From a0545f6c5491fad100aebc638065977ac7304e5e Mon Sep 17 00:00:00 2001 From: Dimitrios Eftaxiopoulos Date: Tue, 24 Jan 2017 18:20:36 +0200 Subject: [PATCH] New upstream version 2.3.5.1 --- CMakeLists.txt | 165 +++- ChangeLog.txt | 63 ++ addons/getopt/CMakeLists.txt | 2 + addons/getopt/getopt.c | 973 ++++++++++++++++++++ addons/getopt/getopt.h | 121 +++ cmake-qt4.txt | 14 +- cmake-qt5.txt | 43 +- examples/CMakeLists.txt | 25 +- examples/FractInt.ifs | 158 ++++ examples/fltk_example.cpp | 10 +- examples/full_test.cpp | 29 +- examples/glut_example.cpp | 2 +- examples/qgl_example.cpp | 3 +- examples/qt_example.cpp | 12 +- examples/samples.cpp | 31 +- examples/wnd_samples.cpp | 2 +- examples/wx_example.cpp | 2 +- fonts/CMakeLists.txt | 3 +- fonts/make_bin.cpp | 2 +- include/mgl2/Fl_MathGL.h | 2 +- include/mgl2/abstract.h | 42 +- include/mgl2/addon.h | 2 +- include/mgl2/base.h | 68 +- include/mgl2/base_cf.h | 2 +- include/mgl2/canvas.h | 11 +- include/mgl2/canvas_cf.h | 14 +- include/mgl2/canvas_wnd.h | 2 +- include/mgl2/cont.h | 2 +- include/mgl2/data.h | 83 +- include/mgl2/data_cf.h | 40 +- include/mgl2/datac.h | 17 +- include/mgl2/datac_cf.h | 16 +- include/mgl2/define.h | 40 +- include/mgl2/eval.h | 2 +- include/mgl2/evalc.h | 2 +- include/mgl2/fit.h | 2 +- include/mgl2/fltk.h | 8 +- include/mgl2/font.h | 6 +- include/mgl2/glut.h | 4 +- include/mgl2/mgl.h | 17 +- include/mgl2/mgl_cf.h | 2 +- include/mgl2/mpi.h | 2 +- include/mgl2/opengl.h | 2 +- include/mgl2/other.h | 2 +- include/mgl2/parser.h | 6 +- include/mgl2/pde.h | 2 +- include/mgl2/plot.h | 2 +- include/mgl2/prim.h | 2 +- include/mgl2/qmathgl.h | 16 +- include/mgl2/qt.h | 8 +- include/mgl2/surf.h | 2 +- include/mgl2/thread.h | 2 +- include/mgl2/type.h | 2 +- include/mgl2/vect.h | 2 +- include/mgl2/volume.h | 2 +- include/mgl2/window.h | 2 +- include/mgl2/wnd.h | 8 +- include/mgl2/wx.h | 2 +- json/Backend.cpp | 21 +- json/Backend.hpp | 3 + json/CMakeLists.txt | 6 +- lang/mgl.i | 2 +- make_release | 57 -- mgltex/Recompilation_decision.eps | 111 ++- mgltex/Recompilation_decision.pdf | Bin 77225 -> 77735 bytes mgltex/Recompilation_decision.svg | 715 +++++++++------ mgltex/mgltex.dtx | 1384 ++++++++++++++++++----------- mgltex/mgltex.ins | 6 +- mgltex/mgltex.pdf | Bin 521993 -> 546058 bytes mgltex/sample.tex | 724 ++++++--------- src/CMakeLists.txt | 71 +- src/addon.cpp | 3 +- src/axis.cpp | 10 +- src/base.cpp | 64 +- src/base_cf.cpp | 2 +- src/canvas.cpp | 30 +- src/canvas_cf.cpp | 14 +- src/complex.cpp | 28 +- src/complex_ex.cpp | 39 +- src/complex_io.cpp | 13 +- src/cont.cpp | 30 +- src/crust.cpp | 78 +- src/data.cpp | 10 +- src/data_ex.cpp | 15 +- src/data_gr.cpp | 2 +- src/data_io.cpp | 23 +- src/data_png.cpp | 2 +- src/eval.cpp | 2 +- src/evalc.cpp | 13 +- src/evalp.cpp | 40 +- src/exec.cpp | 134 ++- src/export.cpp | 2 +- src/export_2d.cpp | 8 +- src/export_3d.cpp | 2 +- src/fft.cpp | 2 +- src/fit.cpp | 2 +- src/font.cpp | 20 +- src/fractal.cpp | 463 ++++++++++ src/obj.cpp | 4 +- src/other.cpp | 68 +- src/parser.cpp | 93 +- src/pde.cpp | 610 +++++++++++-- src/pixel.cpp | 32 +- src/plot.cpp | 25 +- src/prc.cpp | 2 +- src/prc/PRC.h | 2 + src/prim.cpp | 2 +- src/s_hull/s_hull_pro.h | 1 + src/surf.cpp | 2 +- src/tex_table.cc | 4 +- src/vect.cpp | 439 ++++----- src/volume.cpp | 140 +-- src/window.cpp | 30 +- texinfo/concept_en.texi | 8 +- texinfo/concept_ru.texi | 6 +- texinfo/core_en.texi | 38 +- texinfo/core_ru.texi | 39 +- texinfo/data_en.texi | 93 +- texinfo/data_ru.texi | 96 +- texinfo/ex_mgl_en.texi | 19 +- texinfo/ex_mgl_ru.texi | 19 +- texinfo/example_en.texi | 11 +- texinfo/example_ru.texi | 11 +- texinfo/formats_en.texi | 30 +- texinfo/formats_ru.texi | 30 +- texinfo/parse_en.texi | 20 +- texinfo/parse_ru.texi | 67 +- texinfo/symbols_en.texi | 12 +- texinfo/symbols_ru.texi | 12 +- texinfo/version.texi.in | 2 +- texinfo/version_hist.txt | 2 + texinfo/web_en.texi | 125 ++- texinfo/web_ru.texi | 123 ++- texinfo/widget_en.texi | 6 + texinfo/widget_ru.texi | 6 + todo.txt | 12 +- udav/CMakeLists.txt | 16 +- udav/anim_dlg.h | 3 + udav/dat_pnl.cpp | 32 +- udav/data_dlg.cpp | 2 +- udav/files_dlg.h | 3 + udav/find_dlg.h | 3 + udav/help_pnl.h | 3 + udav/hint_dlg.cpp | 46 +- udav/hint_dlg.h | 2 +- udav/info_dlg.cpp | 2 +- udav/mem_pnl.cpp | 14 +- udav/newcmd_dlg.cpp | 8 +- udav/open_dlg.cpp | 12 +- udav/opt_dlg.h | 3 + udav/setup_dlg.h | 3 + udav/style_dlg.cpp | 6 +- udav/subplot_dlg.cpp | 37 +- udav/text_pnl.cpp | 10 +- udav/textedit.cpp | 3 +- udav/textedit.h | 3 + udav/udav_wnd.cpp | 10 +- utils/CMakeLists.txt | 16 +- utils/make_pas.cpp | 2 + utils/mglcgi.cpp | 2 +- utils/mglconv.cpp | 33 +- utils/mglview.cpp | 16 +- widgets/CMakeLists.txt | 7 +- widgets/fltk.cpp | 19 +- widgets/glut.cpp | 2 +- widgets/qt.cpp | 52 +- widgets/qt4/CMakeLists.txt | 23 +- widgets/qt5/CMakeLists.txt | 19 +- widgets/wx.cpp | 10 +- 169 files changed, 6311 insertions(+), 2611 deletions(-) create mode 100644 addons/getopt/CMakeLists.txt create mode 100644 addons/getopt/getopt.c create mode 100644 addons/getopt/getopt.h create mode 100644 examples/FractInt.ifs delete mode 100755 make_release create mode 100644 src/fractal.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 744680e..df67e61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,12 @@ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 2.8.12) if(POLICY CMP0043) cmake_policy(SET CMP0043 OLD) endif() project( MathGL ) +set(MGL_DEP_LIBS) + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) @@ -12,8 +14,8 @@ endif(NOT CMAKE_BUILD_TYPE) set(CMAKE_VERBOSE_MAKEFILE ON) set(MathGL_VERSION_MAJOR 2) -set(MathGL_VERSION_MINOR 3.4) -set(MathGL_SOVERSION 7.4.1) +set(MathGL_VERSION_MINOR 3.5) +set(MathGL_SOVERSION 7.4.3) function(mgl_add_lib mgl_tmp_lib) if(${mgl_tmp_lib} MATCHES mgl) @@ -28,16 +30,29 @@ function(mgl_add_lib mgl_tmp_lib) add_library(${mgllib} SHARED ${mgl_src_lst}) add_library(${mgllib}-static STATIC ${mgl_src_lst}) set_target_properties(${mgllib} PROPERTIES SOVERSION ${MathGL_SOVERSION}) - set_target_properties(${mgllib} PROPERTIES CLEAN_DIRECT_OUTPUT 1) set_target_properties(${mgllib} PROPERTIES DEFINE_SYMBOL "mgl_EXPORTS") - set_target_properties(${mgllib}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(${mgllib} PROPERTIES C_VISIBILITY_PRESET hidden) + set_target_properties(${mgllib} PROPERTIES CXX_VISIBILITY_PRESET hidden) + set_target_properties(${mgllib} PROPERTIES VISIBILITY_INLINES_HIDDEN 1) target_compile_definitions(${mgllib}-static PUBLIC MGL_STATIC_DEFINE) - + if(MSVC) + set(mgl_lib_static "-static") + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(mgl_lib_end "d") + else(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(mgl_lib_end) + endif(CMAKE_BUILD_TYPE STREQUAL "Debug") + elseif(MSVC) + set(mgl_lib_static) + set_target_properties(${mgllib} PROPERTIES CLEAN_DIRECT_OUTPUT 1) + set_target_properties(${mgllib}-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) + endif(MSVC) if(enable-mgl2) - set_target_properties(${mgllib} PROPERTIES OUTPUT_NAME "${mgllib2}") - set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib2}") + set_target_properties(${mgllib} PROPERTIES OUTPUT_NAME "${mgllib2}${mgl_lib_end}") + set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib2}${mgl_lib_static}${mgl_lib_end}") else(enable-mgl2) - set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib}") + set_target_properties(${mgllib} PROPERTIES OUTPUT_NAME "${mgllib}${mgl_lib_end}") + set_target_properties(${mgllib}-static PROPERTIES OUTPUT_NAME "${mgllib}${mgl_lib_static}${mgl_lib_end}") endif(enable-mgl2) install( @@ -136,17 +151,30 @@ CMAKE_DEPENDENT_OPTION(enable-glut "Enable glut support" OFF "NOT enable-all-wid CMAKE_DEPENDENT_OPTION(enable-fltk "Enable fltk widget" OFF "NOT enable-all-widgets" ON) CMAKE_DEPENDENT_OPTION(enable-wx "Enable wxWidget widget" OFF "NOT enable-all-widgets" ON) CMAKE_DEPENDENT_OPTION(enable-qt4 "Enable Qt4 widget" OFF "NOT enable-all-widgets" ON) +CMAKE_DEPENDENT_OPTION(enable-qt4asqt "Set Qt4 as default libmgl-qt" OFF "enable-qt4" OFF) CMAKE_DEPENDENT_OPTION(enable-qt5 "Enable Qt5 widget" OFF "NOT enable-all-widgets" ON) -CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" ON "enable-qt5" OFF) +CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" OFF "enable-qt5" OFF) -if(UNIX AND enable-rvalue) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") -endif(UNIX AND enable-rvalue) - -# MSVC does not require any special flags +# msvc fwprintf print char* for the specifier of "%s" format +if(MSVC AND MSVC_VERSION GREATER 1899) + SET(CMAKE_CXX_FLAGS "/EHsc -D_CRT_STDIO_ISO_WIDE_SPECIFIERS ${CMAKE_CXX_FLAGS}") + SET(CMAKE_C_FLAGS "-D_CRT_STDIO_ISO_WIDE_SPECIFIERS ${CMAKE_C_FLAGS}") +endif(MSVC AND MSVC_VERSION GREATER 1899) if(enable-qt4 OR enable-qt5) -set(QT_ENABLED ON) + set(QT_ENABLED ON) + if(enable-qt4asqt AND enable-qt5asqt) + message(SEND_ERROR "You cannot make Qt4 and Qt5 as qt at the same time.") + endif(enable-qt4asqt AND enable-qt5asqt) + if(enable-qt4 AND NOT enable-qt5) + set(enable-qt4asqt TRUE) + endif(enable-qt4 AND NOT enable-qt5) + if(enable-qt5 AND NOT enable-qt4) + set(enable-qt5asqt TRUE) + endif(enable-qt5 AND NOT enable-qt4) +# if(NOT enable-opengl) +# message(SEND_ERROR "You cannot build MathGL with Qt4 or Qt5 without OpenGL enabled.") +# endif(NOT enable-opengl) endif(enable-qt4 OR enable-qt5) CMAKE_DEPENDENT_OPTION(enable-json-sample "Enable JSON sample" ON "QT_ENABLED" OFF) @@ -183,16 +211,18 @@ endif(WORDS_BIGENDIAN) CHECK_FUNCTION_EXISTS(sin MGL_SIN) CHECK_FUNCTION_EXISTS(memrchr HAVE_MEMRCHR) if(NOT MGL_SIN) - cmake_push_check_state() - set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m) - CHECK_FUNCTION_EXISTS(sin MGL_SIN_M) - cmake_pop_check_state() - if(MGL_SIN_M) - set(M_LIB m) - elseif(MGL_SIN_M) - message(SEND_ERROR "Math library not found") - endif(MGL_SIN_M) + cmake_push_check_state() + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m) + CHECK_FUNCTION_EXISTS(sin MGL_SIN_M) + cmake_pop_check_state() + if(MGL_SIN_M) + set(M_LIB m) + elseif(MGL_SIN_M) + message(SEND_ERROR "Math library not found") + endif(MGL_SIN_M) endif(NOT MGL_SIN) +set(MGL_DEP_LIBS ${M_LIB} ${MGL_DEP_LIBS}) + if(HAVE_MEMRCHR) ADD_DEFINITIONS(-DHAVE_MEMRCHR) endif(HAVE_MEMRCHR) @@ -201,7 +231,7 @@ include(CheckTypeSize) check_type_size("long" SIZEOF_LONG) include(CheckCXXSourceCompiles) -unset(MGL_HAVE_C99_COMPLEX) +#unset(MGL_HAVE_C99_COMPLEX) CHECK_CXX_SOURCE_COMPILES( "#include #include @@ -214,7 +244,7 @@ if(NOT MGL_HAVE_C99_COMPLEX) set(MGL_HAVE_C99_COMPLEX 0) endif(NOT MGL_HAVE_C99_COMPLEX) -unset(MGL_HAVE_NAN_INF) +#unset(MGL_HAVE_NAN_INF) CHECK_CXX_SOURCE_COMPILES( "#include int main(){double a=NAN, b=INFINITY;return 0;}" MGL_HAVE_NAN_INF) @@ -222,7 +252,7 @@ if(NOT MGL_HAVE_NAN_INF) set(MGL_HAVE_NAN_INF 0) endif(NOT MGL_HAVE_NAN_INF) -unset(MGL_HAVE_ATTRIBUTE) +#unset(MGL_HAVE_ATTRIBUTE) CHECK_CXX_SOURCE_COMPILES( "int __attribute__((pure)) test1() {return 0;} int __attribute__((const)) test2(int x) {return x*x;} @@ -231,7 +261,7 @@ if(NOT MGL_HAVE_ATTRIBUTE) set(MGL_HAVE_ATTRIBUTE 0) endif(NOT MGL_HAVE_ATTRIBUTE) -unset(MGL_HAVE_TYPEOF) +unset(MGL_HAVE_TYPEOF CACHE) CHECK_CXX_SOURCE_COMPILES( "#define mgl_isnum(a) ({typeof (a) _a = (a); _a==_a;}) int main(){bool a=mgl_isnum(1);return 0;}" MGL_HAVE_TYPEOF) @@ -239,13 +269,30 @@ if(NOT MGL_HAVE_TYPEOF) set(MGL_HAVE_TYPEOF 0) endif(NOT MGL_HAVE_TYPEOF) -unset(MGL_HAVE_RVAL) -CHECK_CXX_SOURCE_COMPILES( -"struct test { test() {} test(test&& a){} }; -int main() { test t; return 0; }" MGL_HAVE_RVAL) -if(NOT MGL_HAVE_RVAL) +if(NOT MSVC AND enable-rvalue) + SET(CMAKE_CXX_FLAGS "-std=gnu++11 ${CMAKE_CXX_FLAGS}") + unset(MGL_HAVE_RVAL CACHE) + CHECK_CXX_SOURCE_COMPILES( + "struct test { test() {} test(test&& a){} }; + int main() { test t; return 0; }" MGL_HAVE_RVAL) + if(NOT MGL_HAVE_RVAL) + message(SEND_ERROR "Couldn't enable rvalue.") +# set(MGL_HAVE_RVAL 0) + endif(NOT MGL_HAVE_RVAL) +else(NOT MSVC AND enable-rvalue) set(MGL_HAVE_RVAL 0) -endif(NOT MGL_HAVE_RVAL) +endif(NOT MSVC AND enable-rvalue) + + + +CHECK_CXX_SOURCE_COMPILES( +"#include +int main(int argc, char *args[]) { +int ch = getopt(argc, args, \"1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:\"); return 0; }" MGL_HAVE_GETOPT) +if(NOT MGL_HAVE_GETOPT) + include_directories(${MathGL_SOURCE_DIR}/addons/getopt) + set(getopt_lib-static getopt-static) +endif(NOT MGL_HAVE_GETOPT) if(enable-double) set(MGL_USE_DOUBLE 1) @@ -281,24 +328,22 @@ else(enable-mpi) set(MGL_HAVE_MPI 0) endif(enable-mpi) -if(enable-pthread) - set(MGL_HAVE_PTHREAD 1) - include(FindThreads) - if(NOT CMAKE_USE_PTHREADS_INIT) - message(SEND_ERROR "Couldn't find POSIX threads library.") - endif(NOT CMAKE_USE_PTHREADS_INIT) -else(enable-pthread) - set(MGL_HAVE_PTHREAD 0) -endif(enable-pthread) if(enable-pthr-widget OR enable-pthread) + if(enable-pthread) + set(MGL_HAVE_PTHREAD 1) + else(enable-pthread) + set(MGL_HAVE_PTHREAD 0) + endif(enable-pthread) set(MGL_HAVE_PTHR_WIDGET 1) include(FindThreads) if(NOT CMAKE_USE_PTHREADS_INIT) message(SEND_ERROR "Couldn't find POSIX threads library.") endif(NOT CMAKE_USE_PTHREADS_INIT) + set(MGL_DEP_LIBS ${CMAKE_THREAD_LIBS_INIT} ${MGL_DEP_LIBS}) else(enable-pthr-widget OR enable-pthread) set(MGL_HAVE_PTHR_WIDGET 0) + set(MGL_HAVE_PTHREAD 0) endif(enable-pthr-widget OR enable-pthread) if(enable-gsl) @@ -318,6 +363,8 @@ if(enable-gsl) int main(){gsl_multifit_fdfsolver *s=0;gsl_matrix *J = 0; gsl_multifit_fdfsolver_jac(s, J);}" MGL_HAVE_GSL2) endif(NOT GSL_LIB OR NOT GSL_CBLAS_LIB OR NOT GSL_INCLUDE_DIR) + set(MGL_DEP_LIBS ${GSL_LIB} ${GSL_CBLAS_LIB} ${MGL_DEP_LIBS}) + include_directories(${GSL_INCLUDE_DIR}) else(enable-gsl) set(MGL_HAVE_GSL 0) endif(enable-gsl) @@ -331,6 +378,8 @@ if(enable-all OR enable-ltdl) message(SEND_ERROR "${LTDL_INCLUDE_DIR}") message(SEND_ERROR "Couldn't find LTDL library.") endif(NOT LTDL_LIB OR NOT LTDL_INCLUDE_DIR) + set(MGL_DEP_LIBS ${LTDL_LIB} ${MGL_DEP_LIBS}) + include_directories(${LTDL_INCLUDE_DIR}) else(enable-all OR enable-ltdl) set(MGL_HAVE_LTDL 0) endif(enable-all OR enable-ltdl) @@ -346,6 +395,8 @@ if(enable-hdf4) message(SEND_ERROR "${HDF4_INCLUDE_DIR}") message(SEND_ERROR "Couldn't find HDF4 libraries.") endif(NOT HDF4_LIB OR NOT HDF4MF_LIB OR NOT HDF4_INCLUDE_DIR) + set(MGL_DEP_LIBS ${HDF4MF_LIB} ${HDF4_LIB} ${MGL_DEP_LIBS}) + include_directories(${HDF4_INCLUDE_DIR}) else(enable-hdf4) set(MGL_HAVE_HDF4 0) endif(enable-hdf4) @@ -359,6 +410,8 @@ if(enable-hdf5) message(SEND_ERROR "Couldn't find HDF5 library.") endif(NOT HDF5_FOUND) endif(NOT HDF5_FOUND) + set(MGL_DEP_LIBS ${HDF5_LIBRARIES} ${HDF5_C_SHARED_LIBRARY} ${MGL_DEP_LIBS}) + include_directories(${HDF5_INCLUDE_DIR}) else(enable-hdf5) set(MGL_HAVE_HDF5 0) endif(enable-hdf5) @@ -369,6 +422,8 @@ if(enable-jpeg) if(NOT JPEG_FOUND) message(SEND_ERROR "Couldn't find JPEG library.") endif(NOT JPEG_FOUND) + set(MGL_DEP_LIBS ${JPEG_LIBRARIES} ${MGL_DEP_LIBS}) + include_directories(${JPEG_INCLUDE_DIR}) else(enable-jpeg) set(MGL_HAVE_JPEG 0) endif(enable-jpeg) @@ -380,6 +435,8 @@ if(enable-zlib) if(NOT ZLIB_FOUND) message(SEND_ERROR "Couldn't find ZLib library.") endif(NOT ZLIB_FOUND) + set(MGL_DEP_LIBS ${ZLIB_LIBRARIES} ${MGL_DEP_LIBS}) + include_directories(${ZLIB_INCLUDE_DIR}) else(enable-zlib) set(MGL_HAVE_ZLIB 0) endif(enable-zlib) @@ -393,6 +450,8 @@ if(enable-png) if(NOT PNG_FOUND) message(SEND_ERROR "Couldn't find PNG library.") endif(NOT PNG_FOUND) + set(MGL_DEP_LIBS ${PNG_LIBRARIES} ${MGL_DEP_LIBS}) + include_directories(${PNG_INCLUDE_DIR}) else(enable-png) set(MGL_HAVE_PNG 0) endif(enable-png) @@ -411,6 +470,8 @@ if(enable-pdf) if(NOT HPDF_INCLUDE_DIR) message(SEND_ERROR "Couldn't find headers of 3d-enabled version of libhpdf.") endif(NOT HPDF_INCLUDE_DIR) + include_directories(${HPDF_INCLUDE_DIR}) + set(MGL_DEP_LIBS ${HPDF_LIB} ${MGL_DEP_LIBS}) else(enable-pdf) set(MGL_HAVE_PDF 0) endif(enable-pdf) @@ -421,6 +482,8 @@ if(enable-gif) if(NOT GIF_FOUND) message(SEND_ERROR "Couldn't find GIF library.") endif(NOT GIF_FOUND) + set(MGL_DEP_LIBS ${GIF_LIBRARIES} ${MGL_DEP_LIBS}) + include_directories(${GIF_INCLUDE_DIR}) else(enable-gif) set(MGL_HAVE_GIF 0) endif(enable-gif) @@ -431,6 +494,8 @@ if(enable-opengl) if(NOT OPENGL_FOUND) message(SEND_ERROR "Couldn't find OpenGL libraries.") endif(NOT OPENGL_FOUND) + set(MGL_DEP_LIBS ${OPENGL_LIBRARIES} ${MGL_DEP_LIBS}) + include_directories(${OPENGL_INCLUDE_DIR} ) else(enable-opengl) set(MGL_HAVE_OPENGL 0) endif(enable-opengl) @@ -557,6 +622,10 @@ if(WIN32) add_definitions(-DWIN32) endif(WIN32) +if(NOT MGL_HAVE_GETOPT) + add_subdirectory( addons/getopt ) +endif(NOT MGL_HAVE_GETOPT) + add_subdirectory( src ) add_subdirectory( widgets ) add_subdirectory( include ) @@ -566,17 +635,15 @@ if(NOT enable-lgpl) if(enable-python OR enable-lua OR enable-octave) add_subdirectory( lang ) endif(enable-python OR enable-lua OR enable-octave) - if(NOT MSVC AND NOT BORLAND) - add_subdirectory( utils ) - endif(NOT MSVC AND NOT BORLAND) +add_subdirectory( utils ) +add_subdirectory( examples ) if(NOT WIN32) add_subdirectory( fonts ) endif(NOT WIN32) -# add_subdirectory( mgllab ) +# add_subdirectory( mgllab ) endif(NOT enable-lgpl) if(NOT MSVC AND NOT BORLAND) - add_subdirectory( examples ) if(MGL_HAVE_DOC_HTML OR MGL_HAVE_DOC_SITE OR MGL_HAVE_DOC_INFO OR MGL_HAVE_DOC_PDF_RU OR MGL_HAVE_DOC_PDF_EN ) add_subdirectory( texinfo ) diff --git a/ChangeLog.txt b/ChangeLog.txt index c481c3d..c47c176 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,66 @@ +2.3.5.1 Released 2 June 2016 + +* INCOMPATIBLE: library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly now. +* Compatibility changes for latest MS VisualStudio. +* Bugfixes. + +2.3.5 Released 16 May 2016 + +* Greatly update mgltex (by Diego Sejas Viscarra) + o \MGL@codes: Bugfix: category code for tabulators is changed too + o \MGL@quality: 9 is accepted as quality value now + o \MGL@scale: Now accepts any positive value + o \MGL@test@switch: New command to verify and validate switching arguments + o \mglTeX: Add a small negative space in the logo, between the "mgl" and "TEX" + o \mglTeX: Declared now as robust command + o \mglcomments: Now accepts arguments 0 (equivalent to off) and 1 (equivalent to on), besides the usual off and on + o \mglgraphics: New command options: gray, mglscale, quality, variant + o \mglname: Now writes the MGL code line setsize 600 400 to the main script + o \mglplot: Added \bgroup and \egroup in order to keep changes private + o New command options: gray, mglscale, quality, variant + o \mglsettings: Added options gray and variant + o Now calls the \mglswitch and \mglcomments commands for the switch and comments options, respectively + o \mglswitch: Now accepts arguments 0 (equivalent to off) and 1 (equivalent to on), besides the usual off and on + o mglTeX now depends on the ifpdf package + o Change definition of \mglcommentname from MGL comment to mglTEX comment + o Introduce the concept of global, local and private settings in the documentation + o New commands: \mglgray (to activate/deactivate) gray-scale mode locally, and \mglvariant (to set variant of arguments in MGL scripts locally) + o New package option 9q for setting quality to 9 (for testing purposes of the author) + o New package options 0v, 1v, 2v to select variant of arguments in MGL scripts + o New package options gray, color to activate/deactivate gray-scale mode for graphics + o Remove the \MGL@setkeys command, since it isn’t needed as first thought + o Rename \MGL@document@scripts to \MGL@doc@scripts + o Rename \MGL@script@name to \MGL@script + o Rename command \MGL@graph@ext to \MGL@imgext + o Rename command \mglcommonscriptname to mglsetupscriptname + o Rename environment mglcommon to mglsetupscript (mglcommon is still available, but deprecated) + o Rename family MGL@keys as MGL@gr@keys for consistency + o Reorganize and update documentation + o Some minor bugfixes + o The MGL code line "setsize 600 400" is now automatically written to the main script in order for the scaling options and commands to work + o mgl: New environment options: gray, mglscale, quality, variant + o mglcode: New environment options: gray, mglscale, quality, variant +* Add MGL command 'variant' to select proper variant of arguments (like "var1?var2?var3?...") in MGL commands. +* Remove limitation of maximal number (was 1000) of arguments for MGL commands. This is actual for 'list' command. +* Add mglWnd::Widget() for accessing widget which is used for drawing. +* Add Gray() for producing gray-scaled image. +* Add MGL command 'setsizescl' for scaling all further 'setsize'. +* Add Shear() for shearing plot. +* Add ShearPlot() for placing plots side-by-side with some shearing. +* Add mglData::Limit() for limit maximal absolute value of data. +* Add mglTridMat() for tridiagonal matrix algorithm. +* Add MGL command 'diffract' for single step diffraction calculation. +* Add 'ifsfile' for reading IFS fractal parameters from *.ifs file. +* Add style '*' for 2d versions of Pipe() and Flow() to draw threads from points inside axis range. +* Add "norm()" to the list of known functions +* Compatibility changes for MS VisualStudio, MacOS, Win64. +* Bugfix for legend export into EPS and SVG. +* Bugfix for importing data from std::vector. +* Improve Surf3*() drawing. +* Force NAN if divided by 0 in formulas. +* Option "-S" of mglconv now perform scaling in any cases + + 2.3.4 Released 13 February 2016 * Add mglData::Pulse() for determining pulse parameters. diff --git a/addons/getopt/CMakeLists.txt b/addons/getopt/CMakeLists.txt new file mode 100644 index 0000000..679b761 --- /dev/null +++ b/addons/getopt/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(getopt-static STATIC getopt.c getopt.h) +target_compile_definitions(getopt-static PUBLIC MGL_STATIC_DEFINE) diff --git a/addons/getopt/getopt.c b/addons/getopt/getopt.c new file mode 100644 index 0000000..dd4f2c5 --- /dev/null +++ b/addons/getopt/getopt.c @@ -0,0 +1,973 @@ +/* Getopt for Microsoft C +This code is a modification of the Free Software Foundation, Inc. +Getopt library for parsing command line argument the purpose was +to provide a Microsoft Visual C friendly derivative. This code +provides functionality for both Unicode and Multibyte builds. + +Date: 02/03/2011 - Ludvik Jerabek - Initial Release +Version: 1.0 +Comment: Supports getopt, getopt_long, and getopt_long_only +and POSIXLY_CORRECT environment flag +License: LGPL + +Revisions: + +02/03/2011 - Ludvik Jerabek - Initial Release +02/20/2011 - Ludvik Jerabek - Fixed compiler warnings at Level 4 +07/05/2011 - Ludvik Jerabek - Added no_argument, required_argument, optional_argument defs +08/03/2011 - Ludvik Jerabek - Fixed non-argument runtime bug which caused runtime exception +08/09/2011 - Ludvik Jerabek - Added code to export functions for DLL and LIB +02/15/2012 - Ludvik Jerabek - Fixed _GETOPT_THROW definition missing in implementation file +08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi +10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features +06/19/2015 - Ludvik Jerabek - Fixed maximum option limitation caused by option_a (255) and option_w (65535) structure val variable + +**DISCLAIMER** +THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING, BUT Not LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE, OR NON-INFRINGEMENT. SOME JURISDICTIONS DO NOT ALLOW THE +EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT +APPLY TO YOU. IN NO EVENT WILL I BE LIABLE TO ANY PARTY FOR ANY +DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES FOR ANY +USE OF THIS MATERIAL INCLUDING, WITHOUT LIMITATION, ANY LOST +PROFITS, BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER DATA ON +YOUR INFORMATION HANDLING SYSTEM OR OTHERWISE, EVEN If WE ARE +EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +*/ +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include "getopt.h" + +#ifdef __cplusplus + #define _GETOPT_THROW throw() +#else + #define _GETOPT_THROW +#endif + +int optind = 1; +int opterr = 1; +int optopt = '?'; +enum ENUM_ORDERING { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER }; + +// +// +// Ansi structures and functions follow +// +// + +static struct _getopt_data_a +{ + int optind; + int opterr; + int optopt; + char *optarg; + int __initialized; + char *__nextchar; + enum ENUM_ORDERING __ordering; + int __posixly_correct; + int __first_nonopt; + int __last_nonopt; +} getopt_data_a; +char *optarg_a; + +static void exchange_a(char **argv, struct _getopt_data_a *d) +{ + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; + char *tem; + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + int len = middle - bottom; + register int i; + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + top -= len; + } + else + { + int len = top - middle; + register int i; + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + bottom += len; + } + } + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->optind; +} +static const char *_getopt_initialize_a (const char *optstring, struct _getopt_data_a *d, int posixly_correct) +{ + d->__first_nonopt = d->__last_nonopt = d->optind; + d->__nextchar = NULL; + d->__posixly_correct = posixly_correct | !!getenv("POSIXLY_CORRECT"); + if (optstring[0] == '-') + { + d->__ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + d->__ordering = REQUIRE_ORDER; + ++optstring; + } + else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; + else + d->__ordering = PERMUTE; + return optstring; +} +int _getopt_internal_r_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, struct _getopt_data_a *d, int posixly_correct) +{ + int print_errors = d->opterr; + if (argc < 1) + return -1; + d->optarg = NULL; + if (d->optind == 0 || !d->__initialized) + { + if (d->optind == 0) + d->optind = 1; + optstring = _getopt_initialize_a (optstring, d, posixly_correct); + d->__initialized = 1; + } + else if (optstring[0] == '-' || optstring[0] == '+') + optstring++; + if (optstring[0] == ':') + print_errors = 0; + if (d->__nextchar == NULL || *d->__nextchar == '\0') + { + if (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; + if (d->__ordering == PERMUTE) + { + if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) + exchange_a ((char **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; + while (d->optind < argc && (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')) + d->optind++; + d->__last_nonopt = d->optind; + } + if (d->optind != argc && !strcmp(argv[d->optind], "--")) + { + d->optind++; + if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) + exchange_a((char **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + d->__last_nonopt = argc; + d->optind = argc; + } + if (d->optind == argc) + { + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; + return -1; + } + if ((argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')) + { + if (d->__ordering == REQUIRE_ORDER) + return -1; + d->optarg = argv[d->optind++]; + return 1; + } + d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == '-')); + } + if (longopts != NULL && (argv[d->optind][1] == '-' || (long_only && (argv[d->optind][2] || !strchr(optstring, argv[d->optind][1]))))) + { + char *nameend; + unsigned int namelen; + const struct option_a *p; + const struct option_a *pfound = NULL; + struct option_list + { + const struct option_a *p; + struct option_list *next; + } *ambig_list = NULL; + int exact = 0; + int indfound = -1; + int option_index; + for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++); + namelen = (unsigned int)(nameend - d->__nextchar); + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp(p->name, d->__nextchar, namelen)) + { + if (namelen == (unsigned int)strlen(p->name)) + { + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + pfound = p; + indfound = option_index; + } + else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) + { + struct option_list *newp = (struct option_list*)alloca(sizeof(*newp)); + newp->p = p; + newp->next = ambig_list; + ambig_list = newp; + } + } + if (ambig_list != NULL && !exact) + { + if (print_errors) + { + struct option_list first; + first.p = pfound; + first.next = ambig_list; + ambig_list = &first; + fprintf (stderr, "%s: option '%s' is ambiguous; possibilities:", argv[0], argv[d->optind]); + do + { + fprintf (stderr, " '--%s'", ambig_list->p->name); + ambig_list = ambig_list->next; + } + while (ambig_list != NULL); + fputc ('\n', stderr); + } + d->__nextchar += strlen(d->__nextchar); + d->optind++; + d->optopt = 0; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + d->optind++; + if (*nameend) + { + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[d->optind - 1][1] == '-') + { + fprintf(stderr, "%s: option '--%s' doesn't allow an argument\n",argv[0], pfound->name); + } + else + { + fprintf(stderr, "%s: option '%c%s' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name); + } + } + d->__nextchar += strlen(d->__nextchar); + d->optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { + fprintf(stderr,"%s: option '--%s' requires an argument\n",argv[0], pfound->name); + } + d->__nextchar += strlen(d->__nextchar); + d->optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen(d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + if (!long_only || argv[d->optind][1] == '-' || strchr(optstring, *d->__nextchar) == NULL) + { + if (print_errors) + { + if (argv[d->optind][1] == '-') + { + fprintf(stderr, "%s: unrecognized option '--%s'\n",argv[0], d->__nextchar); + } + else + { + fprintf(stderr, "%s: unrecognized option '%c%s'\n",argv[0], argv[d->optind][0], d->__nextchar); + } + } + d->__nextchar = (char *)""; + d->optind++; + d->optopt = 0; + return '?'; + } + } + { + char c = *d->__nextchar++; + char *temp = (char*)strchr(optstring, c); + if (*d->__nextchar == '\0') + ++d->optind; + if (temp == NULL || c == ':' || c == ';') + { + if (print_errors) + { + fprintf(stderr, "%s: invalid option -- '%c'\n", argv[0], c); + } + d->optopt = c; + return '?'; + } + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option_a *p; + const struct option_a *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + if (longopts == NULL) + goto no_longs; + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c); + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + d->optarg = argv[d->optind++]; + for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; nameend++); + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp(p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) == strlen(p->name)) + { + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + pfound = p; + indfound = option_index; + } + else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + { + fprintf(stderr, "%s: option '-W %s' is ambiguous\n",argv[0], d->optarg); + } + d->__nextchar += strlen(d->__nextchar); + d->optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { + fprintf(stderr, "%s: option '-W %s' doesn't allow an argument\n",argv[0], pfound->name); + } + d->__nextchar += strlen(d->__nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { + fprintf(stderr, "%s: option '-W %s' requires an argument\n",argv[0], pfound->name); + } + d->__nextchar += strlen(d->__nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + else + d->optarg = NULL; + d->__nextchar += strlen(d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } +no_longs: + d->__nextchar = NULL; + return 'W'; + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else + d->optarg = NULL; + d->__nextchar = NULL; + } + else + { + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c); + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + d->optarg = argv[d->optind++]; + d->__nextchar = NULL; + } + } + return c; + } +} +int _getopt_internal_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, int posixly_correct) +{ + int result; + getopt_data_a.optind = optind; + getopt_data_a.opterr = opterr; + result = _getopt_internal_r_a (argc, argv, optstring, longopts,longind, long_only, &getopt_data_a,posixly_correct); + optind = getopt_data_a.optind; + optarg_a = getopt_data_a.optarg; + optopt = getopt_data_a.optopt; + return result; +} +int getopt_a (int argc, char *const *argv, const char *optstring) _GETOPT_THROW +{ + return _getopt_internal_a (argc, argv, optstring, (const struct option_a *) 0, (int *) 0, 0, 0); +} +int getopt_long_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW +{ + return _getopt_internal_a (argc, argv, options, long_options, opt_index, 0, 0); +} +int getopt_long_only_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW +{ + return _getopt_internal_a (argc, argv, options, long_options, opt_index, 1, 0); +} +int _getopt_long_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d) +{ + return _getopt_internal_r_a (argc, argv, options, long_options, opt_index,0, d, 0); +} +int _getopt_long_only_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d) +{ + return _getopt_internal_r_a (argc, argv, options, long_options, opt_index, 1, d, 0); +} + +// +// +// Unicode Structures and Functions +// +// + +static struct _getopt_data_w +{ + int optind; + int opterr; + int optopt; + wchar_t *optarg; + int __initialized; + wchar_t *__nextchar; + enum ENUM_ORDERING __ordering; + int __posixly_correct; + int __first_nonopt; + int __last_nonopt; +} getopt_data_w; +wchar_t *optarg_w; + +static void exchange_w(wchar_t **argv, struct _getopt_data_w *d) +{ + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; + wchar_t *tem; + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + int len = middle - bottom; + register int i; + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + top -= len; + } + else + { + int len = top - middle; + register int i; + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + bottom += len; + } + } + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->optind; +} +static const wchar_t *_getopt_initialize_w (const wchar_t *optstring, struct _getopt_data_w *d, int posixly_correct) +{ + d->__first_nonopt = d->__last_nonopt = d->optind; + d->__nextchar = NULL; + d->__posixly_correct = posixly_correct | !!_wgetenv(L"POSIXLY_CORRECT"); + if (optstring[0] == L'-') + { + d->__ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == L'+') + { + d->__ordering = REQUIRE_ORDER; + ++optstring; + } + else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; + else + d->__ordering = PERMUTE; + return optstring; +} +int _getopt_internal_r_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, struct _getopt_data_w *d, int posixly_correct) +{ + int print_errors = d->opterr; + if (argc < 1) + return -1; + d->optarg = NULL; + if (d->optind == 0 || !d->__initialized) + { + if (d->optind == 0) + d->optind = 1; + optstring = _getopt_initialize_w (optstring, d, posixly_correct); + d->__initialized = 1; + } + else if (optstring[0] == L'-' || optstring[0] == L'+') + optstring++; + if (optstring[0] == L':') + print_errors = 0; + if (d->__nextchar == NULL || *d->__nextchar == L'\0') + { + if (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; + if (d->__ordering == PERMUTE) + { + if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) + exchange_w((wchar_t **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; + while (d->optind < argc && (argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0')) + d->optind++; + d->__last_nonopt = d->optind; + } + if (d->optind != argc && !wcscmp(argv[d->optind], L"--")) + { + d->optind++; + if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) + exchange_w((wchar_t **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + d->__last_nonopt = argc; + d->optind = argc; + } + if (d->optind == argc) + { + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; + return -1; + } + if ((argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0')) + { + if (d->__ordering == REQUIRE_ORDER) + return -1; + d->optarg = argv[d->optind++]; + return 1; + } + d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == L'-')); + } + if (longopts != NULL && (argv[d->optind][1] == L'-' || (long_only && (argv[d->optind][2] || !wcschr(optstring, argv[d->optind][1]))))) + { + wchar_t *nameend; + unsigned int namelen; + const struct option_w *p; + const struct option_w *pfound = NULL; + struct option_list + { + const struct option_w *p; + struct option_list *next; + } *ambig_list = NULL; + int exact = 0; + int indfound = -1; + int option_index; + for (nameend = d->__nextchar; *nameend && *nameend != L'='; nameend++); + namelen = (unsigned int)(nameend - d->__nextchar); + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!wcsncmp(p->name, d->__nextchar, namelen)) + { + if (namelen == (unsigned int)wcslen(p->name)) + { + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + pfound = p; + indfound = option_index; + } + else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) + { + struct option_list *newp = (struct option_list*)alloca(sizeof(*newp)); + newp->p = p; + newp->next = ambig_list; + ambig_list = newp; + } + } + if (ambig_list != NULL && !exact) + { + if (print_errors) + { + struct option_list first; + first.p = pfound; + first.next = ambig_list; + ambig_list = &first; + fwprintf(stderr, L"%ls: option '%ls' is ambiguous; possibilities:", argv[0], argv[d->optind]); + do + { + fwprintf (stderr, L" '--%ls'", ambig_list->p->name); + ambig_list = ambig_list->next; + } + while (ambig_list != NULL); + fputwc (L'\n', stderr); + } + d->__nextchar += wcslen(d->__nextchar); + d->optind++; + d->optopt = 0; + return L'?'; + } + if (pfound != NULL) + { + option_index = indfound; + d->optind++; + if (*nameend) + { + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[d->optind - 1][1] == L'-') + { + fwprintf(stderr, L"%ls: option '--%ls' doesn't allow an argument\n",argv[0], pfound->name); + } + else + { + fwprintf(stderr, L"%ls: option '%c%ls' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name); + } + } + d->__nextchar += wcslen(d->__nextchar); + d->optopt = pfound->val; + return L'?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { + fwprintf(stderr,L"%ls: option '--%ls' requires an argument\n",argv[0], pfound->name); + } + d->__nextchar += wcslen(d->__nextchar); + d->optopt = pfound->val; + return optstring[0] == L':' ? L':' : L'?'; + } + } + d->__nextchar += wcslen(d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + if (!long_only || argv[d->optind][1] == L'-' || wcschr(optstring, *d->__nextchar) == NULL) + { + if (print_errors) + { + if (argv[d->optind][1] == L'-') + { + fwprintf(stderr, L"%ls: unrecognized option '--%ls'\n",argv[0], d->__nextchar); + } + else + { + fwprintf(stderr, L"%ls: unrecognized option '%c%ls'\n",argv[0], argv[d->optind][0], d->__nextchar); + } + } + d->__nextchar = (wchar_t *)L""; + d->optind++; + d->optopt = 0; + return L'?'; + } + } + { + wchar_t c = *d->__nextchar++; + wchar_t *temp = (wchar_t*)wcschr(optstring, c); + if (*d->__nextchar == L'\0') + ++d->optind; + if (temp == NULL || c == L':' || c == L';') + { + if (print_errors) + { + fwprintf(stderr, L"%ls: invalid option -- '%c'\n", argv[0], c); + } + d->optopt = c; + return L'?'; + } + if (temp[0] == L'W' && temp[1] == L';') + { + wchar_t *nameend; + const struct option_w *p; + const struct option_w *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + if (longopts == NULL) + goto no_longs; + if (*d->__nextchar != L'\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + fwprintf(stderr,L"%ls: option requires an argument -- '%c'\n",argv[0], c); + } + d->optopt = c; + if (optstring[0] == L':') + c = L':'; + else + c = L'?'; + return c; + } + else + d->optarg = argv[d->optind++]; + for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != L'='; nameend++); + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!wcsncmp(p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) == wcslen(p->name)) + { + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + pfound = p; + indfound = option_index; + } + else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + { + fwprintf(stderr, L"%ls: option '-W %ls' is ambiguous\n",argv[0], d->optarg); + } + d->__nextchar += wcslen(d->__nextchar); + d->optind++; + return L'?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { + fwprintf(stderr, L"%ls: option '-W %ls' doesn't allow an argument\n",argv[0], pfound->name); + } + d->__nextchar += wcslen(d->__nextchar); + return L'?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { + fwprintf(stderr, L"%ls: option '-W %ls' requires an argument\n",argv[0], pfound->name); + } + d->__nextchar += wcslen(d->__nextchar); + return optstring[0] == L':' ? L':' : L'?'; + } + } + else + d->optarg = NULL; + d->__nextchar += wcslen(d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } +no_longs: + d->__nextchar = NULL; + return L'W'; + } + if (temp[1] == L':') + { + if (temp[2] == L':') + { + if (*d->__nextchar != L'\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else + d->optarg = NULL; + d->__nextchar = NULL; + } + else + { + if (*d->__nextchar != L'\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + fwprintf(stderr,L"%ls: option requires an argument -- '%c'\n",argv[0], c); + } + d->optopt = c; + if (optstring[0] == L':') + c = L':'; + else + c = L'?'; + } + else + d->optarg = argv[d->optind++]; + d->__nextchar = NULL; + } + } + return c; + } +} +int _getopt_internal_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, int posixly_correct) +{ + int result; + getopt_data_w.optind = optind; + getopt_data_w.opterr = opterr; + result = _getopt_internal_r_w (argc, argv, optstring, longopts,longind, long_only, &getopt_data_w,posixly_correct); + optind = getopt_data_w.optind; + optarg_w = getopt_data_w.optarg; + optopt = getopt_data_w.optopt; + return result; +} +int getopt_w (int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW +{ + return _getopt_internal_w (argc, argv, optstring, (const struct option_w *) 0, (int *) 0, 0, 0); +} +int getopt_long_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW +{ + return _getopt_internal_w (argc, argv, options, long_options, opt_index, 0, 0); +} +int getopt_long_only_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW +{ + return _getopt_internal_w (argc, argv, options, long_options, opt_index, 1, 0); +} +int _getopt_long_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d) +{ + return _getopt_internal_r_w (argc, argv, options, long_options, opt_index,0, d, 0); +} +int _getopt_long_only_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d) +{ + return _getopt_internal_r_w (argc, argv, options, long_options, opt_index, 1, d, 0); +} \ No newline at end of file diff --git a/addons/getopt/getopt.h b/addons/getopt/getopt.h new file mode 100644 index 0000000..9b52559 --- /dev/null +++ b/addons/getopt/getopt.h @@ -0,0 +1,121 @@ +/* Getopt for Microsoft C +This code is a modification of the Free Software Foundation, Inc. +Getopt library for parsing command line argument the purpose was +to provide a Microsoft Visual C friendly derivative. This code +provides functionality for both Unicode and Multibyte builds. + +Date: 02/03/2011 - Ludvik Jerabek - Initial Release +Version: 1.0 +Comment: Supports getopt, getopt_long, and getopt_long_only +and POSIXLY_CORRECT environment flag +License: LGPL + +Revisions: + +02/03/2011 - Ludvik Jerabek - Initial Release +02/20/2011 - Ludvik Jerabek - Fixed compiler warnings at Level 4 +07/05/2011 - Ludvik Jerabek - Added no_argument, required_argument, optional_argument defs +08/03/2011 - Ludvik Jerabek - Fixed non-argument runtime bug which caused runtime exception +08/09/2011 - Ludvik Jerabek - Added code to export functions for DLL and LIB +02/15/2012 - Ludvik Jerabek - Fixed _GETOPT_THROW definition missing in implementation file +08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi +10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features +06/19/2015 - Ludvik Jerabek - Fixed maximum option limitation caused by option_a (255) and option_w (65535) structure val variable + +**DISCLAIMER** +THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESS OR IMPLIED, INCLUDING, BUT Not LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE, OR NON-INFRINGEMENT. SOME JURISDICTIONS DO NOT ALLOW THE +EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT +APPLY TO YOU. IN NO EVENT WILL I BE LIABLE TO ANY PARTY FOR ANY +DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES FOR ANY +USE OF THIS MATERIAL INCLUDING, WITHOUT LIMITATION, ANY LOST +PROFITS, BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER DATA ON +YOUR INFORMATION HANDLING SYSTEM OR OTHERWISE, EVEN If WE ARE +EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +*/ +#ifndef __GETOPT_H_ + #define __GETOPT_H_ + #include + #define _GETOPT_API MGL_EXPORT + + // Change behavior for C\C++ + #ifdef __cplusplus + #define _BEGIN_EXTERN_C extern "C" { + #define _END_EXTERN_C } + #define _GETOPT_THROW throw() + #else + #define _BEGIN_EXTERN_C + #define _END_EXTERN_C + #define _GETOPT_THROW + #endif + + // Standard GNU options + #define null_argument 0 /*Argument Null*/ + #define no_argument 0 /*Argument Switch Only*/ + #define required_argument 1 /*Argument Required*/ + #define optional_argument 2 /*Argument Optional*/ + + // Shorter Options + #define ARG_NULL 0 /*Argument Null*/ + #define ARG_NONE 0 /*Argument Switch Only*/ + #define ARG_REQ 1 /*Argument Required*/ + #define ARG_OPT 2 /*Argument Optional*/ + + #include + #include + +_BEGIN_EXTERN_C + + extern _GETOPT_API int optind; + extern _GETOPT_API int opterr; + extern _GETOPT_API int optopt; + + // Ansi + struct option_a + { + const char* name; + int has_arg; + int *flag; + int val; + }; + extern _GETOPT_API char *optarg_a; + extern _GETOPT_API int getopt_a(int argc, char *const *argv, const char *optstring) _GETOPT_THROW; + extern _GETOPT_API int getopt_long_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW; + extern _GETOPT_API int getopt_long_only_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW; + + // Unicode + struct option_w + { + const wchar_t* name; + int has_arg; + int *flag; + int val; + }; + extern _GETOPT_API wchar_t *optarg_w; + extern _GETOPT_API int getopt_w(int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW; + extern _GETOPT_API int getopt_long_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW; + extern _GETOPT_API int getopt_long_only_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW; + +_END_EXTERN_C + + #undef _BEGIN_EXTERN_C + #undef _END_EXTERN_C + #undef _GETOPT_THROW + #undef _GETOPT_API + + #ifdef _UNICODE + #define getopt getopt_w + #define getopt_long getopt_long_w + #define getopt_long_only getopt_long_only_w + #define option option_w + #define optarg optarg_w + #else + #define getopt getopt_a + #define getopt_long getopt_long_a + #define getopt_long_only getopt_long_only_a + #define option option_a + #define optarg optarg_a + #endif +#endif // __GETOPT_H_ diff --git a/cmake-qt4.txt b/cmake-qt4.txt index 4208b52..7e661ea 100644 --- a/cmake-qt4.txt +++ b/cmake-qt4.txt @@ -1,14 +1,20 @@ set(MGL_HAVE_QT4 1) +set(MGL_QT4_LIBS) if(enable-json-sample) -set(MGL_QT4_LIBS Core Gui Network WebKit OpenGL) -FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtNetwork QtWebKit QtOpenGL) +set(MGL_QT4_LIBS_FIND QtCore QtGui QtNetwork QtWebKit QtOpenGL) else(enable-json-sample) -set(MGL_QT4_LIBS Core Gui OpenGL) -FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtOpenGL) +set(MGL_QT4_LIBS_FIND QtCore QtGui QtOpenGL) endif(enable-json-sample) + +FIND_PACKAGE(Qt4 4.8 REQUIRED ${MGL_QT4_LIBS_FIND}) + if(NOT QT4_FOUND) message(SEND_ERROR "Couldn't find Qt4 library.") endif(NOT QT4_FOUND) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) + +foreach(mgl_qt4_lib ${MGL_QT4_LIBS_FIND}) + set(MGL_QT4_LIBS ${MGL_QT4_LIBS} Qt4::${mgl_qt4_lib}) +endforeach(mgl_qt4_lib) diff --git a/cmake-qt5.txt b/cmake-qt5.txt index ff447f7..4b7f0b9 100644 --- a/cmake-qt5.txt +++ b/cmake-qt5.txt @@ -1,37 +1,18 @@ set(MGL_HAVE_QT5 1) -find_package(Qt5Core REQUIRED) -find_package(Qt5Widgets REQUIRED) -find_package(Qt5Gui REQUIRED) -find_package(Qt5PrintSupport REQUIRED) -find_package(Qt5OpenGL REQUIRED) -if(NOT Qt5OpenGL_FOUND) - message(SEND_ERROR "Couldn't find Qt5 OpenGL library.") -endif(NOT Qt5OpenGL_FOUND) -if(NOT Qt5Core_FOUND) - message(SEND_ERROR "Couldn't find Qt5 Core library.") -endif(NOT Qt5Core_FOUND) -if(NOT Qt5Gui_FOUND) - message(SEND_ERROR "Couldn't find Qt5 Gui library.") -endif(NOT Qt5Gui_FOUND) -if(NOT Qt5PrintSupport_FOUND) - message(SEND_ERROR "Couldn't find Qt5 PrintSupport library.") -endif(NOT Qt5PrintSupport_FOUND) -set(MGL_QT5_LIBS Core Gui Widgets PrintSupport OpenGL) + +set(MGL_QT5_LIBS_FIND Core Gui Widgets PrintSupport OpenGL) + if(enable-json-sample) -find_package(Qt5Network REQUIRED) -find_package(Qt5WebKit REQUIRED) -find_package(Qt5WebKitWidgets REQUIRED) -if(NOT Qt5Network_FOUND) - message(SEND_ERROR "Couldn't find Qt5 Network library.") -endif(NOT Qt5Network_FOUND) -if(NOT Qt5WebKit_FOUND) - message(SEND_ERROR "Couldn't find Qt5 WebKit library.") -endif(NOT Qt5WebKit_FOUND) -if(NOT Qt5WebKitWidgets_FOUND) - message(SEND_ERROR "Couldn't find Qt5 WebKitWidgets library.") -endif(NOT Qt5WebKitWidgets_FOUND) -set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Network WebKit WebKitWidgets) + set(MGL_QT5_LIBS_FIND ${MGL_QT5_LIBS_FIND} Network WebKit WebKitWidgets) endif(enable-json-sample) +foreach(mgl_qt5_lib ${MGL_QT5_LIBS_FIND}) + set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Qt5::${mgl_qt5_lib}) + find_package(Qt5${mgl_qt5_lib} REQUIRED) + if(NOT Qt5${mgl_qt5_lib}_FOUND) + message(SEND_ERROR "Couldn't find Qt5 ${mgl_qt5_lib} library.") + endif(NOT Qt5${mgl_qt5_lib}_FOUND) +endforeach(mgl_qt5_lib) + set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 75a0465..d216bef 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,9 +1,5 @@ -if(MGL_HAVE_GSL) - include_directories(${GSL_INCLUDE_DIR}) -endif(MGL_HAVE_GSL) - add_executable(mgl_example wnd_samples.cpp full_test.cpp samples.cpp) -target_link_libraries(mgl_example mgl) +target_link_libraries(mgl_example mgl-static ${getopt_lib-static}) if(MGL_HAVE_FLTK) include_directories(${FLTK_INCLUDE_DIR}) @@ -31,19 +27,18 @@ if(QT_ENABLED) include(../cmake-qt4.txt) target_link_libraries(mgl_qt_example mgl-qt4) endif(enable-qt5) - add_executable(mgl_qgl_example wnd_samples.cpp qgl_example.cpp) - if(enable-qt5) - target_link_libraries(mgl_qgl_example mgl) - qt5_use_modules(mgl_qgl_example ${MGL_QT5_LIBS}) - else(enable-qt5) - target_link_libraries(mgl_qgl_example mgl) - qt4_use_modules(mgl_qgl_example ${MGL_QT4_LIBS}) - endif(enable-qt5) - + + if(MGL_HAVE_OPENGL) + add_executable(mgl_qgl_example wnd_samples.cpp qgl_example.cpp) + if(enable-qt5) + target_link_libraries(mgl_qgl_example mgl ${MGL_QT5_LIBS}) + else(enable-qt5) + target_link_libraries(mgl_qgl_example mgl ${MGL_QT4_LIBS}) + endif(enable-qt5) + endif(MGL_HAVE_OPENGL) endif(QT_ENABLED) if(MGL_HAVE_LTDL) - include_directories(${LTDL_INCLUDE_DIR}) add_library(mgl_module MODULE mgl_module.cpp) target_link_libraries(mgl_module mgl) # for compatibility with win32 endif(MGL_HAVE_LTDL) diff --git a/examples/FractInt.ifs b/examples/FractInt.ifs new file mode 100644 index 0000000..5503b66 --- /dev/null +++ b/examples/FractInt.ifs @@ -0,0 +1,158 @@ + + binary + { ; comment allowed here + ; and here + .5 .0 .0 .5 -2.563477 -0.000003 .333333 ; also comment allowed here + .5 .0 .0 .5 2.436544 -0.000003 .333333 + .0 -.5 .5 .0 4.873085 7.563492 .333333 + } + +coral{.307692 -.531469 -.461538 -.293706 5.401953 8.655175 .40 ; also comment + .307692 -.076923 .153846 -.447552 -1.295248 4.152990 .15 + .000000 .545455 .692308 -.195804 -4.893637 7.269794 .45 + } + +crystal { + .696970 -.481061 -.393939 -.662879 2.147003 10.310288 .747826 + .090909 -.443182 .515152 -.094697 4.286558 2.925762 .252174 + } + +dragon { + .824074 .281482 -.212346 .864198 -1.882290 -0.110607 .787473 + .088272 .520988 -.463889 -.377778 0.785360 8.095795 .212527 + } + +fern {0 0 0 .16 0 0 .01 + .85 .04 -.04 .85 0 1.6 .85 + .2 -.26 .23 .22 0 1.6 .07 + -.15 .28 .26 .24 0 .44 .07 + } + +3dfern (3D) { + .00 .00 0 .0 .18 .0 0 0.0 0.00 0 0.0 0 .01 + .85 .00 0 .0 .85 .1 0 -0.1 0.85 0 1.6 0 .85 + .20 -.20 0 .2 .20 .0 0 0.0 0.30 0 0.8 0 .07 + -.20 .20 0 .2 .20 .0 0 0.0 0.30 0 0.8 0 .07 + } + +floor { + .0 -.5 .5 .0 -1.732366 3.366182 .333333 + .5 .0 .0 .5 -0.027891 5.014877 .333333 + .0 .5 -.5 .0 1.620804 3.310401 .333333 + } + +koch3 { + .307692 -.000000 .000000 .294118 4.119164 1.604278 .151515 + .192308 -.205882 .653846 .088235 -0.688840 5.978916 .253788 + .192308 .205882 -.653846 .088235 0.668580 5.962514 .253788 + .307692 -.000000 .000000 .294118 -4.136530 1.604278 .151515 + .384615 -.000000 .000000 -.294118 -0.007718 2.941176 .189394 + } + +spiral { + .787879 -.424242 .242424 .859848 1.758647 1.408065 .895652 + -.121212 .257576 .151515 .053030 -6.721654 1.377236 .052174 + .181818 -.136364 .090909 .181818 6.086107 1.568035 .052174 + } + +swirl5 { + .745455 -.459091 .406061 .887121 1.460279 0.691072 .912675 + -.424242 -.065152 -.175758 -.218182 3.809567 6.741476 .087325 + } + +tree { + 0 0 0 .5 0 0 .05 + .42 -.42 .42 .42 0 .2 .4 + .42 .42 -.42 .42 0 .2 .4 + .1 0 0 .1 0 .2 .15 + } + +triangle { + .5 0 0 .5 0 0 .33 + .5 0 0 .5 0 1 .33 + .5 0 0 .5 1 1 .34 + } + +zigzag2 { + -.632407 -.614815 -.545370 .659259 3.840822 1.282321 .888128 + -.036111 .444444 .210185 .037037 2.071081 8.330552 .111872 + } + + +3dTetrahedron (3D) { ; by Alex Matulich + 0.50 0 0 0 0.50 0 0 0 0.50 0.00 0.00 1.00 0.25 + 0.50 0 0 0 0.50 0 0 0 0.50 0.00 0.87 -0.50 0.25 + 0.50 0 0 0 0.50 0 0 0 0.50 -0.87 -0.50 -0.50 0.25 + 0.50 0 0 0 0.50 0 0 0 0.50 0.87 -0.50 -0.50 0.25 +} +3d5Tetrahedron (3D) { ; by Alex Matulich + 0.44 0 0 0 0.44 0 0 0 0.44 0.00 0.00 1.00 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 0.00 0.87 -0.50 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 -0.87 -0.50 -0.50 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 0.87 -0.50 -0.50 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 0.00 0.00 0.00 0.20 +} +3dHexahedron (3D) { ; by Alex Matulich + 0.44 0 0 0 0.44 0 0 0 0.44 0.00 0.00 0.90 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 0.87 -0.50 0.00 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 -0.87 -0.50 0.00 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 0.00 1.00 0.00 0.20 + 0.44 0 0 0 0.44 0 0 0 0.44 0.00 0.00 -0.90 0.20 +} +3dCube (3d) { ; by Alex Matulich + 0.35 0 0 0 0.35 0 0 0 0.35 1.00 1.00 1.00 0.12 + 0.35 0 0 0 0.35 0 0 0 0.35 1.00 1.00 -1.00 0.13 + 0.35 0 0 0 0.35 0 0 0 0.35 1.00 -1.00 1.00 0.12 + 0.35 0 0 0 0.35 0 0 0 0.35 1.00 -1.00 -1.00 0.13 + 0.35 0 0 0 0.35 0 0 0 0.35 -1.00 1.00 1.00 0.12 + 0.35 0 0 0 0.35 0 0 0 0.35 -1.00 1.00 -1.00 0.13 + 0.35 0 0 0 0.35 0 0 0 0.35 -1.00 -1.00 1.00 0.12 + 0.35 0 0 0 0.35 0 0 0 0.35 -1.00 -1.00 -1.00 0.13 +} +3dOctahedron (3D) { ; by Alex Matulich + 0.40 0 0 0 0.40 0 0 0 0.40 0.00 0.00 1.00 0.17 + 0.40 0 0 0 0.40 0 0 0 0.40 1.00 0.00 0.00 0.16 + 0.40 0 0 0 0.40 0 0 0 0.40 0.00 1.00 0.00 0.17 + 0.40 0 0 0 0.40 0 0 0 0.40 -1.00 0.00 0.00 0.17 + 0.40 0 0 0 0.40 0 0 0 0.40 0.00 -1.00 0.00 0.16 + 0.40 0 0 0 0.40 0 0 0 0.40 0.00 0.00 -1.00 0.17 +} +3dDuodecahedron (3D) { ; by Alex Matulich + 0.28 0 0 0 0.28 0 0 0 0.28 0.00 0.00 0.96 0.09 + 0.28 0 0 0 0.28 0 0 0 0.28 0.00 0.85 0.43 0.08 + 0.28 0 0 0 0.28 0 0 0 0.28 0.81 0.26 0.43 0.08 + 0.28 0 0 0 0.28 0 0 0 0.28 -0.81 0.26 0.43 0.09 + 0.28 0 0 0 0.28 0 0 0 0.28 0.50 -0.69 0.43 0.08 + 0.28 0 0 0 0.28 0 0 0 0.28 -0.50 -0.69 0.43 0.08 + 0.28 0 0 0 0.28 0 0 0 0.28 0.50 0.69 -0.43 0.09 + 0.28 0 0 0 0.28 0 0 0 0.28 -0.50 0.69 -0.43 0.08 + 0.28 0 0 0 0.28 0 0 0 0.28 0.81 -0.26 -0.43 0.08 + 0.28 0 0 0 0.28 0 0 0 0.28 -0.81 -0.26 -0.43 0.09 + 0.28 0 0 0 0.28 0 0 0 0.28 0.00 -0.85 -0.43 0.08 + 0.28 0 0 0 0.28 0 0 0 0.28 0.00 0.00 -0.96 0.08 +} + +fractint { ; by Pieter Branderhorst + 0.00 -0.11 0.22 0.00 -6.25 4.84 0.06 + 0.11 0.02 0.00 0.11 -6.30 5.99 0.03 + 0.06 0.02 0.00 0.10 -6.25 4.51 0.02 + 0.00 -0.11 0.22 0.00 -4.34 4.84 0.06 + 0.08 0.00 0.00 0.11 -4.50 5.99 0.02 + 0.00 0.11 -0.08 0.00 -4.30 6.15 0.02 + -0.09 0.00 -0.01 -0.13 -4.15 5.94 0.02 + 0.06 0.11 -0.13 0.00 -4.69 4.15 0.04 + 0.03 -0.11 0.23 0.11 -2.26 4.43 0.07 + 0.03 0.11 -0.25 0.00 -2.57 4.99 0.07 + 0.06 0.00 0.00 0.11 -2.40 4.46 0.02 + 0.00 0.11 -0.19 0.00 -1.62 4.99 0.06 + 0.09 -0.01 0.00 0.10 -0.58 2.96 0.03 + -0.09 0.00 0.00 -0.11 -0.65 7.10 0.03 + 0.12 0.00 -0.00 0.11 1.24 6.00 0.03 + 0.00 0.11 -0.22 0.00 0.68 4.80 0.06 + -0.12 0.00 0.00 -0.13 6.17 7.18 0.03 + 0.00 -0.11 0.22 0.00 6.78 4.84 0.06 + 0.00 0.08 -0.25 0.02 2.21 4.95 0.07 + 0.00 -0.11 0.22 0.00 4.10 4.84 0.06 + 0.00 -0.11 0.22 0.00 5.25 5.23 0.06 + 0.08 0.11 -0.25 0.00 3.57 4.99 0.08 + } diff --git a/examples/fltk_example.cpp b/examples/fltk_example.cpp index 6595211..61d39c9 100644 --- a/examples/fltk_example.cpp +++ b/examples/fltk_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * fltk_example.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -125,20 +125,22 @@ int main(int argc,char **argv) else printf("You may specify argument '1', '2', '3', 'd' for viewing examples of 1d, 2d, 3d, dual plotting,\nor 'm' for multi-threading sample.\n"); switch(key) { - case '0': gr = new mglFLTK((mglDraw *)NULL,"1D plots"); break; + case '0': gr = new mglFLTK((mglDraw *)NULL,"1D plots"); + gr->Rotate(40,60); gr->Box(); gr->Light(true); + gr->FSurf("sin(4*pi*x*y)"); gr->Update(); break; case '1': gr = new mglFLTK(sample_1,"1D plots"); break; case '2': gr = new mglFLTK(sample_2,"2D plots"); break; case '3': gr = new mglFLTK(sample_3,"3D plots"); break; case 'd': gr = new mglFLTK(sample_d,"Dual plots");break; case 't': gr = new mglFLTK(test_wnd,"Testing"); break; + case 'f': gr = new mglFLTK("Frame drawing"); + gr->NewFrame(); gr->Box(); gr->EndFrame(); break; #if MGL_HAVE_PTHR_WIDGET case 'm': gr = new mglFLTK(&dr,"Multi-threading test"); dr.SetWnd(gr); dr.Run(); break; #endif default: gr = new mglFLTK(sample,"Drop and waves"); break; } - if(key=='0') - { gr->Rotate(40,60); gr->Box(); gr->Light(true); gr->FSurf("sin(4*pi*x*y)"); gr->Update(); } gr->Run(); return 0; } #endif diff --git a/examples/full_test.cpp b/examples/full_test.cpp index acf8612..538dfba 100644 --- a/examples/full_test.cpp +++ b/examples/full_test.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * full_test.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -20,15 +20,14 @@ #include #include #include -#if !defined(_MSC_VER) && !defined(__BORLANDC__) #include -#endif #include "mgl2/mgl.h" #include "mgl2/font.h" #include "mgl2/eval.h" //----------------------------------------------------------------------------- -void mgl_create_cpp_font(HMGL gr, const wchar_t *how); +void MGL_EXPORT mgl_create_cpp_font(HMGL gr, const wchar_t *how); +long MGL_EXPORT mgl_check_tex_table(); //----------------------------------------------------------------------------- struct mglSample /// Structure for list of samples { @@ -75,7 +74,6 @@ void test(mglGraph *gr) return; } //----------------------------------------------------------------------------- -#if !defined(_MSC_VER) && !defined(__BORLANDC__) static struct option longopts[] = { { "big", no_argument, &big, 1 }, @@ -156,7 +154,6 @@ void usage() "--fexport - test most of output formats\n" ); } -#endif //----------------------------------------------------------------------------- void save(mglGraph *gr,const char *name,const char *suf="") { @@ -389,15 +386,6 @@ void smgl_fexport(mglGraph *gr) // test file export gr->ImportMGLD("fexport.mgld"); } //----------------------------------------------------------------------------- -extern mglTeXsymb mgl_tex_symb[]; -extern long mgl_tex_num; -int MGL_LOCAL_PURE mgl_tex_symb_cmp(const void *a, const void *b) -{ - const mglTeXsymb *aa = (const mglTeXsymb *)a; - const mglTeXsymb *bb = (const mglTeXsymb *)b; - return wcscmp(aa->tex, bb->tex); -} -//----------------------------------------------------------------------------- int main(int argc,char **argv) { mgl_suppress_warn(true); @@ -407,7 +395,6 @@ int main(int argc,char **argv) time_t st,en; time(&st); mglGraph *gr = NULL; mglSample *s=samp; -#if !defined(_MSC_VER) && !defined(__BORLANDC__) while(( ch = getopt_long_only(argc, argv, "", longopts, NULL)) != -1) switch(ch) { @@ -426,7 +413,6 @@ int main(int argc,char **argv) case '?': default: usage(); return 0; } -#endif if(dotest==1) printf("Global (before):%s\n",mglGlobalMess.c_str()); gr = new mglGraph; @@ -498,14 +484,7 @@ int main(int argc,char **argv) { smgl_fexport(gr); delete gr; return 0; } else if(dotest==5) { - long i=0; while(mgl_tex_symb[i].tex[0]) i++; - if(mgl_tex_num!=i) printf("real=%lu, set=%ld\n",i,mgl_tex_num); - for(long i=0;mgl_tex_symb[i].tex[0];i++) - { - mglTeXsymb tst, *rts; tst.tex = mgl_tex_symb[i].tex; - rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp); - if(!rts) printf("Bad '%ls' at %lu\n",mgl_tex_symb[i].tex,i); - } + mgl_check_tex_table(); delete gr; return 0; } diff --git a/examples/glut_example.cpp b/examples/glut_example.cpp index 1ae89b6..c921583 100644 --- a/examples/glut_example.cpp +++ b/examples/glut_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * glut_example.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * diff --git a/examples/qgl_example.cpp b/examples/qgl_example.cpp index c606a3a..77fa94b 100644 --- a/examples/qgl_example.cpp +++ b/examples/qgl_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * qt_example.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -19,6 +19,7 @@ ***************************************************************************/ #include "qgl_example.h" #include +//#include //----------------------------------------------------------------------------- int main(int argc, char *argv[]) { diff --git a/examples/qt_example.cpp b/examples/qt_example.cpp index 1b7a3b0..7d5e4ab 100644 --- a/examples/qt_example.cpp +++ b/examples/qt_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * qt_example.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -139,20 +139,22 @@ int main(int argc,char **argv) else printf("You may specify argument '1', '2', '3', 'd' for viewing examples of 1d, 2d, 3d, dual plotting,\nor 'm' for multi-threading sample.\n"); switch(key) { - case '0': gr = new mglQT((mglDraw *)NULL,"1D plots"); break; + case '0': gr = new mglQT((mglDraw *)NULL,"1D plots"); + gr->Rotate(40,60); gr->Box(); gr->Light(true); + gr->FSurf("sin(4*pi*x*y)"); gr->Update(); break; case '1': gr = new mglQT(sample_1,"1D plots"); break; case '2': gr = new mglQT(sample_2,"2D plots"); break; case '3': gr = new mglQT(sample_3,"3D plots"); break; case 'd': gr = new mglQT(sample_d,"Dual plots"); break; - case 't': gr = new mglQT(test_wnd,"Testing"); break; + case 't': gr = new mglQT(test_wnd,"Testing"); break; + case 'f': gr = new mglQT("Frame drawing"); + gr->NewFrame(); gr->Box(); gr->EndFrame(); break; #if MGL_HAVE_PTHR_WIDGET case 'm': gr = new mglQT(&dr,"Multi-threading test"); dr.SetWnd(gr); dr.Run(); break; #endif default: gr = new mglQT(sample,"Drop and waves"); break; } - if(key=='0') - { gr->Rotate(40,60); gr->Box(); gr->Light(true); gr->FSurf("sin(4*pi*x*y)"); gr->Update(); } gr->Run(); return 0; } #endif diff --git a/examples/samples.cpp b/examples/samples.cpp index 437990d..243f59a 100644 --- a/examples/samples.cpp +++ b/examples/samples.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * samples.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -105,7 +105,7 @@ void smgl_refill(mglGraph *gr) //----------------------------------------------------------------------------- const char *mmgl_indirect="subplot 1 1 0 '':title 'SubData vs Evaluate'\n" "new in 9 'x^3/1.1':plot in 'ko ':box\nnew arg 99 '4*x+4'\n" -"evaluate e in arg:plot e 'b.'; legend 'Evaluate'\n" +"evaluate e in arg off:plot e 'b.'; legend 'Evaluate'\n" "subdata s in arg:plot s 'r.';legend 'SubData'\nlegend 2"; void smgl_indirect(mglGraph *gr) { @@ -113,7 +113,7 @@ void smgl_indirect(mglGraph *gr) mglData in(9), arg(99), e, s; gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4"); gr->Plot(in,"ko "); gr->Box(); - e = in.Evaluate(arg); gr->Plot(e,"b.","legend 'Evaluate'"); + e = in.Evaluate(arg,false); gr->Plot(e,"b.","legend 'Evaluate'"); s = in.SubData(arg); gr->Plot(s,"r.","legend 'SubData'"); gr->Legend(2); } @@ -1979,9 +1979,11 @@ void smgl_cones(mglGraph *gr) gr->Rotate(50,60); gr->Box(); gr->Cones(ys,"4"); } //----------------------------------------------------------------------------- -const char *mmgl_aspect="subplot 2 2 0:box:text -1 1.1 'Just box' ':L'\ninplot 0.2 0.5 0.7 1 off:box:text 0 1.2 'InPlot example'\n" -"subplot 2 2 1:title 'Rotate only':rotate 50 60:box\nsubplot 2 2 2:title 'Rotate and Aspect':rotate 50 60:aspect 1 1 2:box\n" -"subplot 2 2 3:title 'Aspect in other direction':rotate 50 60:aspect 1 2 2:box"; +const char *mmgl_aspect="subplot 2 2 0:box:text -1 1.1 'Just box' ':L'\n" +"inplot 0.2 0.5 0.7 1 off:box:text 0 1.2 'InPlot example'\n" +"subplot 2 2 1:title 'Rotate only':rotate 50 60:box\n" +"subplot 2 2 2:title 'Rotate and Aspect':rotate 50 60:aspect 1 1 2:box\n" +"subplot 2 2 3:title 'Shear':box 'c':shear 0.2 0.1:box"; void smgl_aspect(mglGraph *gr) // transformation { gr->SubPlot(2,2,0); gr->Box(); @@ -1992,18 +1994,20 @@ void smgl_aspect(mglGraph *gr) // transformation gr->Rotate(50,60); gr->Box(); gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect"); gr->Rotate(50,60); gr->Aspect(1,1,2); gr->Box(); - gr->SubPlot(2,2,3); gr->Title("Aspect in other direction"); - gr->Rotate(50,60); gr->Aspect(1,2,2); gr->Box(); + gr->SubPlot(2,2,3); gr->Title("Shear"); + gr->Box("c"); gr->Shear(0.2,0.1); gr->Box(); } //----------------------------------------------------------------------------- -const char *mmgl_inplot="subplot 3 2 0:title 'StickPlot'\nstickplot 3 0 20 30:box 'r':text 0 0 '0' 'r'\n" -"stickplot 3 1 20 30:box 'g':text 0 0 '1' 'g'\nstickplot 3 2 20 30:box 'b':text 0 0 '2' 'b'\n" +const char *mmgl_inplot="subplot 3 2 0:title 'StickPlot'\nstickplot 3 0 20 30:box 'r':text 0 0 0 '0' 'r'\n" +"stickplot 3 1 20 30:box 'g':text 0 0 0 '1' 'g'\nstickplot 3 2 20 30:box 'b':text 0 9 0 '2' 'b'\n" "subplot 3 2 3 '':title 'ColumnPlot'\ncolumnplot 3 0:box 'r':text 0 0 '0' 'r'\n" "columnplot 3 1:box 'g':text 0 0 '1' 'g'\ncolumnplot 3 2:box 'b':text 0 0 '2' 'b'\n" "subplot 3 2 4 '':title 'GridPlot'\ngridplot 2 2 0:box 'r':text 0 0 '0' 'r'\n" "gridplot 2 2 1:box 'g':text 0 0 '1' 'g'\ngridplot 2 2 2:box 'b':text 0 0 '2' 'b'\n" "gridplot 2 2 3:box 'm':text 0 0 '3' 'm'\nsubplot 3 2 5 '':title 'InPlot':box\n" -"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot':box"; +"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot and ShearPlot':box\n" +"shearplot 3 0 0.2 0.1:box 'r':text 0 0 '0' 'r'\nshearplot 3 1 0.2 0.1:box 'g':text 0 0 '1' 'g'\n" +"shearplot 3 2 0.2 0.1:box 'b':text 0 0 '2' 'b'"; void smgl_inplot(mglGraph *gr) { gr->SubPlot(3,2,0); gr->Title("StickPlot"); @@ -2021,7 +2025,10 @@ void smgl_inplot(mglGraph *gr) gr->GridPlot(2, 2, 3); gr->Box("m"); gr->Puts(mglPoint(0),"3","m"); gr->SubPlot(3,2,5,""); gr->Title("InPlot"); gr->Box(); gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r"); - gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot"); gr->Box(); + gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot and ShearPlot"); gr->Box(); + gr->ShearPlot(3, 0, 0.2, 0.1); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); + gr->ShearPlot(3, 1, 0.2, 0.1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); + gr->ShearPlot(3, 2, 0.2, 0.1); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); } //----------------------------------------------------------------------------- const char *mmgl_combined="call 'prepare2v'\ncall 'prepare3d'\nnew v 10:fill v -0.5 1:copy d sqrt(a^2+b^2)\n" diff --git a/examples/wnd_samples.cpp b/examples/wnd_samples.cpp index 8506f40..bea8abe 100644 --- a/examples/wnd_samples.cpp +++ b/examples/wnd_samples.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * wnd_sample.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * diff --git a/examples/wx_example.cpp b/examples/wx_example.cpp index 2c064ff..34b1c72 100644 --- a/examples/wx_example.cpp +++ b/examples/wx_example.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * wx_example.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * diff --git a/fonts/CMakeLists.txt b/fonts/CMakeLists.txt index 28ea013..f24af56 100644 --- a/fonts/CMakeLists.txt +++ b/fonts/CMakeLists.txt @@ -1,6 +1,5 @@ - add_executable(make_bin make_bin.cpp) -target_link_libraries(make_bin mgl) +target_link_libraries(make_bin mgl-static ${getopt_lib-static}) set(MGL_FONTS STIX adventor bonum cursor heroscn heros pagella schola termes) set(MGL_FONTS_BIN ) diff --git a/fonts/make_bin.cpp b/fonts/make_bin.cpp index bb4aada..600745f 100644 --- a/fonts/make_bin.cpp +++ b/fonts/make_bin.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * make_bin.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * diff --git a/include/mgl2/Fl_MathGL.h b/include/mgl2/Fl_MathGL.h index 387a347..372bae2 100644 --- a/include/mgl2/Fl_MathGL.h +++ b/include/mgl2/Fl_MathGL.h @@ -1,6 +1,6 @@ /*************************************************************************** * Fl_MathGL.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/abstract.h b/include/mgl2/abstract.h index 48cc733..861aeb1 100644 --- a/include/mgl2/abstract.h +++ b/include/mgl2/abstract.h @@ -1,6 +1,6 @@ /*************************************************************************** * abstract.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -23,7 +23,6 @@ #include "mgl2/define.h" //----------------------------------------------------------------------------- #ifdef __cplusplus -#include #include "mgl2/type.h" #define MGL_TO_WCS(str,code) if(str && *str){size_t s=mbstowcs(0,str,0); wchar_t *wcs=new wchar_t[s+1]; mbstowcs(wcs,str,s); wcs[s]=0; code; delete []wcs;}else{const wchar_t *wcs=L""; code;} //----------------------------------------------------------------------------- @@ -135,6 +134,10 @@ mreal MGL_EXPORT mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); mreal MGL_EXPORT mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); mreal MGL_EXPORT mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); +/// Internal function for (un-)locking mutex in mglStack +void MGL_EXPORT mgl_mutex_lock(void *); +void MGL_EXPORT mgl_mutex_unlock(void *); + //----------------------------------------------------------------------------- /// Callback function for asking user a question. Result shouldn't exceed 1024. extern MGL_EXPORT void (*mgl_ask_func)(const wchar_t *quest, wchar_t *res); @@ -152,7 +155,7 @@ public: mglDataA() { temp=false; func=0; o=0; } virtual ~mglDataA() { if(func) func(o); } - virtual void set_v(mreal val, long i,long j=0,long k=0) {} + virtual void set_v(mreal /*val*/, long /*i*/,long /*j*/=0,long /*k*/=0) {} /// Get the interpolated value and its derivatives in given data cell without border checking virtual mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const =0; /// Get the interpolated value in given data cell without border checking @@ -164,7 +167,10 @@ public: inline mreal linearD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { return mgl_data_linear_ext(this,x,y,z,dx,dy,dz); } virtual mreal v(long i,long j=0,long k=0) const = 0; - virtual mreal vthr(long i) const = 0; + virtual mreal vthr(long i) const + { return v(i%GetNx(), (i/GetNx())%GetNy(), i/(GetNx()*GetNy())); } + virtual dual vc(long i,long j=0,long k=0) const { return v(i,j,k); } + virtual dual vcthr(long i) const { return vthr(i); } virtual long GetNx() const = 0; virtual long GetNy() const = 0; virtual long GetNz() const = 0; @@ -236,6 +242,34 @@ public: /// Find if any nonzero value of formula inline bool FindAny(const char *cond) const { return mgl_data_find_any(this,cond); } + + /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] + inline mreal Spline(mreal x,mreal y=0,mreal z=0) const + { return value(x,y,z); } + /// Interpolate by cubic spline the data to given point x,\a y,\a z which normalized in range [0, 1] + inline mreal Spline1(mreal x,mreal y=0,mreal z=0) const + { return value(x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1)); } + /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] + inline mreal Spline(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { return valueD(x,y,z, &(dif.x),&(dif.y), &(dif.z)); } + /// Interpolate by cubic spline the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] + inline mreal Spline1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { mreal res=valueD(x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1), &(dif.x),&(dif.y), &(dif.z)); + dif.x*=GetNx()>1?GetNx()-1:1; dif.y*=GetNy()>1?GetNy()-1:1; dif.z*=GetNz()>1?GetNz()-1:1; return res; } + + /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] + inline mreal Linear(mreal x,mreal y=0,mreal z=0) const + { return mgl_data_linear_ext(this,x,y,z,0,0,0); } + /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1] + inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const + { return mgl_data_linear_ext(this,x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1),0,0,0); } + /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] + inline mreal Linear(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { return mgl_data_linear_ext(this,x,y,z, &(dif.x),&(dif.y), &(dif.z)); } + /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] + inline mreal Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const + { mreal res=mgl_data_linear_ext(this,x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1), &(dif.x),&(dif.y), &(dif.z)); + dif.x*=GetNx()>1?GetNx()-1:1; dif.y*=GetNy()>1?GetNy()-1:1; dif.z*=GetNz()>1?GetNz()-1:1; return res; } }; //----------------------------------------------------------------------------- /// Structure for color ID diff --git a/include/mgl2/addon.h b/include/mgl2/addon.h index 801054c..2e9d98f 100644 --- a/include/mgl2/addon.h +++ b/include/mgl2/addon.h @@ -1,6 +1,6 @@ /*************************************************************************** * addon.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/base.h b/include/mgl2/base.h index 8ef2c3f..a455625 100644 --- a/include/mgl2/base.h +++ b/include/mgl2/base.h @@ -1,6 +1,6 @@ /*************************************************************************** * base.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -23,8 +23,6 @@ #include "mgl2/abstract.h" #ifdef __cplusplus -#include -#include #if (MGL_HAVE_PTHREAD|MGL_HAVE_PTHR_WIDGET) #include @@ -35,9 +33,6 @@ #else #define MGL_PUSH(a,v,m) a.push_back(v); #endif -#if MGL_HAVE_OMP -#include -#endif //----------------------------------------------------------------------------- inline mreal mgl_d(mreal v,mreal v1,mreal v2) { return v2!=v1?(v-v1)/(v2-v1):NAN; } //----------------------------------------------------------------------------- @@ -59,11 +54,11 @@ public: mglStack(const mglStack &st) { np=st.np; dat = (T**)malloc(np*sizeof(T*)); pb=st.pb; m=n=0; reserve(st.n); - for(size_t i=0;i>pb); if(num>np) { dat = (T**)realloc(dat, num*sizeof(T*)); np=num; } - for(size_t i=m;i>pb; return dat[d][i-(d<>pb; return dat[d][i-(d< &operator=(const mglStack &st) { pb=st.pb; clear(); reserve(st.n); - for(size_t i=0;i; +template class MGL_EXPORT mglStack; +template class MGL_EXPORT std::vector; +template class MGL_EXPORT std::vector; +template class MGL_EXPORT std::vector; +template class MGL_EXPORT std::vector; +template class MGL_EXPORT std::vector; +template class MGL_EXPORT std::vector; +template class MGL_EXPORT mglStack; +#endif +//----------------------------------------------------------------------------- /// Base class for canvas which handle all basic drawing class MGL_EXPORT mglBase { @@ -336,7 +332,7 @@ public: std::string Mess; ///< Buffer for receiving messages int ObjId; ///< object id for mglPrim int HighId; ///< object id to be highlited - mglStack Grp; ///< List of groups with names -- need for export + std::vector Grp; ///< List of groups with names -- need for export mglStack Act; ///< Position of active points std::string PlotId; ///< Id of plot for saving filename (in GLUT window for example) @@ -605,14 +601,12 @@ protected: std::vector Ptx; ///< Text labels for mglPrim std::vector Leg; ///< Text labels for legend std::vector Glf; ///< Glyphs data - mglStack Txt; ///< Pointer to textures + std::vector Txt; ///< Pointer to textures #if MGL_HAVE_PTHREAD pthread_mutex_t mutexPnt, mutexTxt, mutexLeg, mutexGlf, mutexAct, mutexDrw; pthread_mutex_t mutexSub, mutexPrm, mutexPtx, mutexStk, mutexGrp, mutexClf; #endif -#if MGL_HAVE_OMP - omp_lock_t lockClf; -#endif + void *lockClf; ///< pointer to mutex for mglStack int TernAxis; ///< Flag that Ternary axis is used unsigned PDef; ///< Pen bit mask diff --git a/include/mgl2/base_cf.h b/include/mgl2/base_cf.h index 786afa4..9bcb771 100644 --- a/include/mgl2/base_cf.h +++ b/include/mgl2/base_cf.h @@ -1,6 +1,6 @@ /*************************************************************************** * base_cf.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/canvas.h b/include/mgl2/canvas.h index 924147c..d8c1db6 100644 --- a/include/mgl2/canvas.h +++ b/include/mgl2/canvas.h @@ -1,6 +1,6 @@ /*************************************************************************** * canvas.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -99,8 +99,11 @@ struct MGL_EXPORT mglDrawDat std::vector Sub; ///< InPlot regions std::vector Ptx; ///< Text labels for mglPrim std::vector Glf; ///< Glyphs data - mglStack Txt; ///< Pointer to textures + std::vector Txt; ///< Pointer to textures }; +#if defined(_MSC_VER) +template class MGL_EXPORT std::vector; +#endif //----------------------------------------------------------------------------- union mglRGBA { uint32_t c; unsigned char r[4]; }; //----------------------------------------------------------------------------- @@ -143,6 +146,8 @@ using mglBase::Light; /// Put further plotting in cell of stick rotated on angles tet, phi void StickPlot(int num, int i, mreal tet, mreal phi); + /// Put further plotting in cell of stick sheared on sx, sy + void ShearPlot(int num, int i, mreal sx, mreal sy, mreal xd, mreal yd); /// Put further plotting in some region of whole frame surface. inline void InPlot(mreal x1,mreal x2,mreal y1,mreal y2,bool rel=true) { InPlot(B,x1,x2,y1,y2,rel); } @@ -153,6 +158,8 @@ using mglBase::Light; void Title(const wchar_t *title,const char *stl="#",mreal size=-2); /// Set aspect ratio for further plotting. void Aspect(mreal Ax,mreal Ay,mreal Az); + /// Shear a further plotting. + void Shear(mreal Sx,mreal Sy); /// Rotate a further plotting. void Rotate(mreal TetX,mreal TetZ,mreal TetY=0); /// Rotate a further plotting around vector {x,y,z}. diff --git a/include/mgl2/canvas_cf.h b/include/mgl2/canvas_cf.h index e648164..91fddea 100644 --- a/include/mgl2/canvas_cf.h +++ b/include/mgl2/canvas_cf.h @@ -1,6 +1,6 @@ /*************************************************************************** * canvas_cf.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -388,6 +388,9 @@ void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *kind); /// Set the transparency on/off. void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable); void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable); +/// Set the gray-scale mode on/off. +void MGL_EXPORT mgl_set_gray(HMGL gr, int enable); +void MGL_EXPORT mgl_set_gray_(uintptr_t *gr, int *enable); /// Set the fog distance or switch it off (if d=0). void MGL_EXPORT mgl_set_fog(HMGL gr, double d, double dz); void MGL_EXPORT mgl_set_fog_(uintptr_t *gr, mreal *dist, mreal *dz); @@ -479,6 +482,9 @@ void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d) /// Put further plotting in cell of stick rotated on angles tet, phi. void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi); void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi); +/// Put further plotting in cell of stick sheared on sx, sy. +void MGL_EXPORT mgl_shearplot(HMGL gr, int num, int ind, double sx, double sy, double xd, double yd); +void MGL_EXPORT mgl_shearplot_(uintptr_t *gr, int *num, int *i, mreal *sy, mreal *sx, mreal *xd, mreal *yd); /// Add title for current subplot/inplot. /** Style '#' draw box around the title. */ void MGL_EXPORT mgl_title(HMGL gr, const char *title, const char *stl, double size); @@ -491,6 +497,9 @@ void MGL_EXPORT mgl_set_plotfactor_(uintptr_t *gr, mreal *val); /// Set aspect ratio for further plotting. void MGL_EXPORT mgl_aspect(HMGL gr, double Ax,double Ay,double Az); void MGL_EXPORT mgl_aspect_(uintptr_t *gr, mreal *Ax, mreal *Ay, mreal *Az); +/// Set aspect ratio for further plotting. +void MGL_EXPORT mgl_shear(HMGL gr, double Sx,double Sz); +void MGL_EXPORT mgl_shear_(uintptr_t *gr, mreal *Sx, mreal *Sy); /// Rotate a further plotting. void MGL_EXPORT mgl_rotate(HMGL gr, double TetX,double TetZ,double TetY); void MGL_EXPORT mgl_rotate_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY); @@ -641,6 +650,9 @@ void MGL_EXPORT mgl_parser_allow_dll_call_(uintptr_t* p, int *a); /// Set flag to stop script parsing void MGL_EXPORT mgl_parser_stop(HMPR p); void MGL_EXPORT mgl_parser_stop_(uintptr_t* p); +/// Set variant of argument(s) separated by '?' to be used +void MGL_EXPORT mgl_parser_variant(HMPR p, int var); +void MGL_EXPORT mgl_parser_variant_(uintptr_t* p, int *var); /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot, /// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program diff --git a/include/mgl2/canvas_wnd.h b/include/mgl2/canvas_wnd.h index b157d6d..19091ed 100644 --- a/include/mgl2/canvas_wnd.h +++ b/include/mgl2/canvas_wnd.h @@ -1,6 +1,6 @@ /*************************************************************************** * canvas_wnd.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/cont.h b/include/mgl2/cont.h index a0367df..bd3b91c 100644 --- a/include/mgl2/cont.h +++ b/include/mgl2/cont.h @@ -1,6 +1,6 @@ /*************************************************************************** * cont.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/data.h b/include/mgl2/data.h index 834ca26..462ec83 100644 --- a/include/mgl2/data.h +++ b/include/mgl2/data.h @@ -1,6 +1,6 @@ /*************************************************************************** * data.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -23,8 +23,6 @@ #include "mgl2/data_cf.h" #include "mgl2/pde.h" //----------------------------------------------------------------------------- -#include -#include #include //----------------------------------------------------------------------------- mreal MGL_EXPORT mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); @@ -135,9 +133,9 @@ using mglDataA::Momentum; { if(d.size()>0) { Create(d.size()); for(long i=0;i &d) - { if(d.size()>0) Set(&(a[0]),d.size()); else Create(1); } + { if(d.size()>0) Set(&(d[0]),d.size()); else Create(1); } inline void Set(const std::vector &d) - { if(d.size()>0) Set(&(a[0]),d.size()); else Create(1); } + { if(d.size()>0) Set(&(d[0]),d.size()); else Create(1); } /// Allocate memory and set data from variable argument list of double values inline void SetList(long n, ...) { @@ -364,6 +362,9 @@ using mglDataA::Momentum; /// Normalize the data to range [v1,v2] slice by slice inline void NormSl(mreal v1=0,mreal v2=1,char dir='z',bool keep_en=true,bool sym=false) { mgl_data_norm_slice(this,v1,v2,dir,keep_en,sym); } + /// Limit the data to be inside [-v,v], keeping the original sign + inline void Limit(mreal v) + { mgl_data_limit(this, v); } /// Apply Hankel transform inline void Hankel(const char *dir) { mgl_data_hankel(this,dir); } @@ -392,34 +393,6 @@ using mglDataA::Momentum; inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } - /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] - inline mreal Spline(mreal x,mreal y=0,mreal z=0) const - { return value(x,y,z); } - /// Interpolate by cubic spline the data to given point x,\a y,\a z which normalized in range [0, 1] - inline mreal Spline1(mreal x,mreal y=0,mreal z=0) const - { return value(x*(nx-1),y*(ny-1),z*(nz-1)); } - /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] - inline mreal Linear(mreal x,mreal y=0,mreal z=0) const - { return mgl_data_linear_ext(this,x,y,z,0,0,0); } - /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1] - inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const - { return mgl_data_linear_ext(this,x*(nx-1),y*(ny-1),z*(nz-1),0,0,0); } - - /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] - inline mreal Spline(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const - { return valueD(x,y,z, &(dif.x),&(dif.y), &(dif.z)); } - /// Interpolate by cubic spline the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] - inline mreal Spline1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const - { mreal res=valueD(x*(nx-1),y*(ny-1),z*(nz-1), &(dif.x),&(dif.y), &(dif.z)); - dif.x*=nx>1?nx-1:1; dif.y*=ny>1?ny-1:1; dif.z*=nz>1?nz-1:1; return res; } - /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] - inline mreal Linear(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const - { return mgl_data_linear_ext(this,x,y,z, &(dif.x),&(dif.y), &(dif.z)); } - /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] - inline mreal Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const - { mreal res=mgl_data_linear_ext(this,x*(nx-1),y*(ny-1),z*(nz-1), &(dif.x),&(dif.y), &(dif.z)); - dif.x*=nx>1?nx-1:1; dif.y*=ny>1?ny-1:1; dif.z*=nz>1?nz-1:1; return res; } - /// Copy data from other mglData variable inline const mglDataA &operator=(const mglDataA &d) { if(this!=&d) mgl_data_set(this,&d); return d; } @@ -542,6 +515,16 @@ inline mglData mglRay(const char *ham, mglPoint r0, mglPoint p0, mreal dt=0.1, m /// Saves result of ODE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini inline mglData mglODE(const char *df, const char *var, const mglDataA &ini, mreal dt=0.1, mreal tmax=10) { return mglData(true, mgl_ode_solve_str(df,var, &ini, dt, tmax)); } +//----------------------------------------------------------------------------- +/// Get array as solution of tridiagonal system of equations a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] +/** String \a how may contain: + * 'x', 'y', 'z' for solving along x-,y-,z-directions, or + * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), + * 'c' for using periodical boundary conditions, + * 'd' for diffraction/diffuse calculation. */ +inline mglData mglTridMat(const mglDataA &A, const mglDataA &B, const mglDataA &C, const mglDataA &D, const char *how) +{ return mglData(true, mgl_data_tridmat(&A, &B, &C, &D, how)); } +//----------------------------------------------------------------------------- /// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du inline mglData mglJacobian(const mglDataA &x, const mglDataA &y) { return mglData(true, mgl_jacobian_2d(&x, &y)); } @@ -559,6 +542,16 @@ inline mglData mglIFS2d(const mglDataA &A, long n, long skip=20) /// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) generated by A inline mglData mglIFS3d(const mglDataA &A, long n, long skip=20) { return mglData(true,mgl_data_ifs_3d(&A,n,skip)); } +/// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) defined in *.ifs file 'fname' and named as 'name' +inline mglData mglIFSfile(const char *fname, const char *name, long n, long skip=20) +{ return mglData(true,mgl_data_ifs_file(fname,name,n,skip)); } +/// Get array which is n-th pairs {x[i],y[i]} for flame fractal generated by A with functions F +/// Get array which is n-th pairs {x[i],y[i]} for Flame fractal generated by A with functions F +/** NOTE: A.nx must be >= 7 and F.nx >= 2 and F.nz=A.ny. + * F[0,i,j] denote function id. F[1,i,j] give function weight, F(2:5,i,j) provide function parameters. + * Resulting point is {xnew,ynew} = sum_i F[1,i,j]*F[0,i,j]{IFS2d(A[j]){x,y}}. */ +inline mglData mglFlame2d(const mglDataA &A, const mglDataA &F, long n, long skip=20) +{ return mglData(true,mgl_data_flame_2d(&A,&F,n,skip)); } //----------------------------------------------------------------------------- /// Get sub-array of the data with given fixed indexes inline mglData mglSubData(const mglDataA &dat, long xx, long yy=-1, long zz=-1) @@ -882,10 +875,10 @@ public: { ind = i; s = name; } /// Get the interpolated value and its derivatives in given data cell without border checking - mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const + mreal valueD(mreal x,mreal y=0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { if(dz) *dz=0; return dat.valueD(ind,x,y,0,dx,dy); } /// Get the interpolated value in given data cell without border checking - mreal value(mreal x,mreal y=0,mreal z=0) const + mreal value(mreal x,mreal y=0,mreal =0) const { return dat.value(ind,x,y); } /// Get the value in given cell of the data without border checking mreal v(long i,long j=0,long =0) const @@ -929,10 +922,10 @@ public: { ind = i; s = name; } /// Get the interpolated value and its derivatives in given data cell without border checking - mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const + mreal valueD(mreal x,mreal =0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { if(dy) *dy=0; if(dz) *dz=0; return dat.valueD(x,ind,0,dx); } /// Get the interpolated value in given data cell without border checking - mreal value(mreal x,mreal y=0,mreal z=0) const + mreal value(mreal x,mreal =0,mreal =0) const { return dat.value(x,ind,0); } /// Get the value in given cell of the data without border checking mreal v(long i,long =0,long =0) const @@ -940,9 +933,9 @@ public: mreal vthr(long i) const { return dat.vthr(i+dat.GetNx()*ind); } // add for speeding up !!! - mreal dvx(long i,long j=0,long =0) const + mreal dvx(long i,long =0,long =0) const { return dat.dvx(i,ind,0); } - mreal dvy(long i,long j=0,long =0) const + mreal dvy(long ,long =0,long =0) const { return 0; } mreal dvz(long ,long =0,long =0) const { return 0; } @@ -967,21 +960,21 @@ public: const std::vector &operator=(const std::vector &st) { dat = st; return st; } /// Get the interpolated value and its derivatives in given data cell without border checking - mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const + mreal valueD(mreal x,mreal =0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { return mglSpline3(dat.data(),dat.size(),1,1,x,0,0,dx,dy,dz); } /// Get the interpolated value in given data cell without border checking - mreal value(mreal x,mreal y=0,mreal z=0) const + mreal value(mreal x,mreal =0,mreal =0) const { return mglSpline3s(dat.data(),dat.size(),1,1,x,0,0); } - mreal v(long i,long j=0,long k=0) const { return dat[i]; } + mreal v(long i,long =0,long =0) const { return dat[i]; } mreal vthr(long i) const { return dat[i]; }; long GetNx() const { return dat.size(); } long GetNy() const { return 1; } long GetNz() const { return 1; } - mreal dvx(long i,long j=0,long k=0) const + mreal dvx(long i,long =0,long =0) const { return i>0? (i * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -133,11 +133,14 @@ void MGL_EXPORT mgl_data_create_(uintptr_t *dat, int *nx,int *ny,int *nz); void MGL_EXPORT mgl_data_transpose(HMDT dat, const char *dim); void MGL_EXPORT mgl_data_transpose_(uintptr_t *dat, const char *dim,int); /// Normalize the data to range [v1,v2] -void MGL_EXPORT mgl_data_norm(HMDT dat, mreal v1,mreal v2,long sym,long dim); +void MGL_EXPORT mgl_data_norm(HMDT dat, mreal v1,mreal v2,int sym,long dim); void MGL_EXPORT mgl_data_norm_(uintptr_t *dat, mreal *v1,mreal *v2,int *sym,int *dim); /// Normalize the data to range [v1,v2] slice by slice void MGL_EXPORT mgl_data_norm_slice(HMDT dat, mreal v1,mreal v2,char dir,long keep_en,long sym); void MGL_EXPORT mgl_data_norm_slice_(uintptr_t *dat, mreal *v1,mreal *v2,char *dir,int *keep_en,int *sym,int l); +/// Limit the data to be inside [-v,v], keeping the original sign +void MGL_EXPORT mgl_data_limit(HMDT dat, mreal v); +void MGL_EXPORT mgl_data_limit_(uintptr_t *dat, mreal *v); /// Get sub-array of the data with given fixed indexes HMDT MGL_EXPORT mgl_data_subdata(HCDT dat, long xx,long yy,long zz); uintptr_t MGL_EXPORT mgl_data_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz); @@ -201,6 +204,39 @@ uintptr_t MGL_EXPORT mgl_data_ifs_2d_(uintptr_t *A, long *n, long *skip); /** NOTE: A.nx must be >= 13. */ HMDT MGL_EXPORT mgl_data_ifs_3d(HCDT A, long n, long skip); uintptr_t MGL_EXPORT mgl_data_ifs_3d_(uintptr_t *A, long *n, long *skip); +/// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) defined in *.ifs file 'fname' and named as 'name' +HMDT MGL_EXPORT mgl_data_ifs_file(const char *fname, const char *name, long n, long skip); +uintptr_t mgl_data_ifs_file_(const char *fname, const char *name, long *n, long *skip,int l,int m); +/// Codes for flame fractal functions +enum { + mglFlameLinear=0, mglFlameSin, mglFlameSphere, mglFlameSwirl, mglFlameHorseshoe, + mglFlamePolar, mglFlameHandkerchief, mglFlameHeart, mglFlameDisk, mglFlameSpiral, + mglFlameHyperbolic, mglFlameDiamond, mglFlameEx, mglFlameJulia, mglFlameBent, + mglFlameWaves, mglFlameFishEye, mglFlamePopcorn, mglFlameExponent, mglFlamePower, + mglFlameCos, mglFlameRings, mglFlameFan, mglFlameBlob, mglFlamePdj, + mglFlameFan2, mglFlameRings2, mglFlameEyefish, mglFlameBubble, mglFlameCylinder, + mglFlamePerspective, mglFlameNoise, mglFlameJuliaN, mglFlameJuliaScope, mglFlameBlur, + mglFlameGaussian, mglFlameRadialBlur, mglFlamePie, mglFlameNgon, mglFlameCurl, + mglFlameRectangles, mglFlameArch, mglFlameTangent, mglFlameSquare, mglFlameRays, + mglFlameBlade, mglFlameSecant, mglFlameTwintrian, mglFlameCross, mglFlameLAST +}; +/// Get array which is n-th pairs {x[i],y[i]} for Flame fractal generated by A with functions F +/** NOTE: A.nx must be >= 7 and F.nx >= 2 and F.nz=A.ny. + * F[0,i,j] denote function id. F[1,i,j] give function weight. F(2:5,i,j) provide function parameters. + * Resulting point is {xnew,ynew} = sum_i F[1,i,j]*F[0,i,j]{IFS2d(A[j]){x,y}}. */ +HMDT MGL_EXPORT mgl_data_flame_2d(HCDT A, HCDT F, long n, long skip); +uintptr_t MGL_EXPORT mgl_data_flame_2d_(uintptr_t *A, uintptr_t *F, long *n, long *skip); + + +/// Get array as solution of tridiagonal matrix solution a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] +/** String \a how may contain: + * 'x', 'y', 'z' for solving along x-,y-,z-directions, or + * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), + * 'c' for using periodical boundary conditions, + * 'd' for diffraction/diffuse calculation. + * NOTE: It work for flat data model only (i.e. for a[i,j]==a[i+nx*j]) */ +HMDT MGL_EXPORT mgl_data_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how); +uintptr_t MGL_EXPORT mgl_data_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int); /// Returns pointer to data element [i,j,k] MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k); diff --git a/include/mgl2/datac.h b/include/mgl2/datac.h index c3687fa..39670cc 100644 --- a/include/mgl2/datac.h +++ b/include/mgl2/datac.h @@ -1,6 +1,6 @@ /*************************************************************************** * datac.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -354,6 +354,9 @@ using mglDataA::Momentum; * By default quadratic averaging over 5 points is used. */ inline void Smooth(const char *dirs="xyz",mreal delta=0) { mgl_datac_smooth(this,dirs,delta); } + /// Limit the data to be inside [-v,v], keeping the original sign + inline void Limit(mreal v) + { mgl_datac_limit(this, v); } /// Hankel transform inline void Hankel(const char *dir) { mgl_datac_hankel(this,dir); } @@ -445,6 +448,9 @@ using mglDataA::Momentum; /// Set the value in given cell of the data void set_v(mreal val, long i,long j=0,long k=0) { mgl_datac_set_value(this,val,i,j,k); } #endif + /// Get the complex value in given cell of the data + dual vc(long i,long j=0,long k=0) const { return a[i+nx*(j+ny*k)]; } + dual vcthr(long i) const { return a[i]; } /// Get the interpolated value and its derivatives in given data cell without border checking mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { dual aa,ax,ay,az; mreal res; @@ -482,6 +488,15 @@ inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mglData &zz, mreal r=1, mreal k0=100) { return mglDataC(true, mgl_qo3d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy, &zz)); } //----------------------------------------------------------------------------- +/// Get array as solution of tridiagonal system of equations a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] +/** String \a how may contain: + * 'x', 'y', 'z' for solving along x-,y-,z-directions, or + * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), + * 'c' for using periodical boundary conditions, + * 'd' for diffraction/diffuse calculation. */ +inline mglDataC mglTridMatC(const mglDataA &A, const mglDataA &B, const mglDataA &C, const mglDataC &D, const char *how) +{ return mglDataC(true, mgl_datac_tridmat(&A, &B, &C, &D, how)); } +//----------------------------------------------------------------------------- /// Get sub-array of the data with given fixed indexes inline mglDataC mglSubDataC(const mglDataA &dat, long xx, long yy=-1, long zz=-1) { return mglDataC(true,mgl_datac_subdata(&dat,xx,yy,zz)); } diff --git a/include/mgl2/datac_cf.h b/include/mgl2/datac_cf.h index 1383e84..b6f5ad2 100644 --- a/include/mgl2/datac_cf.h +++ b/include/mgl2/datac_cf.h @@ -1,6 +1,6 @@ /*************************************************************************** * data_cf.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -88,6 +88,16 @@ mdual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k); void MGL_EXPORT mgl_datac_set_values(HADT dat, const char *val, long nx, long ny, long nz); void MGL_EXPORT mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); +/// Get array as solution of tridiagonal matrix solution a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] +/** String \a how may contain: + * 'x', 'y', 'z' for solving along x-,y-,z-directions, or + * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), + * 'c' for using periodical boundary conditions, + * 'd' for diffraction/diffuse calculation. + * NOTE: It work for flat data model only (i.e. for a[i,j]==a[i+nx*j]) */ +HADT MGL_EXPORT mgl_datac_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how); +uintptr_t MGL_EXPORT mgl_datac_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int); + /// Returns pointer to internal data array MGL_EXPORT dual *mgl_datac_data(HADT dat); /// Returns pointer to data element [i,j,k] @@ -196,6 +206,10 @@ void MGL_EXPORT mgl_datac_modify_(uintptr_t *dat, const char *eq,int *dim,int); void MGL_EXPORT mgl_datac_modify_vw(HADT dat, const char *eq,HCDT vdat,HCDT wdat); void MGL_EXPORT mgl_datac_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); +/// Limit the data to be inside [-v,v], keeping the original sign +void MGL_EXPORT mgl_datac_limit(HADT dat, mreal v); +void MGL_EXPORT mgl_datac_limit_(uintptr_t *dat, mreal *v); + /// Put value to data element(s) void MGL_EXPORT mgl_datac_put_val(HADT dat, dual val, long i, long j, long k); void MGL_EXPORT mgl_datac_put_val_(uintptr_t *dat, dual *val, int *i, int *j, int *k); diff --git a/include/mgl2/define.h b/include/mgl2/define.h index ada4ce5..8a75385 100644 --- a/include/mgl2/define.h +++ b/include/mgl2/define.h @@ -1,6 +1,6 @@ /*************************************************************************** * define.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,6 +20,19 @@ #ifndef _MGL_DEFINE_H_ #define _MGL_DEFINE_H_ //----------------------------------------------------------------------------- +// Disable warnings for MSVC: +// 4190 - C-linkage of std::complex, +// 4996 - deprecated abi functions +// 4786 - disable warnings on 255 char debug symbols +// 4231 - disable warnings on extern before template instantiation +// 4800 - "int,uint32_t,etc" forcing value to bool 'true' or 'false' (performance warning) +// 4244 - conversion from 'mreal,double' to 'float', possible loss of data +// 4267 - conversion from 'size_t' to 'long,int,etc', possible loss of data +// 4305 - truncation from 'double' to 'float' +#if defined(_MSC_VER) +#pragma warning(disable: 4996 4190 4786 4231 4800 4244 4267 4305) +#endif + #include "mgl2/config.h" #ifndef SWIG @@ -28,6 +41,12 @@ #endif #include "mgl2/dllexport.h" +#if defined(_MSC_VER) +#define MGL_OBSOLETE MGL_NO_EXPORT +#else +#define MGL_OBSOLETE MGL_EXPORT +#endif + #if MGL_HAVE_ATTRIBUTE #define MGL_FUNC_CONST __attribute__((const)) #define MGL_FUNC_PURE __attribute__((pure)) @@ -92,8 +111,8 @@ typedef unsigned long uintptr_t; #include #if defined(_MSC_VER) -#if (_MSC_VER<=1800) #define collapse(a) // MSVS don't support OpenMP 3.* +#if (_MSC_VER<=1800) #define strtoull _strtoui64 //#define hypot _hypot #define getcwd _getcwd @@ -267,6 +286,7 @@ extern uint64_t mgl_mask_val[16]; #define MGL_PREFERVC 0x040000 ///< Prefer vertex color instead of texture if output format supports #define MGL_ONESIDED 0x080000 ///< Render only front side of surfaces if output format supports (for debugging) #define MGL_NO_ORIGIN 0x100000 ///< Don't draw tick labels at axis origin +#define MGL_GRAY_MODE 0x100000 ///< Convert all colors to gray ones //----------------------------------------------------------------------------- #if MGL_HAVE_C99_COMPLEX #include @@ -282,10 +302,26 @@ const mdual mgl_I=_Complex_I; #define mgl_abs(x) cabs(x) #endif #ifdef __cplusplus +#include +#include +#if defined(_MSC_VER) +template class MGL_EXPORT std::allocator; +template class MGL_EXPORT std::allocator; +template struct MGL_EXPORT std::char_traits; +template struct MGL_EXPORT std::char_traits; +template class MGL_EXPORT std::basic_string< char, std::char_traits, std::allocator >; +template class MGL_EXPORT std::basic_string< wchar_t, std::char_traits, std::allocator >; +template class MGL_EXPORT std::vector; +template class MGL_EXPORT std::vector; +#endif //----------------------------------------------------------------------------- extern float mgl_cos[360]; ///< contain cosine with step 1 degree //----------------------------------------------------------------------------- #include +#if defined(_MSC_VER) +template class MGL_EXPORT std::complex; +template class MGL_EXPORT std::complex; +#endif typedef std::complex dual; typedef std::complex ddual; #if !MGL_HAVE_C99_COMPLEX diff --git a/include/mgl2/eval.h b/include/mgl2/eval.h index 9043ccf..920c0c7 100644 --- a/include/mgl2/eval.h +++ b/include/mgl2/eval.h @@ -1,6 +1,6 @@ /*************************************************************************** * eval.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/evalc.h b/include/mgl2/evalc.h index 202ca81..36dbeef 100644 --- a/include/mgl2/evalc.h +++ b/include/mgl2/evalc.h @@ -1,6 +1,6 @@ /*************************************************************************** * evalc.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/fit.h b/include/mgl2/fit.h index 82e3144..5f6f2e2 100644 --- a/include/mgl2/fit.h +++ b/include/mgl2/fit.h @@ -1,6 +1,6 @@ /*************************************************************************** * fit.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/fltk.h b/include/mgl2/fltk.h index 129ac08..9d4a223 100644 --- a/include/mgl2/fltk.h +++ b/include/mgl2/fltk.h @@ -1,6 +1,6 @@ /*************************************************************************** * fltk.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -35,6 +35,8 @@ int MGL_EXPORT mgl_fltk_run_(); int MGL_EXPORT mgl_fltk_thr(); /// Callback function for asking user. void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res); +/// Return pointer to widget (Fl_MGLView*) used for plotting +MGL_EXPORT void *mgl_fltk_widget(HMGL gr); #ifdef __cplusplus } //----------------------------------------------------------------------------- @@ -43,7 +45,7 @@ void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res); /// Wrapper class for windows displaying graphics class MGL_EXPORT mglFLTK : public mglWnd { - mglFLTK(const mglFLTK &t) {} // copying is not allowed + mglFLTK(const mglFLTK &) {} // copying is not allowed const mglFLTK &operator=(const mglFLTK &t) { return t; } public: mglFLTK(const char *title="MathGL") : mglWnd() @@ -61,6 +63,8 @@ public: virtual ~mglFLTK() {} int Run() { return mgl_fltk_run(); } ///< Run main loop for event handling int RunThr() { return mgl_fltk_thr(); } ///< Run main loop for event handling in separate thread + /// Return pointer to widget (Fl_MGLView*) used for plotting + void *Widget() { return mgl_fltk_widget(gr); } }; //----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/font.h b/include/mgl2/font.h index 3bb937c..8c0abdb 100644 --- a/include/mgl2/font.h +++ b/include/mgl2/font.h @@ -1,6 +1,6 @@ /*************************************************************************** * font.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -22,7 +22,6 @@ #define _MGL_FONT_H_ #include "mgl2/define.h" -#include //----------------------------------------------------------------------------- #define MGL_FONT_BOLD 0x01000000 // This value is used binary #define MGL_FONT_ITAL 0x02000000 // This value is used binary @@ -50,6 +49,9 @@ struct mglGlyphDescr }; inline bool operator<(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id>b.id; } +#if defined(_MSC_VER) +template class MGL_EXPORT std::vector; +#endif //----------------------------------------------------------------------------- struct MGL_EXPORT mglTeXsymb { unsigned kod; const wchar_t *tex; }; const float mgl_fgen = 4*14; diff --git a/include/mgl2/glut.h b/include/mgl2/glut.h index 11fb0d5..83c345c 100644 --- a/include/mgl2/glut.h +++ b/include/mgl2/glut.h @@ -1,6 +1,6 @@ /*************************************************************************** * glut.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -51,7 +51,7 @@ void MGL_EXPORT mgl_glut_animation(HMGL gr); //----------------------------------------------------------------------------- class MGL_EXPORT mglGLUT: public mglGraph { - mglGLUT(const mglGLUT &t) {} // copying is not allowed + mglGLUT(const mglGLUT &) {} // copying is not allowed const mglGLUT &operator=(const mglGLUT &t) { return t; } public: mglGLUT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=0, void (*load)(void *p)=0) : mglGraph(-1) diff --git a/include/mgl2/mgl.h b/include/mgl2/mgl.h index 993596a..023cd84 100644 --- a/include/mgl2/mgl.h +++ b/include/mgl2/mgl.h @@ -1,6 +1,6 @@ /*************************************************************************** * mgl.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -29,7 +29,7 @@ /// Wrapper class for all graphics class MGL_EXPORT mglGraph { - mglGraph(const mglGraph &t) {} // copying is not allowed + mglGraph(const mglGraph &) {} // copying is not allowed const mglGraph &operator=(const mglGraph &t) { return t; } protected: HMGL gr; @@ -69,6 +69,8 @@ public: /// Set the transparency on/off. inline void Alpha(bool enable) { mgl_set_alpha(gr, enable); } + /// Set the gray-scale mode on/off. + inline void Gray(bool enable) { mgl_set_gray(gr, enable); } /// Set default value of alpha-channel inline void SetAlphaDef(double alpha) { mgl_set_alpha_default(gr, alpha); } /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp) @@ -304,6 +306,9 @@ public: /// Put further plotting in cell of stick rotated on angles tet, phi inline void StickPlot(int num, int i, double tet, double phi) { mgl_stickplot(gr,num,i,tet,phi); } + /// Put further plotting in cell of stick sheared on sx, sy. + inline void ShearPlot(int num, int i, mreal sx, mreal sy, mreal xd=1, mreal yd=0) + { mgl_shearplot(gr,num,i,sx,sy,xd,yd); } /// Set factor of plot size inline void SetPlotFactor(double val) @@ -324,6 +329,9 @@ public: /// Set aspect ratio for further plotting. inline void Aspect(double Ax,double Ay,double Az=1) { mgl_aspect(gr, Ax, Ay, Az); } + /// Shear a further plotting. + inline void Shear(double Sx,double Sy) + { mgl_shear(gr, Sx, Sy); } /// Rotate a further plotting. inline void Rotate(double TetX,double TetZ=0,double TetY=0) { mgl_rotate(gr, TetX, TetZ, TetY); } @@ -2204,7 +2212,10 @@ public: inline void AllowDllCall(bool allow) { mgl_parser_allow_dll_call(pr, allow); } /// Set flag to stop script parsing inline void Stop() { mgl_parser_stop(pr); } - + /// Set variant of argument(s) separated by '?' to be used in further commands + inline void SetVariant(int var=0) + { mgl_parser_variant(pr, var); } + /// Return result of formula evaluation inline mglData Calc(const char *formula) { return mglData(true,mgl_parser_calc(pr,formula)); } diff --git a/include/mgl2/mgl_cf.h b/include/mgl2/mgl_cf.h index a0d0080..66d3f16 100644 --- a/include/mgl2/mgl_cf.h +++ b/include/mgl2/mgl_cf.h @@ -1,6 +1,6 @@ /*************************************************************************** * mgl_cf.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/mpi.h b/include/mgl2/mpi.h index 79aacb0..1ad2145 100644 --- a/include/mgl2/mpi.h +++ b/include/mgl2/mpi.h @@ -1,6 +1,6 @@ /*************************************************************************** * mpi.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * diff --git a/include/mgl2/opengl.h b/include/mgl2/opengl.h index beae2f6..a1b1354 100644 --- a/include/mgl2/opengl.h +++ b/include/mgl2/opengl.h @@ -1,6 +1,6 @@ /*************************************************************************** * opengl.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/other.h b/include/mgl2/other.h index 4d1675c..c299ba7 100644 --- a/include/mgl2/other.h +++ b/include/mgl2/other.h @@ -1,6 +1,6 @@ /*************************************************************************** * other.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/parser.h b/include/mgl2/parser.h index f952074..fe21f80 100644 --- a/include/mgl2/parser.h +++ b/include/mgl2/parser.h @@ -1,6 +1,6 @@ /*************************************************************************** * parser.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -22,7 +22,6 @@ #ifdef __cplusplus #include "mgl2/mgl.h" -#include #if MGL_HAVE_LTDL #include #endif @@ -161,6 +160,8 @@ public: void DeleteVar(const wchar_t *name); /// Delete all data variables void DeleteAll(); + /// Set variant of argument(s) separated by '?' to be used + inline void SetVariant(int var=0) { Variant = var<=0?0:var; } private: // long parlen; ///< Length of parameter strings std::wstring par[40]; ///< Parameter for substituting instead of $1, ..., $9 @@ -176,6 +177,7 @@ private: int for_stack[40]; ///< The order of for-variables int for_addr; ///< Flag for saving address in variable (for_addr-1) bool for_br; ///< Break is switched on (skip all comands until 'next') + unsigned Variant; ///< Select variant of argument(s) separated by '?' /// Parse command int Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const std::wstring &var, const wchar_t *opt); diff --git a/include/mgl2/pde.h b/include/mgl2/pde.h index f358ce7..d476569 100644 --- a/include/mgl2/pde.h +++ b/include/mgl2/pde.h @@ -1,6 +1,6 @@ /*************************************************************************** * pde.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/plot.h b/include/mgl2/plot.h index fe7a59d..90312df 100644 --- a/include/mgl2/plot.h +++ b/include/mgl2/plot.h @@ -1,6 +1,6 @@ /*************************************************************************** * plot.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/prim.h b/include/mgl2/prim.h index d6959b0..43abeaa 100644 --- a/include/mgl2/prim.h +++ b/include/mgl2/prim.h @@ -1,6 +1,6 @@ /*************************************************************************** * prim.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/qmathgl.h b/include/mgl2/qmathgl.h index 79ed157..de39072 100644 --- a/include/mgl2/qmathgl.h +++ b/include/mgl2/qmathgl.h @@ -1,6 +1,6 @@ /*************************************************************************** * qmathgl.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,10 +20,9 @@ #ifndef _MGL_QMATHGL_H_ #define _MGL_QMATHGL_H_ //----------------------------------------------------------------------------- -#include +#include #include #include -#include //----------------------------------------------------------------------------- class QTextEdit; class QMenu; @@ -233,7 +232,16 @@ public: mglDrawScript(HMPR p):mglDraw() { par=p; line=-1; } virtual ~mglDrawScript() {} int Draw(mglGraph *gr) - { gr->Highlight(line+1); mgl_parse_textw(gr->Self(),par,text.toStdWString().c_str()); return 0; } + { + wchar_t *wtext; + wtext = new wchar_t[text.size()+1]; + text.toWCharArray(wtext); + wtext[text.size()] = 0; + gr->Highlight(line + 1); + mgl_parse_textw(gr->Self(), par, wtext); + delete[] wtext; + return 0; + } }; //----------------------------------------------------------------------------- /// Convert bitmap from mglCanvasWnd to QPixmap diff --git a/include/mgl2/qt.h b/include/mgl2/qt.h index 58ef70d..09bc0dc 100644 --- a/include/mgl2/qt.h +++ b/include/mgl2/qt.h @@ -1,6 +1,6 @@ /*************************************************************************** * qt.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -30,6 +30,8 @@ uintptr_t MGL_EXPORT mgl_create_graph_qt_(const char *title, int); /// Run main Qt loop for event handling. int MGL_EXPORT mgl_qt_run(); int MGL_EXPORT mgl_qt_run_(); +/// Return pointer to widget (QMathGL*) used for plotting +MGL_EXPORT void *mgl_qt_widget(HMGL gr); #ifdef __cplusplus } //----------------------------------------------------------------------------- @@ -38,7 +40,7 @@ int MGL_EXPORT mgl_qt_run_(); /// Wrapper class for windows displaying graphics class MGL_EXPORT mglQT : public mglWnd { - mglQT(const mglQT &t) {} // copying is not allowed + mglQT(const mglQT &) {} // copying is not allowed const mglQT &operator=(const mglQT &t) { return t; } public: mglQT(const char *title="MathGL") : mglWnd() @@ -52,6 +54,8 @@ public: mgl_set_click_func(gr, mgl_click_class); } virtual ~mglQT() {} int Run() { return mgl_qt_run(); } ///< Run main loop for event handling + /// Return pointer to widget (QMathGL*) used for plotting + void *Widget() { return mgl_qt_widget(gr); } }; //----------------------------------------------------------------------------- void MGL_EXPORT mgl_ask_qt(const wchar_t *quest, wchar_t *res); diff --git a/include/mgl2/surf.h b/include/mgl2/surf.h index 43f35b4..b290319 100644 --- a/include/mgl2/surf.h +++ b/include/mgl2/surf.h @@ -1,6 +1,6 @@ /*************************************************************************** * surf.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/thread.h b/include/mgl2/thread.h index f8c3db5..537c9b0 100644 --- a/include/mgl2/thread.h +++ b/include/mgl2/thread.h @@ -1,6 +1,6 @@ /*************************************************************************** * thread.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/type.h b/include/mgl2/type.h index d441ec1..6d639c0 100644 --- a/include/mgl2/type.h +++ b/include/mgl2/type.h @@ -1,6 +1,6 @@ /*************************************************************************** * type.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/vect.h b/include/mgl2/vect.h index 388c0e0..120fd30 100644 --- a/include/mgl2/vect.h +++ b/include/mgl2/vect.h @@ -1,6 +1,6 @@ /*************************************************************************** * vect.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/volume.h b/include/mgl2/volume.h index d5ee4bc..c5efca9 100644 --- a/include/mgl2/volume.h +++ b/include/mgl2/volume.h @@ -1,6 +1,6 @@ /*************************************************************************** * volume.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/window.h b/include/mgl2/window.h index 00d5294..d20f348 100644 --- a/include/mgl2/window.h +++ b/include/mgl2/window.h @@ -1,6 +1,6 @@ /*************************************************************************** * window.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/include/mgl2/wnd.h b/include/mgl2/wnd.h index ad496e7..8cadd9c 100644 --- a/include/mgl2/wnd.h +++ b/include/mgl2/wnd.h @@ -1,6 +1,6 @@ /*************************************************************************** * wnd.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -56,7 +56,7 @@ public: pthread_t thr; bool running; pthread_mutex_t mutex; - + #else mglDraw() {} virtual ~mglDraw() {} @@ -74,12 +74,14 @@ void MGL_EXPORT mgl_reload_class(void *p); /// Abstract class for windows displaying graphics class MGL_EXPORT mglWnd : public mglGraph { - mglWnd(const mglWnd &t) {} // copying is not allowed + mglWnd(const mglWnd &) {} // copying is not allowed const mglWnd &operator=(const mglWnd &t) { return t; } public: mglWnd() : mglGraph(-1) {} virtual ~mglWnd() { mgl_use_graph(gr,-255); } virtual int Run()=0; ///< Run main loop for event handling + /// Return pointer to widget used for plotting + virtual void *Widget() { return NULL; } inline void ToggleAlpha() ///< Switch on/off transparency (do not overwrite user settings) { mgl_wnd_toggle_alpha(gr); } diff --git a/include/mgl2/wx.h b/include/mgl2/wx.h index 911fda4..6e1d051 100644 --- a/include/mgl2/wx.h +++ b/include/mgl2/wx.h @@ -1,6 +1,6 @@ /*************************************************************************** * wx.h.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/json/Backend.cpp b/json/Backend.cpp index 32fa3f0..89f9e5b 100644 --- a/json/Backend.cpp +++ b/json/Backend.cpp @@ -11,13 +11,18 @@ QString Backend::show(const QString& text) const { qDebug() << __FUNCTION__; const char *tmp = tmpnam(0); + wchar_t *wtext; mglGraph gr; gr.SetFaceNum(200); mglParse pr; pr.AllowSetSize(true); setlocale(LC_CTYPE, ""); setlocale(LC_NUMERIC, "C"); - pr.Execute(&gr,text.toStdWString().c_str()); + wtext = new wchar_t[text.size()+1]; + text.toWCharArray(wtext); + wtext[text.size()] = 0; + pr.Execute(&gr,wtext); + delete[] wtext; gr.WriteJSON(tmp); setlocale(LC_NUMERIC, ""); @@ -32,13 +37,18 @@ QString Backend::show(const QString& text) const //----------------------------------------------------------------------------- QString Backend::coor(const QString& xy, const QString& text) const { + wchar_t *wtext; qDebug() << __FUNCTION__; mglGraph gr; mglParse pr; pr.AllowSetSize(true); setlocale(LC_CTYPE, ""); setlocale(LC_NUMERIC, "C"); - pr.Execute(&gr,text.toStdWString().c_str()); + wtext = new wchar_t[text.size()+1]; + text.toWCharArray(wtext); + wtext[text.size()] = 0; + pr.Execute(&gr,wtext); + delete[] wtext; gr.Finish(); int x = (int)xy.section(" ",0,0).toDouble(); @@ -54,6 +64,7 @@ QString Backend::geometry(const QString& mgl) const { qDebug() << __FUNCTION__; const char *tmp = tmpnam(0); + wchar_t *wmgl; mglGraph gr; #if 0 gr.SetFaceNum(200); @@ -62,7 +73,11 @@ QString Backend::geometry(const QString& mgl) const pr.AllowSetSize(true); setlocale(LC_CTYPE, ""); setlocale(LC_NUMERIC, "C"); - pr.Execute(&gr,mgl.toStdWString().c_str()); + wmgl = new wchar_t[mgl.size()+1]; + mgl.toWCharArray(wmgl); + wmgl[mgl.size()] = 0; + pr.Execute(&gr,wmgl); + delete[] wmgl; gr.WriteJSON(tmp); setlocale(LC_NUMERIC, ""); diff --git a/json/Backend.hpp b/json/Backend.hpp index 33081d6..3ebb08e 100644 --- a/json/Backend.hpp +++ b/json/Backend.hpp @@ -2,6 +2,9 @@ #include #include +#if defined(_MSC_VER) +#include +#endif class Backend : public QObject { diff --git a/json/CMakeLists.txt b/json/CMakeLists.txt index 5979d6c..63733a1 100644 --- a/json/CMakeLists.txt +++ b/json/CMakeLists.txt @@ -14,11 +14,9 @@ endif(enable-qt5) add_executable(MglForJsTestBench ${json_src} ${json_moc_hdr} ${json_ui_src}) if(enable-qt5) target_compile_definitions(MglForJsTestBench PUBLIC MGL_USE_QT5) - target_link_libraries(MglForJsTestBench mgl-qt5) - qt5_use_modules(MglForJsTestBench ${MGL_QT5_LIBS}) + target_link_libraries(MglForJsTestBench mgl-qt5 ${MGL_QT5_LIBS}) else(enable-qt5) - target_link_libraries(MglForJsTestBench mgl-qt) - qt4_use_modules(MglForJsTestBench ${MGL_QT4_LIBS}) + target_link_libraries(MglForJsTestBench mgl-qt4 ${MGL_QT4_LIBS}) endif(enable-qt5) endif(enable-json-sample) diff --git a/lang/mgl.i b/lang/mgl.i index d050ccc..8fef535 100644 --- a/lang/mgl.i +++ b/lang/mgl.i @@ -1,6 +1,6 @@ /*************************************************************************** * mgl.h is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * diff --git a/make_release b/make_release deleted file mode 100755 index 2fe9fe3..0000000 --- a/make_release +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash -# Make releases - -VER=2.3.4 -LVER=${VER}.LGPL -BIN=MathGL -LBIN=MathGL-LGPL -SRC=/home/balakin/mathgl-code/mathgl-2x -BSRC=${SRC}/build - -mkdir mathgl-${VER}-mingw.i686 -mkdir mathgl-${VER}-mingw.i686/bin/ -cp -p ${BIN}/bin/* mathgl-${VER}-mingw.i686/bin/ -mkdir mathgl-${VER}-mingw.i686/lib/ -cp -p ${BIN}/lib/* mathgl-${VER}-mingw.i686/lib/ -mkdir mathgl-${VER}-mingw.i686/include/ -mkdir mathgl-${VER}-mingw.i686/include/mgl2/ -cp -p ${BIN}/include/mgl2/* mathgl-${VER}-mingw.i686/include/mgl2/ -cp -p ${SRC}/ChangeLog.txt mathgl-${VER}-mingw.i686/ -cp -p ${SRC}/FindMathGL2.cmake mathgl-${VER}-mingw.i686/mathgl2-config.cmake -7z a mathgl-${VER}-mingw.i686.7z mathgl-${VER}-mingw.i686/ -rm -R mathgl-${VER}-mingw.i686 - -mkdir mathgl-${LVER}-mingw.i686 -mkdir mathgl-${LVER}-mingw.i686/bin/ -cp -p ${LBIN}/bin/* mathgl-${LVER}-mingw.i686/bin/ -mkdir mathgl-${VER}-mingw.i686/lib/ -cp -p ${LBIN}/lib/* mathgl-${LVER}-mingw.i686/lib/ -mkdir mathgl-${LVER}-mingw.i686/include/ -mkdir mathgl-${LVER}-mingw.i686/include/mgl2/ -cp -p ${LBIN}/include/mgl2/* mathgl-${LVER}-mingw.i686/include/mgl2/ -cp -p ${SRC}/ChangeLog.txt mathgl-${LVER}-mingw.i686/ -cp -p ${SRC}/FindMathGL2.cmake mathgl-${LVER}-mingw.i686/mathgl2-config.cmake -7z a mathgl-${LVER}-mingw.i686.7z mathgl-${LVER}-mingw.i686/ -rm -R mathgl-${LVER}-mingw.i686 - -mkdir mgl_scripts-${VER} -cp -pR ${BIN}/extra/* mgl_scripts-${VER}/ -cp -p ${BIN}/bin/* mgl_scripts-${VER}/ -cp -p ${BIN}/share/mathgl/mgl.cgi.exe mgl_scripts-${VER}/ -cp -p ${BIN}/share/udav/*.qm mgl_scripts-${VER}/ -cp -p ${BSRC}/texinfo/mgl_??.html mgl_scripts-${VER}/ -cp -p ${SRC}/ChangeLog.txt mgl_scripts-${VER}/ -7z a mgl_scripts-${VER}.7z mgl_scripts-${VER}/ -rm -R mgl_scripts-${VER} - -cp -p ${BSRC}/texinfo/mathgl_en.pdf mathgl-${VER}.eng.pdf -cp -p ${BSRC}/texinfo/mgl_en.pdf mgl-${VER}.eng.pdf -cp -p ${SRC}/ChangeLog.txt ChangeLog-${VER}.txt -7z a mathgl-doc-html-${VER}.7z ${BSRC}/texinfo/m*html ${BSRC}/texinfo/png/ - -svn checkout svn://svn.code.sf.net/p/mathgl/code/mathgl-2x/ mathgl-${VER} -cd mathgl-${VER} -./clean-svn -cd .. -tar -zcf mathgl-${VER}.tar.gz mathgl-${VER}/ -rm -R mathgl-${VER} diff --git a/mgltex/Recompilation_decision.eps b/mgltex/Recompilation_decision.eps index b087058..c454a17 100644 --- a/mgltex/Recompilation_decision.eps +++ b/mgltex/Recompilation_decision.eps @@ -1,6 +1,6 @@ %!PS-Adobe-3.0 EPSF-3.0 %%Creator: cairo 1.13.1 (http://cairographics.org) -%%CreationDate: Sat Nov 7 08:28:35 2015 +%%CreationDate: Sat Nov 7 15:28:00 2015 %%Pages: 1 %%DocumentData: Clean7Bit %%LanguageLevel: 3 @@ -1624,28 +1624,117 @@ BT ET Q q 0 g -2.4 w +2.15895 w 0 J 0 j [] 0.0 d 4 M q 1 0 0 -1 0 790.399963 cm -316.762 33.48 m 316.762 86.008 l S Q +316.762 37.789 m 316.762 80.293 l S Q +321.988 721.4 m 316.781 707.248 l 311.578 721.4 l 314.652 719.138 318.855 + 719.15 321.988 721.4 c h +321.988 721.4 m f* +0.809606 w +1 j +q 0 1 1 0 0 790.399963 cm +-69 321.988 m -83.152 316.781 l -69 311.578 l -71.262 314.652 -71.25 318.855 + -69 321.988 c h +-69 321.988 m S Q +2.15579 w +0 j q 1 0 0 -1 0 790.399963 cm -316.762 147.812 m 316.762 199.551 l S Q +316.762 152.66 m 316.762 194.406 l S Q +321.98 607.271 m 316.781 593.138 l 311.586 607.271 l 314.652 605.013 318.852 + 605.029 321.98 607.271 c h +321.98 607.271 m f* +0.808421 w +1 j +q 0 1 1 0 0 790.399963 cm +-183.129 321.98 m -197.262 316.781 l -183.129 311.586 l -185.387 314.652 + -185.371 318.852 -183.129 321.98 c h +-183.129 321.98 m S Q +2.295753 w +0 j q 1 0 0 -1 0 790.399963 cm -256.559 257.719 m 139.379 257.719 l 139.379 365.215 l S Q +252.547 257.68 m 139.148 257.68 l 139.148 359.32 l S Q +144.703 443.091 m 139.172 428.041 l 133.637 443.091 l 136.902 440.685 141.375 + 440.701 144.703 443.091 c h +144.703 443.091 m f* +0.860907 w +1 j +q 0 1 1 0 0 790.399963 cm +-347.309 144.703 m -362.359 139.172 l -347.309 133.637 l -349.715 136.902 + -349.699 141.375 -347.309 144.703 c h +-347.309 144.703 m S Q +2.324777 w +0 j q 1 0 0 -1 0 790.399963 cm -378.305 257.715 m 495.484 257.715 l 495.484 365.211 l S Q +381.137 257.691 m 495.648 257.691 l 495.648 360.906 l S Q +501.273 441.658 m 495.668 426.416 l 490.066 441.658 l 493.375 439.22 497.902 + 439.236 501.273 441.658 c h +501.273 441.658 m f* +0.871792 w +1 j +q 0 1 1 0 0 790.399963 cm +-348.742 501.273 m -363.984 495.668 l -348.742 490.066 l -351.18 493.375 + -351.164 497.902 -348.742 501.273 c h +-348.742 501.273 m S Q +2.290224 w +0 j q 1 0 0 -1 0 790.399963 cm -225.398 398.059 m 316.828 397.484 l 316.828 474.172 l S Q +228.438 397.988 m 317.062 397.453 l 317.062 469.492 l S Q +322.605 332.888 m 317.086 317.873 l 311.562 332.888 l 314.824 330.49 319.281 + 330.502 322.605 332.888 c h +322.605 332.888 m f* +0.858834 w +1 j +q 0 1 1 0 0 790.399963 cm +-457.512 322.605 m -472.527 317.086 l -457.512 311.562 l -459.91 314.824 + -459.898 319.281 -457.512 322.605 c h +-457.512 322.605 m S Q +2.300242 w +0 j q 1 0 0 -1 0 790.399963 cm -377.992 533.152 m 495.168 533.152 l 495.168 640.648 l S Q +379.918 533.141 m 495.336 533.141 l 495.336 633.395 l S Q +500.902 169.041 m 495.359 153.962 l 489.812 169.041 l 493.086 166.63 497.566 + 166.646 500.902 169.041 c h +500.902 169.041 m f* +0.862591 w +1 j +q 0 1 1 0 0 790.399963 cm +-621.359 500.902 m -636.438 495.359 l -621.359 489.812 l -623.77 493.086 + -623.754 497.566 -621.359 500.902 c h +-621.359 500.902 m S Q +2.29295 w +0 j q 1 0 0 -1 0 790.399963 cm -255.668 532.582 m 138.488 532.582 l 138.488 640.078 l S Q +252.285 532.551 m 138.273 532.551 l 138.273 633.395 l S Q +143.824 168.998 m 138.297 153.966 l 132.77 168.998 l 136.031 166.595 140.496 + 166.611 143.824 168.998 c h +143.824 168.998 m f* +0.859856 w +1 j +q 0 1 1 0 0 790.399963 cm +-621.402 143.824 m -636.434 138.297 l -621.402 132.77 l -623.805 136.031 + -623.789 140.496 -621.402 143.824 c h +-621.402 143.824 m S Q +2.335361 w +0 j q 1 0 0 -1 0 790.399963 cm -255.688 674.629 m 373.973 674.629 l S Q +258.828 674.629 m 370.828 674.629 l S Q +2.348876 w q 1 0 0 -1 0 790.399963 cm -316.828 674.629 m 316.828 752.344 l S Q +316.828 674.629 m 316.828 749.066 l S Q +322.512 53.619 m 316.852 38.22 l 311.188 53.619 l 314.531 51.162 319.105 + 51.173 322.512 53.619 c h +322.512 53.619 m f* +0.880828 w +1 j +q 0 1 1 0 0 790.399963 cm +-736.781 322.512 m -752.18 316.852 l -736.781 311.187 l -739.238 314.531 + -739.227 319.105 -736.781 322.512 c h +-736.781 322.512 m S Q +2.4 w +0 j q 1 0 0 -1 0 790.399963 cm 495.113 422.059 m 495.113 451.77 l 332.828 451.199 l 332.828 451.199 317.516 429.449 301.457 451.18 c 138.828 451.484 l 138.543 532.629 l S Q diff --git a/mgltex/Recompilation_decision.pdf b/mgltex/Recompilation_decision.pdf index cff8a1366f06637813738663ec827c692d01a292..a6a33bfe9457f86771536fd6785e2ef2b1fea87f 100644 GIT binary patch delta 5743 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 + + + + + + + + + + + + + + + + + + + + + + inkscape:isstock="true" + inkscape:collect="always"> image/svg+xml - + @@ -1218,95 +1330,107 @@ inkscape:groupmode="layer" id="layer1" transform="translate(56.035869,-48.362179)" /> - - + + Start - - FindStart + + + + \MGL@@@<script> - - Is itFind\MGL@@@<script> + + + + defined? - - CompareIs itdefined? + + + + script vs. code + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve">Comparescript vs. code + - Rewrite/recompile + script - - UndefineRewrite/recompilescript + + + + \MGL@@@<script> - - DefineUndefine\MGL@@@<script> + + + + \MGL@@@<script> - - Define\MGL@@@<script> + + + + End - - AretheyEnd + + + + equal? + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve">Aretheyequal? + - - + + Yes - - Yes + + + + Yes - - Yes + + + + No - - No + + + + No + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:100%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;" + xml:space="preserve">No + diff --git a/mgltex/mgltex.dtx b/mgltex/mgltex.dtx index 959e117..d50fa82 100644 --- a/mgltex/mgltex.dtx +++ b/mgltex/mgltex.dtx @@ -22,17 +22,17 @@ % % %\NeedsTeXFormat{LaTeX2e} -%\ProvidesPackage{mgltex}[2016/01/28 v4.1 Embed MGL scripts into LaTeX documents] +%\ProvidesPackage{mgltex}[2016/04/26 v4.2 Embed MGL scripts into LaTeX documents] % % %<*driver> \documentclass[10pt]{ltxdoc} \usepackage{color} +\usepackage{mgltex} +\DeclareRobustCommand\mglTeX{mgl\kern-0.04em\TeX}% Otherwise, incompatibility with \CharacterTable \IfFileExists{hyperref.sty}{% - \usepackage[hidelinks=true]{hyperref}% + \usepackage[hidelinks]{hyperref}% }{} -\usepackage{mgltex} -\def\mglTeX{mgl\TeX} % Otherwise, incompatibility with \CharacterTable \EnableCrossrefs \CodelineIndex \RecordChanges @@ -87,48 +87,75 @@ % \makeatother % \egroup % -% \changes{v1.0}{2014/09/27}{Initial version} -% \changes{v2.0}{2014/11/23}{Possible bugfix by adding \texttt{\textbackslash expandafter} to commands to ignore/write lines of MGL code} -% \changes{v2.0}{2014/11/23}{Add environment \texttt{mglsignature} that adds a commentary every MGL script} -% \changes{v2.0}{2014/11/23}{Eliminate line ignoring commands to create more elegant scripts, due to the a new command that adds comments to the scripts} -% \changes{v2.0}{2014/11/23}{Move the MGL \emph{stop} command from the \texttt{\textbackslash{}AtEndDocument} command to the \texttt{\textbackslash{}mgl@func} buffer} -% \changes{v3.0}{/2015/03/29}{Add detection of changes in MGL scripts to speed up compilation time (only changed scripts are recompiled)} -% \changes{v3.0}{/2015/03/29}{Add command \texttt{\textbackslash mgldir}, \texttt{\textbackslash mglscriptsdir}, \texttt{\textbackslash mglgraphicsdir} and \texttt{\textbackslash mglbackupsdir} to specify a main directory for \textsf{\mglTeX} and directories for the creation of scripts, graphics and backups} -% \changes{v3.0}{/2015/03/29}{Add the \texttt{\textbackslash mglquality} command to specify a default quality} -% \changes{v3.0}{/2015/03/29}{Add the \texttt{\textbackslash mglwidth} and \texttt{\textbackslash mglheight} commands to specify the default size of the images produced} -% \changes{v3.0}{/2015/03/29}{Add the \texttt{\textbackslash mglsettings} command to configure behavior of the package} -% \changes{v3.0}{/2015/03/29}{Improve environment \texttt{mglsignature} by adding the possibility of using \LaTeX{} commands inside it} -% \changes{v4.0}{/2015/08/17}{Completely rewrite of \textsf{\mglTeX}} -% \changes{v4.0}{/2015/08/17}{\textsf{\mglTeX} now depends of the \textsf{verbatim} package} -% \changes{v4.0}{/2015/08/17}{All environments write their contents \emph{verbatim}} -% \changes{v4.0}{/2015/08/17}{Add package options \texttt{0q}, \ldots, \texttt{8q} to specify quality} -% \changes{v4.0}{/2015/08/17}{Add the \texttt{\textbackslash mglpaths} command to add directories to the search paths for MGL scripts} -% \changes{v4.0}{/2015/08/17}{Add the \texttt{\textbackslash mglname} command to force clousure of the current main script, its compilation, and the opening of a new main script} -% \changes{v4.0}{/2015/08/17}{Add the option \texttt{label} to the \texttt{mgl} environment in order to override the automatic naming of the script and corresponding image} -% \changes{v4.0}{/2015/08/17}{Add the option \texttt{label} to the \texttt{mglverbatim} environment to name the verbatim code} -% \changes{v4.0}{/2015/08/17}{Add the option \texttt{separator} to the command \texttt{\textbackslash mglplot} to brake the code into different physical text lines} -% \changes{v4.0}{/2015/08/17}{Add the option \texttt{path} to the commands \texttt{\textbackslash mglgraphics} and \texttt{\textbackslash mglinclude} to force a path to search MGL scripts} -% \changes{v4.0}{/2015/08/17}{Make verbatim-like environments and \texttt{\textbackslash mglinclude} command more visually elegant} -% \changes{v4.0}{/2015/08/17}{Numbering in verbatim-like environments is optional now} -% \changes{v4.0}{/2015/08/17}{Add the command \texttt{\textbackslash listofmglscripts} to create a list of all MGL scripts included verbatim in the document} -% \changes{v4.0}{/2015/08/17}{Add the command \texttt{\textbackslash mglTeXwVer} that prints the name of the package with its version in a coherent manner, and separated by an unbreakable space} -% \changes{v4.0}{/2015/08/17}{Verbatim-like environments and the \texttt{\textbackslash mglinclude} command have starred versions wich prevent the command \texttt{\textbackslash listofmglscripts} to list them} -% \changes{v4.0}{/2015/08/17}{Remove \texttt{mglsignature} environment for being considered useless, and to avoid interference with the detection of changes in MGL scripts, to speed up script writing and to make the package less resource-consuming} -% \changes{v4.0}{/2015/08/17}{Remove the \texttt{\textbackslash mglwidth} and \texttt{\textbackslash mglheight} commands for being considered useless} -% \changes{v4.0}{/2015/08/17}{Remove the \texttt{\textbackslash MGL@setkeys} command, since it isn't needed as first thought} -% \changes{v4.0}{/2015/08/17}{Many improvements, including, but not limited to, speed up, increased coherence and cleanness of the code, less resource consumption} -% \changes{v4.0}{/2015/08/17}{Many bugfixes} -% -% \changes{v4.1}{/2016/01/28}{Add the command \texttt{\textbackslash mglimgext} to specify locally the extension to save the generated graphics} -% \changes{v4.1}{/2016/01/28}{Add the command \texttt{\textbackslash mglswitch}, which replaces \texttt{\textbackslash mgltexon} and \texttt{\textbackslash mgltexoff}} -% \changes{v4.1}{/2016/01/28}{Rename the commands \texttt{\textbackslash mgltexon} as \texttt{\textbackslash MGL@switch@on} and \texttt{\textbackslash mgltexoff} as \texttt{\textbackslash MGL@switch@off} in order to avoid the user from unpurposely overwriting them} -% \changes{v4.1}{/2016/01/28}{The command \texttt{\textbackslash mglcomments} has been reimplemented to accept one mandatory argument: \texttt{\textbackslash mglcomments\{on\}} replaces the old \texttt{\textbackslash mglcomments}, while \texttt{\textbackslash mglcomments\{off\}} replaces the old \texttt{\textbackslash mglnocomments}} -% \changes{v4.1}{/2016/01/28}{Remove the command \texttt{\textbackslash mglnocomments} (rendered useless by the new implementation of \texttt{\textbackslash mglcomments})} -% \changes{v4.1}{/2016/01/28}{Remove the command \texttt{\textbackslash mglTeXwVer} (rendered useless by the implementation of the starred version of \texttt{\textbackslash mglTeX})} -% \changes{v4.1}{/2016/01/28}{Restore the command \texttt{\textbackslash mglsettings}, which was unintentionally deleted in version~4.0} -% \changes{v4.1}{/2016/01/28}{Expand the key-val list family for the command \texttt{\textbackslash mglsettings}} -% \changes{v4.1}{/2016/01/28}{Reimplement the \texttt{\textbackslash @MGL@comments@} switch} -% \changes{v4.1}{/2016/01/28}{A starred version of the command \texttt{\textbackslash mglTeX} has been implemented, which prints the version of the package besides its name} +% \def\doccommand#1{\texttt{\textbackslash#1}} +% +% \changes{\textbf{v1.0 ------------}}{2014/09/27}{Initial version} +% +% +% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Possible bugfix by adding \doccommand{expandafter} to commands to ignore/write lines of MGL code} +% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Add environment \texttt{mglsignature} that adds a comment to every MGL script} +% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Eliminate line ignoring commands to create more elegant scripts, due to the a new command that adds comments to the scripts} +% \changes{\textbf{v2.0 ------------}}{2014/11/23}{Move the MGL \emph{stop} command from the \texttt{\textbackslash{}AtEndDocument} command to the \doccommand{mgl@func} buffer} +% +% +% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add detection of changes in MGL scripts to speed up compilation time (only changed scripts are recompiled)} +% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add command \doccommand{mgldir}, \doccommand{mglscriptsdir}, \doccommand{mglgraphicsdir} and \doccommand{mglbackupsdir} to specify a main directory for \textsf{\mglTeX} and directories for the creation of scripts, graphics and backups} +% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglquality} command to specify a default quality} +% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglwidth} and \doccommand{mglheight} commands to specify the default size of the images produced} +% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglsettings} command to configure behavior of the package} +% \changes{\textbf{v3.0 ------------}}{2015/03/29}{Improve environment \texttt{mglsignature} by adding the possibility of using \LaTeX{} commands inside it} +% +% +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Complete rewrite of \textsf{\mglTeX}} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{\textsf{\mglTeX} now depends of the \textsf{verbatim} package} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{All environments write their contents \emph{verbatim}} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add package options \texttt{0q}, \ldots, \texttt{8q} to specify quality} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the \doccommand{mglpaths} command to add directories to the search paths for MGL scripts} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the \doccommand{mglname} command to force clousure of the current main script, its compilation, and the opening of a new main script} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{label} to the \texttt{mgl} environment in order to override the automatic naming of the script and corresponding image} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{label} to the \texttt{mglverbatim} environment to name the verbatim code} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{separator} to the command \doccommand{mglplot} to brake the code into different physical text lines} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{path} to the commands \doccommand{mglgraphics} and \doccommand{mglinclude} to force a path to search MGL scripts} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Verbatim-like environments and \doccommand{mglinclude} command are more visually elegant now} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Numbering in verbatim-like environments is optional now} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the command \doccommand{listofmglscripts} to create a list of all MGL scripts included verbatim in the document} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the command \doccommand{mglTeXwVer} that prints the name of the package with its version in a coherent manner, and separated by an unbreakable space} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Verbatim-like environments and the \doccommand{mglinclude} command have starred versions wich prevent the command \doccommand{listofmglscripts} to list them} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Remove \texttt{mglsignature} environment for being considered useless, and to avoid interference with the detection of changes in MGL scripts, to speed up script writing and to make the package less resource-consuming} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Remove the \doccommand{mglwidth} and \doccommand{mglheight} commands for being considered useless} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Many improvements, including, but not limited to, speed up, increased coherence and cleanness of the code, less resource consumption} +% \changes{\textbf{v4.0 ------------}}{2015/08/17}{Many bugfixes} +% +% +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Add the command \doccommand{mglimgext} to specify locally the extension to save the generated graphics} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Add the command \doccommand{mglswitch}, which replaces \doccommand{mgltexon} and \doccommand{mgltexoff}} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Rename the commands \doccommand{mgltexon} as \doccommand{MGL@switch@on} and \doccommand{mgltexoff} as \doccommand{MGL@switch@off} in order to avoid the user from unpurposely overwriting them} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{The command \doccommand{mglcomments} has been reimplemented to accept one mandatory argument: \doccommand{mglcomments\{on\}} replaces the old \doccommand{mglcomments}, while \doccommand{mglcomments\{off\}} replaces the old \doccommand{mglnocomments}} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Remove the command \doccommand{mglnocomments} (rendered useless by the new implementation of \doccommand{mglcomments})} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Remove the command \doccommand{mglTeXwVer} (rendered useless by the implementation of the starred version of \doccommand{mglTeX})} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Restore the command \doccommand{mglsettings}, which was unintentionally deleted in version~4.0} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Expand the key-val list family for the command \doccommand{mglsettings}} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{Reimplement the \doccommand{@MGL@comments@} switch} +% \changes{\textbf{v4.1 ------------}}{2016/01/28}{A starred version of the command \doccommand{mglTeX} has been implemented, which prints the version of the package besides its name} +% +% +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package options \texttt{gray}, \texttt{color} to activate/deactivate gray-scale mode for graphics} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package options \texttt{0v}, \texttt{1v}, \texttt{2v} to select variant of arguments in MGL scripts} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package option \texttt{9q} for setting quality to \texttt{9} (for testing purposes of the author)} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New commands: \doccommand{mglgray} (to activate/deactivate) gray-scale mode locally, and \doccommand{mglvariant} (to set variant of arguments in MGL scripts locally)} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename environment \texttt{mglcommon} to \texttt{mglsetupscript} (\texttt{mglcommon} is still available, but deprecated)} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename command \doccommand{mglcommonscriptname} to \texttt{mglsetupscriptname}} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename command \doccommand{MGL@graph@ext} to \doccommand{MGL@imgext}} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename family \texttt{MGL@keys} as \texttt{MGL@gr@keys} for consistency} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Reorganize and update documentation} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{\mglTeX{} now depends on the \texttt{ifpdf} package} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{The MGL code line \texttt{setsize~600~400} is now automatically written to the main script in order for the scaling options and commands to work} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Remove the \doccommand{MGL@setkeys} command, since it isn't needed as first thought} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Some minor bugfixes} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Change definition of \doccommand{mglcommentname} from \emph{MGL comment} to \emph{\mglTeX{} comment}} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename \doccommand{MGL@document@scripts} to \doccommand{MGL@doc@scripts}} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename \doccommand{MGL@script@name} tp \doccommand{MGL@script}} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Introduce the concept of \emph{global}, \emph{local} and \emph{private} settings in the documentation} % % \GetFileInfo{mgltex.sty} % @@ -137,7 +164,7 @@ % \DoNotIndex{\@flushglue,\@for,\@ifnextchar,\@makeother,\{,\},\ ,\AtBeginDocument,\AtEndDocument,\centering} % \DoNotIndex{\closein,\closeout,\csname,\endcsname,\CurrentOption,\DeclareGraphicsExtensions,\define@key,\DeclareOption} % \DoNotIndex{\detokenize,\do,\dospecials,\endlinechar,\endlist,\escapechar,\ExecuteOptions,\expandafter,\footnotesize} -% \DoNotIndex{\framebox,\Gin@extensions,\Huge,\ifeof,\IfFileExists,\ifx,\immediate,\include,\includegraphics,\item,\itemsep} +% \DoNotIndex{\framebox,\Huge,\ifeof,\IfFileExists,\ifx,\immediate,\include,\includegraphics,\item,\itemsep} % \DoNotIndex{\itshape,\jobname,\labelsep,\leftskip,\let,\long,\mbox,\newcounter,\newread,\newtoks,\newwrite,\noexpand} % \DoNotIndex{\obeyspaces,\openin,\openout,\PackageError,\PackageWarning,\parfillskip,\parindent,\parskip} % \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\read,\relax,\RequirePackage,\rightskip,\setcounter,\setkeys,\setlength} @@ -150,7 +177,7 @@ % \DoNotIndex{\endcenter,\everypar,\fbox,\fboxrule,\frenchspacing,\g@addto@macro,\global,\hb@xt@,\hbadness,\hfil,\hfill} % \DoNotIndex{\hrule,\hskip,\hss,\if@minipage,\if@tempswa,\ifhmode,\ifnum,\interlinepenalty,\itemindent,\kern,\l@chapter} % \DoNotIndex{\l@section,\large,\leavevmode,\MakeUppercase,\newdimen,\nobreak,\nopagebreak,\normalfont,\null,\numberline} -% \DoNotIndex{\p@,\par,\unpenalty,\usecounter,\@ifstar,\^} +% \DoNotIndex{\p@,\par,\unpenalty,\usecounter,\@ifstar,\^,\iffalse,\iftrue,\ifpdf} % % \title{The \textsf{\mglTeX} package\thanks{This document corresponds to \textsf{\mglTeX}~\fileversion, dated \filedate.}} % \author{Diego Sejas Viscarra\\\texttt{dsejas.mathematics@gmail.com}} @@ -160,13 +187,13 @@ % \begin{abstract} % \noindent MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. Although it defines interfaces for many programming languages, it also implements its own scripting language, called \emph{MGL}, which can be used independently. With the package \textsf{\mglTeX}, MGL scripts can be embedded within any \LaTeX{} document, and the corresponding images are automatically created and included. % -% This manual documents the use of the commands and environments of~\textsf{\mglTeX}. +% This manual documents the usage of the commands and environments of~\textsf{\mglTeX}. % \end{abstract} % % \tableofcontents % % \section{Introduction} -% MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. It implements more than $50$ different types of graphics for 1d, 2d and 3d large sets of data. It supports exporting images to bitmap formats (PNG, JPEG, BMP, etc.), or vector formats (EPS, \TeX, SVG, etc.), or 3d image formats (STL, OBJ, XYZ, etc.), and even its own native 3d format, MGLD. MathGL also defines its own vector font specification format, and supports UTF-16 encoding with \TeX-like symbol parsing. It supports various kinds of transparency and lighting, textual formula evaluation, arbitrary curvilinear coordinate systems, loading of subroutines from .dll or .so libraries, and many other useful features. +% \noindent MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. It implements more than $50$ different types of graphics for 1d, 2d and 3d large sets of data. It supports exporting images to bitmap formats (PNG, JPEG, BMP, etc.), or vector formats (EPS, \TeX, SVG, etc.), or 3d image formats (STL, OBJ, XYZ, etc.), and even its own native 3d format, MGLD. MathGL also defines its own vector font specification format, and supports UTF-16 encoding with \TeX-like symbol parsing. It supports various kinds of transparency and lighting, textual formula evaluation, arbitrary curvilinear coordinate systems, loading of subroutines from .dll or .so libraries, and many other useful features. % % MathGL has interfaces for a wide variety of programming languages, such as C/C++, Fortran, Python, Octave, Pascal, Forth, and many others, but it also defines its own scripting language, called \emph{MGL}, which can be used to generate graphics independently of any programming language. The \textsf{\mglTeX} package adds support to embed MGL code inside \LaTeX{} documents, which is automatically extracted and executed, and the resulting images are included in the document. % @@ -179,13 +206,16 @@ % \begin{enumerate} % \item Any meta-variable that contain the word \emph{directory} indicates the name of a directory, in the form of an absolute or relative path, ending with the slash (``/'') character. % \item Any meta-variable that contain the word \emph{subdirectory} indicates a relative path ending with the slash (``/'') character. -% \item \meta{$x_1\vert x_2\vert\ldots\vert x_n$} indicates that any of the values $x_1$, $x_2$, \ldots, $x_n$ can be placed there. +% \item \meta{$x_1\vert x_2\vert\ldots\vert x_n$} indicates that any of the values $x_1$, $x_2$, \ldots, $x_n$ can be placed there. A special case is \meta{$x_1\vert x_2\vert\ldots$}, where no upper limit is set. +% \item The possible values of a meta-variable could also be indicated by a property. For example \meta{$x:x>0$} indicates that any positive value can be used in that location. % \item A meta-variable of the form \meta{list of something} or \meta{something list} indicate a comma-separated list of values of type $\meta{something}$; if only one value is used, no comma is needed. -% \item A meta-variable with underscores (``\_'') in its description indicate that spaces should not be used in that location. +% \item A meta-variable with underscores (``|_|'') in its description indicate that spaces should not be used in that location. % \item \meta{key-val list} refers to a list of \meta{key}=\meta{value} pairs of options, where \meta{key} is a keyword name for an option and \meta{value} is a value assigned to it. % \end{enumerate} % -% As is conventional for \LaTeX{} packages, the commands and environments of \textsf{\mglTeX{}} accept optional commands inside brackets and mandatory arguments inside curly braces. +% As is conventional for \LaTeX{} packages, the environments and commands defined by \textsf{\mglTeX} accept optional commands inside brackets ("|[|" and "|]|"), and mandatory arguments inside curly braces ("|{|" and "|}|"). +% +% While reading the following, it must be noted that most of \textsf{\mglTeX} settings have three modes: global, local and private. A setting is \emph{global} if it applies to the whole document, it is \emph{local} if it applies to the document from one point onwards, and it is \emph{private} if it applies only to a particular MGL script. Global settings are set thorugh package options or with the command |\mglsettings| (explained later), local settings have associated commands (subsection \ref{local setts}), and private settings are specified as optional arguments for environments and commands. An example of this would be the package option |4q|, the command |\mglquality{4}|, and the optional argument for environments and commands |quality=4|, to set the quality for graphics to |4| in the three different modes, respectively. % % \section{Usage} % \noindent The simplest way to load \textsf{\mglTeX} to a \LaTeX{} document is to write the command @@ -198,14 +228,16 @@ % \end{center} % where \meta{options list} can contain one or more of the following options: % \begin{itemize} -% \item |draft|: The generated images won't be included in the document. This option is useful when fast compilation of the document is needed. -% \item |final|: Overrides the |draft| option. -% \item |on|: To rewrite, recompile and include the changed MGL scripts and/or corresponding graphics. -% \item |off|: To avoid creation, compilation and/or inclusion of the MGL scripts and corresponding images. -% \item |comments|: To allow the contents of the |mglcomment| environments to be shown in the \LaTeX{} document. -% \item |nocomments|: To avoid showing the contents of the |mglcomment| environments in the \LaTeX{} document. -% \item |1x|, \ldots, |9x|: To specify the scale for the creation of graphics (|1x| is normal scaling, |2x| is twice as bigger, etc). -% \item |0q|, \ldots, |8q|: To specify the quality for the creation of graphics. An info message indicating the characteristics of the chosen quality is printed in the .log file according to the following table: +% \item \textbf{draft:} The generated images won't be included in the document. This option is useful when fast compilation of the document is needed. +% \item \textbf{final:} Overrides the |draft| option. +% \item \textbf{on:} To rewrite, recompile and include the changed MGL scripts and/or corresponding graphics. +% \item \textbf{off:} To avoid creation, compilation and/or inclusion of the MGL scripts and corresponding images. +% \item \textbf{comments:} To allow the contents of the |mglcomment| environments to be shown in the \LaTeX{} document. +% \item \textbf{nocomments:} To avoid showing the contents of the |mglcomment| environments in the \LaTeX{} document. +% \item \textbf{gray:} To create the MGL graphics in gray-scale mode. +% \item \textbf{color:} To create the MGL graphics in color mode. +% \item \textbf{1x, \ldots, 9x:} To specify the scale for the creation of graphics (|1x| is normal scaling, |2x| is twice as bigger, etc). +% \item \textbf{0q, \ldots, 9q:} To specify the quality for the creation of graphics. An info message indicating the characteristics of the chosen quality is printed in the .log file according to the following table: % \begin{center} % \DeleteShortVerb{\|} % \begin{tabular}{|c|l|} @@ -232,14 +264,17 @@ % \hline % $8$ & Draw dots instead of primitives (extremely fast)\\ % \hline +% $9$ & No drawing (for testing purposes)\\ +% \hline % \end{tabular} % \MakeShortVerb{\|} % \end{center} -% \item |png|, |jpg|, |jpeg|: To export images to a bitmap format. -% \item |eps|, |epsz|: To export to uncompressed/compressed vectorial EPS format. -% \item |bps|, |bpsz|: To export to uncompressed/compressed bitmap EPS format. -% \item |pdf|: To export to 3D PDF format. -% \item |tex|: To export to \LaTeX{}/\emph{tikz} document. +% \item \textbf{0v, 1v, 2v:} To set the default variant of arguments for the MGL commands. +% \item \textbf{png, jpg, jpeg:} To export images to a bitmap format. +% \item \textbf{eps, epsz:} To export to uncompressed/compressed vectorial EPS format. +% \item \textbf{bps, bpsz:} To export to uncompressed/compressed bitmap EPS format. +% \item \textbf{pdf:} To export to 3D PDF format. +% \item \textbf{tex:} To export to \LaTeX{}/\emph{tikz} document. % \end{itemize} % If two or more mutually exclusive options are specified, only the last one will be used by \textsf{\mglTeX}. For example, if one specifies the options |0q|, |3q| and |8q|---in that order---, then the quality will be set to $8$. % @@ -282,7 +317,7 @@ % \end{quote} % % \subsection{Environments for MGL code embedding} -% \DescribeEnv{mgl}\noindent The main environment defined by \textsf{\mglTeX} is |mgl|. It extracts its contents to a main script, called \meta{main\_script\_name}.mgl, where \meta{main\_script\_name} stands for a name specified by the user with the |\mglname| command (see below), or the name of the \LaTeX{} document being executed otherwise; this script is compiled, and the corresponding image is included. +% \DescribeEnv{mgl}\noindent The main environment defined by \textsf{\mglTeX} is |mgl|. It extracts its contents to a main script, called \meta{main\_script\_name}.mgl, where \meta{main\_script\_name} stands for a name specified by the user with the |\mglname| command (explained later), or the name of the \LaTeX{} document being executed otherwise; this script is compiled, and the corresponding image is included. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] @@ -292,9 +327,18 @@ % \hline % \end{tabular} % \end{center} -% Here, \meta{key-val list} can have the same optional arguments as the |\includegraphics| command from the \textsf{graphicx} package, plus two additional ones, |imgext|, which can be used to specify the extension to save the graphic, and |label|, which can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied). The \meta{MGL code} doesn't need to contain any specific instruction to create the image since \textsf{\mglTeX} takes care of that. +% Here, \meta{key-val list} can have the following optional arguments: +% \begin{itemize} +% \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. +% \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). +% \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger. +% \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. +% \item \textbf{variant:} Sets the variant of argument for the commands in the current script. +% \item \textbf{imgext:} Can be used to set the extension for the current image. +% \item \textbf{label:} Can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied) +% \end{itemize} % -% \DescribeEnv{mgladdon} This environment adds its contents to the document's main script, but it doesn't produce any image. It doesn't require any kind of arguments. It is useful to add ``complementary code'', like loading of dynamic libraries, set default size for the graphics, etc. +% \DescribeEnv{mgladdon} This environment adds its contents to the document's main script, but it doesn't produce any image. It doesn't require any kind of arguments. It is useful to add ``complementary code'', like instructions to load dynamic libraries, set default size for the graphics, etc. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] @@ -316,7 +360,15 @@ % \end{tabular} % \end{center} % -% \DescribeEnv{mglcode} It has the same function as the |mgl| environment, but the corresponding code is written to a separate script, whose name is specified as mandatory argument. It accepts the same optional arguments as |mgl|, except, of course, the |label| option. +% \DescribeEnv{mglcode} It has the same function as the |mgl| environment, but the corresponding code is written to a separate script, whose name is specified as mandatory argument. It accepts the following optional arguments: +% \begin{itemize} +% \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. +% \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). +% \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger. +% \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. +% \item \textbf{variant:} Sets the variant of argument for the commands in the current script. +% \item \textbf{imgext:} Can be used to set the extension for the current image. +% \end{itemize} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] @@ -338,13 +390,13 @@ % \end{tabular} % \end{center} % -% \DescribeEnv{mglcommon} This is used to create a common ``setup'' script to define constants, parameters, etc. that will be available to the others. +% \DescribeEnv{mglsetupscript} This is used to create a common ``setup'' script to define constants, parameters, etc. that will be available to the others. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\begin{mglcommon}|\\[0.5em] +% |\begin{mglsetupscript}|\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] -% |\end{mglcommon}|\\[0.25em] +% |\end{mglsetupscript}|\\[0.25em] % \hline % \end{tabular} % \end{center} @@ -352,12 +404,23 @@ % % For example, one could write % \begin{quote} -% |\begin{mglcommon}|\\ +% |\begin{mglsetupscript}|\\ % |define gravity 9.81 # [m/s^2]|\\ -% |\end{mglcommon}| +% |\end{mglsetupscript}| % \end{quote} % to make the constant \emph{gravity} available to every script. % +% \DescribeEnv{mglcommon} This is a synomyn for the |mglsetupscript| environment. It is and will always be kept in \textsf{\mglTeX} for backwards compatibility with older versions of the package, but its use is \emph{deprecated}. +% \begin{center} +% \begin{tabular}{l} +% \hline\\[-0.75em] +% |\begin{mglcommon}|\\[0.5em] +% \hss\meta{MGL code}\hss\\[0.5em] +% |\end{mglcommon}|\\[0.25em] +% \hline +% \end{tabular} +% \end{center} +% % \subsection{Fast creation of graphics} % \noindent\textsf{\mglTeX} defines a convenient way to work with many graphics that have exactly the same settings (same rotation angles, same type of grid, same lighting, etc.): instead of writing repetitive code every time it's needed, it can be stored inside a |mglsetup| environment, and then can be used when needed with the |\mglplot| command. % @@ -372,7 +435,18 @@ % \end{tabular} % \end{center} % -% \DescribeMacro{\mglplot} This command is used for fast generation of graphics with default settings, and can be used in parallel with the |mglsetup| environment. It accepts one mandatory argument which consists of MGL instructions, separated by the symbol ``:'', and can span through various text lines. It accepts the same optional arguments as the |mgl| environment, plus two additional ones, called |setup| and |separator|. The |setup| option specifies a keyword associated to a |mglsetup| block, which will be executed before the code in the mandatory argument. The |separator| option specifies a text symbol that will break the code in the mandatory argument into a new physical line in the main script every time is encountered. +% \DescribeMacro{\mglplot} This command is used for fast generation of graphics with default settings, and can be used in parallel with the |mglsetup| environment. It accepts one mandatory argument which consists of MGL instructions, separated by the symbol ``:'', and can span through various text lines. It accepts the following optional arguments: +% \begin{itemize} +% \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. +% \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). +% \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, e.g., |mglscale=2| will create an image file twice as bigger. +% \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. +% \item \textbf{variant:} Sets the variant of argument for the commands in the current script. +% \item \textbf{imgext:} Can be used to set the extension for the current image. +% \item \textbf{label:} Can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied) +% \item \textbf{setup:} Specifies a keyword associated to a |mglsetup| block, which will be executed before the code in the mandatory argument. +% \item \textbf{separator:} Specifies a text symbol that will break the code in the mandatory argument into a new physical line in the main script every time is encountered. +% \end{itemize} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] @@ -382,11 +456,15 @@ % \end{center} % % \subsection{Verbatim-like environments} -% \noindent The main purpose of these environments is to typeset their contents to the \LaTeX{} document, elegantly separated from the rest of the text. They have two versions: an unstarred version which can be listed later with the |\listofmglscripts| command (see below), and a starred version which won't be listed. +% \noindent The main purpose of these environments is to typeset their contents to the \LaTeX{} document, elegantly separated from the rest of the text. They have two versions: an unstarred version which can be listed later with the |\listofmglscripts| command (explained later), and a starred version which won't be listed. % -% Although these environments are intended to mimic the behavior of the |verbatim| environment from \LaTeX{}, there is an important difference, namely, long lines will be broken when the page margin is reached. This intended behavior is set because a language like MGL can easily have very long lines of code, like textual formulas, vectors input as lists of values, etc. Of course, no hyphenation will be performed, but the code will be indented in the second, third, etc. continuation lines by an amount specified by |\mglbreakindent| (see below). +% Although these environments are intended to mimic the behavior of the |verbatim| environment from \LaTeX{}, there is an important difference, namely, long lines will be broken when the page margin is reached. This intended behavior is set because a language like MGL can easily have very long lines of code, like textual formulas, vectors input as lists of values, etc. Of course, no hyphenation will be performed, but the code will be indented in the second, third, etc. continuation lines by an amount specified by |\mglbreakindent| (explained later). % -% \DescribeEnv{mglblock}\DescribeEnv{mglblock*} Besides typesetting its contents to the document, |mglblock| creates a script whose name is specified as mandatory argument. It also accepts one optional argument, called |lineno|, whose default value is |true|, used to activate (|lineno=true|) or deactivate (|lineno=false|) line numbering inside the environment. The default behavior is to number each line of code. +% \DescribeEnv{mglblock}\DescribeEnv{mglblock*} Besides typesetting its contents to the document, |mglblock| creates a script whose name is specified as mandatory argument. It accepts one optional argument: +% \begin{itemize} +% \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment. +% \end{itemize} +% By default, each line of code is numbered. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] @@ -409,13 +487,13 @@ % \begin{quote} % \makeatletter % \MGL@set@script@name{example_script}% -% \refstepcounter{MGL@verb@script@no}% -% \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@script@no.}{\ttfamily\protect\detokenize{\MGL@script@name.mgl}}}% +% \refstepcounter{MGL@verb@no}% +% \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@no.}{\ttfamily\protect\detokenize{\MGL@script.mgl}}}% % \setcounter{MGL@line@no}{0}% % \list{\mgllinenostyle\arabic{MGL@line@no}.}{}% % \MGL@set@pseudo@verb@env % \fboxrule=\mgllinethickness% -% \item[\MGL@line@sep]\fbox{\bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}}\hskip\labelsep\MGL@line@sep\par\par% +% \item[\MGL@line@sep]\fbox{\bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}}\hskip\labelsep\MGL@line@sep\par\par% % \stepcounter{MGL@line@no}% % \item new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% @@ -430,7 +508,12 @@ % \endlist% % \end{quote} % -% \DescribeEnv{mglverbatim}\DescribeEnv{mglverbatim*} This environment only typesets its contents to the \LaTeX{} document without creating any script. It accepts the |lineno| option, with default value |true|, plus an one called |label|, intended to specify a name associated to the corresponding code. The default behavior is to number each line of code. +% \DescribeEnv{mglverbatim}\DescribeEnv{mglverbatim*} This environment only typesets its contents to the \LaTeX{} document without creating any script. It accepts two optional arguments +% \begin{itemize} +% \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment. +% \item \textbf{label:} Used to specify a name associated to the corresponding code. +% \end{itemize} +% The default behavior is to number each line of code. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] @@ -458,8 +541,8 @@ % \fboxrule=\mgllinethickness% % \MGL@set@script@name{\mglverbatimname}% % \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% -% \refstepcounter{MGL@verb@script@no}% -% \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@script@no.}{\ttfamily\protect\detokenize{\MGL@script@name}}}% +% \refstepcounter{MGL@verb@no}% +% \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@no.}{\ttfamily\protect\detokenize{\MGL@script}}}% % \stepcounter{MGL@line@no}% % \item new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% @@ -475,35 +558,51 @@ % \end{quote} % \noindent If a |label| is specified, the output will look exactly as that of the |mglblock| environment. % -% \DescribeEnv{mglcomment} This environment is used to embed commentaries in the \LaTeX{} document. The commentary won't be visible in the case of the user passing the option |nocomments| to the package, but it will be typeset \emph{verbatim} to the document if the user passes the option |comments|. +% \DescribeEnv{mglcomment} This environment is used to embed comments. The comment won't be visible in the case of the user passing the option |nocomments| to the package, but it will be typeset \emph{verbatim} to the document if the user passes the option |comments|. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglcomment}|\\[0.5em] -% \hss\meta{Commentary}\hss\\[0.5em] +% \hss\meta{Comment}\hss\\[0.5em] % |\end{mglcomment}|\\[0.25em] % \hline % \end{tabular} % \end{center} -% If the user requests visible commentaries, this will result in the appearance of something like the following in the \LaTeX{} document: +% If the user requests visible comments, this will result in the appearance of something like the following in the \LaTeX{} document: % \begin{quote} % \makeatletter % \list{}{}% % \MGL@set@pseudo@verb@env % \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>% -% \item This is a MGL commentary +% \item This is a mglTeX comment % \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>% % \endlist% % \end{quote} % % \subsection{Working with external scripts} -% \noindent External scripts exist in their own files, independently of the \LaTeX{} document ---for example, a script sent by a colleague, a script created before the actual writing of the \LaTeX{} document, etc. \textsf{\mglTeX} provides convenient ways to deal with external scripts, as if they were embedded. It must be noted, however, that the package works on the suposition that these scripts are in their final version, so no change detection is performed on them. If a external script is changed, the corresponding graphic must be manually deleted in oreder to force recompilation. +% \noindent \textsf{\mglTeX} provides convenient ways to deal with external scripts (scripts that exist in their own files, independently of the \LaTeX{} document, like scripts sent by a colleague or created before the actual writing of the \LaTeX{} document, etc). It must be noted, however, that the package works on the suposition that these scripts are in their final version, so no change detection is performed on them. If a external script is changed, the corresponding graphic must be manually deleted in oreder to force recompilation. +% +% \DescribeMacro{\mglgraphics} This command takes the name of an external MGL script as mandatory argument, which will be automatically executed, and the resulting image will be included. The same optional arguments accepted by this command are: +% \begin{itemize} +% \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. +% \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). +% \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger. +% \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. +% \item \textbf{variant:} Sets the variant of argument for the commands in the current script. +% \item \textbf{imgext:} Can be used to set the extension for the current image. +% \item \textbf{path:} Can be used to specify the location of the script. +% \end{itemize} % -% \DescribeMacro{\mglinclude}\DescribeMacro{\mglinclude*} This command is the equivalent of the |mglverbatim| environment for external scripts. It takes one mandatory argument, which is the name of a MGL script, which will be automatically transcript \emph{verbatim} on the \LaTeX{} document. It accepts the same optional arguments as the |\mglgraphics| command, plus the |lineno| option to activate/deactivate line numbering. There are unstarred version of this command will be listed if |\listofmglscripts| is used, while the starred version won't. +% \DescribeMacro{\mglinclude}\DescribeMacro{\mglinclude*} This command is the equivalent of the |mglverbatim| environment for external scripts. It takes one mandatory argument, which is the name of a MGL script, which will be automatically transcript \emph{verbatim} on the \LaTeX{} document. It accepts the following optional arguments: +% \begin{itemize} +% \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment. +% \item \textbf{path:} Can be used to specify the location of the script. +% \end{itemize} +% The unstarred version of this command will be listed if |\listofmglscripts| is used (explained later), while the starred version won't. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglinclude|\marg{script\_name}\oarg{key-val list}\\[0.25em] +% |\mglinclude|\oarg{key-val list}\marg{script\_name}\\[0.25em] % \hline % \end{tabular} % \end{center} @@ -515,32 +614,81 @@ % \end{tabular} % \end{center} % -% \DescribeMacro{\mglgraphics} This takes one mandatory argument, which is the name of an external MGL script, which will be automatically executed, and the resulting image will be included. The same optional arguments as the |\includegraphics| command are accepted, plus the |imgext| option to specify the extension of the resulting graphic, and an additional option, |path|, which can be used to specify the location of the script. +% \subsection{Additional commands} +% \DescribeMacro{\listofmglscripts}\noindent Opens a new section or chapter---depending on the \LaTeX{} class used---, where all the scripts that have been transcript in the document with the unstarred versions of the |mglblock| and |mglverbatim| environments, and the |\mglinclude| command, are listed. In case a |mglverbatim| is used, but no |label| is specified, the default name to display is specified by the |\mglverbatimname| macro (explained later), otherwise, the corresponding label is typeset. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglgraphics|\oarg{key-val list}\marg{script\_name}\\[0.25em] +% |\listofmglscripts|\\[0.25em] % \hline % \end{tabular} % \end{center} +% The output is like this: +% \begin{center} +% \begin{minipage}{0.9\textwidth} +% \listofmglscripts +% \end{minipage} +% \end{center} % -% \subsection{Additional commands} -% \DescribeMacro{\mglname}\noindent This command can be used in the preamble of the document to indicate the name of the main script, passed as mandatory argument. If used after the |\begin{document}| command, it will force the closure of the current main script, create the corresponding graphics, and start a new script with the specified name. +% \DescribeMacro{\mglTeX}\DescribeMacro{\mglTeX*} This command just pretty-prints the name of the package, i.e., the logo: +% \begin{center} +% \Huge\mglTeX +% \end{center} +% The starred version will also print the version in a coherent manner. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglname|\marg{main\_script\_name}\\[0.25em] +% |\mglTeX|\\[0.25em] +% \hline +% \end{tabular} +% \end{center} +% \begin{center} +% \begin{tabular}{l} +% \hline\\[-0.75em] +% |\mglTeX*|\\[0.25em] % \hline % \end{tabular} % \end{center} % -% The use of this command is encouraged when writing large documents, like books or thesis, to create a main script per document block (section, chapter, part, etc.). Since the |mgl| environment and the |\mglplot| command use an internal counter to automatically name scripts, unless the |label| option is used; if a new script is added this way to the document, it will alter the original numbering, causing \textsf{\mglTeX} to recompile the scripts from that point on (for more details, read subsection \ref{subsection: recompilation decision}). If the |\mglname| command is used, only the scripts of the current document block will be recompiled. +% In an environment where the typesetting of the logo is impossible (a text editor, for instance), it can (and should) be replaced by ``mglTeX''. % -% \DescribeMacro{\mglimgext} Can be used to specify the extension to save graphics. Its effect is local, meaning that the new quality will be applied from the point this command is used~on. +% \subsection{Local settings commands}\label{local setts} +% \noindent These commands are intended to be equivalent to the package options, but with a local-only effect, meaning that the new settings are applied from the point these commands are used onward. +% +% \DescribeMacro{\mglswitch} This command is equivalent to the package options |on| and |off|, depending on the argument passed. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglimgext|\marg{image extension}\\[0.25em] +% |\mglswitch{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em] +% \hline +% \end{tabular} +% \end{center} +% +% Observe that |\mglswitch{on}| and |\mglswitch{off}| can be used to save time when writing a document, wrapping a section with them, avoiding recompilation of the corresponding scripts. +% +% \DescribeMacro{\mglcomments} This command is equivalent to the package options |comments| and |nocomments|, depending on the argument passed. +% \begin{center} +% \begin{tabular}{l} +% \hline\\[-0.75em] +% |\mglcomments{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em] +% \hline +% \end{tabular} +% \end{center} +% +% \DescribeMacro{\mglgray} It is equivalent to the package options |gray| and |color|, depending on the argument passed. +% \begin{center} +% \begin{tabular}{l} +% \hline\\[-0.75em] +% |\mglgray{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em] +% \hline +% \end{tabular} +% \end{center} +% +% \DescribeMacro{\mglscale} Can be used to specify the default scaling for the creation of MGL graphics (1 is normal scaling, 2 is twice as bigger, etc.). +% \begin{center} +% \begin{tabular}{l} +% \hline\\[-0.75em] +% |\mglscale|\marg{$x:x>0$}\\[0.25em] % \hline % \end{tabular} % \end{center} @@ -572,6 +720,8 @@ % \hline % $8$ & Draw dots instead of primitives (extremely fast)\\ % \hline +% $9$ & No drawing (for testing purposes)\\ +% \hline % \end{tabular} % \MakeShortVerb{\|} % \end{center} @@ -579,72 +729,41 @@ % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglquality|\marg{0$\vert$1$\vert$\ldots$\vert$8}\\[0.25em] +% |\mglquality|\marg{0\,$\vert$1\,$\vert$\ldots\,$\vert$9}\\[0.25em] % \hline % \end{tabular} % \end{center} % -% \DescribeMacro{\mglscale} Can be used to specify the default scaling for the creation of MGL graphics (1 is normal scaling, 2 is twice as bigger, etc.). Its effect is local, meaning that the new scaling will be applied from the point this command is used on. Any non negative value can be specified. +% \DescribeMacro{\mglvariant} It is useful to set the default variant of arguments for MGL commands. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglscale|\marg{1$\vert$2$\vert$\ldots$\vert$9}\\[0.25em] +% |\mglvariant|\marg{0\,$\vert$1\,$\vert$\ldots}\\[0.25em] % \hline % \end{tabular} % \end{center} % -% \DescribeMacro{\mglswitch} This command is equivalent to the package options |on| and |off|, depending on the argument passed, but it's effect is local. +% \DescribeMacro{\mglimgext} Can be used to specify the extension to save graphics. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglswitch{|\meta{on$\vert$off}|}|\\[0.25em] +% |\mglimgext|\marg{image extension}\\[0.25em] % \hline % \end{tabular} % \end{center} % -% Observe that |\mglswitch{on}| and |\mglswitch{off}| can be used to save time when writing a document, wrapping a section with them, avoiding recompilation of the corresponding scripts. -% -% \DescribeMacro{\mglcomments} This command is equivalent to the package options |comments| and |nocomments|, depending on the argument passed, but its effect is local. +% \DescribeMacro{\mglname}\noindent If used in the preamble of the document this commands just sets the name of the. If used after the |\begin{document}| command, it will force the closure of the current main script, create the corresponding graphics, and start a new main script with the specified name. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] -% |\mglcomments{|\meta{on$\vert$off$\vert$true$\vert$false}|}|\\[0.25em] +% |\mglname|\marg{main\_script\_name}\\[0.25em] % \hline % \end{tabular} % \end{center} % -% \DescribeMacro{\listofmglscripts} Opens a new section or chapter---depending on the \LaTeX{} class used---, where all the scripts that have been transcript in the document with the unstarred versions of the |mglblock| and |mglverbatim| environments, and the |\mglinclude| command, are listed. In case a |mglverbatim| is used, but no |label| is specified, the default name to display is specified by the |\mglverbatimname| macro (see below), otherwise, the corresponding label is typeset. -% \begin{center} -% \begin{tabular}{l} -% \hline\\[-0.75em] -% |\listofmglscripts|\\[0.25em] -% \hline -% \end{tabular} -% \end{center} -% The output is like this: -% \begin{center} -% \begin{minipage}{0.9\textwidth} -% \listofmglscripts -% \end{minipage} -% \end{center} -% -% \DescribeMacro{\mglTeX}\DescribeMacro{\mglTeX*} This command just pretty-prints the name of the package; if followed by an asterisk, it will also print the version, separated with an unbreakable space. -% \begin{center} -% \begin{tabular}{l} -% \hline\\[-0.75em] -% |\mglTeX|\\[0.25em] -% \hline -% \end{tabular} -% \end{center} -% \begin{center} -% \begin{tabular}{l} -% \hline\\[-0.75em] -% |\mglTeX*|\\[0.25em] -% \hline -% \end{tabular} -% \end{center} +% The use of this command is encouraged when writing large documents, like books or thesis, to create a main script per document block (section, chapter, part, etc.). Since the |mgl| environment and the |\mglplot| command use an internal counter to automatically name scripts, unless the |label| option is used; if a new script is added this way to the document, it will alter the original numbering, causing \textsf{\mglTeX} to recompile the scripts from that point on (for more details, read subsection \ref{subsection: recompilation decision}). If the |\mglname| command is used, only the scripts of the current document block will be recompiled. % -% \subsection{Advanced setup commands} +% \subsection{Advanced settings commands} % \noindent Although \textsf{\mglTeX} is completely functional without any further set up, there are some parameters of its behavior that could be useful to modify. The following commands must be used in the preamble of the document only, since the first MGL script is created at the moment of the |\begin{document}| command, and otherwise they could create weird errors during compilation; trying to use them somewhere else will produce an error. % % \DescribeMacro{\mgldir} This command can be used to specify the main working directory for \textsf{\mglTeX}. Inside it, the scripts, backup files and graphics will be created, or can be separated inside subdirectories. This is useful, for example, to avoid many scripts and graphics from polluting the directory where the \LaTeX{} document is. @@ -695,7 +814,7 @@ % \end{center} % This command can be used many times or can be used to specify many paths at once. In the case of using it many times, each call will add the new directory or directories to the list of searching paths. % -% \DescribeMacro{mglsettings} This command has been added for the confort of the user, since it handles all of the basic and advanced settings of \textsf{\mglTeX}, as an alternative to some package options and commands. It takes one mandatory argument which should be a list of \meta{key}=\meta{value} pairs, according to the following table: +% \DescribeMacro{\mglsettings} This command has been added for the confort of the user, since it handles all of the basic and advanced settings of \textsf{\mglTeX}, as an alternative to some package options and commands. It takes one mandatory argument which should be a list of \meta{key}=\meta{value} pairs, according to the following table: % \begin{center} % \DeleteShortVerb{\|} % \begin{tabular}{|l|l|l|} @@ -713,9 +832,17 @@ % \hline % paths & \meta{directory list} & Paths to external scripts\\ % \hline -% quality & \meta{0$\vert$1$\vert$\ldots$\vert$8} & Quality for creation of graphics\\ +% switch & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on \mglTeX\\ % \hline -% scale & \meta{1$\vert$2$\vert$\ldots$\vert$9} & Scale for creation of graphics\\ +% comments & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on comments\\ +% \hline +% gray & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on gray-scale mode\\ +% \hline +% mglscale & \meta{$x:x>0$} & Scale for creation of graphics\\ +% \hline +% quality & \meta{0\,$\vert$1\,$\vert$\ldots\,$\vert$9} & Quality for creation of graphics\\ +% \hline +% variant & \meta{0\,$\vert$1\,$\vert$\ldots} & Variant of arguments for MGL commands\\ % \hline % imgext & \meta{image extension} & Extension for creation of graphics\\ % \hline @@ -731,16 +858,16 @@ % \end{center} % % \subsection{User-definable macros} -% \noindent There are macros that the user is allowed to modify in order to customize some aspects of the behavior of \textsf{\mglTeX}. For example, if writing in spanish, french or russian, the user would like to modify the name of the common script, the words typeset in the separator lines of MGL commentaries, the name of the list of MGL scripts, etc. +% \noindent There are macros that the user is allowed to modify in order to customize some aspects of the behavior of \textsf{\mglTeX}. For example, if writing in spanish, french or russian, the user would like to modify the name of the common script, the words typeset in the separator lines of mglTeX comments, the name of the list of MGL scripts, etc. % -% \DescribeMacro{\mglcommonscriptname} It is the name for the common script that takes the contents of the |mglcommon| environment. The default name is defined by +% \DescribeMacro{\mglsetupscriptname} It is the name for the common setup script that takes the contents of the |mglseuptscipt| or |mglcommon| environments. The default name is defined by % \begin{quote} -% |\def\mglcommonscriptname{MGL_common_script}| +% |\def\mglsetupscriptname{MGL_setup_script}| % \end{quote} % -% \DescribeMacro{\mglcommentname} This macro expands to the words typeset before and after a MGL commentary, in the middle of the separator lines. The default words are set by +% \DescribeMacro{\mglcommentname} This macro expands to the words typeset before and after a \textsf{\mglTeX} comment, in the middle of the separator lines. The default words are set by % \begin{quote} -% |\def\mglcommentname{MGL commentary}| +% |\def\mglcommentname{\mglTeX{} comment}| % \end{quote} % % \DescribeMacro{\listofmglscriptsname} This is the name of the section/chapter created by the command |\listofmglscripts|. The default is set by @@ -841,18 +968,48 @@ % \StopEventually{\PrintChanges\PrintIndex} % % \section{Implementation} -% \noindent This section documents the complete implementation of \textsf{\mglTeX}. It's main purpose is to facilitate the understanding and maintanance of the package's code. For the following, we use ``|@|'' in the name of macros the user should not modify; the prefix ``|MGL|'' is used to simulate a namespace, so the macros from \textsf{\mglTeX} won't interfere with the ones from other packages. +% \noindent This section documents the complete code of \textsf{\mglTeX}. It's main purpose is to facilitate the understanding and maintanance of the package's code. For the following, we use ``|@|'' in the name of macros the user should not modify; the prefix ``|MGL|'' is used to simulate a namespace, so the macros from \textsf{\mglTeX} won't interfere with the ones from other packages. % -% \subsection{Initialization} +% \subsection{Initialization}\label{Init} % \noindent We first define some macros that will serve different purposes on different parts of the package. +% \begin{macro}{\MGL@off}\begin{macro}{\MGL@on}\begin{macro}{\MGL@zero}\begin{macro}{\MGL@one} +% These are used in the command |\MGL@test@switch| (explained later) to determine whether the user has passed one of the options |off|, |on|, |0| or |1| to a command. +% \begin{macrocode} +\def\MGL@off{off} +\def\MGL@on{on} +\def\MGL@zero{0} +\def\MGL@one{1} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro} +% \begin{macro}{\MGL@test@switch} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command to verify and validate switching arguments} +% It is called by a command to test whether the user has passed the option |off|, |on|, |0| (equivalent to |off|) or |1| (equivalent to |on|); if the option is correct, it is replaced by its equivalent, otherwise, a warning is issued. It takes two arguments: the first one is the option to test, the second one is the name of the command calling this macro. +% \begin{macrocode} +\def\MGL@test@switch#1#2{% + \def\MGL@temp@a{#1}% + \ifx\MGL@temp@a\MGL@on% + \else\ifx\MGL@temp@a\MGL@off% + \else\ifx\MGL@temp@a\MGL@one% + \def\MGL@temp@a{on}% + \else\ifx\MGL@temp@a\MGL@zero% + \def\MGL@temp@a{off}% + \else% + \PackageWarning{mgltex}{% + Unrecognizable option "#1" passed to command \protect#2% + }% + \fi\fi\fi\fi% +} +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\MGL@TeX@ext} -% Is used to determine whether the user has chosen to save graphics in \LaTeX/Tikz format. +% Is used in the command |\MGL@includegraphics| (explained later) to determine whether the user has chosen to save graphics in \LaTeX/Tikz format. % \begin{macrocode} \def\MGL@TeX@ext{.tex} % \end{macrocode} % \end{macro} % -% The macros |\MGL@switch@on| and |\MGL@switch@off| are called when the package options |on| and |off| are passed, respectively. +% The macros |\MGL@switch@on| and |\MGL@switch@off| are called when the package options |on| and |off| are passed, respectively, or when the commands |\mglswitch{on}| and |\mglswitch{off}| are used, respectively. % \begin{macro}{\MGL@switch@on} % (Re)defines the commands to open, read, write and close scripts, and the command that includes MGL graphics. % \begin{macrocode} @@ -918,27 +1075,27 @@ % \begin{macrocode} \def\MGL@includegraphics{% % \end{macrocode} -% First checks if the image exists. Note the |\MGL@dir| and |\MGL@graphics@dir| macros are set by the user with the |\mgldir| and |\mglgraphicsdir| commands, respectively, while |\MGL@script@name| stores the name of the script ---and thus the image--- executed, and |\MGL@graph@ext| is the extension chosen by the user to save the graphics. +% First checks if the image exists. Note the |\MGL@dir| and |\MGL@graphics@dir| macros are set by the user with the |\mgldir| and |\mglgraphicsdir| commands, respectively, while |\MGL@script| stores the name of the script ---and thus the image--- executed, and |\MGL@imgext| is the extension chosen by the user to save the graphics. % \begin{macrocode} - \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}{% + \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{% % \end{macrocode} % If the chosen extension is |.tex|, a \LaTeX/Tikz file has been created, which has to be simply included in the document; it will be automatically compiled by \LaTeX{}. (Observe we use the |\MGL@TeX@ext| macro defined above.) % \begin{macrocode} - \ifx\MGL@graph@ext\MGL@TeX@ext% - \include{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}% + \ifx\MGL@imgext\MGL@TeX@ext% + \include{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}% % \end{macrocode} % If the chosen extension is not |.tex|, a normal visual image has been created, so the |\includegraphics| command is invoked to deal with it. The options for this command (like |scale|, |angle|, etc.) are stored in the |\MGL@graph@keys| macro, which is defined by every environment or command that creates and compiles MGL scripts, according to the optional arguments the user has passed. % \begin{macrocode} \else% \expandafter\includegraphics\expandafter[\MGL@graph@keys]{% - \MGL@dir\MGL@graphics@dir\MGL@script@name% + \MGL@dir\MGL@graphics@dir\MGL@script% }% \fi% }{% % \end{macrocode} % If the requested image doesn't exist, the issue a warning message for the user, and print a warning framed box (``\textbf{MGL image not found}'') in the place the image should occupy. % \begin{macrocode} - \PackageWarning{mgltex}{MGL image "\MGL@script@name" not found}% + \PackageWarning{mgltex}{MGL image "\MGL@script" not found}% \fbox{% \centering% \bfseries\Huge% @@ -976,24 +1133,44 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\@MGL@comments@on}\begin{macro}{\@MGL@comments@off} -% We will need a boolean switch to activate/deactivate commentaries later. +% \begin{macro}{\@MGL@comments@off}\begin{macro}{\@MGL@comments@on} +% We will need a boolean switch to activate/deactivate comments later. % \begin{macrocode} +\def\@MGL@comments@off{\let\if@MGL@comments@\iffalse} \def\@MGL@comments@on{\let\if@MGL@comments@\iftrue} -\def\@MGL@comments@off{\let\if@mglcomments@\iffalse} % \end{macrocode} % \end{macro}\end{macro} % +% \begin{macro}{\MGL@gray}\begin{macro}{\MGL@gray@off}\begin{macro}{\MGL@gray@on} +% The commands |\MGL@gray@off| and |\MGL@gray@on| simply set the value of |\MGL@gray| to $0$ and $1$, respectively; this value will be used later through the |-g| command line option from |mglconv|. +% \begin{macrocode} + +\def\MGL@gray@off{\def\MGL@gray{0}} +\def\MGL@gray@on{\def\MGL@gray{1}} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% \begin{macro}{\mglgray} +% Depending on the option passed by the user, it calls |\@MGL@gray@on| or |\@MGL@gray@off|. +% \begin{macrocode} +\def\mglgray#1{% + \MGL@test@switch{#1}{\mglgray}% + \csname @MGL@gray@\MGL@temp@a\endcsname% +} +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\mglscale}\begin{macro}{\MGL@scale} -% |\mglscale| sets the value of the |\MGL@scale| macro, which is used later to specify the default scaling for graphics. It only accepts integer values from $1$ to $9$, otherwise it issues a warning and restarts the scaling to $1$. In order to be able to check the validity of the value passed by the user, we first set the |\MGL@scale| macro to that value and test it with the |\ifcase| conditional; if the value is valid, we do nothing, but if it is invalid, we issue a warning and overwrite |\MGL@scale| to $1$. +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts any positive value} +% |\mglscale| sets the value of the |\MGL@scale| macro, which is used later to specify the default scaling for graphics. It only accepts positive values, otherwise it issues a warning and restarts the scaling to $1$. In order to be able to check the validity of the value passed by the user, we first set the |\MGL@scale| macro to that value and test it with the |\ifdim| conditional.\footnote{We can't use \doccommand{ifnum} here because it only accepts integer values.} Since this conditional tests dimensions only, the value passed by the user is multiplied by |\p@| (value |1pt|), so it can be compared with |\z@| (value |0pt|). % \begin{macrocode} \def\mglscale#1{ - \def\MGL@scale{#1}% - \ifcase\MGL@scale\or\or\or\or\or\or\or\or\else% + \ifdim#1\p@>\z@% + \def\MGL@scale{#1}% + \else% \PackageWarning{mgltex}{% - Scaling value of \MGL@scale\space not allowed; using default (1)% + Scaling value of #1\space not allowed; using default (1)% }% \def\MGL@scale{1}% \fi% @@ -1002,8 +1179,8 @@ % \end{macro}\end{macro} % % \begin{macro}{\mglquality}\begin{macro}{\MGL@quality} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{\texttt{9} is accepted as quality value now} % |\mglquality| sets the value of the |\MGL@quality| macro, which is used later to specify the default quality for graphics. It only accepts integer values from $0$ to $8$ (the only ones defined by |MathGL|), otherwise it issues a warning and restarts to $2$ (the default for |MathGL|). In order to be able to check the validity of the value passed by the user, we first set the |\MGL@quality| macro to that value and test it with the |\ifcase| conditional; if the value is valid, we print an info message to the |.log| file about the characteristics of the chosen quality, but if it is invalid, we issue a warning and overwrite |\MGL@scale| to $2$. -% \end{macro}\end{macro} % \begin{macrocode} \def\mglquality#1{% @@ -1026,11 +1203,13 @@ }% \or% \PackageInfo{mgltex}{% - Quality 4: No face drawing, direct bitmap drawing (low memory usage)% + Quality 4: No face drawing, direct bitmap drawing + (low memory usage)% }% \or% \PackageInfo{mgltex}{% - Quality 5: No color interpolation, direct bitmap drawing (low memory usage)% + Quality 5: No color interpolation, direct bitmap drawing + (low memory usage)% }% \or% \PackageInfo{mgltex}{% @@ -1038,12 +1217,17 @@ }% \or% \PackageInfo{mgltex}{% - Quality 7: High quality with 3d primitives, direct bitmap drawing (not implemented yet)% + Quality 7: High quality with 3d primitives, direct bitmap drawing % + (not implemented yet)% }% \or% \PackageInfo{mgltex}{% Quality 8: Draw dots instead of primitives (extremely fast)% }% + \or% + \PackageInfo{mgltex}{% + Quality 9: No drawing (for testing purposes)% + }% \else% \PackageWarning{mgltex}{% Quality #1 not available; using default (2)% @@ -1052,6 +1236,23 @@ \fi% } % \end{macrocode} +% \end{macro}\end{macro} +% +% \begin{macro}{\mglvariant}\begin{macro}{\MGL@variant} +% |\mglvariant| sets the value of the |\MGL@variant| macro, which is passed later to |mglconv| thorugh its |-v| command line option. It only accepts non-negative integer, otherwise it issues a warning and restarts to $0$ (the default for |MathGL|). In order to be able to check the validity of the value passed by the user, we use the |\ifnum| conditional; if the value is invalid we issue a warning and overwrite |\MGL@variant| to $0$. +% \begin{macrocode} + +\def\mglvariant#1{% + \def\MGL@variant{#1}% + \ifnum\MGL@variant<0% + \PackageWarning{mgltex}{% + Variant #1 not allowed; using default (0)% + }% + \def\MGL@variant{0}% + \fi% +} +% \end{macrocode} +% \end{macro}\end{macro} % % Now we declare the options |final| and |draft|, which are simply passed to the \textsf{graphicx} package. % \begin{macrocode} @@ -1063,57 +1264,61 @@ \PassOptionsToPackage{\CurrentOption}{graphicx}% } % \end{macrocode} -% Now we can declare the package options |on| and |off| so that they execute |\MGL@switch@on| and |\MGL@switch@off|, respectively. +% +% The rest of the package options just call an adequate command or set an adequate value for a macro. % \begin{macrocode} + \DeclareOption{on}{\MGL@switch@on} \DeclareOption{off}{\MGL@switch@off} -% \end{macrocode} -% Now, the options call the respective commands. -% \begin{macrocode} + \DeclareOption{nocomments}{\@MGL@comments@off} \DeclareOption{comments}{\@MGL@comments@on} -% \end{macrocode} -% The pacakage options |1x|, \ldots, |9x| just call |\mglscale| with the appropiate value. -% \begin{macrocode} -\DeclareOption{1x}{\mglscale{1}} -\DeclareOption{2x}{\mglscale{2}} -\DeclareOption{3x}{\mglscale{3}} -\DeclareOption{4x}{\mglscale{4}} -\DeclareOption{5x}{\mglscale{5}} -\DeclareOption{6x}{\mglscale{6}} -\DeclareOption{7x}{\mglscale{7}} -\DeclareOption{8x}{\mglscale{8}} -\DeclareOption{9x}{\mglscale{9}} -% \end{macrocode} -% The package options |0q|, \ldots, |8q| just call |\mglquality| with the appropiate value. -% \begin{macrocode} -\DeclareOption{0q}{\mglquality{0}} -\DeclareOption{1q}{\mglquality{1}} -\DeclareOption{2q}{\mglquality{2}} -\DeclareOption{3q}{\mglquality{3}} -\DeclareOption{4q}{\mglquality{4}} -\DeclareOption{5q}{\mglquality{5}} -\DeclareOption{6q}{\mglquality{6}} -\DeclareOption{7q}{\mglquality{7}} -\DeclareOption{8q}{\mglquality{8}} + +\DeclareOption{gray}{\MGL@gray@on} +\DeclareOption{color}{\MGL@gray@off} + +\DeclareOption{1x}{\def\MGL@scale{1}} +\DeclareOption{2x}{\def\MGL@scale{2}} +\DeclareOption{3x}{\def\MGL@scale{3}} +\DeclareOption{4x}{\def\MGL@scale{4}} +\DeclareOption{5x}{\def\MGL@scale{5}} +\DeclareOption{6x}{\def\MGL@scale{6}} +\DeclareOption{7x}{\def\MGL@scale{7}} +\DeclareOption{8x}{\def\MGL@scale{8}} +\DeclareOption{9x}{\def\MGL@scale{9}} + +\DeclareOption{0q}{\def\MGL@quality{0}} +\DeclareOption{1q}{\def\MGL@quality{1}} +\DeclareOption{2q}{\def\MGL@quality{2}} +\DeclareOption{3q}{\def\MGL@quality{3}} +\DeclareOption{4q}{\def\MGL@quality{4}} +\DeclareOption{5q}{\def\MGL@quality{5}} +\DeclareOption{6q}{\def\MGL@quality{6}} +\DeclareOption{7q}{\def\MGL@quality{7}} +\DeclareOption{8q}{\def\MGL@quality{8}} +\DeclareOption{9q}{\def\MGL@quality{9}} + +\DeclareOption{0v}{\def\MGL@variant{0}} +\DeclareOption{1v}{\def\MGL@variant{1}} +\DeclareOption{2v}{\def\MGL@variant{2}} % \end{macrocode} % -% \begin{macro}{\MGL@graph@ext} -% The following options set the default graphics extension, which is stored in the |\MGL@graph@ext| macro for later use. +% \begin{macro}{\MGL@imgext} +% The following options set the default graphics extension, which is stored in the |\MGL@imgext| macro for later use. % \begin{macrocode} -\DeclareOption{eps}{\def\MGL@graph@ext{.eps}} -\DeclareOption{epsz}{\def\MGL@graph@ext{.epsz}} -\DeclareOption{epsgz}{\def\MGL@graph@ext{.eps.gz}} -\DeclareOption{bps}{\def\MGL@graph@ext{.bps}} -\DeclareOption{bpsz}{\def\MGL@graph@ext{.bpsz}} -\DeclareOption{bpsgz}{\def\MGL@graph@ext{.bps.gz}} -\DeclareOption{pdf}{\def\MGL@graph@ext{.pdf}} -\DeclareOption{png}{\def\MGL@graph@ext{.png}} -\DeclareOption{jpg}{\def\MGL@graph@ext{.jpg}} -\DeclareOption{jpeg}{\def\MGL@graph@ext{.jpeg}} -\DeclareOption{gif}{\def\MGL@graph@ext{.gif}} -\DeclareOption{tex}{\def\MGL@graph@ext{.tex}} +\DeclareOption{eps}{\def\MGL@imgext{.eps}} +\DeclareOption{epsz}{\def\MGL@imgext{.epsz}} +\DeclareOption{epsgz}{\def\MGL@imgext{.eps.gz}} +\DeclareOption{bps}{\def\MGL@imgext{.bps}} +\DeclareOption{bpsz}{\def\MGL@imgext{.bpsz}} +\DeclareOption{bpsgz}{\def\MGL@imgext{.bps.gz}} +\DeclareOption{pdf}{\def\MGL@imgext{.pdf}} +\DeclareOption{png}{\def\MGL@imgext{.png}} +\DeclareOption{jpg}{\def\MGL@imgext{.jpg}} +\DeclareOption{jpeg}{\def\MGL@imgext{.jpeg}} +\DeclareOption{gif}{\def\MGL@imgext{.gif}} +\DeclareOption{tex}{\def\MGL@imgext{.tex}} % \end{macrocode} % \end{macro} % @@ -1126,65 +1331,10 @@ % We now declare the default package options, and, finally, process the options the user specifies in the order they are introduced. % \begin{macrocode} -\ExecuteOptions{final,on,nocomments,1x,2q,eps} +\ExecuteOptions{final,on,nocomments,color,1x,2q,0v,eps} \ProcessOptions* % \end{macrocode} % -% \textsf{\mglTeX} requires the \textsf{keyval} package to define \meta{key}=\meta{value} options for the environments and commands; the \textsf{graphicx} package apports the facilities for inclusion of graphics, and the \textsf{verbatim} package is used as engine for the environments. -% \begin{macrocode} - -\RequirePackage{keyval} -\RequirePackage{graphicx} -\RequirePackage{verbatim} -% \end{macrocode} -% -% \begin{macro}{\MGL@graph@keys} -% The main family of \meta{key}=\meta{value} pairs is defined. These pairs are common to every environment or command that produces graphics. Most of the \meta{key}'s are redefinitions of the optional arguments for the |\includegraphics| commands, so they are stored inside the |\MGL@graph@keys| macro, which is later passed to that command as optional argument by |\MGL@includegraphics|. -% \begin{macrocode} - -\define@key{MGL@keys}{bb}{\g@addto@macro\MGL@graph@keys{bb=#1,}} -\define@key{MGL@keys}{bbllx}{\g@addto@macro\MGL@graph@keys{bbllx=#1,}} -\define@key{MGL@keys}{bblly}{\g@addto@macro\MGL@graph@keys{bblly=#1,}} -\define@key{MGL@keys}{bburx}{\g@addto@macro\MGL@graph@keys{bburx=#1,}} -\define@key{MGL@keys}{bbury}{\g@addto@macro\MGL@graph@keys{bbury=#1,}} -\define@key{MGL@keys}{natwidth}{\g@addto@macro\MGL@graph@keys{natwidth=#1,}} -\define@key{MGL@keys}{natheight}{\g@addto@macro\MGL@graph@keys{natheight=#1,}} -\define@key{MGL@keys}{hiresbb}{\g@addto@macro\MGL@graph@keys{hiresbb=#1,}} -\define@key{MGL@keys}{viewport}{\g@addto@macro\MGL@graph@keys{viewport=#1,}} -\define@key{MGL@keys}{trim}{\g@addto@macro\MGL@graph@keys{trim=#1,}} -\define@key{MGL@keys}{angle}{\g@addto@macro\MGL@graph@keys{angle=#1,}} -\define@key{MGL@keys}{origin}{\g@addto@macro\MGL@graph@keys{origin=#1,}} -\define@key{MGL@keys}{width}{\g@addto@macro\MGL@graph@keys{width=#1,}} -\define@key{MGL@keys}{height}{\g@addto@macro\MGL@graph@keys{height=#1,}} -\define@key{MGL@keys}{totalheight}{\g@addto@macro\MGL@graph@keys{totalheight=#1,}} -\define@key{MGL@keys}{keepaspectratio}[true]{% - \g@addto@macro\MGL@graph@keys{keepaspectratio=#1,}% -} -\define@key{MGL@keys}{scale}{\g@addto@macro\MGL@graph@keys{scale=#1,}} -\define@key{MGL@keys}{clip}[true]{\g@addto@macro\MGL@graph@keys{clip=#1,}} -\define@key{MGL@keys}{draft}[true]{\g@addto@macro\MGL@graph@keys{draft=#1,}} -\define@key{MGL@keys}{type}{\g@addto@macro\MGL@graph@keys{type=#1,}} -\define@key{MGL@keys}{ext}{\g@addto@macro\MGL@graph@keys{ext=#1,}} -\define@key{MGL@keys}{read}{\g@addto@macro\MGL@graph@keys{read=#1,}} -\define@key{MGL@keys}{command}{\g@addto@macro\MGL@graph@keys{command=#1,}} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\MGL@graph@ext} -% Stores the default extension for the creation of the graphics. -% \begin{macrocode} -\define@key{MGL@keys}{imgext}{\def\MGL@graph@ext{.#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@MGL@lineno@} -% The only \meta{key}=\meta{value} pair needed for verbatim-like environments and commands is the one for the |lineno| option, which sets the value of the |\@MGL@lineno@| boolean macro. -% \begin{macrocode} - -\newif\if@MGL@lineno@ -\define@key{MGL@verb@keys}{lineno}[true]{\csname @MGL@lineno@#1\endcsname} -% \end{macrocode} -% \end{macro} -% % \begin{macro}{\MGL@dir} % This is the \textsf{\mglTeX} main working directory. By default, it is defined to empty, so it points to the path of the \LaTeX{} document. % \begin{macrocode} @@ -1216,24 +1366,6 @@ \def\MGL@paths{\MGL@dir\MGL@scripts@dir,\MGL@dir\MGL@backups@dir} % \end{macrocode} % \end{macro} -% \begin{macro}{\mglsettings} -% First, we define a \meta{key}=\meta{value} family, |MGL@sett@keys|, for the |\mglsettings| command. -% \begin{macrocode} -\define@key{MGL@sett@keys}{dir}{\def\MGL@dir{#1}} -\define@key{MGL@sett@keys}{scriptsdir}{\def\MGL@scripts@dir{#1}} -\define@key{MGL@sett@keys}{graphicsdir}{\def\MGL@graphics@dir{#1}} -\define@key{MGL@sett@keys}{backupsdir}{\def\MGL@backups@dir{#1}} -\define@key{MGL@sett@keys}{paths}{\g@addto@macro\MGL@paths{,#1}} -\define@key{MGL@sett@keys}{quality}{\mglquality{#1}} -\define@key{MGL@sett@keys}{scale}{\mglscale{#1}} -\define@key{MGL@sett@keys}{imgext}{\def\MGL@graph@ext{.#1}} -% \end{macrocode} -% The command receives and executes the \meta{key}=\meta{value} pairs for |MGL@sett@keys|. This is an only-preamble command. -% \begin{macrocode} -\def\mglsettings#1{\setkeys{MGL@sett@keys}{#1}} -\@onlypreamble\mglsettings -% \end{macrocode} -% \end{macro} % % \begin{macro}{\MGL@main@script@name} % \noindent This macro stores the name of the of the document's main script. It is initialized to the name of the \LaTeX{} document. @@ -1275,10 +1407,10 @@ \newcounter{MGL@line@no} % \end{macrocode} % \end{macro} -% \begin{macro}{MGL@verb@script@no} +% \begin{macro}{MGL@verb@no} % The counter used to numerate verbatim-written scripts with the |\listofmglscripts| command. % \begin{macrocode} -\newcounter{MGL@verb@script@no} +\newcounter{MGL@verb@no} % \end{macrocode} % \end{macro} % \begin{macro}{\@MGL@list@script@} @@ -1293,11 +1425,30 @@ \def\l@MGL@script{\@dottedtocline{1}{0em}{1.5em}} % \end{macrocode} % \end{macro} -% Finally, the supported graphic formats are declared, and the |\verbatim@finish| command from the \textsf{verbatim} package is disabled to avoid it from writing a blank line at the end of every script (see subsection~\ref{subsection: warning}). +% +% \textsf{\mglTeX} requires the \textsf{keyval} package to define \meta{key}=\meta{value} options for the environments and commands; the \textsf{graphicx} package apports the facilities for inclusion of graphics; the \textsf{ifpdf} package is used to determine whether the user is compiling to |pdf| or not when indicating the default graphics extensionsthe \textsf{verbatim} package is used as engine for the environments. +% \begin{macrocode} + +\RequirePackage{keyval} +\RequirePackage{graphicx} +\RequirePackage{ifpdf} +\RequirePackage{verbatim} +% \end{macrocode} +% +% The supported graphic extensions are declared. These extensions depend on whether we are compiling to |pdf| or not, so the |\ifpdf| conditional from the homonym package is used. +% \begin{macrocode} +\ifpdf% + \DeclareGraphicsExtensions{% + .pdf,.png,.jpg,.jpeg,.gif% + }% +\else% + \DeclareGraphicsExtensions{% + .eps,.epsz,.eps.gz,.bps,.bpsz,.bps.gz% + }% +\fi% +% \end{macrocode} +% Finally, the |\verbatim@finish| command from the \textsf{verbatim} package is disabled to avoid it from writing a blank line at the end of every script (see subsection~\ref{subsection: warning}). % \begin{macrocode} -\DeclareGraphicsExtensions{% - .eps,.epsz,.eps.gz,.bps,.bpsz,.bps.gz,.pdf,.png,.jpg,.jpeg,.gif% -} \let\verbatim@finish\relax % \end{macrocode} % @@ -1315,35 +1466,135 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\MGL@graph@keys} +% The main family of \meta{key}=\meta{value} pairs is defined. These pairs are common to every environment or command that produces graphics. Most of the \meta{key}'s are redefinitions of the optional arguments for the |\includegraphics| commands, so they are stored inside the |\MGL@graph@keys| macro, which is later passed to that command as optional argument by |\MGL@includegraphics|. +% \begin{macrocode} + +\define@key{MGL@gr@keys}{bb}{% + \g@addto@macro\MGL@graph@keys{bb=#1,}% +} +\define@key{MGL@gr@keys}{bbllx}{% + \g@addto@macro\MGL@graph@keys{bbllx=#1,}% +} +\define@key{MGL@gr@keys}{bblly}{% + \g@addto@macro\MGL@graph@keys{bblly=#1,}% +} +\define@key{MGL@gr@keys}{bburx}{% + \g@addto@macro\MGL@graph@keys{bburx=#1,}% +} +\define@key{MGL@gr@keys}{bbury}{% + \g@addto@macro\MGL@graph@keys{bbury=#1,}% +} +\define@key{MGL@gr@keys}{natwidth}{% + \g@addto@macro\MGL@graph@keys{natwidth=#1,}% +} +\define@key{MGL@gr@keys}{natheight}{% + \g@addto@macro\MGL@graph@keys{natheight=#1,}% +} +\define@key{MGL@gr@keys}{hiresbb}{% + \g@addto@macro\MGL@graph@keys{hiresbb=#1,}% +} +\define@key{MGL@gr@keys}{viewport}{% + \g@addto@macro\MGL@graph@keys{viewport=#1,}% +} +\define@key{MGL@gr@keys}{trim}{% + \g@addto@macro\MGL@graph@keys{trim=#1,}% +} +\define@key{MGL@gr@keys}{angle}{% + \g@addto@macro\MGL@graph@keys{angle=#1,}% +} +\define@key{MGL@gr@keys}{origin}{% + \g@addto@macro\MGL@graph@keys{origin=#1,}% +} +\define@key{MGL@gr@keys}{width}{% + \g@addto@macro\MGL@graph@keys{width=#1,}% +} +\define@key{MGL@gr@keys}{height}{% + \g@addto@macro\MGL@graph@keys{height=#1,}% +} +\define@key{MGL@gr@keys}{totalheight}{% + \g@addto@macro\MGL@graph@keys{totalheight=#1,}% +} +\define@key{MGL@gr@keys}{keepaspectratio}[true]{% + \g@addto@macro\MGL@graph@keys{keepaspectratio=#1,}% +} +\define@key{MGL@gr@keys}{scale}{% + \g@addto@macro\MGL@graph@keys{scale=#1,}% +} +\define@key{MGL@gr@keys}{clip}[true]{% + \g@addto@macro\MGL@graph@keys{clip=#1,}% +} +\define@key{MGL@gr@keys}{draft}[true]{% + \g@addto@macro\MGL@graph@keys{draft=#1,}% +} +\define@key{MGL@gr@keys}{type}{% + \g@addto@macro\MGL@graph@keys{type=#1,}% +} +\define@key{MGL@gr@keys}{ext}{% + \g@addto@macro\MGL@graph@keys{ext=#1,}% +} +\define@key{MGL@gr@keys}{read}{% + \g@addto@macro\MGL@graph@keys{read=#1,}% +} +\define@key{MGL@gr@keys}{command}{% + \g@addto@macro\MGL@graph@keys{command=#1,}% +} +% \end{macrocode} +% \end{macro} +% The following four \meta{key}=\meta{value} pairs call the adequate \textsf{\mglTeX} command. +% \begin{macrocode} +\define@key{MGL@gr@keys}{gray}[0]{\mglgray{#1}} +\define@key{MGL@gr@keys}{mglscale}{\mglscale{#1}} +\define@key{MGL@gr@keys}{quality}{\mglquality{#1}} +\define@key{MGL@gr@keys}{variant}{\mglvariant{#1}} +% \end{macrocode} +% \begin{macro}{\MGL@imgext} +% |\MGL@imgext| stores the default extension for the creation of the graphics. +% \begin{macrocode} +\define@key{MGL@gr@keys}{imgext}{\def\MGL@imgext{.#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@MGL@lineno@} +% The only \meta{key}=\meta{value} pair needed for verbatim-like environments and commands is the one for the |lineno| option, which sets the value of the |\@MGL@lineno@| boolean macro. +% \begin{macrocode} + +\newif\if@MGL@lineno@ +\define@key{MGL@verb@keys}{lineno}[true]{\csname @MGL@lineno@#1\endcsname} +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\MGL@codes} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Bugfix: category code for tabulators is changed too} % This macro changes the category codes of all special characters (like |\|, |$|, etc.) to $12$ (other), so they don't have any special meaning and can be processed as normal text. The exception is the new line character (|^^M|), which is kept active for compatibility with the \textsf{verbatim} package. % \begin{macrocode} \def\MGL@codes{% \let\do\@makeother\dospecials% + \catcode`\^^I=12% \catcode`\^^M\active% } % \end{macrocode} % \end{macro} % -% \begin{macro}{\MGL@document@scripts} +% \begin{macro}{\MGL@doc@scripts} % A macro to store the names of the scripts created or compiled in the document. % \begin{macrocode} -\def\MGL@document@scripts{} +\def\MGL@doc@scripts{} % \end{macrocode} % \end{macro} -% \begin{macro}{\MGL@set@script@name}\begin{macro}{\MGL@script@name} -% |\MGL@set@script@name| receives the name of a script without extension as argument, defines |\MGL@script@name| as that name, and checks if it has already been created or compiled, by comparing it with the names already stored in |\MGL@document@scripts|; if it's there already, warns the user. Finally, adds the name of the script to |\MGL@document@scripts|. +% \begin{macro}{\MGL@set@script@name}\begin{macro}{\MGL@script} +% |\MGL@set@script@name| receives the name of a script without extension as argument, defines |\MGL@script| as that name, and checks if it has already been created or compiled, by comparing it with the names already stored in |\MGL@doc@scripts|; if it's there already, warns the user. Finally, adds the name of the script to |\MGL@doc@scripts|. % \begin{macrocode} \def\MGL@set@script@name#1{% - \edef\MGL@script@name{#1}% - \@for\MGL@temp@a:=\MGL@document@scripts\do{% - \ifx\MGL@temp@a\MGL@script@name% - \PackageWarning{mgltex}{Multiple MGL scripts named "\MGL@script@name.mgl"}% + \edef\MGL@script{#1}% + \@for\MGL@temp@a:=\MGL@doc@scripts\do{% + \ifx\MGL@temp@a\MGL@script% + \PackageWarning{mgltex}{Multiple MGL scripts named "\MGL@script.mgl"}% \fi% }% - \g@addto@macro\MGL@document@scripts{\MGL@script@name,}% + \g@addto@macro\MGL@doc@scripts{\MGL@script,}% } % \end{macrocode} % \end{macro}\end{macro} @@ -1359,14 +1610,14 @@ % \end{macro} % % \begin{macro}{\MGL@process@script} -% It checks whether the ``switch'' |\MGL@@@\MGL@script@name| is undefined, in which case executes its first argument. If the switch is defined, it checks if the corresponding image has been created; if so, it executes its second argument; otherwise, the first one. +% It checks whether the ``switch'' |\MGL@@@\MGL@script| is undefined, in which case executes its first argument. If the switch is defined, it checks if the corresponding image has been created; if so, it executes its second argument; otherwise, the first one. % \begin{macrocode} \def\MGL@process@script#1#2{% - \@ifundefined{MGL@@@\MGL@script@name}{% + \@ifundefined{MGL@@@\MGL@script}{% #1% }{% - \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}{% + \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{% #2% }{% #1% @@ -1420,11 +1671,11 @@ \def\MGL@compare@code#1{% % \end{macrocode} % \begin{macro}{\MGL@next} -% This macro is called at the end of environments that use the |\MGL@compare@code| macro, and performs the ending actions of the comparision process, which are closing the |\MGL@in@stream| and writing the |\MGL@unchanged{\MGL@script@name}| to the |.aux| file. If during the comparison process a difference in the code is found, |\MGL@next| is redefined to only close the |\MGL@in@stream|. +% This macro is called at the end of environments that use the |\MGL@compare@code| macro, and performs the ending actions of the comparision process, which are closing the |\MGL@in@stream| and writing the |\MGL@unchanged{\MGL@script}| to the |.aux| file. If during the comparison process a difference in the code is found, |\MGL@next| is redefined to only close the |\MGL@in@stream|. % \begin{macrocode} \def\MGL@next{% \MGL@closein\MGL@in@stream% - \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% }% % \end{macrocode} % \end{macro} @@ -1574,6 +1825,7 @@ % \noindent For the following, we agree that if a macro is required by an environment, and it hasn't been already defined, it will be defined between the commands that start and end such environment; also the command's name will have the environment's name as prefix. % % \begin{environment}{mgl} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New environment options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % This environment has to transcript its contents to the document's main script, and create a backup of the code simultaneously; the backup is used to detect changes in following compilations. % \begin{macro}{\mgl} % The command that starts the |mgl| environment. It is called by the |\begin{mgl}| command. @@ -1583,22 +1835,22 @@ % \end{macrocode} % We define an additional \meta{key}=\meta{value} pair in the main family of pairs, corresponding to the |label| option for this environment. This definition is local because we don't want to be valid outside the environment. % \begin{macrocode} - \define@key{MGL@keys}{label}{\def\MGL@script@name{##1}}% + \define@key{MGL@gr@keys}{label}{\def\MGL@script{##1}}% % \end{macrocode} % The list of comma-separated options is processed. % \begin{macrocode} - \MGL@setkeys{MGL@keys}{#1}% + \MGL@setkeys{MGL@gr@keys}{#1}% % \end{macrocode} % If the user hasn't used the |label| option, the automatic naming mechanism is called. Note that |\MGL@main@script@name| is set using the |\mglname| command. % \begin{macrocode} - \@ifundefined{MGL@script@name}{% + \@ifundefined{MGL@script}{% \stepcounter{MGL@script@no}% - \edef\MGL@script@name{\MGL@main@script@name-MGL-\arabic{MGL@script@no}}% + \edef\MGL@script{\MGL@main@script@name-MGL-\arabic{MGL@script@no}}% }{}% % \end{macrocode} % We use the |\MGL@set@script@name| to test whether the given name has already been used. % \begin{macrocode} - \MGL@set@script@name{\MGL@script@name}% + \MGL@set@script@name{\MGL@script}% % \end{macrocode} % |\MGL@codes| is used to change the codes of special characters. % \begin{macrocode} @@ -1609,7 +1861,7 @@ \MGL@process@script{% \MGL@write@script% }{% - \MGL@compare@code{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}% + \MGL@compare@code{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% }% } % \end{macrocode} @@ -1620,15 +1872,15 @@ \def\MGL@write@script{% % \end{macrocode} % \begin{macro}{\MGL@next} -% It contains the actions to perform immediately after the end of |\MGL@write@script|. They are close the output stream; write in the main script the commands to save the image, and to reset the initial values for all MGL parameters and clear the image; finally, write |\MGL@unchanged{\MGL@script@name}| in the |.aux| file. +% It contains the actions to perform immediately after the end of |\MGL@write@script|. They are close the output stream; write in the main script the commands to save the image, and to reset the initial values for all MGL parameters and clear the image; finally, write |\MGL@unchanged{\MGL@script}| in the |.aux| file. % \begin{macrocode} \def\MGL@next{% \MGL@closeout\MGL@out@stream% \MGL@write\MGL@main@stream{% - write '\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext'^^J% + write '\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext'^^J% ^^Jreset^^J% }% - \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% }% % \end{macrocode} % \end{macro} @@ -1639,13 +1891,18 @@ \MGL@write\MGL@out@stream{\the\verbatim@line}% }% % \end{macrocode} -% Before writing the MGL code of the environment, we set the default quality. +% Before writing the MGL code of the environment, we set the default gray/color mode, mglscale, quality and variant. % \begin{macrocode} - \MGL@write\MGL@main@stream{quality \MGL@quality}% + \MGL@write\MGL@main@stream{% + gray \MGL@gray^^J% + setsizescl \MGL@scale^^J% + quality \MGL@quality^^J% + variant \MGL@variant% + }% % \end{macrocode} % We open the backup file in the output stream. % \begin{macrocode} - \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}% + \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % The transcription process starts by calling the |\verbatim@start| command. % \begin{macrocode} @@ -1718,11 +1975,11 @@ % \end{macrocode} % The backup file is opened for writing. % \begin{macrocode} - \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}% + \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % The head of the function is written. % \begin{macrocode} - \MGL@write\MGL@out@stream{func '\MGL@script@name' #1}% + \MGL@write\MGL@out@stream{func '\MGL@script' #1}% % \end{macrocode} % The writing process is started. % \begin{macrocode} @@ -1752,19 +2009,20 @@ % \end{environment} % % \begin{environment}{mglcode} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New environment options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % This environment also checks for changes on the code, but, since it writes to its own script, there is no need to create a backup file (the check is performed using the script itself). % \begin{macro}{\mglcode} % It starts the |mglcode| environment. Its anatomy is similar to that of the |\mgl| command. % \begin{macrocode} \newcommand\mglcode[2][]{% - \MGL@setkeys{MGL@keys}{#1}% + \MGL@setkeys{MGL@gr@keys}{#1}% \MGL@set@script@name{#2}% \MGL@codes% \MGL@process@script{% \mglcode@write@script% }{% - \MGL@compare@code{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}% + \MGL@compare@code{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% }% } % \end{macrocode} @@ -1783,17 +2041,18 @@ % \begin{macrocode} \MGL@closeout\MGL@out@stream% % \end{macrocode} -% The |\MGL@unchanged{\MGL@script@name}| command is written to the |.aux| file. +% The |\MGL@unchanged{\MGL@script}| command is written to the |.aux| file. % \begin{macrocode} - \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% % \end{macrocode} % The script compilation instruction is written to the terminal. % \begin{macrocode} \MGL@write{18}{% - mglconv -q \MGL@quality\space -S \MGL@scale\space% - -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space% - -o "\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext"\space% - "\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl"% + mglconv -q \MGL@quality\space -g \MGL@gray\space% + -S \MGL@scale\space -v \MGL@variant\space% + -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% + -o "\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext"\space% + "\MGL@dir\MGL@scripts@dir\MGL@script.mgl"% }% }% % \end{macrocode} @@ -1804,7 +2063,7 @@ % \end{macrocode} % The script is opened for writing in the output stream. % \begin{macrocode} - \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}% + \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% % \end{macrocode} % The writing process is started by calling the |\verbatim@start| command. % \begin{macrocode} @@ -1833,7 +2092,7 @@ \MGL@set@script@name{#1}% \MGL@codes% \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}% - \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}% + \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% \verbatim@start% } % \end{macrocode} @@ -1849,42 +2108,55 @@ % \end{macro} % \end{environment} % -% \begin{environment}{mglcommon} -% This environment doesn't require any backup file nor any scanning for changes. Although the user sets the name of the script by redifining |\mglcommonscriptname|, it is necessary to perform a check of the name, just in case a name has been inadvertedly repeated. -% \begin{macro}{\mglcommon} -% Starts the |mglcommon| environment. +% \begin{environment}{mglsetupscript}\begin{environment}{mglcommon} +% This environment doesn't require any backup file nor any scanning for changes. Although the user sets the name of the script by redifining |\mglsetupscriptname|, it is necessary to perform a check of the name, just in case a name has been inadvertedly repeated. +% \begin{macro}{\mglsetupscript} +% Starts the |mglsetupscript| environment. % \begin{macrocode} -\def\mglcommon{% +\def\mglsetupscript{% \@bsphack% - \MGL@set@script@name{\mglcommonscriptname}% + \MGL@set@script@name{\mglsetupscriptname}% \MGL@codes% \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}% - \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}% + \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% \verbatim@start% } % \end{macrocode} % It is declared to be an only-preamble command, so it can't be used after the |\begin{document}| instruction. % \begin{macrocode} +\@onlypreamble\mglsetupscript +% \end{macrocode} +% \end{macro} +% \begin{macro}{\mglcommon} +% This macro is defined to be a synonym for |\mglcommon| (to keep backwards compatibility). +% \begin{macrocode} +\let\mglcommon\mglsetupscript \@onlypreamble\mglcommon % \end{macrocode} % \end{macro} -% \begin{macro}{\endmglcommon} -% It ends the |mglcommon| environment. +% \begin{macro}{\endmglsetupscript} +% It ends the |mglsetupscript| environment. % \begin{macrocode} -\def\endmglcommon{% +\def\endmglsetupscript{% \MGL@closeout\MGL@out@stream% \@esphack% } % \end{macrocode} % \end{macro} -% \end{environment} +% \begin{macro}{\endmglcommon} +% It is defined to be a synonym for |\endmglsetupscript|. +% \begin{macrocode} +\let\endmglcommon\endmglsetupscript +% \end{macrocode} +% \end{macro} +% \end{environment}\end{environment} % % \subsection{Fast creation of graphics} % \begin{environment}{mglsetup} % This environment is meant to contain code that is executed just before the instruction of a |\mglplot| command, producing always the same ouput. Instead of writing a new chunk of code for that purpose, |mglsetup| is defined as a special case of the |mglfunc| environment, with the exception that the MGL function obtained this way doesn't accept any argument ---thus producing always the same output. % \begin{macro}{\mglsetup} -% It is defined as an alias for |\mglfunc|, but only the name of the MGL function is passed to it, forcing the assumption that the number of arguments for the function is zero. +% It is defined as an alias for |\mglfunc|, but only the name of the MGL function is passed to it, forcing the assumption that its number of arguments is zero. % \begin{macrocode} \def\mglsetup#1{\mglfunc{#1}}% @@ -1899,39 +2171,43 @@ % \end{environment} % % \begin{macro}{\mglplot} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Added \doccommand{bgroup} and \doccommand{egroup} in order to keep changes private} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % Although the function of this command is quite simple and straightforward, it requires many lines of code and some tricks in order to reach the desired functionality. % \begin{macrocode} \newcommand\mglplot[2][]{% % \end{macrocode} +% Since this is a command, we need to explicitly create a local group so that all changes keep private to the command.\footnote{In contrast, environments keep changes private by default.} +% \begin{macrocode} + \bgroup% +% \end{macrocode} % We add some \meta{key}=\meta{value} pairs locally. The |label| key works exactly as the one of the |mgl| environment. % \begin{macrocode} - \define@key{MGL@keys}{label}{\edef\MGL@script@name{##1}}% + \define@key{MGL@gr@keys}{label}{\edef\MGL@script{##1}}% % \end{macrocode} % The |setup| key defines the variable |\MGL@mglplot@setup| which is later used to call a setup function for the corresponding image. % \begin{macrocode} - \define@key{MGL@keys}{setup}{\def\MGL@mglplot@setup{##1}}% + \define@key{MGL@gr@keys}{setup}{\def\MGL@mglplot@setup{##1}}% % \end{macrocode} % The |separator| key uses the |\MGL@def@for@loop| to define |\MGL@for| so that it iterates over lists separated by the indicated separator symbol. % \begin{macrocode} - \define@key{MGL@keys}{separator}{% - \MGL@def@for@loop{##1}% - }% + \define@key{MGL@gr@keys}{separator}{\MGL@def@for@loop{##1}}% % \end{macrocode} % Now, we process the keys passed by the user. % \begin{macrocode} - \MGL@setkeys{MGL@keys}{#1}% + \MGL@setkeys{MGL@gr@keys}{#1}% % \end{macrocode} % If the user hasn't specified a name using the |label| option, then a name is autogenerated following the same naming mechanism of the |mgl| environment. % \begin{macrocode} - \@ifundefined{MGL@script@name}{% + \@ifundefined{MGL@script}{% \stepcounter{MGL@script@no} - \edef\MGL@script@name{\MGL@main@script@name-MGL-\arabic{MGL@script@no}} + \edef\MGL@script{\MGL@main@script@name-MGL-\arabic{MGL@script@no}} }{}% % \end{macrocode} % The name of the script is checked. % \begin{macrocode} - \MGL@set@script@name{\MGL@script@name}% + \MGL@set@script@name{\MGL@script}% % \end{macrocode} % If the user hasn't specified a setup, then the only code that has to be written is the non-optional argument of |\mglplot|; it is stored in the temporary variable |\MGL@temp@a|. % \begin{macrocode} @@ -1952,9 +2228,13 @@ \mglplot@compare@code% }% % \end{macrocode} -% Finally, the corresponding image is included in the document. +% The corresponding image is included in the document. % \begin{macrocode} \MGL@includegraphics% +% \end{macrocode} +% Finally, the local group is closed. +% \begin{macrocode} + \egroup% } % \end{macrocode} % \begin{macro}{\mglplot@write@script} @@ -1964,11 +2244,16 @@ % \end{macrocode} % The default quality is written to the main script. % \begin{macrocode} - \MGL@write\MGL@main@stream{quality \MGL@quality}% + \MGL@write\MGL@main@stream{% + gray \MGL@gray^^J% + setsizescl \MGL@scale^^J% + quality \MGL@quality^^J% + variant \MGL@variant% + }% % \end{macrocode} % The backup file is opened to write in the output stream. % \begin{macrocode} - \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}% + \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % Now we use the |\MGL@for| command to iterate over |\MGL@temp@a|. It takes a piece of code up to the separator symbol indicated by the user, and stores it in the temporary variable |\MGL@temp@b|, which is then written to the main script and backup file. % \begin{macrocode} @@ -1984,13 +2269,13 @@ % The instructions to save the image and reset the MGL parameters are written to the main script. % \begin{macrocode} \MGL@write\MGL@main@stream{% - write '\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext'^^J% + write '\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext'^^J% ^^Jreset^^J% }% % \end{macrocode} -% Finally, |\MGL@unchanged{\MGL@script@name}| is written to the |.aux| file. +% Finally, |\MGL@unchanged{\MGL@script}| is written to the |.aux| file. % \begin{macrocode} - \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% } % \end{macrocode} % \end{macro} @@ -1999,13 +2284,13 @@ % \begin{macrocode} \def\mglplot@compare@code{% % \end{macrocode} -% The action that will finish this command is, for now, to write |\MGL@unchanged{\MGL@script@name}| in the |.aux| file; it is stored in the |\MGL@next| variable. If no changes in the code are found, this will remain as the last action; otherwise, it will be overwritten to do nothing. +% The action that will finish this command is, for now, to write |\MGL@unchanged{\MGL@script}| in the |.aux| file; it is stored in the |\MGL@next| variable. If no changes in the code are found, this will remain as the last action; otherwise, it will be overwritten to do nothing. % \begin{macrocode} - \def\MGL@next{\MGL@write\@auxout{\string\MGL@unchanged{\MGL@script@name}}}% + \def\MGL@next{\MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}}% % \end{macrocode} % The backup file is opened for reading in the input stream. % \begin{macrocode} - \MGL@openin\MGL@in@stream{\MGL@dir\MGL@backups@dir\MGL@script@name.mgl}% + \MGL@openin\MGL@in@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % Once again, the |\MGL@for| command is used to iterate over the |\MGL@temp@a| variable defined by |\mglplot|. Pieces of code are taken up to the appearance of the separator symbol indicated by the user. In every iteration, the corresponding piece of code is stored in the |\MGL@temp@b| variable, one line of code is read from the input stream to the variable |\MGL@temp@c|, and these two are compared; if they are different, we redefined |\MGL@next| to do nothing. % \begin{macrocode} @@ -2062,13 +2347,13 @@ % \begin{macrocode} \MGL@set@script@name{#2}% % \end{macrocode} -% If the switch |\@MGL@list@script@| is true, we increase the counter for verbatim code (|MGL@verb@script@no|), and add a contents line to the |.lms| file, using the style set by |\l@MGL@script|. In order to be able to use special characters in the name of the script, we use the |\detokenize| primitive. +% If the switch |\@MGL@list@script@| is true, we increase the counter for verbatim code (|MGL@verb@no|), and add a contents line to the |.lms| file, using the style set by |\l@MGL@script|. In order to be able to use special characters in the name of the script, we use the |\detokenize| primitive. % \begin{macrocode} \if@MGL@list@script@% - \refstepcounter{MGL@verb@script@no}% + \refstepcounter{MGL@verb@no}% \addcontentsline{lms}{MGL@script}{% - \protect\numberline{\theMGL@verb@script@no.}% - {\ttfamily\protect\detokenize{\MGL@script@name.mgl}}% + \protect\numberline{\theMGL@verb@no.}% + {\ttfamily\protect\detokenize{\MGL@script.mgl}}% }% \fi% % \end{macrocode} @@ -2094,7 +2379,7 @@ % The separator to indicate the begining of the verbatim code is positioned; we use the |\MGL@line@sep| command to draw it. % \begin{macrocode} \item[\MGL@line@sep]\fbox{% - \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}% + \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}% }\hskip\labelsep\MGL@line@sep\par\par% % \end{macrocode} % The |\verbatim@processline| is redefined to put |\the\verbatim@line| in an item of the list, and to to also write it to the script file. @@ -2106,7 +2391,7 @@ % \end{macrocode} % The script file is opened for writing. % \begin{macrocode} - \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script@name.mgl}% + \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% % \end{macrocode} % The writing process starts. % \begin{macrocode} @@ -2125,7 +2410,7 @@ % \end{macrocode} % \end{macro} % \begin{macro}{\endmglblock*} -% It's defined as an alias for |\endmglblock|. +% It is defined as an alias for |\endmglblock|. % \begin{macrocode} \expandafter\let\csname endmglblock*\endcsname\endmglblock % \end{macrocode} @@ -2154,7 +2439,7 @@ % \begin{macrocode} \newcommand\mglverbatim@[1][]{% \@MGL@lineno@true% - \define@key{MGL@verb@keys}{label}{\edef\MGL@script@name{##1}}% + \define@key{MGL@verb@keys}{label}{\edef\MGL@script{##1}}% \setkeys{MGL@verb@keys}{#1}% \if@MGL@lineno@% \list{\mgllinenostyle\arabic{MGL@line@no}.}{\usecounter{MGL@line@no}}% @@ -2164,24 +2449,24 @@ \MGL@set@verbatim@code% \fboxrule=\mgllinethickness% % \end{macrocode} -% The separator that indicates the begining of the verbatim code is different depending on whether the user has specified a name associated to the code or not. If no name has been indicated, i.e., |\MGL@script@name| is undefined, the separator is just a line; otherwise, i.e., |\MGL@script@name| is defined, the separator is similar to the one of the |mglblock| environment. +% The separator that indicates the begining of the verbatim code is different depending on whether the user has specified a name associated to the code or not. If no name has been indicated, i.e., |\MGL@script| is undefined, the separator is just a line; otherwise, i.e., |\MGL@script| is defined, the separator is similar to the one of the |mglblock| environment. % \begin{macrocode} - \@ifundefined{MGL@script@name}{% - \edef\MGL@script@name{\mglverbatimname}% + \@ifundefined{MGL@script}{% + \edef\MGL@script{\mglverbatimname}% \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% }{% \item[\MGL@line@sep]\fbox{% - \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}% + \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}% }\hskip\labelsep\MGL@line@sep\par\par% }% % \end{macrocode} % Note that, if the user requests an entry in the |\listofmglscripts|, the contents line is added to the same |.lms| file. So here start the similitudes again. % \begin{macrocode} \if@MGL@list@script@% - \refstepcounter{MGL@verb@script@no}% + \refstepcounter{MGL@verb@no}% \addcontentsline{lms}{MGL@script}{% - \protect\numberline{\theMGL@verb@script@no.}% - {\ttfamily\protect\detokenize{\MGL@script@name}}% + \protect\numberline{\theMGL@verb@no.}% + {\ttfamily\protect\detokenize{\MGL@script}}% }% \fi% \def\verbatim@processline{% @@ -2211,29 +2496,29 @@ % \end{environment} % % \begin{environment}{mglcomment} -% This environment has two different behaviors: When commentaries are allowed by the user, it behaves similarly to the |mglverbatim| environment; if commentaries are not allowed, it behaves as the |comment| environment from the \textsf{verbatim} package. So it is natural that we borrow code from them and adapt it to the corresponding situation. +% This environment has two different behaviors: When comments are allowed by the user, it behaves similarly to the |mglverbatim| environment; if comments are not allowed, it behaves as the |comment| environment from the \textsf{verbatim} package. So it is natural that we borrow code from them and adapt it to the corresponding situation. % \begin{macro}{\mglcomment} % The switch |\@MGL@comments@| governs the behavior of this command. % \begin{macrocode} \def\mglcomment{% % \end{macrocode} -% If the switch is true, i.e., the user requests displaying of commentaries, we start a list without labels, and set the parameters for verbatim text. +% If the switch is true, i.e., the user requests displaying of comments, we start a list without labels, and set the parameters for verbatim text. % \begin{macrocode} \if@MGL@comments@% \list{}{}% \MGL@set@verbatim@code% % \end{macrocode} -% The separator indicating the begining of the commentary is similar to the one used by the |mglblock| and |mglverbatim| environments; the differences are that, instead of using a solid line, we use a dashed line (|\MGL@dash@sep|), and instead of displaying the name of a script, we display |\mglcommentname|. +% The separator indicating the begining of the comment is similar to the one used by the |mglblock| and |mglverbatim| environments; the differences are that, instead of using a solid line, we use a dashed line (|\MGL@dash@sep|), and instead of displaying the name of a script, we display |\mglcommentname|. % \begin{macrocode} \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>% % \end{macrocode} -% The two following lines redefine the |\verbatim@processline| command to display the commentary text line by line as items of the list, and start the process of writing the text. +% The two following lines redefine the |\verbatim@processline| command to display the comment text line by line as items of the list, and start the process of writing the text. % \begin{macrocode} \def\verbatim@processline{\item\the\verbatim@line}% \verbatim@start% % \end{macrocode} -% If the switch is false, i.e., the user requests no to display commentaries, we start a \emph{space hack}, since no text output will be produced. Then, the category codes are changed with |\MGL@codes|, and the macros |\verbatim@startline|, |\verbatim@addtoline|, |\verbatim@processline| and |\verbatim@finish| are disabled, as done in the |comment| environment of the \textsf{verbatim} package. Finally, we call the |\verbatim@| command to start reading the text in the environment. +% If the switch is false, i.e., the user requests no to display comments, we start a \emph{space hack}, since no text output will be produced. Then, the category codes are changed with |\MGL@codes|, and the macros |\verbatim@startline|, |\verbatim@addtoline|, |\verbatim@processline| and |\verbatim@finish| are disabled, as done in the |comment| environment of the \textsf{verbatim} package. Finally, we call the |\verbatim@| command to start reading the text in the environment. % \begin{macrocode} \else% \@bsphack% @@ -2248,7 +2533,7 @@ % \end{macrocode} % \end{macro} % \begin{macro}{\endmglcomment} -% The |\@MGL@comments@| switch also governs the behavior of this command. If it's true, then the separator that ends the commentary ---which is the same as the one that starts it--- is displayed, and the list is ended; otherwise, simply the \emph{space hack} is ended. +% The |\@MGL@comments@| switch also governs the behavior of this command. If it's true, then the separator that ends the comment ---which is the same as the one that starts it--- is displayed, and the list is ended; otherwise, simply the \emph{space hack} is ended. % \begin{macrocode} \def\endmglcomment{% \if@MGL@comments@% @@ -2266,6 +2551,7 @@ % \noindent Since external scripts exist independently of the \LaTeX{} document, there is no need of environments to process them, just commands. Remember these commands work on the suposition that the scripts don't change. % % \begin{macro}{\mglgraphics} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % This command compiles the external script and includes it in the document. Although that process is simple, the code to execute it is relatively large due to the possibility of the user specifying an optional path, so many parameters have to be checked. % \begin{macrocode} @@ -2277,19 +2563,19 @@ % \end{macrocode} % We add the option |path| for the user to be able to specify the location of the script, which is stored in the variable |\MGL@force@path|. % \begin{macrocode} - \define@key{MGL@keys}{path}{\def\MGL@forced@path{##1}}% + \define@key{MGL@gr@keys}{path}{\def\MGL@forced@path{##1}}% % \end{macrocode} % The optional arguments are processed. % \begin{macrocode} - \MGL@setkeys{MGL@keys}{#1}% + \MGL@setkeys{MGL@gr@keys}{#1}% % \end{macrocode} % The name of the script is set, though it is not check for multiple naming. This is necessary, since |\MGL@includegraphics| uses this macro. % \begin{macrocode} - \edef\MGL@script@name{#2}% + \edef\MGL@script{#2}% % \end{macrocode} % If the corresponding image exists, then this script has been compiled in a previous \LaTeX{} run, so nothing is done, but the inclusion of the image. % \begin{macrocode} - \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext}{}{% + \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{}{% % \end{macrocode} % If the image doesn't exist, we check if the user has specified a custom location. % \begin{macrocode} @@ -2298,7 +2584,7 @@ % If no custom location has been used, we iterate over the list of search paths (|\MGL@paths|): If we find the requested script, then we store its location in |\MGL@temp@b|. % \begin{macrocode} \@for\MGL@temp@a:=\MGL@paths\do{% - \IfFileExists{\MGL@temp@a\MGL@script@name.mgl}{% + \IfFileExists{\MGL@temp@a\MGL@script.mgl}{% \edef\MGL@temp@b{\MGL@temp@a}% }{}% }% @@ -2306,7 +2592,7 @@ % \end{macrocode} % If the user has specified a path for the script, we check if the script actually exists. If it does, we store its location inside |\MGL@temp@b|. % \begin{macrocode} - \IfFileExists{\MGL@forced@path\MGL@script@name.mgl}{% + \IfFileExists{\MGL@forced@path\MGL@script.mgl}{% \edef\MGL@temp@b{\MGL@forced@path}% }{}% }% @@ -2315,17 +2601,18 @@ % \begin{macrocode} \@ifundefined{MGL@temp@b}{% \PackageWarning{mgltex}{% - MGL script "\MGL@script@name.mgl" not found% + MGL script "\MGL@script.mgl" not found% }% }{% % \end{macrocode} % If |\MGL@temp@b| is defined, the script has been found, so we compile it. % \begin{macrocode} \MGL@write{18}{% - mglconv -q \MGL@quality\space -S \MGL@scale\space% - -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space% - -o "\MGL@dir\MGL@graphics@dir\MGL@script@name\MGL@graph@ext"\space% - "\MGL@temp@b\MGL@script@name.mgl"% + mglconv -q \MGL@quality\space -g \MGL@gray\space% + -S \MGL@scale\space -v \MGL@variant\space% + -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% + -o "\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext"\space% + "\MGL@temp@b\MGL@script.mgl"% }% }% }% @@ -2370,9 +2657,9 @@ % \begin{macrocode} \setkeys{MGL@verb@keys}{#1}% % \end{macrocode} -% We don't need to check if there are multiple scripts with the same name, so we namually set |\MGL@script@name|, instead of using |\MGL@set@script@name|. +% We don't need to check if there are multiple scripts with the same name, so we namually set |\MGL@script|, instead of using |\MGL@set@script@name|. % \begin{macrocode} - \edef\MGL@script@name{#2}% + \edef\MGL@script{#2}% % \end{macrocode} % We check if the user has specified a custom location for the script. % \begin{macrocode} @@ -2384,7 +2671,7 @@ % \end{macrocode} % If the script exists, we store its location in |\MGL@temp@a|% % \begin{macrocode} - \IfFileExists{\MGL@temp@b\MGL@script@name.mgl}{% + \IfFileExists{\MGL@temp@b\MGL@script.mgl}{% \edef\MGL@temp@a{\MGL@temp@b}% }{}% }% @@ -2392,7 +2679,7 @@ % \end{macrocode} % If the user specified the location of the script, we check if it exists, in which case we store its location in |\MGL@temp@a|. % \begin{macrocode} - \IfFileExists{\MGL@script@name.mgl}{% + \IfFileExists{\MGL@script.mgl}{% \edef\MGL@temp@a{\MGL@forced@path}% }{}% }% @@ -2401,7 +2688,7 @@ % \begin{macrocode} \@ifundefined{MGL@temp@a}{% \PackageWarning{mgltex}{% - MGL script "\MGL@forced@path\MGL@script@name.mgl" not found% + MGL script "\MGL@forced@path\MGL@script.mgl" not found% }% \center% \fbox{% @@ -2427,15 +2714,15 @@ % \end{macrocode} % We first add the script to the \LaTeX{} list of included files. % \begin{macrocode} - \@addtofilelist{\MGL@script@name.mgl}% + \@addtofilelist{\MGL@script.mgl}% % \end{macrocode} % If the user has used the unstarred version of |\mglinclude|, we add a contents line to the |.lms| file. % \begin{macrocode} \if@MGL@list@script@% - \refstepcounter{MGL@verb@script@no}% + \refstepcounter{MGL@verb@no}% \addcontentsline{lms}{MGL@script}{% - \protect\numberline{\theMGL@verb@script@no.}% - {\ttfamily\protect\detokenize{\MGL@script@name.mgl}}% + \protect\numberline{\theMGL@verb@no.}% + {\ttfamily\protect\detokenize{\MGL@script.mgl}}% }% \fi% % \end{macrocode} @@ -2455,7 +2742,7 @@ % \begin{macrocode} \fboxrule=\mgllinethickness% \item[\MGL@line@sep]\fbox{% - \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script@name.mgl}% + \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}% }\hskip\labelsep\MGL@line@sep\par\par% % \end{macrocode} % We redefine the |\verbatim@processline| macro from the \textsf{verbatim} package to put |\the\verbatim@line| on an item. @@ -2466,7 +2753,7 @@ % \end{macrocode} % The script is opened for reading. % \begin{macrocode} - \immediate\openin\MGL@in@stream="\MGL@temp@a\MGL@script@name.mgl"% + \immediate\openin\MGL@in@stream="\MGL@temp@a\MGL@script.mgl"% % \end{macrocode} % We call |\mglinclude@@@| to start the transcription. % \begin{macrocode} @@ -2504,106 +2791,8 @@ % \end{macro}\end{macro} % % \subsection{Additional commands} -% \begin{macro}{\mglname} -% \noindent The purpose of this command is to force the closure of the current main script, compile the corresponding figures, and open a new main script. At first, it is defined to only change the value of |\MGL@main@script@name| because the main script is not opened until the call of |\begin{document}|; but at that point, it is redefined to perform the described actions. -% \begin{macrocode} -\def\mglname#1{\edef\MGL@main@script@name{#1}} -% \end{macrocode} -% Here is the redefinition of |\mglname|. -% \begin{macrocode} -\AtBeginDocument{% - \def\mglname#1{% -% \end{macrocode} -% We start a space hack, ince this function has no real effect on the document. -% \begin{macrocode} - \@bsphack% -% \end{macrocode} -% The MGL functions created throughout the document are written. -% \begin{macrocode} - \MGL@write@funcs% -% \end{macrocode} -% We force the closure of the main script. We use |\immediate\closeout| instead of |\MGL@closeout| in case \textsf{\mglTeX} is off. -% \begin{macrocode} - \immediate\closeout{\MGL@main@stream}% -% \end{macrocode} -% The closed script is compiled. -% \begin{macrocode} - \MGL@write{18}{% - mglconv -q \MGL@quality\space -S \MGL@scale\space% - -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space% - -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"% - }% -% \end{macrocode} -% The name of the new main script is updated, and it is check for overwriting, using |\MGL@set@script@name| inside a local group, since this command defines |\MGL@script@name|, which we need undefined in some parts of the code of the package. -% \begin{macrocode} - \edef\MGL@main@script@name{#1}% - \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup% - \MGL@openout\MGL@main@stream{% - \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl% - }% -% \end{macrocode} -% The space hack is ended. -% \begin{macrocode} - \@esphack% - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\mglswitch} -% This command turns |on| and |off| the package according to its argument; it is just a call to the commands |\MGL@switch@on| or |\MGL@switch@off|. -% \begin{macrocode} -\def\mglswitch#1{\csname MGL@switch@#1\endcsname} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\mglcomments} Depending on the option passed by the user, it calls |\@MGL@comments@on| or |\@MGL@comments@off|. -% \begin{macrocode} -\def\mglcomments#1{\csname @MGL@comments@#1\endcsname} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\mgldir} -% This command is the interface for the user to change the value of |\MGL@dir|. It is an only-preamble macro, since using it elsewhere would cause faulty behavior. -% \begin{macrocode} - -\def\mgldir#1{\def\MGL@dir{#1}}\@onlypreamble\mgldir -% \end{macrocode} -% \end{macro} -% \begin{macro}{\mglscriptsdir} -% This command modifies the value of |\MGL@scripts@dir|. It is also an only-preamble macro. -% \begin{macrocode} -\def\mglscriptsdir#1{\def\MGL@scripts@dir{#1}}\@onlypreamble\mglscriptsdir -% \end{macrocode} -% \end{macro} -% \begin{macro}{\mglgraphicsdir} -% Modifies the value of |\MGL@graphics@dir|. It is an only-preamble macro. -% \begin{macrocode} -\def\mglgraphicsdir#1{\def\MGL@graphics@dir{#1}}\@onlypreamble\mglgraphicsdir -% \end{macrocode} -% \end{macro} -% \begin{macro}{\mglbackupsdir} -% Modifies the value of |\MGL@backups@dir|. It is an only-preamble macro. -% \begin{macrocode} -\def\mglbackupsdir#1{\def\MGL@backups@dir{#1}}\@onlypreamble\mglbackupsdir -% \end{macrocode} -% \end{macro} -% \begin{macro}{\mglpaths} -% This command adds a list of search paths for scripts to the existing one (|\MGL@paths|). -% \begin{macrocode} -\def\mglpaths#1{\g@addto@macro\MGL@paths{,#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\mglimgext} -% This command changes the value of |\MGL@graph@ext|. -% \begin{macrocode} -\def\mglimgext#1{\def\MGL@graph@ext{#1}} -% \end{macrocode} -% \end{macro} -% % \begin{macro}{\listofmglscripts} -% This command creates the \emph{list of MGL scripts} section. It has to be defined differently depending on whether the used document class defines the |\l@chapter| command or it only the |\l@section| command, which set the style for making a table of contents entry for the |\chapter| command and the |\section| command, respectively. If none of them are defined, we define our own style based on the latter. +% \noindent This command creates the \emph{list of MGL scripts} section. It has to be defined differently depending on whether the used document class defines the |\l@chapter| command or it only the |\l@section| command, which set the style for making a table of contents entry for the |\chapter| command and the |\section| command, respectively. If none of them are defined, we define our own style based on the latter. % \begin{macrocode} \ifx\l@chapter\@undefined% @@ -2682,11 +2871,178 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\mglcommonscriptname}\begin{macro}{\mglcommentname}\begin{macro}{\listofmglscriptsname}\begin{macro}{\mglverbatimname}\begin{macro}{\mgllinenostyle}\begin{macro}{\mgldashwidth}\begin{macro}{\mgllinethickness}\begin{macro}{\mglbreakindent} +% \begin{macro}{\mglTeX} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Add a small negative space in the logo, between the ``mgl'' and ``\TeX''} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Declared now as robust command} +% This macro pretty-prints the name of the package. It has a starred version, which also prints the version. % \begin{macrocode} -\def\mglcommonscriptname{MGL_common_script} -\def\mglcommentname{MGL commentary} +\DeclareRobustCommand\mglTeX{% + mgl\TeX\@ifstar{~v4.2}{}% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Local settings commands} +% \begin{macro}{\mglswitch} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts arguments \texttt{0} (equivalent to \texttt{off}) and \texttt{1} (equivalent to \texttt{on}), besides the usual \texttt{off} and \texttt{on}} +% \noindent This command turns |on| and |off| the package according to its argument; it is just a call to the commands |\MGL@switch@on| or |\MGL@switch@off|. +% \begin{macrocode} +\def\mglswitch#1{% + \MGL@test@switch{#1}{\mglswitch}% + \csname MGL@switch@\MGL@temp@a\endcsname% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mglcomments} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts arguments \texttt{0} (equivalent to \texttt{off}) and \texttt{1} (equivalent to \texttt{on}), besides the usual \texttt{off} and \texttt{on}} +% Depending on the option passed by the user, it calls |\@MGL@comments@on| or |\@MGL@comments@off|. +% \begin{macrocode} +\def\mglcomments#1{% + \MGL@test@switch{#1}{\mglcomments}% + \csname @MGL@comments@\MGL@temp@a\endcsname% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mglquality} +% See under the title \emph{Initialization}, subsection \ref{Init}. +% \end{macro} +% +% \begin{macro}{\mglscale} +% See under the title \emph{Initialization}, subsection \ref{Init}. +% \end{macro} +% +% \begin{macro}{\mglvariant} +% See under the title \emph{Initialization}, subsection \ref{Init}. +% \end{macro} +% +% \begin{macro}{\mglimgext} +% This command changes the value of |\MGL@imgext|. +% \begin{macrocode} +\def\mglimgext#1{\def\MGL@imgext{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mglname} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now writes the MGL code line \texttt{setsize~600~400} to the main script} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{The MGL code line \texttt{setsize~600~400} is now written to the main script} +% \noindent The purpose of this command is to force the closure of the current main script, compile the corresponding figures, and open a new main script. At first, it is defined to only change the value of |\MGL@main@script@name| because the main script is not opened until the call of |\begin{document}|; but at that point, it is redefined to perform the described actions. +% \begin{macrocode} +\def\mglname#1{\edef\MGL@main@script@name{#1}} +% \end{macrocode} +% Here is the redefinition of |\mglname| after the |\begin{document}| command. +% \begin{macrocode} +\AtBeginDocument{% + \def\mglname#1{% +% \end{macrocode} +% We start a space hack, ince this function has no real effect on the document. +% \begin{macrocode} + \@bsphack% +% \end{macrocode} +% The MGL functions created throughout the document are written. +% \begin{macrocode} + \MGL@write@funcs% +% \end{macrocode} +% We force the closure of the main script. We use |\immediate\closeout| instead of |\MGL@closeout| in case \textsf{\mglTeX} is off. +% \begin{macrocode} + \immediate\closeout{\MGL@main@stream}% +% \end{macrocode} +% The closed script is compiled. +% \begin{macrocode} + \MGL@write{18}{% + mglconv -q \MGL@quality\space -g \MGL@gray\space% + -S \MGL@scale\space -v \MGL@variant\space% + -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% + -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"% + }% +% \end{macrocode} +% The name of the new main script is updated, and it is check for overwriting, using |\MGL@set@script@name| inside a local group, since this command defines |\MGL@script|, which we need undefined in some parts of the code of the package. +% \begin{macrocode} + \edef\MGL@main@script@name{#1}% + \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup% + \MGL@openout\MGL@main@stream{% + \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl% + }% +% \end{macrocode} +% We set the default size for the graphics that the main script will generate; without this line the |setsizescl| commands written automatically by \textsf{\mglTeX} wouldn't work. +% \begin{macrocode} + \MGL@write\MGL@main@script@name{setsize 600 400} +% \end{macrocode} +% The space hack is ended. +% \begin{macrocode} + \@esphack% + }% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Advanced settings commands} +% \begin{macro}{\mgldir} +% \noindent This command is the interface for the user to change the value of |\MGL@dir|. It is an only-preamble macro, since using it elsewhere would cause faulty behavior. +% \begin{macrocode} + +\def\mgldir#1{\def\MGL@dir{#1}}\@onlypreamble\mgldir +% \end{macrocode} +% \end{macro} +% \begin{macro}{\mglscriptsdir} +% This command modifies the value of |\MGL@scripts@dir|. It is also an only-preamble macro. +% \begin{macrocode} +\def\mglscriptsdir#1{\def\MGL@scripts@dir{#1}}\@onlypreamble\mglscriptsdir +% \end{macrocode} +% \end{macro} +% \begin{macro}{\mglgraphicsdir} +% Modifies the value of |\MGL@graphics@dir|. It is an only-preamble macro. +% \begin{macrocode} +\def\mglgraphicsdir#1{\def\MGL@graphics@dir{#1}}\@onlypreamble\mglgraphicsdir +% \end{macrocode} +% \end{macro} +% \begin{macro}{\mglbackupsdir} +% Modifies the value of |\MGL@backups@dir|. It is an only-preamble macro. +% \begin{macrocode} +\def\mglbackupsdir#1{\def\MGL@backups@dir{#1}}\@onlypreamble\mglbackupsdir +% \end{macrocode} +% \end{macro} +% \begin{macro}{\mglpaths} +% This command adds a list of search paths for scripts to the existing one (|\MGL@paths|). +% \begin{macrocode} +\def\mglpaths#1{\g@addto@macro\MGL@paths{,#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mglsettings} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now calls the \doccommand{mglswitch} and \doccommand{mglcomments} commands for the \texttt{switch} and \texttt{comments} options, respectively} +% \changes{\textbf{v4.2 ------------}}{2016/05/14}{Added options \texttt{gray} and \texttt{variant}} +% First, we define a \meta{key}=\meta{value} family, |MGL@sett@keys|, for this command. +% \begin{macrocode} +\define@key{MGL@sett@keys}{dir}{\def\MGL@dir{#1}} +\define@key{MGL@sett@keys}{scriptsdir}{\def\MGL@scripts@dir{#1}} +\define@key{MGL@sett@keys}{graphicsdir}{\def\MGL@graphics@dir{#1}} +\define@key{MGL@sett@keys}{backupsdir}{\def\MGL@backups@dir{#1}} +\define@key{MGL@sett@keys}{paths}{\g@addto@macro\MGL@paths{,#1}} +\define@key{MGL@sett@keys}{switch}{\mglswitch{#1}} +\define@key{MGL@sett@keys}{comments}{\mglcomments{#1}} +\define@key{MGL@sett@keys}{gray}{\mglgray{#1}} +\define@key{MGL@sett@keys}{mglscale}{\mglscale{#1}} +\define@key{MGL@sett@keys}{quality}{\mglquality{#1}} +\define@key{MGL@sett@keys}{variant}{\mglvariant{#1}} +\define@key{MGL@sett@keys}{imgext}{\def\MGL@imgext{.#1}} +% \end{macrocode} +% The command receives and executes the \meta{key}=\meta{value} pairs for |MGL@sett@keys|. This is an only-preamble command. +% \begin{macrocode} +\def\mglsettings#1{\setkeys{MGL@sett@keys}{#1}} +\@onlypreamble\mglsettings +% \end{macrocode} +% \end{macro} +% +% \subsection{User-definable macros} +% \begin{macro}{\mglsetupscriptname}\begin{macro}{\mglcommentname}\begin{macro}{\listofmglscriptsname}\begin{macro}{\mglverbatimname}\begin{macro}{\mgllinenostyle}\begin{macro}{\mgldashwidth}\begin{macro}{\mgllinethickness}\begin{macro}{\mglbreakindent} +% The user is allowed to modifu these commands, so no |@| symbol is used on them. +% \begin{macrocode} + +\def\mglsetupscriptname{MGL_setup_script} +\def\mglcommentname{\mglTeX{} comment} \def\listofmglscriptsname{List of MGL scripts} \def\mglverbatimname{(Unnamed MGL verbatim script)} \def\mgllinenostyle{\footnotesize} @@ -2696,30 +3052,23 @@ % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % -% \begin{macro}{\mglTeX} -% This macro pretty-prints the name of the package. It has a starred version, which also prints the version. -% \begin{macrocode} - -\def\mglTeX{% - mgl\TeX\@ifstar{~v4.1}{}% -} -% \end{macrocode} -% \end{macro} -% % \subsection{Final adjustments} % To finish the code of \textsf{\mglTeX}, we set the behavior of the package at the call of the |\begin{document}| and |\end{document}| commands. % -% We tell \LaTeX{} to check the name of the document's main script for overwriting. We do this by calling |\MGL@set@script@name| inside a local group, because it defines |\MGL@script@name|, which we need undefined in certain parts of the code. Then the script is opened. We use |\immediate\openout| instead of |\MGL@openout| for this purpose, since, otherwise, we run the risk of the main script not being created when needed, if the user turns off \textsf{\mglTeX} before the |\begin{document}| command, and turns it on immediately after. +% We tell \LaTeX{} to check the name of the document's main script for overwriting. We do this by calling |\MGL@set@script@name| inside a local group, because it defines |\MGL@script|, which we need undefined in certain parts of the code. Then the script is opened. We use |\immediate\openout| instead of |\MGL@openout| for this purpose, since, otherwise, we run the risk of the main script not being created when needed, if the user turns off \textsf{\mglTeX} before the |\begin{document}| command, and turns it on immediately after. Finally, we set the default size for the graphics the main script will generate; without this line the |setsizescl| commands written automatically by \textsf{\mglTeX} wouldn't work. % \begin{macrocode} \AtBeginDocument{% \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup% \immediate\openout\MGL@main@stream=% \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl% + \MGL@write\MGL@main@stream{setsize 600 400}% } % \end{macrocode} +% % We also set the actions for the call of |\end{document}| % \begin{macrocode} + \AtEndDocument{% % \end{macrocode} % |\MGL@write@funcs| will simply write the MGL functions throughout the \LaTeX{} document. @@ -2733,8 +3082,9 @@ % The main script is compiled. % \begin{macrocode} \MGL@write{18}{% - mglconv -q \MGL@quality\space -S \MGL@scale\space% - -s "\MGL@dir\MGL@scripts@dir\mglcommonscriptname.mgl"\space% + mglconv -q \MGL@quality\space -g \MGL@gray\space% + -S \MGL@scale\space -v \MGL@variant\space% + -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"% }% } diff --git a/mgltex/mgltex.ins b/mgltex/mgltex.ins index f58fa72..49d18ee 100644 --- a/mgltex/mgltex.ins +++ b/mgltex/mgltex.ins @@ -1,6 +1,6 @@ %% -%% Copyright (C) 2014--2015 by Diego Sejas Viscarra -%% Copyright (C) 2014--2015 by Alexey Balakin +%% Copyright (C) 2014--2016 by Diego Sejas Viscarra +%% Copyright (C) 2014--2016 by Alexey Balakin %% %% 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 @@ -60,4 +60,4 @@ with this program. If not, see . \Msg{* *} \Msg{**********************************************************} -\endbatchfile \ No newline at end of file +\endbatchfile diff --git a/mgltex/mgltex.pdf b/mgltex/mgltex.pdf index 296f42ec5de0157e6e62565d358b91a37f441a6f..58c5dd6a3f8b768c158448f3fd5f711c06c0b929 100644 GIT binary patch delta 337225 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 cDf7f_~1M}27j*Yqr$23F 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 N9}WY9tePCoe*s|P!Os8y delta 313461 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

    ZRW12T>15KRJa~>Y4rvjeY2t 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 diff --git a/mgltex/sample.tex b/mgltex/sample.tex index d7d39eb..91447c8 100644 --- a/mgltex/sample.tex +++ b/mgltex/sample.tex @@ -1,472 +1,276 @@ \documentclass{article} -\usepackage[jpg,comments]{mgltex} +\usepackage[png,comments]{mgltex} +\usepackage{hyperref} -\title{\mglTeX{} package example} -\author{Diego Sejas Viscarra, Alexey Balakin} +\title{\mglTeX*{} usage sample} +\author{Diego Sejas Viscarra \and Alexey Balakin} \date{\today} -\mgldir{MGL/} -\mglscriptsdir{scripts/} -\mglgraphicsdir{graphics/} -\mglbackupsdir{backups/} - -\begin{mglcommon} - define gravity 9.81 -\end{mglcommon} - -%\begin{mglsignature} -% This scripts was generated on date |today. -%\end{mglsignature} +\mglsettings{ + dir=MGL/, + scriptsdir=scripts/, + graphicsdir=graphics/, + backupsdir=backups/ +} +\begin{mglsetupscript} + define gravity 9.81 # [m/s^2] +\end{mglsetupscript} \begin{document} - -\maketitle - -\noindent The \LaTeX{} package \textsf{\mglTeX} (was made by Diego Sejas Viscarra) allows one to make figures directly from MGL scripts located in \LaTeX{} file. - -For using this package you need to specify \texttt{--shell-escape} option for \emph{latex/pdflatex} or manually run \emph{mglconv} tool on produced MGL scripts for generation of images. Don't forget to run \emph{latex/pdflatex} a second time to insert the generated images into the output document. - -The package may have following options: \texttt{draft}, \texttt{final} --- the same as in the \emph{graphicx} package; \texttt{on}, \texttt{off} --- to activate/deactivate the creation of scripts and graphics; \texttt{comments}, \texttt{nocomments} --- to make visible/invisible commentaries contained inside \texttt{mglcomment} environments; \texttt{jpg}, \texttt{jpeg}, \texttt{png} --- to export graphics as JPEG/PNG images; \texttt{eps}, \texttt{epsz} --- to export to uncompressed/compressed EPS format as primitives; \texttt{bps}, \texttt{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with \emph{pdflatex}); \texttt{pdf} --- to export to 3D PDF; \texttt{tex} --- to export to \LaTeX{}/\emph{tikz} document. - -The package defines the following environments: -\begin{description} -\item[mgl] - It writes its contents to a general script which has the same name as the LaTeX document, but its extension is \emph{.mgl}. The code in this environment is compiled and the image produced is included. It takes exactly the same optional arguments as the \texttt{\textbackslash{}includegraphics} command, plus an additional argument \emph{imgext}, which specifies the extension to save the image. -\item[mgladdon] - It adds its contents to the general script, without producing any image. It useful to set some global properties (like size of the images) at beginning of the document. -\item[mglcode] - Is exactly the same as \texttt{mgl}, but it writes its contents verbatim to its own file, whose name is specified as a mandatory argument. -\item[mglscript] - Is exactly the same as \texttt{mglcode}, but it doesn't produce any image, nor accepts optional arguments. It is useful, for example, to create a MGL script, which can later be post processed by another package like "listings". -\item[mglblock] - It writes its contents verbatim to a file, specified as a mandatory argument, and to the LaTeX document, and numerates each line of code. - -% This last three environments will test if the user is overwriting some file, and will issue a warning in that case. -\item[mglverbatim] - Exactly the same as \texttt{mglblock}, but it doesn't write to a file. This environment doesn't have arguments. -\item[mglfunc] - Is used to define MGL functions. It takes one mandatory argument, which is the name of the function, plus one additional argument, which specifies the number of arguments of the function. The environment needs to contain only the body of the function, since the first and last lines are appended automatically, and the resulting code is written at the end of the general script, which is also written automatically. The warning is produced if 2 or more function with the same name is defined. -\item[mglsignature] -Used to defined a commentary that will be added to every script. It is useful to include signature text or license text. Observe this is a verbatim-like environment, so no \LaTeX{} command will be executed inside it, but will be copied as is. - -As an alternative to this method of declaring signatures, the user can manually redefine the signature macro \texttt{\textbackslash{}mgltexsignature}, according to the following rules: - \begin{itemize} - \item The positions of the comment signs for the MGL language have to be manually specified in the signature using the \texttt{\textbackslash{}mglcomm} macro. - \item The new-line character is declared as ``\verb|^^J|''. - \item A percent sign (\texttt{\%}) has to be added at the end of every physical line of \texttt{\textbackslash{}mgltexsignature}, otherwise an inelegant space at the beginning of every line will appear. - \item Any \LaTeX{} command can be used in this case. -\end{itemize} - For example, the default signature: - \begin{mglcomment} - \begin{quote}\small - \mglcomm\\ - \mglcomm\ This script was generated from $<$document$>$.mgl on date $<$today$>$\\ - \mglcomm - \end{quote} - \end{mglcomment} - can be achieved with - \begin{verbatim} - \def\mgltexsignature{% - \mglcomm^^J% - \mglcomm\ This script was generated from \jobname.mgl on date \today^^J% - \mglcomm% - } - \end{verbatim} -\item[mglcomment] - Used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options \texttt{comments} and \texttt{nocomments} (see above), or the \texttt{\mglcomments{on}} and \texttt{\mglcomments{off}} commands (see bellow). - - When, visible, the comment will appear like this: - \begin{center} - \makeatletter - \verbatim@font - \makeatother - <------------------ MGL comment ------------------>\\ - $<$Commentary$>$\\ - <------------------ MGL comment ------------------>\\ - \end{center} -\item[mglsetup] - If many scripts with the same code are to be written, the repetitive code can be written inside this environment only once, then this code will be used automatically every time the \texttt{\textbackslash{}mglplot} command is used (see below). It takes one optional argument, which is a name to be associated to the corresponding contents of the environment; this name can be passed to the \texttt{\textbackslash{}mglplot} command to use the corresponding block of code automatically (see below). -\end{description} - -The package also defines the following commands: -\begin{description} -\item[\textbackslash{}mglplot] - It takes one mandatory argument, which is MGL instructions separated by the symbol ':' this argument can be more than one line long. It takes the same optional arguments as the \texttt{mgl} environment, plus an additional argument \emph{settings}, which indicates the name associated to a block of code inside a \texttt{mglsetup} environment. The code inside the mandatory argument will be appended to the block of code specified, and the resulting code will be written to the general script. -\item[\textbackslash{}mglgraphics] - This command takes the same optional arguments as the \texttt{mgl} environment, and one mandatory argument, which is the name of a MGL script. This command will compile the corresponding script and include the resulting image. It is useful when you have a script outside the LaTeX document, and you want to include the image, but you don't want to type the script again. -\item[\textbackslash{}mglinclude] - This is like \texttt{\textbackslash{}mglgraphics} but, instead of creating/including the corresponding image, it writes the contents of the MGL script to the LaTeX document, and numerates the lines. -\item[\textbackslash{}mgldir] - This command can be used in the preamble of the document to specify a directory where LaTeX will save the MGL scripts and generate the corresponding images. This directory is also where \texttt{\textbackslash{}mglgraphics} and \texttt{\textbackslash{}mglinclude} will look for scripts. -\item[\textbackslash{}mglquality] - Can be used to adjust the quality of the MGL graphics produced. The following table shows the available qualities: - \begin{center} - \begin{tabular}{cl} - \hline - Quality & Description\\ - \hline - \hline - $0$ & No face drawing (fastest)\\ - \hline - $1$ & No color interpolation (fast)\\ - \hline - $2$ & High quality (normal)\\ - \hline - $3$ & High quality with 3d primitives (not implemented yet)\\ - \hline - $4$ & No face drawing, direct bitmap drawing (low memory usage)\\ - \hline - $5$ & No color interpolation, direct bitmap drawing (low memory usage)\\ - \hline - $6$ & High quality, direct bitmap drawing (low memory usage)\\ - \hline - $7$ & High quality with 3d primitives, direct bitmap drawing (not implemented yet)\\ - \hline - $8$ & Draw dots instead of primitives (extremely fast)\\ - \hline - \end{tabular} - \end{center} -\item[\textbackslash{}mglswitch\{on\}, \textbackslash{}mglswitch\{off\}] - To activate/deactivate the creation of MGL scripts and images. Notice these commands have local behavior in the sense that their effect is from the point they are called on. -\item[\textbackslash{}mglcomment\{on\}, \textbackslash{}mglnocomment\{off\}] - To make visible/invisible the contents of the \texttt{mglcomment} environments. These commands have local effect too. -\item[\textbackslash{}mglTeX] - It just pretty prints the name of the package ``\mglTeX''. -\end{description} - - -An example of usage of \texttt{mgl} and \texttt{mglfunc} environments would be: -\begin{verbatim} -\begin{mglfunc}{prepare2d} - new a 50 40 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' - new b 50 40 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' -\end{mglfunc} - -\begin{figure}[!ht] - \centering - \begin{mgl}[width=0.85\textwidth,height=7.5cm] - fog 0.5 - call 'prepare2d' - subplot 2 2 0:title 'Surf plot (default)':rotate 50 60:light on:box:surf a - - subplot 2 2 1:title '"\#" style; meshnum 10':rotate 50 60:box - surf a '#'; meshnum 10 - - subplot 2 2 2 : title 'Mesh plot' : rotate 50 60 : box - mesh a - - new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)' - new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)' - new z 50 40 '0.8*cos(pi*(y+1)/2)' - subplot 2 2 3 : title 'parametric form' : rotate 50 60 : box - surf x y z 'BbwrR' - \end{mgl} -\end{figure} -\end{verbatim} -Note, that \texttt{mglfunc} environment(s) can be located at any position (at the beginning, at the end, or somewhere else) of LaTeX document. -\begin{mglfunc}{prepare2d} - new a 50 40 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' - new b 50 40 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' -\end{mglfunc} - -\begin{figure}[!ht] - \centering - \begin{mgl}[width=0.85\textwidth,height=7.5cm] - fog 0.5 - call 'prepare2d' - subplot 2 2 0 : title 'Surf plot (default)' : rotate 50 60 : light on : box : surf a - - subplot 2 2 1 : title '"\#" style; meshnum 10' : rotate 50 60 : box - surf a '#'; meshnum 10 - - subplot 2 2 2 : title 'Mesh plot' : rotate 50 60 : box - mesh a - - new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)' - new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)' - new z 50 40 '0.8*cos(pi*(y+1)/2)' - subplot 2 2 3 : title 'parametric form' : rotate 50 60 : box - surf x y z 'BbwrR' - \end{mgl} -\end{figure} - -Following example show the usage of \texttt{mglscript} environment -\begin{verbatim} -\begin{mglscript}{Vectorial} -call 'prepare2v' -subplot 3 2 0 '' : title 'lolo' : box -vect a b -subplot 3 2 1 '' : title '"." style; "=" style' : box -vect a b '.=' -subplot 3 2 2 '' : title '"f" style' : box -vect a b 'f' -subplot 3 2 3 '' : title '">" style' : box -vect a b '>' -subplot 3 2 4 '' : title '"<" style' : box -vect a b '<' -call 'prepare3v' -subplot 3 2 5 : title '3d variant' : rotate 50 60 : box -vect ex ey ez - -stop - -func 'prepare2v' - new a 20 30 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' - new b 20 30 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' -return - -func 'prepare3v' - define $1 pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5) - define $2 pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5) - new ex 10 10 10 '0.2*x/$1-0.2*x/$2' - new ey 10 10 10 '0.2*y/$1-0.2*y/$2' - new ez 10 10 10 '0.2*(z-0.3)/$1-0.2*(z+0.3)/$2' -return -\end{mglscript} -\end{verbatim} - -\begin{mglscript}{Vectorial} -call 'prepare2v' -subplot 3 2 0 '' : title 'lolo' : box -vect a b -subplot 3 2 1 '' : title '"." style; "=" style' : box -vect a b '.=' -subplot 3 2 2 '' : title '"f" style' : box -vect a b 'f' -subplot 3 2 3 '' : title '">" style' : box -vect a b '>' -subplot 3 2 4 '' : title '"<" style' : box -vect a b '<' -call 'prepare3v' -subplot 3 2 5 : title '3d variant' : rotate 50 60 : box -vect ex ey ez - -stop - -func 'prepare2v' - new a 20 30 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' - new b 20 30 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' -return - -func 'prepare3v' - define $1 pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5) - define $2 pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5) - new ex 10 10 10 '0.2*x/$1-0.2*x/$2' - new ey 10 10 10 '0.2*y/$1-0.2*y/$2' - new ez 10 10 10 '0.2*(z-0.3)/$1-0.2*(z+0.3)/$2' -return -\end{mglscript} - -You should use \texttt{\textbackslash{}mglgraphics} command to display its contents -\begin{verbatim} -\begin{figure}[!ht] - \centering - \mglgraphics[width=40em,height=20em]{Vectorial} - \caption{A beautiful example} -\end{figure} -\end{verbatim} - -\begin{figure}[!ht] - \centering - \mglgraphics[width=40em,height=20em]{Vectorial} - \caption{A beautiful example} -\end{figure} - -Alternatively, you can display the contents of the script in parallel to saving to a file, if you are using \texttt{mglblock} environment -\begin{verbatim} -\begin{mglblock}{Axis_projection} - ranges 0 1 0 1 0 1 - new x 50 '0.25*(1+cos(2*pi*x))' - new y 50 '0.25*(1+sin(2*pi*x))' - new z 50 'x' - new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)' - new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx - light on - - title 'Projection sample':ternary 4:rotate 50 60 - box:axis:grid - plot x y z 'r2':surf a '#' - xlabel 'X':ylabel 'Y':zlabel 'Z' -\end{mglblock} -\begin{figure}[!ht] - \centering - \mglgraphics[scale=0.5]{Axis_projection} - \caption{The image from Axis\_projection.mgl script} -\end{figure} -\end{verbatim} - -\begin{mglblock}{Axis_projection} - ranges 0 1 0 1 0 1 - new x 50 '0.25*(1+cos(2*pi*x))' - new y 50 '0.25*(1+sin(2*pi*x))' - new z 50 'x' - new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)' - new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx - light on - - title 'Projection sample':ternary 4:rotate 50 60 - box:axis:grid - plot x y z 'r2':surf a '#' - xlabel 'X':ylabel 'Y':zlabel 'Z' + + \maketitle + + \begin{abstract} + \noindent \mglTeX{} is a \LaTeX{} package that allows the creation of graphics directly from MGL scripts of the MathGL library (by Alexey Balakin) inside documents. The MGL code is extracted, executed (if shell escape is activated), and the resulting graphics are automatically included. + + This document is intended as a sample of the capabilities of \mglTeX{}, as well as a brief introduction to the package, for those who want to start right away to use it, without diving into the a little bit more technical documentation. + \end{abstract} + + \section{Basics on environments} + \begin{description} + \item[mgl] The easiest way to embed MGL code is the \verb|mgl| environment. It extracts its contents to a main script associated to the document.\footnote{Generally, the main script has the same name as the document being compiled. In order to rename it or create a new one, the \texttt{\textbackslash mglname} command can be used.} If shell escape is activated, \LaTeX{} will take care of calling \verb|mglconv| (the MathGL compiler) with the appropriate settings, and the resulting image will be automatically included. + + For example, you could write: + \begin{verbatim} + \begin{figure}[!ht] + \centering + \begin{mgl}[width=0.85\textwidth,height=6cm] + call 'prepare1d' + subplot 2 1 0 '<_' : title 'Standard data plot' + box : axis : grid 'xy' ';k' + plot y ’rGb’ + + subplot 2 1 1 '<_' : title 'Region plot' + ranges -1 1 -1 1 : origin 0 0 + new y1 200 'x^3-x' : new y2 200 'x' + axis : grid 'xy' 'W' + region y1 y2 'ry' + plot y1 '2k' : plot y2 '2k' + text -0.75 -0.35 '\i{A}_1' 'k' : text 0.75 0.25 '\i{A}_2' 'k' + \end{mgl} + \caption{A simple plot create by \mglTeX's \texttt{mgl} environment} + \end{figure} + \end{verbatim} + This will produce the following image: + \begin{figure}[!ht] + \centering + \begin{mgl}[width=0.85\textwidth,height=5.5cm] + call 'prepare1d' + subplot 2 1 0 '<_' : title 'Standard data plot' + box : axis : grid 'xy' ';k' + plot y '2' + + subplot 2 1 1 '<_' : title 'Region plot' + ranges -1 1 -1 1 : origin 0 0 + new y1 200 'x^3-x' : new y2 200 'x' + axis 'AKDTVISO' : grid 'xy' ';W' + region y1 y2 'ry' + plot y1 '2k' : plot y2 '2k' + text -0.75 -0.35 '\i{A}_1' 'k' -2 : text 0.75 0.25 '\i{A}_2' 'k' -2 + \end{mgl} + \caption{A simple plot create by \mglTeX's \texttt{mgl} environment} + \end{figure} + + Two important aspects of \mglTeX{} can be noted from this example: First, the \verb|mgl| environment accepts the same optional argument as the \verb|\includegraphics| command from the \verb|graphicx| package. Actually, it also accepts other optional arguments, called \verb|gray| (to activate/deactivate gray-scale mode), \verb|mglscale| (to set the factor for scaling the image file), \verb|quality| (to set the quality of the image), \verb|variant| (to chose the variant of the arguments of MGL commands in the script), \verb|imgext| (to specify the extension of the resulting graphic file), and \verb|label| (to specify a name to save the image). Most of these options are available to every \mglTeX{} environment or command to create graphics. + + The second aspect to be noted about the example is that this script calls a MGL function, \verb|prepare1d|, which hasn't been defined yet. \mglTeX{} provides the \verb|mglfunc| environment for this purpose (see below). + + \item[mglfunc] This environment can be used in any part of the \LaTeX{} document; \mglTeX{} takes care of placing the corresponding code at the end of the main script, as has to be done in the MGL language. + + For example, the function \verb|prepare1d| that is called in the script above is defined like this + \begin{verbatim} + \begin{mglfunc}{prepare1d} + new y 50 3 + modify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)' + modify y 'sin(2*pi*x)' 1 + modify y 'cos(2*pi*x)' 2 + \end{mglfunc} + \end{verbatim} + \begin{mglfunc}{prepare1d} + new y 50 3 + modify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)' + modify y 'sin(2*pi*x)' 1 + modify y 'cos(2*pi*x)' 2 + \end{mglfunc} + As you can see, only the body of the function has to be written. The number of arguments of the function can be passed to \verb|mglfunc| as optional argument, like in the code \verb|\begin{mglfunc}[3]{func_with_three_args}|. + + \item[mgladdon] This environment just adds its contents to the main script, without producing any image. It is useful to load dynamic libraries, define constants, etc. + + \item[mglcode] The \verb|mglcode| environment is similar to \verb|mgl|, but it creates its own script, whose name is passed as mandatory argument. The same optional arguments are accepted, except \verb|label| (for obvious reasons). + \begin{verbatim} + \begin{figure}[!ht] + \begin{mglcode}[scale=0.5]{vectorial_flow} + new a 20 30 'sin(pi*x)*sin(pi*y)+cos(2*pi*x*y)' + new b 20 30 'cos(pi*x)*cos(pi*y)+cos(2*pi*x*y)' + + subplot 1 1 0 '' : title 'Flow of vector field' : box + flow a b 'v'; value 20 + \end{mglcode} + \end{figure} + \end{verbatim} + \begin{figure}[!ht] + \centering + \begin{mglcode}[scale=0.5]{vectorial_flow} + new a 20 30 'sin(pi*x)*sin(pi*y)+cos(2*pi*x*y)' + new b 20 30 'cos(pi*x)*cos(pi*y)+cos(2*pi*x*y)' + + subplot 1 1 0 '' : title 'Flow of a vector field' : box + flow a b '2v'; value 10 + \end{mglcode} + \end{figure} + + \item[mglscript] This environment just creates a script, whose name is specified as mandatory argument. It is useful, for example, to create MGL scripts which can later be post-processed by another package, like \verb|listings| or \verb|pygments|. + + For example, the following won't produce any image, just a script: + \begin{verbatim} + \begin{mglscript}{Gaston_surface} + subplot 1 1 0 '' : title 'Gaston\'s surface' + ranges -13 13 -40 40 + new a 200 200 '-x+(2*0.84*cosh(0.4*x)*sinh(0.4*x))/' \ + '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+(0.4*sin(sqrt(0.84)*y))))+' \ + '0.5*sin(pi/2*x)' + new b 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*sin(y)*' \ + 'cos(sqrt(0.84)*y))+cos(y)*sin(sqrt(0.84)*y)))/' \ + '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' + new c 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*cos(y)*' \ + 'cos(sqrt(0.84)*y))-sin(y)*sin(sqrt(0.84)*y)))/' \ + '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' + rotate 60 60 + light on + xrange c : yrange b : zrange a : crange c + surf c b a '#'; meshnum 100 + \end{mglscript} + \end{verbatim} + \begin{mglscript}{Gaston_surface} + subplot 1 1 0 '' + ranges -13 13 -40 40 + new a 200 200 '-x+(2*0.84*cosh(0.4*x)*sinh(0.4*x))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+(0.4*sin(sqrt(0.84)*y))))+0.5*sin(pi/2*x)' + new b 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*sin(y)*cos(sqrt(0.84)*y))+cos(y)*sin(sqrt(0.84)*y)))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' + new c 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*cos(y)*cos(sqrt(0.84)*y))-sin(y)*sin(sqrt(0.84)*y)))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' + rotate 60 60 + light on + xrange c : yrange b : zrange a : crange c + surf c b a '#'; meshnum 100 + title 'Gaston surface' + \end{mglscript} + + \item[mglblock] It writes its contents verbatim to a file, specified as mandatory argument, and to the \LaTeX{} document. + + For example: + \begin{verbatim} + \begin{mglblock}{fractal} + list A [0,0,0,.16,0,0,.01] [.85,.04,-.04,.85,0,1.6,.85] [.2,-.26,.23,.22,0,1.6,.07] [-.15,.28,.26,.24,0,.44,.07] + ifs2d f A 100000 + subplot 2 1 0 '<_' : title 'A fractal fern' + ranges f(0) f(1) : axis + plot f(0) f(1) 'G#o '; size 0.05 + + subplot 2 1 1 '<_' : title 'Bifurcation plot' + ranges 0 4 0 1 : axis + bifurcation 0.005 'x*y*(1-y)' 'R' + \end{mglblock} + \end{verbatim} +\begin{mglblock}{fractal} +list A [0,0,0,.16,0,0,.01] [.85,.04,-.04,.85,0,1.6,.85] [.2,-.26,.23,.22,0,1.6,.07] [-.15,.28,.26,.24,0,.44,.07] +ifs2d f A 100000 +subplot 2 1 0 '<_' : title 'A fractal fern' +ranges f(0) f(1) : axis +plot f(0) f(1) 'G#o '; size 0.05 + +subplot 2 1 1 '<_' : title 'Bifurcation plot' +ranges 0 4 0 1 : axis +bifurcation 0.005 'x*y*(1-y)' 'R' \end{mglblock} -\begin{figure}[!ht] - \centering - \mglgraphics[scale=0.5]{Axis_projection} - \caption{The image from Axis\_projection.mgl script} -\end{figure} - -Finally, you can just show MGL script itself -\begin{verbatim} -\begin{mglverbatim} - ranges 0 1 0 1 0 1 - new x 50 '0.25*(1+cos(2*pi*x))' - new y 50 '0.25*(1+sin(2*pi*x))' - new z 50 'x' - new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)' - new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx - light on - - title 'Projection sample':ternary 4:rotate 50 60 - box:axis:grid - plot x y z 'r2':surf a '#' - xlabel 'X':ylabel 'Y':zlabel 'Z' -\end{mglverbatim} -\end{verbatim} - -\begin{mglverbatim} - ranges 0 1 0 1 0 1 - new x 50 '0.25*(1+cos(2*pi*x))' - new y 50 '0.25*(1+sin(2*pi*x))' - new z 50 'x' - new a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)' - new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx - light on - - title 'Projection sample':ternary 4:rotate 50 60 - box:axis:grid - plot x y z 'r2':surf a '#' - xlabel 'X':ylabel 'Y':zlabel 'Z' -\end{mglverbatim} - - -An example of usage of \texttt{\textbackslash{}mglplot} command would be: -\begin{verbatim} -\begin{mglsetup} - box '@{W9}' : axis -\end{mglsetup} -\begin{mglsetup}[2d] - box : axis - grid 'xy' ';k' -\end{mglsetup} -\begin{mglsetup}[3d] - rotate 50 60 - box : axis : grid 'xyz' ';k' -\end{mglsetup} -\begin{figure}[!ht] - \centering - \mglplot[scale=0.5]{new a 200 'sin(pi*x)':plot a '2B'} -\end{figure} -\begin{figure}[!ht] - \centering - \mglplot[scale=0.5,settings=2d]{ - fplot 'sin(pi*x)' '2B' : - fplot 'cos(pi*x^2)' '2R' - } -\end{figure} -\begin{figure}[!ht] - \centering - \mglplot[width=0.5 \textwidth, settings=3d] - {fsurf 'sin(pi*x)+cos(pi*y)'} -\end{figure} -\end{verbatim} - -\begin{mglsetup}{generic} - box '@{W9}' : axis -\end{mglsetup} -\begin{mglsetup}{2d} - box : axis - grid 'xy' ';k' -\end{mglsetup} -\begin{mglsetup}{3d} - rotate 50 60 - box : axis : grid 'xyz' ';k' -\end{mglsetup} -\begin{figure}[!ht] - \centering - \mglplot[scale=0.5,setup=generic]{new a 200 'x' : fplot 'sin(pi*x)' '2R' : plot a '2B'} -\end{figure} -\begin{figure}[!ht] - \centering - \mglplot[scale=0.5,setup=2d]{% - fplot 'sin(pi*x)' '2B' :% - fplot 'cos(pi*x^2)' '2R'% - } -\end{figure} -\begin{figure}[!ht] - \centering - \mglplot[width=0.5\textwidth, setup=3d]{fsurf 'sin(pi*x)+cos(pi*y)'} -\end{figure} - -As an additional feature, when an image is not found or cannot be included, instead of issuing an error, \texttt{mgltex} prints a box with the word \emph{'MGL image not found'} in the LaTeX document. -\begin{figure}[!ht] - \centering - \mglgraphics{xyz} -\end{figure} - -Let's display the content of the MGL file using \texttt{\textbackslash{}mglinclude} command: -\mglinclude{Vectorial} - -The following commentary will be visible, since \mglTeX{} has been called with the \texttt{comments} option. -\begin{verbatim} - \begin{mglcomment} - This is a visible commentary - that can have multiple lines - \end{mglcomment} -\end{verbatim} -The result is: + As you can see, although this is a verbatim-like environment, very long lines of code are split to fit the paragraph. Each line of code is numbered, this can be disabled with the \verb|lineno| option, like \verb|\begin{mglblock}[lineno=false]{fractal}|. + + \item[mglverbatim] This is like \verb|mglblock| environment, but it doesn't produce any script, just typesets the code to the \LaTeX{} document. It accepts the \verb|lineno| option, plus the \verb|label| option, in case you want to associate a name to the code. + + \item[mglcomment] This environment is used to embed comments in the document. You can control whether the contents of this environment are displayed or not, using the \verb|comments| and \verb|nocomments| package options, or the \verb|\mglcomments{on}| and \verb|mglcomments{off}| commands. + + An example of this would be: + \begin{verbatim} + \begin{mglcomments} + This comment will be shown because we used the "comments" package option for mglTeX + \end{mglcomments} + \end{verbatim} \begin{mglcomment} - This is a visible commentary - that can have multiple lines +This comment will be shown because we used the "comments" package option for mglTeX \end{mglcomment} - -The following commentary won't be visible, since it is wrapped by \texttt{\textbackslash{}mglnocomments\{off\}} and \texttt{\textbackslash{}mglcomments\{on\}}. -\begin{verbatim} - \mglcomments{off} - \begin{mglcomment} - This is an invisible commentary - that can have multiple lines - \end{mglcomment} - \mglcomments{on} -\end{verbatim} -\mglcomments{off} -\begin{mglcomment} - This is an invisible commentary - that can have multiple lines -\end{mglcomment} -\mglcomments{on} - -The last example is the use of the \texttt{\textbackslash{}mglswitch\{on\}} and \texttt{\textbackslash{}mglswitch\{off\}} commands. For example, the following image won't be generated: -\begin{verbatim} - \mglswitch{off} - \begin{figure}[!ht] - \centering - \begin{mgl} - box : axis - fplot 'sin(pi*x)' '2B' - \end{mgl} - \end{figure} - \mglswitch{on} -\end{verbatim} -The result is: -\mglswitch{off} -\begin{figure}[!ht] - \centering - \begin{mgl} - box : axis - fplot 'sin(pi*x)' '2B' - \end{mgl} -\end{figure} -\mglswitch{on} + Once again, long lines are broke down to fit the paragraph. + \end{description} + + \section{Basics on commands} + \begin{description} + \item[\textbackslash mglgraphics] This command takes the name of an external MGL script, compiles it, and includes the resulting image. It accespt the same optional arguments as the \verb|mgl| environment, except for \verb|label|, plus a \verb|path| option, which can be used to specify the location of the script. This is useful when you have a script outside of the \LaTeX{} document (sent by a colleague for example), but you don't want to transcript it to your document. + + For example, in order to display the image of the script we created with \verb|mglscript| environment, we write: + \begin{verbatim} + \begin{figure}[!ht] + \centering + \mglgraphics[height=9cm,width=9cm]{Gaston_surface} + \caption{Gaston's surface} + \end{figure} + \end{verbatim} + \begin{figure}[!ht] + \centering + \mglgraphics[height=9cm,width=9cm]{Gaston_surface} + \caption{Gaston's surface: Three-dimensional parametric surface} + \end{figure} + + We could also could compile the script we created with the \verb|mglblock| environment: + \begin{verbatim} + \begin{figure}[!ht] + \centering + \mglgraphics[height=7cm,width=10cm]{fractal} + \caption{Examples of fractal behavior} + \end{figure} + \end{verbatim} + \begin{figure}[!ht] + \centering + \mglgraphics[height=7cm,width=10cm]{fractal} + \caption{Examples of fractal behavior} + \end{figure} + + \item[\textbackslash mglinclude] This is equivalent to the \verb|mglblock| environment, but works for external scripts. + + \item[\textbackslash mglplot] This command allows the fast creation of plots. It takes one mandatory argument, which is a block of MGL code to produce the plot. Accepts the same optional arguments as the \verb|mgl| environment, plus an additional one, \verb|setup|, that can be used to specify a block of code to append, defined inside a \verb|mglsetup| environment (see the example below). + + The \verb|mglsetup| environment can be used if many plots will have the same settings (background color, etc.). Instead of writing the same code over and over again, it can be introduced in that environment, and used with the \verb|\mglplot| command. + + An example of use of the \verb|mglsetup| environment and the \verb|\mglplot| command would be: + \begin{verbatim} + \begin{mglsetup}{3d} + clf 'W' + rotate 50 60 + light on + box : axis : grid 'xyz' ';k' + \end{mglsetup} + \begin{figure}[!ht] + \centering + \mglplot[setup=3d,scale=0.5]{fsurf 'cos(4*pi*hypot(x,y))*exp(-abs(x+y))'} + \end{figure} + \begin{figure}[!ht] + \centering + \mglplot[setup=3d,scale=0.5]{fsurf 'sin(pi*(x+y))'} + \end{figure} + \end{verbatim} + \begin{mglsetup}{3d} + clf 'W' + rotate 50 60 + light on : light 0 0 1 0 'w' 0.25 + box : axis : grid 'xyz' ';k' + \end{mglsetup} + \begin{figure}[!ht] + \centering + \mglplot[setup=3d,scale=0.5]{fsurf 'cos(4*pi*hypot(x,y))*exp(-abs(x+y))'} + \end{figure} + \begin{figure}[!ht] + \centering + \mglplot[setup=3d,scale=0.5]{fsurf 'sin(pi*(x+y))'} + \end{figure} + \end{description} + + There are more environments and commands defined by \mglTeX{}. The ones presented here are the most basic. More on this topic can be found in the documentation. \end{document} \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0470c22..ea538cc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,8 +4,8 @@ set(mgl_src data.cpp data_io.cpp data_ex.cpp data_png.cpp export_2d.cpp export_3d.cpp eval.cpp evalp.cpp exec.cpp export.cpp fit.cpp font.cpp obj.cpp other.cpp parser.cpp pde.cpp pixel.cpp - plot.cpp prim.cpp surf.cpp tex_table.cc vect.cpp volume.cpp evalc.cpp - s_hull/s_hull_pro.cpp window.cpp + plot.cpp prim.cpp surf.cpp vect.cpp volume.cpp evalc.cpp + s_hull/s_hull_pro.cpp window.cpp fractal.cpp ) set(mgl_hdr @@ -20,6 +20,7 @@ ${MathGL_BINARY_DIR}/include/mgl2/dllexport.h cont.hpp ../include/mgl2/parser.h ../include/mgl2/addon.h ../include/mgl2/evalc.h s_hull/s_hull_pro.h ../include/mgl2/wnd.h ../include/mgl2/canvas_wnd.h ../include/mgl2/thread.h ../include/mgl2/abstract.h ../include/mgl2/pde.h +# tex_table.cc def_font.cc ) add_definitions(-DMGL_SRC) @@ -42,76 +43,16 @@ if(MGL_HAVE_OPENGL) endif(MGL_HAVE_OPENGL) include(GenerateExportHeader) -add_compiler_export_flags() mgl_add_lib(mgl ${mgl_src} ${mgl_hdr}) generate_export_header(mgl EXPORT_FILE_NAME ../include/mgl2/dllexport.h) -# if(MGL_HAVE_LTDL) -# target_link_libraries(mgl ${LTDL_LIB}) -# include_directories(${LTDL_INCLUDE_DIR}) -# endif(MGL_HAVE_LTDL) - -if(MGL_HAVE_PDF) - include_directories(${HPDF_INCLUDE_DIR}) - target_link_libraries(mgl ${HPDF_LIB}) -endif(MGL_HAVE_PDF) - -if(MGL_HAVE_PTHREAD) - target_link_libraries(mgl ${CMAKE_THREAD_LIBS_INIT}) -endif(MGL_HAVE_PTHREAD) - -if(MGL_HAVE_JPEG) - target_link_libraries(mgl ${JPEG_LIBRARIES}) - include_directories(${JPEG_INCLUDE_DIR}) -endif(MGL_HAVE_JPEG) - -if(MGL_HAVE_GIF) - target_link_libraries(mgl ${GIF_LIBRARIES}) - include_directories(${GIF_INCLUDE_DIR}) -endif(MGL_HAVE_GIF) - -if(MGL_HAVE_HDF5) - target_link_libraries(mgl ${HDF5_LIBRARIES} ${HDF5_C_SHARED_LIBRARY}) - include_directories(${HDF5_INCLUDE_DIR}) -endif(MGL_HAVE_HDF5) - -if(MGL_HAVE_HDF4) - target_link_libraries(mgl ${HDF4MF_LIB} ${HDF4_LIB}) - include_directories(${HDF4_INCLUDE_DIR}) -endif(MGL_HAVE_HDF4) - -if(MGL_HAVE_LTDL) - target_link_libraries(mgl ${LTDL_LIB} ) - include_directories(${LTDL_INCLUDE_DIR}) -endif(MGL_HAVE_LTDL) - -if(MGL_HAVE_GSL) - target_link_libraries(mgl ${GSL_LIB} ${GSL_CBLAS_LIB} ) - include_directories(${GSL_INCLUDE_DIR}) -endif(MGL_HAVE_GSL) - -if(MGL_HAVE_OPENGL) - target_link_libraries(mgl ${OPENGL_LIBRARIES} ) - include_directories(${OPENGL_INCLUDE_DIR} ) -endif(MGL_HAVE_OPENGL) - -if(MGL_HAVE_PNG) - target_link_libraries(mgl ${PNG_LIBRARIES} ) - include_directories(${PNG_INCLUDE_DIR}) -endif(MGL_HAVE_PNG) - -if(MGL_HAVE_ZLIB) - target_link_libraries(mgl ${ZLIB_LIBRARIES} ) - include_directories(${ZLIB_INCLUDE_DIR}) -endif(MGL_HAVE_ZLIB) - -if(M_LIB) - target_link_libraries(mgl ${M_LIB}) -endif(M_LIB) +target_link_libraries(mgl ${MGL_DEP_LIBS}) +target_link_libraries(mgl-static ${MGL_DEP_LIBS}) if(MGL_HAVE_MPI) mgl_add_lib(mpi mpi.cpp ../include/mgl2/mpi.h) target_link_libraries(mgl-mpi ${MPI_LIBRARIES} ) + target_link_libraries(mgl-mpi-static ${MPI_LIBRARIES} ) target_include_directories(mgl-mpi SYSTEM PUBLIC ${MPI_CXX_INCLUDE_PATH}) endif(MGL_HAVE_MPI) diff --git a/src/addon.cpp b/src/addon.cpp index 9e9b8c9..3a726d1 100644 --- a/src/addon.cpp +++ b/src/addon.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * addon.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -171,6 +171,7 @@ void MGL_EXPORT mgl_difr_grid_old(dual *a,int n,int step,dual q,int Border,dual memcpy(b,d,n*sizeof(dual)); switch(Border) { + default: case 0: // zero at border b[0] = 0; b[n-1] = 0; break; case 1: // constant at border diff --git a/src/axis.cpp b/src/axis.cpp index 36164ee..a3cd0b2 100644 --- a/src/axis.cpp +++ b/src/axis.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * axis.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -216,8 +216,8 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t) UpdateAxis(); time_t tt; tm t1,t2; - tt=aa.v1; mgl_localtime(&tt, &t1, get(MGL_USE_GMTIME)); - tt=aa.v2; mgl_localtime(&tt, &t2, get(MGL_USE_GMTIME)); + tt=(time_t)aa.v1; mgl_localtime(&tt, &t1, get(MGL_USE_GMTIME)); + tt=(time_t)aa.v2; mgl_localtime(&tt, &t2, get(MGL_USE_GMTIME)); if(aa.v1 * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,6 +20,28 @@ #include "mgl2/font.h" #include "mgl2/base.h" #include "mgl2/eval.h" +#if MGL_HAVE_OMP +#include +#endif + +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_mutex_unlock(void *mutex) +{ +#if MGL_HAVE_PTHREAD + pthread_mutex_unlock((pthread_mutex_t *)mutex); +#elif MGL_HAVE_OMP + omp_unset_lock((omp_lock_t *)mutex); +#endif +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_mutex_lock(void *mutex) +{ +#if MGL_HAVE_PTHREAD + pthread_mutex_lock((pthread_mutex_t *)mutex); +#elif MGL_HAVE_OMP + omp_set_lock((omp_lock_t *)mutex); +#endif +} //----------------------------------------------------------------------------- char *mgl_strdup(const char *s) { @@ -105,13 +127,16 @@ mglBase::mglBase() pthread_mutex_init(&mutexClf,0); Pnt.set_mutex(&mutexClf); Prm.set_mutex(&mutexClf); - Txt.set_mutex(&mutexClf); +// Txt.set_mutex(&mutexClf); #endif #if MGL_HAVE_OMP - omp_init_lock(&lockClf); - Pnt.set_mutex(&lockClf); - Prm.set_mutex(&lockClf); - Txt.set_mutex(&lockClf); + lockClf = new omp_lock_t; + omp_init_lock((omp_lock_t*)lockClf); + Pnt.set_mutex(lockClf); + Prm.set_mutex(lockClf); +// Txt.set_mutex(&lockClf); +#else + lockClf = NULL; #endif fnt=0; *FontDef=0; fx=fy=fz=fa=fc=0; AMin.Set(0,0,0,0); AMax.Set(1,1,1,1); @@ -127,12 +152,28 @@ mglBase::mglBase() MinS.Set(-1,-1,-1); MaxS.Set(1,1,1); fnt = new mglFont; fnt->gr = this; PrevState=NAN; size_opt=NAN; } +//----------------------------------------------------------------------------- mglBase::~mglBase() { ClearEq(); ClearPrmInd(); delete fnt; - Pnt.set_mutex(0); Prm.set_mutex(0); Txt.set_mutex(0); + Pnt.set_mutex(0); Prm.set_mutex(0); //Txt.set_mutex(0); +#if MGL_HAVE_PTHREAD + pthread_mutex_destroy(&mutexPnt); + pthread_mutex_destroy(&mutexTxt); + pthread_mutex_destroy(&mutexSub); + pthread_mutex_destroy(&mutexLeg); + pthread_mutex_destroy(&mutexPrm); + pthread_mutex_destroy(&mutexPtx); + pthread_mutex_destroy(&mutexStk); + pthread_mutex_destroy(&mutexGrp); + pthread_mutex_destroy(&mutexGlf); + pthread_mutex_destroy(&mutexAct); + pthread_mutex_destroy(&mutexDrw); + pthread_mutex_destroy(&mutexClf); +#endif #if MGL_HAVE_OMP - omp_destroy_lock(&lockClf); + omp_destroy_lock((omp_lock_t*)lockClf); + delete ((omp_lock_t*)lockClf); #endif } //----------------------------------------------------------------------------- @@ -299,6 +340,11 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea if(ci<0 || ci>=(long)Txt.size()) ci=0; // NOTE never should be here!!! const mglTexture &txt=Txt[ci]; txt.GetC(c,a,q); // RGBA color + if(get(MGL_GRAY_MODE)) + { + float h = 0.3*q.r + 0.59*q.g + 0.11*q.b; + q.r = q.g = q.b = h; + } // add gap for texture coordinates for compatibility with OpenGL const mreal gap = 0./MGL_TEXTURE_COLOURS; @@ -310,7 +356,7 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea if(!get(MGL_ENABLE_ALPHA)) { q.a=1; if(txt.Smooth!=2) q.ta=1-gap; } if(norefr) q.v=0; if(!get(MGL_ENABLE_LIGHT) && !(scl&4)) q.u=q.v=NAN; - q.sub=mat->norot?-Sub.size():Sub.size()-1; + q.sub=mat->norot?-1*(short)Sub.size():Sub.size()-1; long k; #pragma omp critical(pnt) {k=Pnt.size(); MGL_PUSH(Pnt,q,mutexPnt);} return k; diff --git a/src/base_cf.cpp b/src/base_cf.cpp index a8ec273..148d068 100644 --- a/src/base_cf.cpp +++ b/src/base_cf.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * base.cpp is part of Math gric Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/canvas.cpp b/src/canvas.cpp index b413099..8374232 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * canvas.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -763,7 +763,7 @@ void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az) mreal fz=exp(M_LN10*floor(0.5+log10(fabs(dz/dx)))); if(Ay>0) fy*=Ay; if(Az>0) fz*=Az; - Ax = Height*dx; Ay = Width*dy*fy; Az = Depth*dz*fz; + Ax = inH*dx; Ay = inW*dy*fy; Az = sqrt(inW*inH)*dz*fz; } mreal a = fabs(Ax) > fabs(Ay) ? fabs(Ax) : fabs(Ay); a = a > fabs(Az) ? a : fabs(Az); @@ -775,6 +775,32 @@ void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az) size_t n = Sub.size(); if(n>0) Sub[n-1].B = B; } //----------------------------------------------------------------------------- +void mglCanvas::Shear(mreal Sx,mreal Sy) +{ + mreal R[6], Fx=1+fabs(Sx)*inH/inW, Fy=1+fabs(Sy)*inW/inH; + memcpy(R,B.b,6*sizeof(mreal)); + B.b[0] = (R[0]+Sx*R[3])/Fx; B.b[1] = (R[1]+Sx*R[4])/Fx; B.b[2] = (R[2]+Sx*R[5])/Fx; + B.b[3] = (R[3]+Sy*R[0])/Fy; B.b[4] = (R[4]+Sy*R[1])/Fy; B.b[5] = (R[5]+Sy*R[2])/Fy; + size_t n = Sub.size(); if(n>0) Sub[n-1].B = B; +} +//----------------------------------------------------------------------------- +void mglCanvas::ShearPlot(int num, int id, mreal sx, mreal sy, mreal xd, mreal yd) +{ + InPlot(0,1,0,1,true); + if(!(fabs(xd)<=1 && fabs(yd)<=1)) { xd=1; yd=0; } + mreal wx,wy,dx,dy,wf,hf,x1,y1; + int ix=sy>=0?id:num-id-1, iy=sx>=0?id:num-id-1; + for(int i=0;i<3;i++) // iterations to solve cubic equation + { + wx = fabs(sx)*inH/inW; dx = xd + yd*wx; wf = 1+wx+(num-1)*fabs(dx); + wy = fabs(sy)*inW/inH; dy = yd + xd*wy; hf = 1+wy+(num-1)*fabs(dy); + x1=(dx>=0?ix:(ix-num+1))*dx; + y1=(dy>=0?iy:(iy-num+1))*dy; + InPlot(x1/wf,(x1+1+wx)/wf,y1/hf,(y1+1+wy)/hf,true); + } + Shear(sx,sy); +} +//----------------------------------------------------------------------------- // Lighting and transparency //----------------------------------------------------------------------------- void mglCanvas::Fog(mreal d, mreal dz) { FogDist=d; FogDz = dz; } diff --git a/src/canvas_cf.cpp b/src/canvas_cf.cpp index 3eb207b..6d7cbb7 100644 --- a/src/canvas_cf.cpp +++ b/src/canvas_cf.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * canvas_cf.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -83,6 +83,7 @@ void MGL_EXPORT mgl_clear_frame(HMGL gr) void MGL_EXPORT mgl_set_transp_type(HMGL gr, int type) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTranspType(type); } void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable) { gr->Alpha(enable); } +void MGL_EXPORT mgl_set_gray(HMGL gr, int enable) { gr->set(enable, MGL_GRAY_MODE); } void MGL_EXPORT mgl_set_fog(HMGL gr, double d, double dz) { mglCanvas *g = dynamic_cast(gr); if(g) g->Fog(d,dz); } void MGL_EXPORT mgl_set_light(HMGL gr, int enable) { gr->Light(enable); } @@ -159,9 +160,13 @@ void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int i, double dd) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int i, double tet, double phi) { mglCanvas *g = dynamic_cast(gr); if(g) g->StickPlot(num, i, tet, phi); } +void MGL_EXPORT mgl_shearplot(HMGL gr, int num, int i, double sx, double sy, double xd, double yd) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->ShearPlot(num, i, sx, sy, xd, yd); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_aspect(HMGL gr, double Ax,double Ay,double Az) { mglCanvas *g = dynamic_cast(gr); if(g) g->Aspect(Ax,Ay,Az); } +void MGL_EXPORT mgl_shear(HMGL gr, double Sx,double Sy) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->Shear(Sx,Sy); } void MGL_EXPORT mgl_rotate(HMGL gr, double TetX,double TetZ,double TetY) { mglCanvas *g = dynamic_cast(gr); if(g) g->Rotate(TetX,TetZ,TetY); } void MGL_EXPORT mgl_view(HMGL gr, double TetX,double TetZ,double TetY) @@ -191,6 +196,7 @@ void MGL_EXPORT mgl_clear_frame_(uintptr_t *gr) { _GR_->ClearFrame(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *type) { _GR_->SetTranspType(*type); } void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable) { _GR_->Alpha(*enable); } +void MGL_EXPORT mgl_set_gray_(uintptr_t *gr, int *enable) { _GR_->set(*enable, MGL_GRAY_MODE); } void MGL_EXPORT mgl_set_fog_(uintptr_t *gr, mreal *d, mreal *dz) { _GR_->Fog(*d, *dz); } void MGL_EXPORT mgl_set_light_(uintptr_t *gr, int *enable) { _GR_->Light(*enable); } void MGL_EXPORT mgl_set_attach_light_(uintptr_t *gr, int *enable) { _GR_->AttachLight(*enable); } @@ -236,6 +242,8 @@ void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *i, mreal *d) { mgl_gridplot(_GR_,*nx,*ny,*i,*d); } void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi) { _GR_->StickPlot(*num, *i, *tet, *phi); } +void MGL_EXPORT mgl_shearplot_(uintptr_t *gr, int *num, int *i, mreal *sy, mreal *sx, mreal *xd, mreal *yd) +{ _GR_->ShearPlot(*num,*i,*sx,*sy,*xd,*yd); } void MGL_EXPORT mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, int l,int m) { char *t=new char[l+1]; memcpy(t,title,l); t[l]=0; @@ -243,6 +251,8 @@ void MGL_EXPORT mgl_title_(uintptr_t *gr, const char *title, const char *stl, mr _GR_->Title(t,s,*size); delete []s; delete []t; } void MGL_EXPORT mgl_aspect_(uintptr_t *gr, mreal *Ax, mreal *Ay, mreal *Az) { _GR_->Aspect(*Ax,*Ay,*Az); } +void MGL_EXPORT mgl_shear_(uintptr_t *gr, mreal *Sx, mreal *Sy) +{ _GR_->Shear(*Sx,*Sy); } void MGL_EXPORT mgl_rotate_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY) { _GR_->Rotate(*TetX,*TetZ,*TetY); } void MGL_EXPORT mgl_view_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY) @@ -399,7 +409,7 @@ void MGL_EXPORT mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *l void MGL_EXPORT mgl_set_ticks_val_(uintptr_t *gr, const char *dir, uintptr_t *val, const char *lbl, int *add,int,int l) { char *s=new char[l+1]; memcpy(s,lbl,l); s[l]=0; _GR_->SetTicksVal(*dir,_DA_(val),s,*add); delete []s; } -void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl, int *add,int,int l) +void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl, int,int l) { char *s=new char[l+1]; memcpy(s,lbl,l); s[l]=0; mgl_add_tick(_GR_,*dir,*val,s); delete []s; } void MGL_EXPORT mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos) diff --git a/src/complex.cpp b/src/complex.cpp index ccfbb20..891482b 100644 --- a/src/complex.cpp +++ b/src/complex.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * complex.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -912,7 +912,7 @@ void MGL_EXPORT mgl_datac_put_val(HADT d, dual val, long xx, long yy, long zz) if(xx>=nx || yy>=ny || zz>=nz) return; dual *a=d->a; if(xx>=0 && yy>=0 && zz>=0) a[xx+nx*(yy+zz*ny)] = val; - if(xx<0 && yy<0 && zz<0) + else if(xx<0 && yy<0 && zz<0) #pragma omp parallel for for(long i=0;inx,ny=d->ny,nz=d->nz,ll=strlen(how); - long p[4]={0,0,(mglchr(how,'a')||mglchr(how,'r'))?1:0,0}; + long p[4]={0,0,0,0}; dual qq=q; for(long i=0;i='0' && how[i]<='9') p[3] = how[i]-'0'; + bool axial = mglchr(how,'r')||mglchr(how,'r'); if(mglchr(how,'z') && nz>1) { - p[0]=nz; p[1]=nx*ny; + p[0]=nz; p[1]=nx*ny; p[2]=0; mglStartThreadC(mgl_difr,0,nx*ny,0,&qq,0,p); } - if(mglchr(how,'y') && ny>1) + if(mglchr(how,'y') && ny>1 && !axial) { - p[0]=ny; p[1]=nx; + p[0]=ny; p[1]=nx; p[2]=0; mglStartThreadC(mgl_difr,0,nx*nz,0,&qq,0,p); } - if((mglchr(how,'x')||mglchr(how,'r')) && nx>1) + if(mglchr(how,'x') && nx>1 && !axial) { - p[0]=nx; p[1]=1; + p[0]=nx; p[1]=1; p[2]=0; + mglStartThreadC(mgl_difr,0,ny*nz,0,&qq,0,p); + } + if(axial && nx>1) + { + p[0]=nx; p[1]=1; p[2]=1; mglStartThreadC(mgl_difr,0,ny*nz,0,&qq,0,p); } } @@ -1171,7 +1177,7 @@ void MGL_EXPORT mgl_datac_refill_gs(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mr #pragma omp parallel for for(long i=0;ia[i+j*nx] = d; else dat->a[i+sl*nx] = d; } @@ -1188,7 +1194,7 @@ void MGL_EXPORT mgl_datac_refill_x(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mre for(long i=0;ia[i+j*nx] = d; else dat->a[i+sl*nx] = d; } @@ -1263,7 +1269,7 @@ void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, m #pragma omp parallel for collapse(2) for(long j=0;ja[i0+k*nn] = d; else dat->a[i0+sl*nn] = d; diff --git a/src/complex_ex.cpp b/src/complex_ex.cpp index 5d5ab4d..3c3af89 100644 --- a/src/complex_ex.cpp +++ b/src/complex_ex.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_new.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -62,7 +62,7 @@ HADT MGL_EXPORT mgl_datac_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz) mglData tmp; tmp.a[0]=-1; return mgl_datac_subdata_ext(d,xx?xx:&tmp,yy?yy:&tmp,zz?zz:&tmp); } - + long n=0,m=0,l=0,j,k; bool ix=false, iy=false, iz=false; if(xx->GetNz()>1) // 3d data @@ -330,20 +330,21 @@ HADT MGL_EXPORT mgl_datac_sum(HCDT dat, const char *dir) if(strchr(dir,'z') && nz>1) { mglStartThreadC(mgl_sumc_z,0,nx*ny,b,c,0,p); - memcpy(c,b,nx*ny*sizeof(mreal)); p[2] = 1; + memcpy(c,b,nx*ny*sizeof(dual)); p[2] = 1; } if(strchr(dir,'y') && ny>1) { mglStartThreadC(mgl_sumc_y,0,nx*p[2],b,c,0,p); - memcpy(c,b,nx*p[2]*sizeof(mreal)); p[1] = p[2]; p[2] = 1; + memcpy(c,b,nx*p[2]*sizeof(dual)); p[1] = p[2]; p[2] = 1; } if(strchr(dir,'x') && nx>1) { mglStartThreadC(mgl_sumc_x,0,p[1]*p[2],b,c,0,p); p[0] = p[1]; p[1] = p[2]; p[2] = 1; + memcpy(c,b,p[0]*p[1]*sizeof(dual)); } mglDataC *r=new mglDataC(p[0],p[1],p[2]); - memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(dual)); + memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(dual)); delete []b; delete []c; return r; } uintptr_t MGL_EXPORT mgl_datac_sum_(uintptr_t *d, const char *dir,int l) @@ -368,10 +369,10 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) #pragma omp parallel for for(long i=0;ivthr(i+nx*j); + dual u=dat->vthr(i+nx*j); i0 += u; i1 += u*res->a[i+nx*j]; } b->a[i] = i0!=mreal(0) ? i1/i0 : 0; @@ -383,10 +384,10 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) #pragma omp parallel for for(long i=0;iv(j,i,k); + dual u=dat->v(j,i,k); i0 += u; i1 += u*res->a[j+nx*(i+ny*k)]; } b->a[i] = i0!=mreal(0) ? i1/i0 : 0; @@ -399,10 +400,10 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) #pragma omp parallel for for(long i=0;ivthr(j+nn*i); + dual u=dat->vthr(j+nn*i); i0 += u; i1 += u*res->a[j+nn*i]; } b->a[i] = i0!=mreal(0) ? i1/i0 : 0; @@ -421,25 +422,27 @@ HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, in const mglDataC *dc=dynamic_cast(dat); long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz(); mglDataC *r=new mglDataC(idat->GetNx(),idat->GetNy(),idat->GetNz()); + mreal dx = nx-1, dy = ny-1, dz = nz-1; + if(!norm) dx=dy=dz=1; if(dd) #pragma omp parallel for for(long i=0;iGetNN();i++) { - mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?mglSpline3st(dd->a,nx,ny,nz, x,y,z):NAN; } else if(dc) #pragma omp parallel for for(long i=0;iGetNN();i++) { - mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?mglSpline3st(dc->a,nx,ny,nz, x,y,z):NAN; } else #pragma omp parallel for for(long i=0;iGetNN();i++) { - mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?dat->linear(x,y,z):NAN;; } return r; @@ -481,7 +484,7 @@ void MGL_EXPORT mgl_datac_mul_dat(HADT d, HCDT a) long nx=d->nx, ny=d->ny, nz=d->nz; long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); const mglDataC *c = dynamic_cast(a); - + if(mz*my*mx==1) { dual v=c?c->a[0]:a->v(0); @@ -515,7 +518,7 @@ void MGL_EXPORT mgl_datac_div_dat(HADT d, HCDT a) long nx=d->nx, ny=d->ny, nz=d->nz; long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); const mglDataC *c = dynamic_cast(a); - + if(mz*my*mx==1) { dual v=c?c->a[0]:a->v(0); @@ -549,7 +552,7 @@ void MGL_EXPORT mgl_datac_add_dat(HADT d, HCDT a) long nx=d->nx, ny=d->ny, nz=d->nz; long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); const mglDataC *c = dynamic_cast(a); - + if(mz*my*mx==1) { dual v=c?c->a[0]:a->v(0); @@ -583,7 +586,7 @@ void MGL_EXPORT mgl_datac_sub_dat(HADT d, HCDT a) long nx=d->nx, ny=d->ny, nz=d->nz; long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); const mglDataC *c = dynamic_cast(a); - + if(mz*my*mx==1) { dual v=c?c->a[0]:a->v(0); diff --git a/src/complex_io.cpp b/src/complex_io.cpp index a1dee5d..26d3eb9 100644 --- a/src/complex_io.cpp +++ b/src/complex_io.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_io.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -945,3 +945,14 @@ void MGL_EXPORT mgl_datac_save_hdf_(uintptr_t *d, const char *fname, const char char *t=new char[n+1]; memcpy(t,data,n); t[n]=0; mgl_datac_save_hdf(_DC_,s,t,*rewrite); delete []s; delete []t; } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_limit(HADT d, mreal v) +{ + long n = d->GetNN(); + dual *a = d->a; + #pragma omp parallel for + for(long i=0;iv) a[i] *= v/b; } +} +void MGL_EXPORT mgl_datac_limit_(uintptr_t *d, mreal *v) +{ mgl_datac_limit(_DC_, *v); } +//----------------------------------------------------------------------------- diff --git a/src/cont.cpp b/src/cont.cpp index b39a034..e98984c 100644 --- a/src/cont.cpp +++ b/src/cont.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * cont.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -411,14 +411,14 @@ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const c x = &xx; y = &yy; } // x, y -- have the same size z - mglDataV zz(n, m); +#pragma omp parallel for collapse(2) for(long i=0;iGetNx();i++) for(long j=0;jGetNz();j++) { if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; if(z->GetNz()>1) z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); + mglDataV zz(n, m); zz.Fill(z0,z0); mgl_cont_gen(gr,v0,z,x,y,&zz,gr->GetC(s,v0),text,j); } gr->EndGroup(); @@ -526,21 +526,20 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT if(n<2 || m<2 || x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m || z->GetNx()*z->GetNy()!=n*m) { gr->SetWarn(mglWarnDim,"ContFGen"); return; } - register long i,j; gr->Reserve(8*n*m); long *kk = new long[4*n], l1,l2, r1,r2, t1,t2, u1,u2, b1,b2, d1,d2, p[8],num; memset(kk,-1,2*n*sizeof(long)); - for(i=0;iGetNx()-1;i++) for(long j=0;jGetNz();j++) { if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; if(z->GetNz()>1) z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); + mglDataV zz(n, m); zz.Fill(z0,z0); mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,gr->GetC(s,v0),j); } gr->EndGroup(); @@ -782,15 +781,15 @@ void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const } // x, y -- have the same size z mreal dc = nc>1 ? 1/(MGL_FEPSILON*(nc-1)) : 0; - mglDataV zz(n, m); +#pragma omp parallel for collapse(2) for(long i=0;iGetNx()-1;i++) for(long j=0;jGetNz();j++) { if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; if(z->GetNz()>1) z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); - mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,s+i*dc,j); + mglDataV zz(n, m); zz.Fill(z0,z0); + mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,s+(i%nc)*dc,j); } gr->EndGroup(); } @@ -891,13 +890,13 @@ void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const x = &xx; y = &yy; } // x, y -- have the same size z - mglDataV zz(n, m); +#pragma omp parallel for collapse(2) for(long i=0;iGetNx();i++) for(long j=0;jGetNz();j++) { if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; if(z->GetNz()>1) z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); + mglDataV zz(n, m); zz.Fill(z0,z0); mreal dv = (gr->Max.c-gr->Min.c)/8; if(i>0) dv = v->v(i-1)-v->v(i); else if(iGetNx()-1) dv = v->v(i)-v->v(i+1); @@ -1070,6 +1069,7 @@ void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT _mgl_slice s; mgl_get_slice(s,x,y,z,a,dir,sVal,both); +#pragma omp parallel for for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -1234,6 +1234,7 @@ void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT long ss=gr->AddTexture(sch); _mgl_slice s; mgl_get_slice(s,x,y,z,a,dir,sVal,both); +#pragma omp parallel for for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); @@ -1458,6 +1459,7 @@ void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const // x, y -- have the same size z int wire = mglchr(sch,'#')?1:0; if(mglchr(sch,'.')) wire = 2; +#pragma omp parallel for collapse(2) for(long i=0;iGetNx();i++) for(long j=0;jGetNz();j++) { if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } diff --git a/src/crust.cpp b/src/crust.cpp index 6c97cf2..c9ed965 100644 --- a/src/crust.cpp +++ b/src/crust.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * crust.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -740,12 +740,14 @@ long MGL_NO_EXPORT mgl_crust(long n,mglPoint *pp,long **nn,mreal ff) rs += sqrt(rm); } rs *= ff/n; rs = rs*rs; // "average" distance - long ind[100], set[100], ii; // indexes of "close" points, flag that it was added and its number - mglPoint qq[100]; // normalized point coordinates + const int nnum=100; + long *ind, *set, ii; // indexes of "close" points, flag that it was added and its number + mglPoint *qq; // normalized point coordinates + ind = new long[nnum]; set = new long[nnum]; qq = new mglPoint[nnum]; long k1,k2,k3,m=0; for(i=0;iGetNy(); - mreal r = amax*mgl_rnd(), sum_prob = 0, x1; - for(i=0;iv(6,i); - if(rv(0,i)*x + A->v(1,i)*y + A->v(4,i); - y = A->v(2,i)*x + A->v(3,i)*y + A->v(5,i); x = x1; -} -HMDT MGL_EXPORT mgl_data_ifs_2d(HCDT A, long n, long skip) -{ - if(!A || A->GetNx()<7 || n<1) return 0; // incompatible dimensions - mreal amax=0; - for(long i=0; iGetNy(); i++) amax += A->v(6,i); - if(amax<=0) return 0; - - mglData *f = new mglData(2,n); - mreal x = 0, y = 0; - for(long i=0; ia[2*i] = x; f->a[2*i+1] = y; - } - return f; -} -uintptr_t MGL_EXPORT mgl_data_ifs_2d_(uintptr_t *d, long *n, long *skip) -{ return uintptr_t(mgl_data_ifs_2d(_DT_,*n,*skip)); } -//----------------------------------------------------------------------------- -void MGL_NO_EXPORT mgl_ifs_3d_point(HCDT A, mreal& x, mreal& y, mreal& z, mreal amax) -{ - int i, n=A->GetNy(); - mreal r = amax*mgl_rnd(), sum_prob = 0, x1, y1; - for (i=0; iv(12,i); - if(r < sum_prob) break; - } - x1= A->v(0,i)*x + A->v(1,i)*y + A->v(2,i)*z + A->v(9,i); - y1= A->v(3,i)*x + A->v(4,i)*y + A->v(5,i)*z + A->v(10,i); - z = A->v(6,i)*x + A->v(7,i)*y + A->v(8,i)*z + A->v(11,i); - x = x1; y = y1; -} -HMDT MGL_EXPORT mgl_data_ifs_3d(HCDT A, long n, long skip) -{ - if(!A || A->GetNx()<13 || n<1) return 0; // incompatible dimensions - mreal amax = 0; - for(int i=0; iGetNy(); i++) amax += A->v(12,i); - if(amax <= 0) return 0; - - mglData *f = new mglData(3,n); - mreal x = 0, y = 0, z = 0; - for(long i=0; ia[3*i] = x; f->a[3*i+1] = y; f->a[3*i+2] = z; - } - return f; -} -uintptr_t MGL_EXPORT mgl_data_ifs_3d_(uintptr_t *d, long *n, long *skip) -{ return uintptr_t(mgl_data_ifs_3d(_DT_,*n,*skip)); } -//----------------------------------------------------------------------------- diff --git a/src/data.cpp b/src/data.cpp index c6927af..6263d23 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -1533,7 +1533,7 @@ void MGL_EXPORT mgl_data_put_val(HMDT d, mreal val, long xx, long yy, long zz) if(xx>=nx || yy>=ny || zz>=nz) return; mreal *a=d->a; if(xx>=0 && yy>=0 && zz>=0) a[xx+nx*(yy+zz*ny)] = val; - if(xx<0 && yy<0 && zz<0) + else if(xx<0 && yy<0 && zz<0) #pragma omp parallel for for(long i=0;i(dat); long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz(); mglData *r=new mglData(idat->GetNx(),idat->GetNy(),idat->GetNz()); + mreal dx = nx-1, dy = ny-1, dz = nz-1; + if(!norm) dx=dy=dz=1; if(dd) #pragma omp parallel for for(long i=0;iGetNN();i++) { - mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?mglSpline3st(dd->a,nx,ny,nz, x,y,z):NAN; } else #pragma omp parallel for for(long i=0;iGetNN();i++) { - mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + mreal x=dx*idat->vthr(i), y=jdat?dy*jdat->vthr(i):0, z=kdat?dz*kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?dat->linear(x,y,z):NAN;; } return r; diff --git a/src/data_ex.cpp b/src/data_ex.cpp index a719d85..56eab8a 100644 --- a/src/data_ex.cpp +++ b/src/data_ex.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_new.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -48,7 +48,7 @@ HMDT MGL_EXPORT mgl_data_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz) mglData tmp; tmp.a[0]=-1; return mgl_data_subdata_ext(d,xx?xx:&tmp,yy?yy:&tmp,zz?zz:&tmp); } - + long n=0,m=0,l=0,j,k; bool ix=false, iy=false, iz=false; if(xx->GetNz()>1) // 3d data @@ -286,9 +286,10 @@ HMDT MGL_EXPORT mgl_data_sum(HCDT dat, const char *dir) { mglStartThread(mgl_sum_x,0,p[1]*p[2],b,c,0,p); p[0] = p[1]; p[1] = p[2]; p[2] = 1; + memcpy(c,b,p[0]*p[1]*sizeof(mreal)); } mglData *r=new mglData(p[0],p[1],p[2]); - memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(mreal)); + memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(mreal)); delete []b; delete []c; return r; } uintptr_t MGL_EXPORT mgl_data_sum_(uintptr_t *d, const char *dir,int l) @@ -371,9 +372,10 @@ HMDT MGL_EXPORT mgl_data_max_dir(HCDT dat, const char *dir) { mglStartThread(mgl_max_x,0,p[1]*p[2],b,c,0,p); p[0] = p[1]; p[1] = p[2]; p[2] = 1; + memcpy(c,b,p[0]*p[1]*sizeof(mreal)); } mglData *r=new mglData(p[0],p[1],p[2]); - memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(mreal)); + memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(mreal)); delete []b; delete []c; return r; } uintptr_t MGL_EXPORT mgl_data_max_dir_(uintptr_t *d, const char *dir,int l) @@ -456,9 +458,10 @@ HMDT MGL_EXPORT mgl_data_min_dir(HCDT dat, const char *dir) { mglStartThread(mgl_min_x,0,p[1]*p[2],b,c,0,p); p[0] = p[1]; p[1] = p[2]; p[2] = 1; + memcpy(c,b,p[0]*p[1]*sizeof(mreal)); } mglData *r=new mglData(p[0],p[1],p[2]); - memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(mreal)); + memcpy(r->a,c,p[0]*p[1]*p[2]*sizeof(mreal)); delete []b; delete []c; return r; } uintptr_t MGL_EXPORT mgl_data_min_dir_(uintptr_t *d, const char *dir,int l) @@ -984,6 +987,6 @@ HMDT MGL_EXPORT mgl_data_pulse(HCDT dat, char dir) } delete []c; return r; } -uintptr_t MGL_EXPORT mgl_data_pulse_(uintptr_t *d, const char *dir,int l) +uintptr_t MGL_EXPORT mgl_data_pulse_(uintptr_t *d, const char *dir,int) { return uintptr_t(mgl_data_pulse(_DT_,dir[0])); } //----------------------------------------------------------------------------- diff --git a/src/data_gr.cpp b/src/data_gr.cpp index d8fbda8..4fbc2f4 100644 --- a/src/data_gr.cpp +++ b/src/data_gr.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_gr.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/data_io.cpp b/src/data_io.cpp index 5834e72..b109d30 100644 --- a/src/data_io.cpp +++ b/src/data_io.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_io.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -421,13 +421,15 @@ int MGL_EXPORT mgl_data_scan_file(HMDT d,const char *fname, const char *templ) return false; } s = mgl_read_gz(fp); gzclose(fp); - if(*s) bufs.push_back(s); + size_t len = strs[0].length(); + const char *s0 = strs[0].c_str(); + if(!strncmp(s, s0, len)) bufs.push_back(s); for(long i=0;s[i];i++) if(s[i]=='\n') { while(s[i+1]=='\n') i++; s[i]=0; i++; - if(s[i]) bufs.push_back(s+i); - else break; + if(!strncmp(s+i, s0, len)) bufs.push_back(s+i); + if(!s[i]) break; } // parse lines and collect data size_t nx=strs.size(), ny=bufs.size(); @@ -766,7 +768,7 @@ void MGL_EXPORT mgl_data_fill(HMDT d, mreal x1,mreal x2,char dir) void MGL_EXPORT mgl_data_fill_(uintptr_t *d, mreal *x1,mreal *x2,const char *dir,int) { mgl_data_fill(_DT_,*x1,*x2,*dir); } //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_data_norm(HMDT d, mreal v1,mreal v2,long sym,long dim) +void MGL_EXPORT mgl_data_norm(HMDT d, mreal v1,mreal v2,int sym,long dim) { long s,nn=d->nx*d->ny*d->nz; mreal a1=INFINITY,a2=-INFINITY,v,*a=d->a; @@ -1254,3 +1256,14 @@ uintptr_t MGL_EXPORT mgl_data_column_(uintptr_t *d, const char *eq,int l) uintptr_t r = uintptr_t(mgl_data_column(_DT_,s)); delete []s; return r; } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_data_limit(HMDT d, mreal v) +{ + long n = d->GetNN(); + mreal *a = d->a; + #pragma omp parallel for + for(long i=0;iv) a[i] *= v/b; } +} +void MGL_EXPORT mgl_data_limit_(uintptr_t *d, mreal *v) +{ mgl_data_limit(_DT_, *v); } +//----------------------------------------------------------------------------- diff --git a/src/data_png.cpp b/src/data_png.cpp index d6a15be..b4a8bb3 100644 --- a/src/data_png.cpp +++ b/src/data_png.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * data_png.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/eval.cpp b/src/eval.cpp index e0d611c..a4cb543 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * eval.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/evalc.cpp b/src/evalc.cpp index 6be9232..e703e06 100644 --- a/src/evalc.cpp +++ b/src/evalc.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * evalc.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -61,6 +61,9 @@ EQ_LG, // decimal logarithm of x, lg(x) = ln(x)/ln(10) EQ_ABS, // absolute value EQ_ARG, // argument (or phase) of complex number EQ_CONJ, // complex conjugate +EQ_REAL, // real part +EQ_IMAG, // imaginary part +EQ_NORM, // square of absolute value |u|^2 EQ_LAST // id of last entry }; //----------------------------------------------------------------------------- @@ -173,6 +176,9 @@ mglFormulaC::mglFormulaC(const char *string) else if(!strcmp(name,"abs")) Kod=EQ_ABS; else if(!strcmp(name,"arg")) Kod=EQ_ARG; else if(!strcmp(name,"conj")) Kod=EQ_CONJ; + else if(!strcmp(name,"real")) Kod=EQ_REAL; + else if(!strcmp(name,"imag")) Kod=EQ_IMAG; + else if(!strcmp(name,"norm")) Kod=EQ_NORM; else { delete []str; return; } // unknown function n=mglFindInText(str,","); if(n>=0) @@ -255,12 +261,15 @@ dual MGL_LOCAL_CONST logc(dual x) { return log(x); } dual MGL_LOCAL_CONST absc(dual x) { return abs(x); } dual MGL_LOCAL_CONST argc(dual x) { return arg(x); } dual MGL_LOCAL_CONST lgc(dual x) { return log10(x);} +dual MGL_LOCAL_CONST realc(dual x) { return real(x); } +dual MGL_LOCAL_CONST imagc(dual x) { return imag(x); } +dual MGL_LOCAL_CONST normc(dual x) { return norm(x); } //----------------------------------------------------------------------------- typedef dual (*func_1)(dual); typedef dual (*func_2)(dual, dual); static const func_2 f2[EQ_SIN-EQ_LT] = {cltc,cgtc,ceqc,addc,subc,mulc,divc,ipwc,powc,llgc}; static const func_1 f1[EQ_LAST-EQ_SIN] = {sinc,cosc,tanc,asinc,acosc,atanc,sinhc,coshc,tanhc, - asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc,argc,conjc}; + asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc,argc,conjc,realc,imagc,normc}; // evaluation of embedded (included) expressions dual mglFormulaC::CalcIn(const dual *a1) const { diff --git a/src/evalp.cpp b/src/evalp.cpp index bfaed55..df9fb00 100644 --- a/src/evalp.cpp +++ b/src/evalp.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * evalp.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -143,13 +143,16 @@ HMDT mglApplyOperDiv(std::wstring a1, std::wstring a2, mglParser *arg, const std mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; if(na==nb) #pragma omp parallel for - for(long i=0;ia[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; if(na==nb) #pragma omp parallel for - for(long i=0;ia[0] = wcstod(str.c_str(),0); // this is number else if(!str.compare(L"pi")) res->a[0] = M_PI; else if(ch==':') res->a[0] = -1; @@ -686,6 +692,12 @@ HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::v HMDT res = mgl_datac_imag(a1); mgl_delete_datac(a1); return res; } + else if(!nm.compare(L"norm")) + { + HADT a1 = mglFormulaCalcC(str, arg, head); + HMDT res = mgl_datac_norm(a1); + mgl_delete_datac(a1); return res; + } #if MGL_HAVE_GSL else if(!nm.compare(L"i") && n>0) return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu); @@ -739,9 +751,10 @@ dual MGL_LOCAL_CONST sqrtc(dual x); //{ return sqrt(x); } dual MGL_LOCAL_CONST logc(dual x); //{ return log(x); } dual MGL_LOCAL_CONST absc(dual x); //{ return abs(x); } dual MGL_LOCAL_CONST argc(dual x); //{ return arg(x); } -dual MGL_LOCAL_CONST lgc(dual x); //{ return log10(x);} -dual MGL_LOCAL_CONST realc(dual x) { return real(x); } -dual MGL_LOCAL_CONST imagc(dual x) { return dual(0,imag(x)); } +dual MGL_LOCAL_CONST lgc(dual x); //{ return log10(x);} +dual MGL_LOCAL_CONST realc(dual x); //{ return real(x); } +dual MGL_LOCAL_CONST imagc(dual x); //{ return imag(x); } +dual MGL_LOCAL_CONST normc(dual x); //{ return norm(x); } //----------------------------------------------------------------------------- /// Parse string and substitute the script argument // All numbers are presented as mglData(1). Do boundary checking. @@ -907,7 +920,7 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std:: else { HADT res = new mglDataC; - char ch = str[0]; + wchar_t ch = str[0]; if(ch<':') // this is real number res->a[0] = (str[str.length()-1]=='i') ? dual(0,wcstod(str.c_str(),0)) : mreal(wcstod(str.c_str(),0)); else if(ch=='i') // this is imaginary number @@ -970,7 +983,7 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std:: else if(!nm.compare(L"acosh")) return mglApplyFuncC(str, arg, head, acoshc); else if(!nm.compare(L"atanh")) return mglApplyFuncC(str, arg, head, atanhc); else if(!nm.compare(L"arg")) return mglApplyFuncC(str, arg, head, argc); - else if(!nm.compare(L"abs")) return mglApplyFuncC(str, arg, head, absc); + else if(!nm.compare(L"abs")) return mglApplyFuncC(str, arg, head, absc); } else if(nm[0]=='c') { @@ -1002,6 +1015,7 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std:: for(long i=0;iGetNN();i++) a[i] = dual(mgl_rnd(), mgl_rnd()); return res; } else if(!nm.compare(L"real")) return mglApplyFuncC(str, arg, head, realc); else if(!nm.compare(L"imag")) return mglApplyFuncC(str, arg, head, imagc); + else if(!nm.compare(L"norm")) return mglApplyFuncC(str, arg, head, normc); } HADT res = new mglDataC; res->a[0]=NAN; return res; } diff --git a/src/exec.cpp b/src/exec.cpp index daa56a1..c561826 100644 --- a/src/exec.cpp +++ b/src/exec.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * exec.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -66,6 +66,14 @@ int MGL_NO_EXPORT mgls_alpha(mglGraph *gr, long , mglArg *a, const char *k, cons else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_gray(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(k[0]==0) gr->Gray(true); + else if(!strcmp(k,"n")) gr->Gray(a[0].v!=0); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_pendelta(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; @@ -130,6 +138,13 @@ int MGL_NO_EXPORT mgls_aspect(mglGraph *gr, long , mglArg *a, const char *k, con else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_shear(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(!strcmp(k,"nn")) gr->Shear(a[0].v, a[1].v); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_axial(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; @@ -982,7 +997,7 @@ int MGL_NO_EXPORT mgls_refill(mglGraph *gr, long , mglArg *a, const char *k, con else res = 1; return res; } //----------------------------------------------------------------------------- -int MGL_NO_EXPORT mgls_gspline(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +int MGL_NO_EXPORT mgls_gspline(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; if(k[0]=='d' && a[0].d->temp) return 5; @@ -1645,6 +1660,13 @@ int MGL_NO_EXPORT mgls_setsize(mglGraph *gr, long , mglArg *a, const char *k, co else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_setsizescl(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(!strcmp(k,"n")) gr->SetSizeScl(a[0].v); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_sphere(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; gr->Self()->SaveState(opt); @@ -2325,7 +2347,7 @@ int MGL_NO_EXPORT mgls_info(mglGraph *gr, long , mglArg *a, const char *k, const else res = 1; return res; } //----------------------------------------------------------------------------- -int MGL_NO_EXPORT mgls_print(mglGraph *gr, long , mglArg *a, const char *k, const char *) +int MGL_NO_EXPORT mgls_print(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; if(!strcmp(k,"d")) printf("%s\n",a[0].d->PrintInfo()); @@ -2383,6 +2405,14 @@ int MGL_NO_EXPORT mgls_stickplot(mglGraph *gr, long , mglArg *a, const char *k, else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_shearplot(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(!strcmp(k,"nnnn")) gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v); + else if(!strcmp(k,"nnnnnn")) gr->ShearPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v, a[4].v, a[5].v); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_pipe(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; @@ -2430,6 +2460,17 @@ int MGL_NO_EXPORT mgls_norm(mglGraph *, long , mglArg *a, const char *k, const c else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_limit(mglGraph *, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; + mglData *d = dynamic_cast(a[0].d); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dn")) d->Limit(a[1].v); + else if(c && !strcmp(k,"dn")) c->Limit(a[1].v); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_hist(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; @@ -2752,7 +2793,7 @@ int MGL_NO_EXPORT mgls_fsurf(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; gr->Self()->SaveState(opt); - char buf[4096]; + char *buf; buf = new char[4096]; FILE *fp; if(!strncmp(k,"nns",3)) { @@ -2761,7 +2802,7 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons if(!fp) { gr->SetWarn(mglWarnOpen,a[2].s.c_str()); - return res; + delete []buf; return res; } for(i=0;iSetWarn(mglWarnOpen,(a[2].s+" - line "+b).c_str()); - fclose(fp); return res; + fclose(fp); delete []buf; return res; } fclose(fp); gr->Puts(mglPoint(a[0].v,a[1].v,NAN),buf, (k[4]=='s')?a[4].s.c_str():"", k[5]=='n'?a[5].v:-1); @@ -2781,7 +2822,7 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons if(!fp) { gr->SetWarn(mglWarnOpen,a[3].s.c_str()); - return res; + delete []buf; return res; } for(i=0;iSetWarn(mglWarnOpen,(a[3].s+" - line "+b).c_str()); - fclose(fp); return res; + fclose(fp); delete []buf; return res; } fclose(fp); gr->Puts(mglPoint(a[0].v,a[1].v,a[2].v),buf, (k[5]=='s')?a[5].s.c_str():"", k[6]=='n'?a[6].v:-1); } - else res = 1; gr->Self()->LoadState(); return res; + else res = 1; gr->Self()->LoadState(); delete []buf; return res; } //----------------------------------------------------------------------------- -int MGL_NO_EXPORT mgls_scanfile(mglGraph *gr, long , mglArg *a, const char *k, const char *) +int MGL_NO_EXPORT mgls_scanfile(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; if(!strcmp(k,"dss")) @@ -3003,6 +3044,26 @@ int MGL_NO_EXPORT mgls_ode(mglGraph *, long , mglArg *a, const char *k, const ch else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_tridmat(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; + mglData *d = dynamic_cast(a[0].d); + mglDataC *c = dynamic_cast(a[0].d); + if(c && !strcmp(k,"ddddds")) + *c = mglTridMatC(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str()); + else if(d && !strcmp(k,"ddddds")) + *d = mglTridMat(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str()); + else res = 1; return res; +} +//----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_diffract(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; + mglDataC *c = dynamic_cast(a[0].d); + if(c && !strcmp(k,"dsn")) c->Diffraction(a[1].s.c_str(), a[2].v); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_pde(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; @@ -3380,6 +3441,27 @@ int MGL_NO_EXPORT mgls_version(mglGraph *gr, long , mglArg *a, const char *k, co else res = 1; return res; } //----------------------------------------------------------------------------- +int mgls_flame2d(mglGraph *, long, mglArg *a, const char *k, const char *) +{ + mglData *fx = dynamic_cast(a[0].d); + mglData *fy = dynamic_cast(a[1].d); + if(!fx) return 1; + int res = 0; + if (!strcmp(k, "dddn")) fx->Set(mglFlame2d(*(a[1].d), *(a[2].d), mgl_int(a[3].v))); + else if (!strcmp(k, "ddddn") && fy) + { + mglData f(mglFlame2d(*(a[2].d), *(a[3].d), mgl_int(a[4].v))); + fx->Set(f.SubData(0)); fy->Set(f.SubData(1)); + } + else if (!strcmp(k, "dddnn")) fx->Set(mglFlame2d(*(a[1].d), *(a[2].d), mgl_int(a[3].v), mgl_int(a[4].v))); + else if (!strcmp(k, "ddddnn") && fy) + { + mglData f(mglFlame2d(*(a[2].d), *(a[3].d), mgl_int(a[4].v), mgl_int(a[5].v))); + fx->Set(f.SubData(0)); fy->Set(f.SubData(1)); + } + else res = 1; return res; +} +//----------------------------------------------------------------------------- int mgls_ifs2d(mglGraph *, long, mglArg *a, const char *k, const char *) { mglData *fx = dynamic_cast(a[0].d); @@ -3411,6 +3493,16 @@ int mgls_ifs3d(mglGraph *, long, mglArg *a, const char *k, const char *) else res = 1; return res; } //----------------------------------------------------------------------------- +int mgls_ifsfile(mglGraph *, long, mglArg *a, const char *k, const char *) +{ + mglData *f = dynamic_cast(a[0].d); + if(!f) return 1; + int res = 0; + if (!strcmp(k, "dssn")) f->Set(mglIFSfile(a[1].s.c_str(), a[2].s.c_str(), mgl_int(a[3].v))); + else if (!strcmp(k, "dssnn")) f->Set(mglIFSfile(a[1].s.c_str(), a[2].s.c_str(), mgl_int(a[3].v), mgl_int(a[4].v))); + else res = 1; return res; +} +//----------------------------------------------------------------------------- mglCommand mgls_base_cmd[] = { {"addlegend","Add legend entry","addlegend 'txt' 'fmt'", mgls_addlegend,15}, {"addto","Add data or number","addto Var Dat|Var num", mgls_addto ,3}, @@ -3433,7 +3525,7 @@ mglCommand mgls_base_cmd[] = { {"barh","Draw horizontal bars for 1D data", "barh Ydat ['fmt' above]|Xdat Ydat ['fmt' above]", mgls_barh ,7}, {"bars","Draw bars for 1D data","bars Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_bars ,7}, {"barwidth","Set default bars width","barwidth val", mgls_barwidth ,2}, - {"beam","Draw quasioptical beam","beam Tr G1 G2 Adat r ['sch' flag num] ", mgls_beam ,9}, + {"beam","Draw quasi-optical beam","beam Tr G1 G2 Adat r ['sch' flag num] ", mgls_beam ,9}, {"belt","Draw belts","belt Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_belt ,8}, {"bifurcation","Draw Bifurcation diagram","bifurcation dx Func ['fmt']|dx 'func' ['fmt']", mgls_bifurcation,13}, {"box","Draw bounding box","box ['fmt' ticks]", mgls_box ,12}, @@ -3446,7 +3538,7 @@ mglCommand mgls_base_cmd[] = { {"chdir","Change current directory","chdir 'path'", mgls_chdir ,2}, {"circle","Draw circle","circle x y r ['fmt']|x y z r ['fmt']", mgls_circle ,13}, {"clean","Remove duplicate rows","clean Dat id", mgls_clean ,3}, - {"clearlegend","Clear legend antries","clearlegend", mgls_clearlegend ,15}, + {"clearlegend","Clear legend entries","clearlegend", mgls_clearlegend ,15}, {"clf","Clear picture","clf|'col'|r g b", mgls_clf ,12}, {"cloud","Draw cloud","cloud Adat ['fmt']|Xdat Ydat Zdat Adat ['fmt']", mgls_cloud ,9}, {"colorbar","Draw colorbar","colorbar ['fmt' pos]|Vdat ['fmt' pos]|'sch' pos x y [w h]|Vdat 'sch' pos x y [w h]", mgls_colorbar ,12}, @@ -3493,6 +3585,7 @@ mglCommand mgls_base_cmd[] = { {"dew","Draw dew plot","dew Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']", mgls_dew ,11}, {"diff","Numerically differentiate data","diff Var 'dir'", mgls_diff ,16}, {"diff2","Numerically double differentiate data","diff2 Var 'dir'", mgls_diff2 ,16}, + {"diffract","Step for pulse diffraction","diffract Res 'how' q", mgls_diffract ,16}, {"diffuse","Set diffusive light brightness","diffuse val", mgls_diffuse ,2}, {"divto","Divide by data or number","divto Var Dat|Var num", mgls_divto ,3}, {"dots","Draw dots for arbitrary data points","dots Xdat Ydat Zdat ['fmt']|Xdat Ydat Zdat Adat ['fmt']|Xdat Ydat Zdat Cdat Adat ['fmt']", mgls_dots ,9}, @@ -3520,6 +3613,7 @@ mglCommand mgls_base_cmd[] = { {"fillsample","Fill x-,k-samples for transforms","fillsample Var 'how'", mgls_fillsample ,3}, {"fit","Fit data to formula","fit Res A 'eq' 'var' [Ini]|Res X A 'eq' 'var' [Ini]|Res X Y A 'eq' 'var' [Ini]|Res X Y Z A 'eq' 'var' [Ini]", mgls_fit ,4}, {"fits","Fit data to formula","fits Res A S 'eq' 'var' [Ini]|Res X A S 'eq' 'var' [Ini]|Res X Y A S 'eq' 'var' [Ini]|Res X Y Z A S 'eq' 'var' [Ini]", mgls_fits ,4}, + {"flame2d", "Computes the flame fractal", "flame2d F A B n [skip]|Fx Fy A B n [skip]", mgls_flame2d, 4}, {"flow","Draw flow threads for vector field","flow Udat Vdat ['fmt' num]|Xdat Ydat Udat Vdat ['fmt' num]|Udat Vdat Wdat ['fmt' num]|Xdat Ydat Zdat Udat Vdat ['fmt' num]|\ x0 y0 Udat Vdat ['fmt']|x0 y0 Xdat Ydat Udat Vdat ['fmt']|x0 y0 z0 Udat Vdat Wdat ['fmt']|x0 y0 z0 Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_flow ,11}, {"fog","Switch on/off fog","fog val [pos]", mgls_fog ,2}, @@ -3530,6 +3624,7 @@ mglCommand mgls_base_cmd[] = { {"fsurf","Plot surface by formula","fsurf 'z(x,y)' ['fmt']|'x(u,v)' 'y(u,v)' 'z(u,v)' ['fmt']", mgls_fsurf ,1}, {"func","Start function definition and stop execution of main script","func 'name' [narg]", 0, 6}, {"grad","Draw gradient lines for scalar field","grad Phi ['fmt' num]|Xdat Ydat Phi ['fmt' num]|Xdat Ydat Zdat Phi ['fmt' num]", mgls_grad ,8}, + {"gray","Switch on/off gray-scale mode","gray [val]", mgls_gray ,2}, {"grid","Draw grid","grid ['dir' 'fmt']", mgls_grid ,12}, {"grid2","Draw grid for data array(s)","grid Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_grid2 ,8}, {"grid3","Draw grid at slices of 3D data","grid3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_grid3 ,9}, @@ -3541,6 +3636,7 @@ mglCommand mgls_base_cmd[] = { {"if","Conditional operator","if val|Dat ['cond']", 0, 6}, {"ifs2d", "Computes the attractor of an IFS", "ifs2d F A n [skip]|Fx Fy A n [skip]", mgls_ifs2d, 4}, {"ifs3d", "Computes the attractor of an IFS for 3d case", "ifs3d F A n [skip]", mgls_ifs3d, 4}, + {"ifsfile", "Computes the attractor of an IFS with parameters from *.ifs file", "ifsfile F 'fname' 'name' n [skip]", mgls_ifsfile, 4}, {"import","Import data from PNG picture","import Dat 'fname' 'scheme' [v1 v2]", mgls_import ,4}, {"info","Print message or information about the data","info Dat [detail]|'message'|const", mgls_info ,3}, {"inplot","Set position of plot in picture","x1 x2 y1 y2 [rel]", mgls_inplot ,5}, @@ -3553,6 +3649,7 @@ mglCommand mgls_base_cmd[] = { {"legend","Draw legend","legend [pos 'fmt']|x y ['fmt']", mgls_legend ,15}, {"legendmarks","Set number of marks in the legend","legendmarks val", mgls_legendmarks ,15}, {"light","Setup light","light [val] | val num | num xpos ypos zpos ['fmt' br]", mgls_light ,2}, + {"limit","Limit data to be inside [-v,v]","limit Dat v", mgls_limit ,16}, {"line","Draw line","line x1 y1 x2 y2 ['fmt']|x1 y1 z1 x2 y2 z2 ['fmt']", mgls_line ,13}, {"list","Creates new variable from list of numbers or data","list Var v1 ...|Var D1 ...", 0, 4}, {"load","Load commands from external DLL","load 'fname'", 0, 6}, @@ -3599,7 +3696,7 @@ mglCommand mgls_base_cmd[] = { {"quality","Set plot quality","quality [val]", mgls_quality ,2}, {"radar","Draw radar chart","radar Rdat ['fmt']", mgls_radar ,7}, {"ranges","Set axis ranges","ranges x1 x2 y1 y2 [z1 z2]", mgls_ranges ,14}, - {"rasterize","Rasterize and save to background","rasterize", mgls_rasterize ,12}, + {"rasterize","Rasterize plot and save to background","rasterize", mgls_rasterize ,12}, {"ray","Solve Hamiltonian ODE (find GO ray or trajectory)","ray Res 'ham' x0 y0 z0 px0 py0 pz0 [dz=0.1 tmax=10]", mgls_ray ,4}, {"read","Read data from file","read Dat 'file' [nx ny nz] | ReDat ImDat 'file' [nx ny nz]", mgls_read ,4}, {"readall","Read and join data from several files","readall Dat 'templ' [slice]", mgls_readall ,4}, @@ -3619,10 +3716,13 @@ mglCommand mgls_base_cmd[] = { {"rotate","Rotate plot","rotate tetz tetx [tety] | tet x y z", mgls_rotate ,5}, {"rotatetext","Set to auto rotate text or not","rotatetext val", mgls_rotatetext ,15}, {"save","Save data to file","save Dat 'file'|'str' 'file'|'str' 'file' 'how'", mgls_save ,3}, - {"savehdf","Save data to HDF5 file","savehdf Dat 'file' 'id'", mgls_savehdf ,3}, - {"scanfile","Get fromated data from file","scanfile Dat 'fname 'templ'", mgls_scanfile ,4}, + {"savehdf","Save data to HDF5 file","savehdf Dat 'file' 'id' [rewrite]", mgls_savehdf ,3}, + {"scanfile","Get formated data from file","scanfile Dat 'fname 'templ'", mgls_scanfile ,4}, {"setsize","Set picture size","setsize width height", mgls_setsize ,2}, + {"setsizescl","Set scaling factor for further setsize","setsizescl val", mgls_setsizescl ,2}, {"sew","Remove jump into the data, like phase jumps","sew Dat ['dir' da]", mgls_sew ,16}, + {"shear","Shear plot","shear valx valy", mgls_shear ,5}, + {"shearplot","Set position of plot inside cell of sheared stick", "shearplot num ind sx sy [xd yd]", mgls_shearplot ,5}, {"sinfft","Sin-Fourier transform at some direction","sinfft Dat 'dir'", mgls_sinfft ,16}, {"smooth","Smooth data","smooth Dat [kind 'dir']", mgls_smooth ,16}, {"solve","Find root Dat_{i,j,k}=val (inverse evaluate)","solve Res Dat val 'dir' [Idat norm]", mgls_solve ,4}, @@ -3633,7 +3733,7 @@ mglCommand mgls_base_cmd[] = { {"step","Draw step plot for 1D data","step Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_step ,7}, {"stfa","Draw STFA diagram","stfa Udat Vdat dn ['fmt']|Xdat Ydat Udat Vdat dn ['fmt']", mgls_stfa ,10}, {"stfad","Do STFA transform","stfad Res Real Imag dn ['dir']", mgls_stfad ,4}, - {"stickplot","Set position of plot inside cell of stick", "stickplot num ind tet phi", mgls_stickplot ,5}, + {"stickplot","Set position of plot inside cell of rotated stick", "stickplot num ind tet phi", mgls_stickplot ,5}, {"stop","Stop execution","stop", 0, 6}, {"subdata","Extract sub-array","subdata Res Dat nx [ny nz]", mgls_subdata ,4}, {"subplot","Set position of plot","subplot m n pos ['style' dx dy]", mgls_subplot ,5}, @@ -3671,10 +3771,12 @@ mglCommand mgls_base_cmd[] = { {"triangulate","Find triangles of randomly placed points","triangulate Res Xdat Ydat [er]|Res Xdat Ydat Zdat [er]", mgls_triangulate ,4}, {"tricont","Draw contour lines for surface of triangles","tricont Idat Xdat Ydat Cdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt']|Vdat Idat Xdat Ydat Cdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt']", mgls_tricont ,0}, {"tricontv","Draw contour tubes for surface of triangles","tricontv Idat Xdat Ydat Cdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt']|Vdat Idat Xdat Ydat Cdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt']", mgls_tricontv ,0}, + {"tridmat","Solve tridiagonal matrix","tridmat Res A B C D 'how'", mgls_tridmat ,4}, {"triplot","Draw surface of triangles","triplot Idat Xdat Ydat ['fmt']|Idat Xdat Ydat Zdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_triplot ,0}, {"tube","Draw curve by tube","tube Ydat Rdat ['fmt']|Ydat rval ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat rval ['fmt']|Xdat Ydat Zdat Rdat ['fmt']|Xdat Ydat Zdat rval ['fmt']", mgls_tube ,7}, {"tuneticks","Set ticks tuning","tuneticks val [fctr]", mgls_tuneticks ,14}, {"var","Create new 1D data and fill it in range","var Dat nx x1 [x2]", mgls_var ,4}, + {"variant","Select variant of plot style(s)","variant var", 0, 6}, {"vect","Draw vector field","vect Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']|Udat Vdat Wdat ['fmt']|Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_vect ,11}, {"vect3","Draw vector field at slices of 3D data","vect Udat Vdat Wdat ['fmt' sval]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' sval]", mgls_vect3 ,11}, {"version","Print MathGL version or check if it is valid","version |'ver'", mgls_version, 2}, diff --git a/src/export.cpp b/src/export.cpp index eac9c49..9125501 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * export.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/export_2d.cpp b/src/export_2d.cpp index b8013f4..ce368a3 100644 --- a/src/export_2d.cpp +++ b/src/export_2d.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * export_2d.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -22,8 +22,6 @@ #include "mgl2/font.h" #include #include -#include -#include #include #undef _GR_ #define _GR_ ((mglCanvas *)(*gr)) @@ -321,7 +319,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr) case 'P': mgl_printf(fp, gz, "np %g %g mt m_P %sdr\n",x0,y0,str); break; case 'X': mgl_printf(fp, gz, "np %g %g mt m_X %sdr\n",x0,y0,str); break; case 'C': mgl_printf(fp, gz, "%g %g m_o %g %g m_c %sdr\n",x0,y0,x0,y0,str); break; - default: mgl_printf(fp, gz, "%g %g m_c %sfill\n",x0,y0,str); + case '.': mgl_printf(fp, gz, "%g %g m_c %sfill\n",x0,y0,str); } } else if(q.type==3) // quad @@ -499,7 +497,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr) case '*': mgl_printf(fp, gz, "\n", x-s,y,x+s,y,x-0.6*s,y-0.8*s,x+0.6*s,y+0.8*s,x+0.6*s,y-0.8*s,x-0.6*s,y+0.8*s); break; - default: + case '.': mgl_printf(fp, gz, "\n", int(cp.r[0]),int(cp.r[1]),int(cp.r[2]),x,y); break; } diff --git a/src/export_3d.cpp b/src/export_3d.cpp index 9ba30f2..e9cdf3d 100644 --- a/src/export_3d.cpp +++ b/src/export_3d.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * export_3d.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/fft.cpp b/src/fft.cpp index f100f57..e05ec0e 100644 --- a/src/fft.cpp +++ b/src/fft.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * fft.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/fit.cpp b/src/fit.cpp index 56cf1d6..3cb6630 100644 --- a/src/fit.cpp +++ b/src/fit.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * fit.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/font.cpp b/src/font.cpp index 1fd685c..de68ad6 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * font.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -30,9 +30,8 @@ #include "mgl2/base.h" #include "mgl2/font.h" #include "def_font.cc" +#include "tex_table.cc" //----------------------------------------------------------------------------- -extern mglTeXsymb mgl_tex_symb[]; -extern long mgl_tex_num; //mglFont mglDefFont("nofont"); mglFont mglDefFont; //----------------------------------------------------------------------------- @@ -918,3 +917,18 @@ void mglFont::Copy(mglFont *f) memcpy(&glyphs[0],&(f->glyphs)[0],glyphs.size()*sizeof(mglGlyphDescr)); } //----------------------------------------------------------------------------- +long MGL_EXPORT mgl_check_tex_table() +{ + size_t i=0; while(mgl_tex_symb[i].tex[0]) i++; + long res = 0; + if(mgl_tex_num!=i) + { printf("real=%zu, set=%zu\n",i,mgl_tex_num); res = -1; } + for(i=0;mgl_tex_symb[i].tex[0];i++) + { + mglTeXsymb tst, *rts; tst.tex = mgl_tex_symb[i].tex; + rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp); + if(!rts) + { printf("Bad '%ls' at %zu\n",mgl_tex_symb[i].tex,i); res = 1+i; } + } + return res; +} \ No newline at end of file diff --git a/src/fractal.cpp b/src/fractal.cpp new file mode 100644 index 0000000..4be00b8 --- /dev/null +++ b/src/fractal.cpp @@ -0,0 +1,463 @@ +/*************************************************************************** +*pixel.cpp is part of Math Graphic Library +*Copyright (C) 2007-2016 Alexey Balakin * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU Library General Public License as * +* published by the Free Software Foundation; either version 3 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 Library 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. * + ***************************************************************************/ +#include "mgl2/other.h" +#include "mgl2/data.h" +MGL_NO_EXPORT char *mgl_read_gz(gzFile fp); +//----------------------------------------------------------------------------- +// +// IFS series +// +//----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_ifs_2d_point(HCDT A, mreal& x, mreal& y, mreal amax) +{ + long i, n=A->GetNy(); + mreal r = amax*mgl_rnd(), sum_prob = 0, x1; + for(i=0;iv(6,i); + if(rv(0,i)*x + A->v(1,i)*y + A->v(4,i); + y = A->v(2,i)*x + A->v(3,i)*y + A->v(5,i); x = x1; +} +HMDT MGL_EXPORT mgl_data_ifs_2d(HCDT A, long n, long skip) +{ + if(!A || A->GetNx()<7 || n<1) return 0; // incompatible dimensions + mreal amax=0; + for(long i=0; iGetNy(); i++) amax += A->v(6,i); + if(amax<=0) return 0; + + mglData *f = new mglData(2,n); + mreal x = 0, y = 0; + for(long i=0; ia[2*i] = x; f->a[2*i+1] = y; + } + return f; +} +uintptr_t MGL_EXPORT mgl_data_ifs_2d_(uintptr_t *d, long *n, long *skip) +{ return uintptr_t(mgl_data_ifs_2d(_DT_,*n,*skip)); } +//----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_ifs_3d_point(HCDT A, mreal& x, mreal& y, mreal& z, mreal amax) +{ + int i, n=A->GetNy(); + mreal r = amax*mgl_rnd(), sum_prob = 0, x1, y1; + for (i=0; iv(12,i); + if(r < sum_prob) break; + } + x1= A->v(0,i)*x + A->v(1,i)*y + A->v(2,i)*z + A->v(9,i); + y1= A->v(3,i)*x + A->v(4,i)*y + A->v(5,i)*z + A->v(10,i); + z = A->v(6,i)*x + A->v(7,i)*y + A->v(8,i)*z + A->v(11,i); + x = x1; y = y1; +} +HMDT MGL_EXPORT mgl_data_ifs_3d(HCDT A, long n, long skip) +{ + if(!A || A->GetNx()<13 || n<1) return 0; // incompatible dimensions + mreal amax = 0; + for(int i=0; iGetNy(); i++) amax += A->v(12,i); + if(amax <= 0) return 0; + + mglData *f = new mglData(3,n); + mreal x = 0, y = 0, z = 0; + for(long i=0; ia[3*i] = x; f->a[3*i+1] = y; f->a[3*i+2] = z; + } + return f; +} +uintptr_t MGL_EXPORT mgl_data_ifs_3d_(uintptr_t *d, long *n, long *skip) +{ return uintptr_t(mgl_data_ifs_3d(_DT_,*n,*skip)); } +//----------------------------------------------------------------------------- +HMDT MGL_EXPORT mgl_data_ifs_file(const char *fname, const char *name, long n, long skip) +{ + gzFile fp = gzopen(fname,"r"); + if(!fp) return 0; // Couldn't open file file + char *buf = mgl_read_gz(fp); gzclose(fp); + char *s = strstr(buf,name); + if(!s) return 0; // No data for fractal 'name' in the file + + char *p = strchr(s,'{'), *e; + if(!p) return 0; // Wrong data format for fractal 'name' in the file + bool ext3d = false; + e = strstr(s,"(3D)"); if(e && e nums; + for(size_t i=0;p[i] && p+i' ') i++; + } + } + HMDT dat = new mglData, res; + if(ext3d) + { + dat->Set(&(nums[0]), 13, nums.size()/13, 1); + res = mgl_data_ifs_3d(dat, n, skip); + } + else + { + dat->Set(&(nums[0]), 7, nums.size()/7, 1); + res = mgl_data_ifs_2d(dat, n, skip); + } + delete dat; free(buf); return res; +} +uintptr_t mgl_data_ifs_file_(const char *fname, const char *name, long *n, long *skip,int l,int m) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + char *t=new char[m+1]; memcpy(t,name,m); t[m]=0; + uintptr_t r = uintptr_t(mgl_data_ifs_file(s,t,*n,*skip)); + delete []s; delete []t; return r; } +//----------------------------------------------------------------------------- +// +// Functions for flame fractal +// +//----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_linear_var0(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ xNew += par[0]*x; yNew += par[0]*y; } +void MGL_NO_EXPORT mgl_sinusoidal_var1(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ xNew += par[0]*sin(x); yNew += par[0]*sin(y); } +void MGL_NO_EXPORT mgl_spherical_var2(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ mreal c1 = par[0]/(x*x+y*y); xNew += c1*x; yNew += c1*y; } +void MGL_NO_EXPORT mgl_swirl_var3(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r2=x*x+y*y, c1=sin(r2), c2=cos(r2); + xNew += par[0]*(x*c1 - y*c2); + yNew += par[0]*(x*c2 + y*c1); +} +void MGL_NO_EXPORT mgl_horseshoe_var4(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1 = par[0]/hypot(x,y); + xNew += c1*(x*x-y*y); + yNew += 2*c1*x*y; +} +void MGL_NO_EXPORT mgl_polar_var5(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + xNew += par[0]*atan2(x,y)/M_PI; + yNew += par[0]*(hypot(x,y)-1); +} +void MGL_NO_EXPORT mgl_handkerchief_var6(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), t=atan2(x,y), c1=par[0]*r; + xNew += c1*sin(t+r); yNew += c1*cos(t-r); +} +void MGL_NO_EXPORT mgl_heart_var7(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), c1=par[0]*r, c2=atan2(x,y)*r; + xNew += c1*sin(c2); yNew += -c1*cos(c2); +} +void MGL_NO_EXPORT mgl_disc_var8(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*atan2(x,y)/M_PI, c2=M_PI*hypot(x,y); + xNew += c1*sin(c2); yNew += c1*cos(c2); +} +void MGL_NO_EXPORT mgl_spiral_var9(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), t=atan2(x,y), c1=par[0]/r; + xNew += c1*(cos(t)+sin(r)); + yNew += c1*(sin(t)-cos(r)); +} +void MGL_NO_EXPORT mgl_hyperbolic_var10(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), t=atan2(x,y); + xNew += par[0]*sin(t)/r; + yNew += par[0]*r*cos(t); +} +void MGL_NO_EXPORT mgl_diamond_var11(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), t=atan2(x,y); + xNew += par[0]*sin(t)*cos(r); + yNew += par[0]*cos(t)*sin(r); +} +void MGL_NO_EXPORT mgl_ex_var12(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), t=atan2(x,y), c1=par[0]*r; + mreal c2=mgl_ipow(sin(t+r),3), c3 = mgl_ipow(cos(t-r), 3); + xNew += c1*(c2 + c3); yNew += c1*(c2 - c3); +} +void MGL_NO_EXPORT mgl_julia_var13(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*sqrt(hypot(x,y)), c2=atan2(x,y)/2, c3=(rand()%2)*M_PI; + xNew += c1*cos(c2+c3); yNew += c1*sin(c2+c3); +} +void MGL_NO_EXPORT mgl_bent_var14(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + if (x>=0 && y>=0) + { xNew += par[0]*x; yNew += par[0]*y; } + else if (x<0 && y>=0) + { xNew += par[0]*2*x; yNew += par[0]*y; } + else if (x>=0 && x<0) + { xNew += par[0]*x; yNew += par[0]*y/2; } + else + { xNew += par[0]*2*x; yNew += par[0]*y/2; } +} +void MGL_NO_EXPORT mgl_waves_var15(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ // NOTE: par[1]=b[i], par[2]=1/c[i]^2, par[3]=e[i], par[4]=1/f[i]^2 + xNew += par[0]*(x + par[1]*sin(y*par[2])); + yNew += par[0]*(y + par[3]*sin(x*par[4])); +} +void MGL_NO_EXPORT mgl_fisheye_var16(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1 = par[0]*2/(hypot(x,y) + 1); + xNew += c1*y; yNew += c1*x; +} +void MGL_NO_EXPORT mgl_popcorn_var17(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ // NOTE: par[1]=c[i], par[2]=f[i] + xNew += par[0]*(x + par[1]*sin(tan(3*y))); + yNew += par[0]*(y + par[2]*sin(tan(3*x))); +} +void MGL_NO_EXPORT mgl_exponential_var18(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*exp(x-1); + xNew += c1*cos(M_PI*y); yNew += c1*sin(M_PI*y); +} +void MGL_NO_EXPORT mgl_power_var19(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal t=atan2(x,y), c1=par[0]*pow(hypot(x,y), sin(t)); + xNew += c1*cos(t); yNew += c1*sin(t); +} +void MGL_NO_EXPORT mgl_cosine_var20(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + xNew += par[0]*cos(M_PI*x)*cosh(y); + yNew += -par[0]*sin(M_PI*x)*sinh(y); +} +void MGL_NO_EXPORT mgl_rings_var21(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ // NOTE: par[1]=c[i]^2 + mreal t=atan2(x,y), r=hypot(x,y), c1=par[0]*(fmod(r+par[1],2*par[1])-par[1]+r*(1-par[1])); // convert to int? + xNew += c1*cos(t); yNew += c1*sin(t); +} +void MGL_NO_EXPORT mgl_fan_var22(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ // NOTE: par[1]=c[i]^2, par[2]=f[i] + mreal t=atan2(x,y), c1=par[0]*hypot(x,y), c2; + c2 = fmod(t+par[2], M_PI*par[1]); // convert to int? + if (c2 > M_PI/2*par[1]) c2 = t - M_PI/2*par[1]; + else c2 += t; + xNew += c1*cos(c2); yNew += c1*sin(c2); +} +void MGL_NO_EXPORT mgl_blob_var23(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal t=atan2(x,y), c1=par[0]*hypot(x,y)*(par[2]+(par[1]-par[2])/2*(sin(par[3]*t))); + xNew += c1*cos(t); yNew += c1*sin(t); +} +void MGL_NO_EXPORT mgl_pdj_var24(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + xNew += par[0]*(sin(par[1]*y) - cos(par[2]*x)); + yNew += par[0]*(sin(par[3]*x) - cos(par[4]*y)); +} +void MGL_NO_EXPORT mgl_fan2_var25(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal t=atan2(x,y), c1, c2; + c1 = M_PI*par[1]*par[1]; + c2 = t + par[2] - c1*int(2*t*par[2]/c1); + c1 /= 2; c2 = c2>c1?t-c1:t+c1; + c1 = par[0]*hypot(x,y); + xNew += c1*sin(c2); yNew += c1*cos(c2); +} +void MGL_NO_EXPORT mgl_rings2_var26(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), t=atan2(x,y), c1=par[1]*par[1]; + c1 = par[0]*(r - 2*c1*int((r+c1)/(2*c1)) + r*(1-c1)); + xNew += c1*cos(t); yNew += c1*sin(t); +} +void MGL_NO_EXPORT mgl_eyefish_var27(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1 = par[0]*2/(hypot(x,y)+1); + xNew += c1*x; yNew += c1*y; +} +void MGL_NO_EXPORT mgl_bubble_var28(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1 = par[0]*4/(x*x+y*y+4); + xNew += c1*x; yNew += c1*y; +} +void MGL_NO_EXPORT mgl_cylinder_var29(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ xNew += par[0]*sin(x); yNew += par[0]*y; } +void MGL_NO_EXPORT mgl_perspective_var30(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1 = par[0]*par[2]/(par[2]-y*sin(par[1])); + xNew += c1*x; yNew += c1*y*cos(par[1]); +} +void MGL_NO_EXPORT mgl_noise_var31(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*mgl_rnd(), c2=2*M_PI*mgl_rnd(); + xNew += c1*x*cos(c2); yNew += c1*y*sin(c2); +} +void MGL_NO_EXPORT mgl_juliaN_var32(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=int(fabs(par[1])*mgl_rnd()), c2; + c2 = (atan2(y,x) + 2*M_PI*c1)/par[1]; + c1 = par[0]*pow(hypot(x,y), par[2]/par[1]); + xNew += c1*cos(c2); yNew += c1*sin(c2); +} +void MGL_NO_EXPORT mgl_juliaScope_var33(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=int(fabs(par[1])*mgl_rnd()), c2; + c2 = ((2*(rand()%2)-1)*atan2(y,x) + 2*M_PI*c1)/par[1]; + c1 = par[0]*pow(hypot(x,y), par[2]/par[1]); + xNew += c1*cos(c2); yNew += c1*sin(c2); +} +void MGL_NO_EXPORT mgl_blur_var34(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*mgl_rnd(), c2=2*M_PI*mgl_rnd(); + xNew += c1*cos(c2); yNew += c1*sin(c2); +} +void MGL_NO_EXPORT mgl_gaussian_var35(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*(4*mgl_rnd()-2), c2=2*M_PI*mgl_rnd(); + xNew += c1*cos(c2); yNew += c1*sin(c2); +} +void MGL_NO_EXPORT mgl_radialBlur_var36(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal r=hypot(x,y), c1=par[1]*M_PI/2, c2=par[0]*(4*mgl_rnd()-2), c3; + c3 = c2*cos(c1) - 1; c2 = atan2(y,x) + c2 *sin(c1); + xNew += r*cos(c2) + c3*x; yNew += r*sin(c2) + c3*y; +} +void MGL_NO_EXPORT mgl_pie_var37(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=int(mgl_rnd()*par[1] + 0.5), c2; + c2 = par[2] + 2*M_PI/par[1]*(c1 + mgl_rnd()*par[3]); + c1 = par[0]*mgl_rnd(); + xNew += c1*cos(c2); yNew += c1*sin(c2); +} +void MGL_NO_EXPORT mgl_ngon_var38(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=2*M_PI/par[2], c2; + c2 = atan2(y,x) - c1*floor(atan2(y,x)/c1); + if (c2 <= c1/2) c2 -= c1; + c1 = par[0]*(par[3]*(1/cos(c2) - 1) + par[4])/pow(hypot(x,y), par[1]); + xNew += c1*x; yNew += c1*y; +} +void MGL_NO_EXPORT mgl_curl_var39(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=1 + par[1]*x + par[2]*(x*x - y*y); + mreal c2 = par[1]*y + 2*par[2]*x*y; + mreal c3 = par[0]/(c1*c1 + c2*c2); + + xNew += c3*(c1*x + c2*y); yNew += c3*(c1*y - c2*y); +} +void MGL_NO_EXPORT mgl_rectangles_var40(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + xNew += par[0]*((2*floor(x/par[1]) + 1)*par[1] - x); + yNew += par[0]*((2*floor(y/par[2]) + 1)*par[2] - y); +} +void MGL_NO_EXPORT mgl_arch_var41(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=mgl_rnd()*M_PI*par[0], c2=sin(c1); + xNew += par[0]*c2; yNew += par[0]*c2*c2/cos(c1); +} +void MGL_NO_EXPORT mgl_tangent_var42(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ xNew += par[0]*sin(x)/cos(y); yNew += par[0]*tan(y); } +void MGL_NO_EXPORT mgl_square_var43(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + xNew += par[0]*(mgl_rnd() - 0.5); + yNew += par[0]*(mgl_rnd() - 0.5); +} +void MGL_NO_EXPORT mgl_rays_var43(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1 = par[0]*par[0]*tan(mgl_rnd()*M_PI*par[0])/(x*x+y*y); + xNew += c1*cos(x); yNew += c1*sin(y); +} +void MGL_NO_EXPORT mgl_blade_var44(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*x, c2=mgl_rnd()*hypot(x,y)*par[0]; + xNew += c1*(cos(c2) + sin(c2)); // TODO check use of c2 + yNew += c1*(cos(c2) - sin(c2)); +} +void MGL_NO_EXPORT mgl_secant_var45(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ xNew += par[0]*x; yNew += 1/cos(par[0]*hypot(x,y)); } +void MGL_NO_EXPORT mgl_twintrian_var47(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1=par[0]*x, c2, c3; + c2 = mgl_rnd()*hypot(x,y)*par[0]; + c3 = log10(sin(c2)*sin(c2)) + cos(c2); + xNew += c1*c3; yNew += c1*(c3 - M_PI*sin(c2)); +} +void MGL_NO_EXPORT mgl_cross_var48(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par) +{ + mreal c1 = par[0]/fabs(x*x - y*y); + xNew += c1*x; yNew += c1*y; +} +//----------------------------------------------------------------------------- +typedef void (*flame_func)(mreal &xNew, mreal &yNew, mreal x, mreal y, const mreal *par); +MGL_NO_EXPORT flame_func ffunc[mglFlameLAST] = { + mgl_linear_var0, mgl_sinusoidal_var1, mgl_spherical_var2, mgl_swirl_var3, mgl_horseshoe_var4, + mgl_polar_var5, mgl_handkerchief_var6, mgl_heart_var7, mgl_disc_var8, mgl_spiral_var9, + mgl_hyperbolic_var10, mgl_diamond_var11, mgl_ex_var12, mgl_julia_var13, mgl_bent_var14, + mgl_waves_var15, mgl_fisheye_var16, mgl_popcorn_var17, mgl_exponential_var18, mgl_power_var19, + mgl_cosine_var20, mgl_rings_var21, mgl_fan_var22, mgl_blob_var23, mgl_pdj_var24, + mgl_fan2_var25, mgl_rings2_var26, mgl_eyefish_var27, mgl_bubble_var28, mgl_cylinder_var29, + mgl_perspective_var30, mgl_noise_var31, mgl_juliaN_var32, mgl_juliaScope_var33, mgl_blur_var34, + mgl_gaussian_var35, mgl_radialBlur_var36, mgl_pie_var37, mgl_ngon_var38, mgl_curl_var39, + mgl_rectangles_var40, mgl_arch_var41, mgl_tangent_var42, mgl_square_var43, mgl_rays_var43, + mgl_blade_var44, mgl_secant_var45, mgl_twintrian_var47,mgl_cross_var48 }; +//----------------------------------------------------------------------------- +long MGL_NO_EXPORT mgl_flame_2d_point(HCDT A, HCDT F, mreal& x, mreal& y, mreal amax) +{ + long i, n=A->GetNy(), m=F->GetNy(), last_func=0, l=F->GetNx(); + l = l>6?6:l; + mreal r = amax*mgl_rnd(), sum_prob = 0, x1, y1; + for(i=0;iv(6,i); + if(rv(0,i)*x + A->v(1,i)*y + A->v(4,i); + y1 = A->v(2,i)*x + A->v(3,i)*y + A->v(5,i); + x = y = 0; + for(long j=0;jv(0,j,i)+0.5); + mreal par[5] = {F->v(1,j,i),0,0,0,0}; + for(int k=2;kv(k,j,i); + if(v<0 || v>=mglFlameLAST) { v=0; par[0]=1; } + ffunc[v](x,y,x1,y1,par); last_func=v; + } + return last_func; +} +HMDT MGL_EXPORT mgl_data_flame_2d(HCDT A, HCDT F, long n, long skip) +{ + if(!A || A->GetNx()<7 || n<1) return 0; // incompatible dimensions + if(!F || F->GetNx()<2 || F->GetNz()!=A->GetNy()) return 0; // incompatible dimensions + mreal amax=0; + for(long i=0; iGetNy(); i++) amax += A->v(6,i); + if(amax<=0) return 0; + + mglData *f = new mglData(3,n); + mreal x = 0, y = 0; + for(long i=0; ia[3*i+2] = mgl_flame_2d_point(A, F, x, y, amax); // TODO color information ?!! + f->a[3*i] = x; f->a[3*i+1] = y; + } + return f; +} +uintptr_t MGL_EXPORT mgl_data_flame_2d_(uintptr_t *d, uintptr_t *f, long *n, long *skip) +{ return uintptr_t(mgl_data_flame_2d(_DT_,_DA_(f),*n,*skip)); } +//----------------------------------------------------------------------------- diff --git a/src/obj.cpp b/src/obj.cpp index febde6c..1fae550 100644 --- a/src/obj.cpp +++ b/src/obj.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * obj.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -32,8 +32,6 @@ void MGL_NO_EXPORT mgl_printf(void *fp, bool gz, const char *str, ...); #include #include -#include -#include #include #include #include diff --git a/src/other.cpp b/src/other.cpp index 06549af..ed9bf22 100644 --- a/src/other.cpp +++ b/src/other.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * other.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -24,7 +24,7 @@ #include "mgl2/data.h" #include "mgl2/base.h" //----------------------------------------------------------------------------- -HCDT MGL_NO_EXPORT fill_slice_x(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa) +HCDT MGL_NO_EXPORT fill_slice_x(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa) { long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(l>1) @@ -47,7 +47,7 @@ HCDT MGL_NO_EXPORT fill_slice_x(HMGL gr, double sv, HCDT a, mglData &xx, mglData return a; } //----------------------------------------------------------------------------- -HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa) +HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa) { long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(l>1) @@ -70,7 +70,7 @@ HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglData &xx, mglData return a; } //----------------------------------------------------------------------------- -HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa) +HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglDataV &xx, mglDataV &yy, mglDataV &zz, mglData &aa) { long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); @@ -99,11 +99,11 @@ HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglData &xx, mglData void MGL_EXPORT mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensX"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensX"); return; } - mglData xx,yy,zz,aa; gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); + if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensX"); gr->LoadState(); return; } + mglDataV xx,yy,zz; mglData aa; a = fill_slice_x(gr,sv,a,xx,yy,zz,aa); mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); } @@ -111,11 +111,11 @@ void MGL_EXPORT mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const ch void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensY"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensY"); return; } - mglData xx,yy,zz,aa; gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgY('y'); + if(svMin.y || sv>gr->Max.y) { gr->SetWarn(mglWarnSlc,"DensY"); gr->LoadState(); return; } + mglDataV xx,yy,zz; mglData aa; a = fill_slice_y(gr,sv,a,xx,yy,zz,aa); mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); } @@ -123,11 +123,11 @@ void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const ch void MGL_EXPORT mgl_dens_z(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensZ"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensZ"); return; } - mglData xx,yy,zz,aa; gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgZ('z'); + if(svMin.z || sv>gr->Max.z) { gr->SetWarn(mglWarnSlc,"DensZ"); gr->LoadState(); return; } + mglDataV xx,yy,zz; mglData aa; a = fill_slice_z(gr,sv,a,xx,yy,zz,aa); mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); } @@ -157,12 +157,12 @@ void MGL_EXPORT mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContX"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContX"); return; } gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); + if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContX"); gr->LoadState(); return; } static int cgid=1; gr->StartGroup("ContX",cgid++); - mglData xx,yy,zz,aa; + mglDataV xx,yy,zz; mglData aa; int text=0; if(mglchr(sch,'t')) text=1; @@ -171,6 +171,7 @@ void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double gr->SetPenPal(sch); a = fill_slice_x(gr,sv,a,xx,yy,zz,aa); +#pragma omp parallel for for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -182,12 +183,12 @@ void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContY"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContY"); return; } gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgY('y'); + if(svMin.y || sv>gr->Max.y) { gr->SetWarn(mglWarnSlc,"ContY"); gr->LoadState(); return; } static int cgid=1; gr->StartGroup("ContY",cgid++); - mglData xx,yy,zz,aa; + mglDataV xx,yy,zz; mglData aa; int text=0; if(mglchr(sch,'t')) text=1; @@ -196,6 +197,7 @@ void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double gr->SetPenPal(sch); a = fill_slice_y(gr,sv,a,xx,yy,zz,aa); +#pragma omp parallel for for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -207,12 +209,12 @@ void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double void MGL_EXPORT mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContZ"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContZ"); return; } gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgZ('z'); + if(svMin.z || sv>gr->Max.z) { gr->SetWarn(mglWarnSlc,"ContZ"); gr->LoadState(); return; } static int cgid=1; gr->StartGroup("ContZ",cgid++); - mglData xx,yy,zz,aa; + mglDataV xx,yy,zz; mglData aa; int text=0; if(mglchr(sch,'t')) text=1; @@ -221,6 +223,7 @@ void MGL_EXPORT mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double gr->SetPenPal(sch); a = fill_slice_z(gr,sv,a,xx,yy,zz,aa); +#pragma omp parallel for for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -294,15 +297,16 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContFX"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContFX"); return; } gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); + if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContFX"); gr->LoadState(); return; } static int cgid=1; gr->StartGroup("ContFX",cgid++); - mglData xx,yy,zz,aa; + mglDataV xx,yy,zz; mglData aa; long ss=gr->AddTexture(sch); a = fill_slice_x(gr,sv,a,xx,yy,zz,aa); +#pragma omp parallel for for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); @@ -314,15 +318,16 @@ void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContFY"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContFY"); return; } gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgY('y'); + if(svMin.y || sv>gr->Max.y) { gr->SetWarn(mglWarnSlc,"ContFY"); gr->LoadState(); return; } static int cgid=1; gr->StartGroup("ContFY",cgid++); - mglData xx,yy,zz,aa; + mglDataV xx,yy,zz; mglData aa; long ss=gr->AddTexture(sch); a = fill_slice_y(gr,sv,a,xx,yy,zz,aa); +#pragma omp parallel for for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); @@ -334,15 +339,16 @@ void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double void MGL_EXPORT mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { long n=a->GetNx(),m=a->GetNy(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContFZ"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContFZ"); return; } gr->SaveState(opt); + if(mgl_isnan(sv)) sv = gr->GetOrgZ('z'); + if(svMin.z || sv>gr->Max.z) { gr->SetWarn(mglWarnSlc,"ContFZ"); gr->LoadState(); return; } static int cgid=1; gr->StartGroup("ContFZ",cgid++); - mglData xx,yy,zz,aa; + mglDataV xx,yy,zz; mglData aa; long ss=gr->AddTexture(sch); a = fill_slice_z(gr,sv,a,xx,yy,zz,aa); +#pragma omp parallel for for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); diff --git a/src/parser.cpp b/src/parser.cpp index 49aa1b7..35a560f 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * parse.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -100,7 +100,7 @@ const mglCommand *mglParser::FindCommand(const wchar_t *com) const } //----------------------------------------------------------------------------- // return values : 0 -- OK, 1 -- wrong arguments, 2 -- wrong command, 3 -- unclosed string -int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const std::wstring &var, const wchar_t *opt) +int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const std::wstring &/*var*/, const wchar_t *opt) { int i; const char *id="dsn"; @@ -135,7 +135,7 @@ int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const s //----------------------------------------------------------------------------- mglParser::mglParser(bool setsize) { - InUse = 1; curGr = 0; + InUse = 1; curGr = 0; Variant = 0; Skip=Stop=for_br=false; memset(for_stack,0,40*sizeof(int)); memset(if_stack,0,40*sizeof(int)); @@ -272,16 +272,17 @@ mglNum *mglParser::AddNum(const wchar_t *name) //----------------------------------------------------------------------------- int MGL_LOCAL_PURE mglFindArg(const std::wstring &str) { - register long l=0,k=0,i; - for(i=0;is = L"/*"+s+L"*/"; a[n-1].type = 0; ParseDat(gr, s, *u); a[n-1].d = u; u->temp=true; DataList.push_back(u); } - else if((v = FindVar(arg[n].c_str()))!=0) // try to find normal variables (for data creation) + else if((v = FindVar(str.c_str()))!=0) // try to find normal variables (for data creation) { a[n-1].type=0; a[n-1].d=v; a[n-1].w=v->s; } - else if((f = FindNum(arg[n].c_str()))!=0) // try to find normal number (for data creation) + else if((f = FindNum(str.c_str()))!=0) // try to find normal number (for data creation) { a[n-1].type=2; a[n-1].d=0; a[n-1].v=f->d; a[n-1].c=f->c; a[n-1].w = f->s; } - else if(arg[n][0]=='!') // complex array is asked + else if(str[0]=='!') // complex array is asked { // parse all numbers and formulas by unified way - HADT d = mglFormulaCalcC(arg[n].substr(1), this, DataList); + HADT d = mglFormulaCalcC(str.substr(1), this, DataList); if(d->GetNN()==1) { - if(CheckForName(arg[n].substr(1))) + if(CheckForName(str.substr(1))) { a[n-1].type = 2; a[n-1].v = d->v(0); a[n-1].c = d->a[0]; } else - { a[n-1].type = 0; a[n-1].d = AddVar(arg[n].c_str()); } + { a[n-1].type = 0; a[n-1].d = AddVar(str.c_str()); } delete d; } else { - a[n-1].w = L"/*"+arg[n]+L"*/"; + a[n-1].w = L"/*"+str+L"*/"; d->temp=true; DataList.push_back(d); a[n-1].type = 0; a[n-1].d = d; } } else { // parse all numbers and formulas by unified way - HMDT d = mglFormulaCalc(arg[n], this, DataList); + HMDT d = mglFormulaCalc(str, this, DataList); if(d->GetNN()==1) { - if(CheckForName(arg[n])) + if(CheckForName(str)) { a[n-1].type = 2; a[n-1].c = a[n-1].v = d->v(0); } else - { a[n-1].type = 0; a[n-1].d = AddVar(arg[n].c_str()); } + { a[n-1].type = 0; a[n-1].d = AddVar(str.c_str()); } delete d; } else { - a[n-1].w = L"/*"+arg[n]+L"*/"; + a[n-1].w = L"/*"+str+L"*/"; d->temp=true; DataList.push_back(d); a[n-1].type = 0; a[n-1].d = d; } @@ -573,7 +590,6 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) { if(Stop || gr->NeedStop()) return 0; curGr = gr->Self(); - std::wstring arg[1024]; str=mgl_trim_ws(str); long n,k=0,m=0,mm=0,res; // try parse ':' -- several commands in line @@ -598,7 +614,8 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) PutArg(str,false); str=mgl_trim_ws(str); std::wstring opt; - for(k=0;k<1024;k++) // parse string to substrings (by spaces) + std::vector arg; + while(!str.empty()) // parse string to substrings (by spaces) { n = mglFindArg(str); if(n<1) // this is option @@ -607,17 +624,18 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) if(n<0) str = str.substr(0,-n); break; } - arg[k] = str.substr(0,n); + arg.push_back(str.substr(0,n)); str = mgl_trim_ws(str.substr(n+1)); } // try to find last argument - if(str[0]!=0 && str[0]!='#' && str[0]!=';') { arg[k] = str; k++; } - if(k<1) n =0; + if(str[0]!=0 && str[0]!='#' && str[0]!=';') arg.push_back(str); + k = arg.size(); + if(k<1) n = 0; else { // fill arguments by its values mglArg *a = new mglArg[k]; - FillArg(gr, k, arg, a); + FillArg(gr, k, &(arg[0]), a); // execute first special (program-flow-control) commands if(!skip() && !arg[0].compare(L"stop")) { Stop = true; delete []a; return 0; } @@ -656,10 +674,16 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) std::wstring a1 = arg[1], a2=arg[2]; res = 0; if(a1[0]=='\'') a1 = a1.substr(1,a1.length()-2); if(a2[0]=='\'') a2 = a2.substr(1,a2.length()-2); - mgl_rk_step_w(this, a1.c_str(), a2.c_str(), (k>=3 && a[2].type==2)?a[2].v:1); + mgl_rk_step_w(this, a1.c_str(), a2.c_str(), (k>3 && a[2].type==2)?a[2].v:1); } delete []a; return res; } + if(!arg[0].compare(L"variant")) + { + int res=1; + if(k==2 && a[0].type==2) { SetVariant(a[0].v); res=0; } + delete []a; return res; + } if(!arg[0].compare(L"call")) { n = 1; @@ -702,6 +726,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) } if(!arg[0].compare(L"for")) { + if(k<2) { delete []a; return 1; } n = 1; char ch = arg[1][0]; int r = ch-'0'; @@ -737,10 +762,10 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) delete []a; return n; } // alocate new arrays and execute the command itself - n = PreExec(gr, k, arg, a); + n = PreExec(gr, k, &(arg[0]), a); if(n>0) n--; else if(!arg[0].compare(L"setsize") && !AllowSetSize) n = 2; - else n = Exec(gr, arg[0].c_str(),k-1,a, arg[1].c_str(), opt.c_str()); + else n = Exec(gr, arg[0].c_str(),k-1,a, k>1?arg[1]:L"", opt.c_str()); delete []a; } // delete temporary data arrays @@ -887,7 +912,6 @@ int mglParser::FlowExec(mglGraph *, const std::wstring &com, long m, mglArg *a) return n+1; } //----------------------------------------------------------------------------- -#include void mglParser::Execute(mglGraph *gr, FILE *fp, bool print) { if(gr==0 || fp==0) return; @@ -1303,3 +1327,6 @@ void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, do char *s=new char[m+1]; memcpy(s,vars,m); s[m]=0; mgl_rk_step(_PR_,e,s,*dt); delete []e; delete []s; } //--------------------------------------------------------------------------- +void MGL_EXPORT mgl_parser_variant(HMPR p, int var) { p->SetVariant(var); } +void MGL_EXPORT mgl_parser_variant_(uintptr_t *p, int *var) { mgl_parser_variant(_PR_,*var); } +//--------------------------------------------------------------------------- diff --git a/src/pde.cpp b/src/pde.cpp index b99338c..637f014 100644 --- a/src/pde.cpp +++ b/src/pde.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * pde.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -29,12 +29,160 @@ HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector // Advanced PDE series in 2D case // //----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_operator_exp(long n, dual *h, dual *a, dual *f) +{ + memset(f,0,2*n*sizeof(dual)); + const long i1=n/2, i2=3*n/2-1; +#pragma omp parallel for + for(long j=0;jn-1) ii=n-1; + double kk=M_PI*2*i/n; + for(long j=0;jn-1) ii=n-1; + double kk=M_PI*2*i/n; + for(long j=0;j=0?dual(sqrt(b),0):dual(0,sqrt(-b)); } +void MGL_NO_EXPORT mgl_operator_lin(long n, dual *h, dual *a, dual *f, dual *g, dual *o) +{ + memset(f,0,2*n*sizeof(dual)); + memset(g,0,2*n*sizeof(dual)); + const long i1=n/2, i2=3*n/2-1; +#pragma omp parallel for + for(long j=0;jn-1) ii=n-1; + double kk=M_PI*2*i/n; + for(long j=0;jSaveState(opt); if(mgl_isnan(gamma)) gamma = 20; - mglPoint Min=gr->Min, Max=gr->Max; - long nx=ini_re->GetNx(), nt = long((Max.y-Min.y)/dt)+1; + const mglPoint &Min=gr->Min, &Max=gr->Max; + const long nx=ini_re->GetNx(), nt = long((Max.y-Min.y)/dt)+1; if(nx<2 || nt<2 || Max.x==Min.x){ gr->SetWarn(mglWarnLow,"PDE"); return 0; } // Too small data if(ini_im->GetNx() != nx) { gr->SetWarn(mglWarnDim,"PDE"); return 0; } // Wrong dimensions @@ -49,7 +197,7 @@ HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *func, HCDT ini_re, HCDT ini_i list.push_back(&x); list.push_back(&y); list.push_back(&p); list.push_back(&r); list.push_back(&u); dual *a = new dual[2*nx]; memset(a,0,2*nx*sizeof(dual)); // Add "damping" area - dual *f = new dual[2*nx]; memset(f,0,2*nx*sizeof(dual)); // Effective "spectrum" + dual *f = new dual[6*nx], *g=f+2*nx, *s=f+4*nx; #pragma omp parallel for for(long i=0;iv(i), ini_im->v(i)); @@ -60,57 +208,26 @@ HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *func, HCDT ini_re, HCDT ini_i if(i3*nx/2) dmp[i] += gamma*mgl_ipow((i-3*nx/2-1)/mreal(nx/2),2); } + bool have_y = mglchr(func,'y'); HADT ham; + if(!have_y) + { ham = mglFormulaCalcC(func, list); mgl_datac_mul_num(ham,dd); } for(long k=0;ka+k*nx,a+nx/2,nx*sizeof(dual)); - ham = mglFormulaCalcC(func, list); - memset(f,0,2*nx*sizeof(dual)); - const long i1=nx/2, i2=3*nx/2-1; -#pragma omp parallel for - for(long j=0;ja[nx*j], h2=dual(0,dd)*ham->a[nx-1+nx*j]; - dual g1=(h1+dual(0,dd)*ham->a[nx*jp])/mreal(2), g2=(h2+dual(0,dd)*ham->a[nx-1+nx*jp])/mreal(2); - mreal k1=M_PI*2*j/nx, k2 = M_PI*(2*j+1)/nx; - for(long i=0;ia[i-i1+nx*j]; - f[2*j] += a[i]*exp(dual(0,dd)*hh+dual(0,i*k1)); - f[2*j+1] += a[i]*exp(dual(0,dd)*(hh+ham->a[i-i1+nx*jp])/mreal(2)+dual(0,i*k2)); - } - for(long i=i2;i<2*nx;i++) - { - f[2*j] += a[i]*exp(h2+dual(0,i*k1)); - f[2*j+1] += a[i]*exp(g2+dual(0,i*k2)); - } - } - memset(a,0,2*nx*sizeof(dual)); + if(have_y) + { y.Fill(k*dt); ham = mglFormulaCalcC(func, list); mgl_datac_mul_num(ham,dd); } + mgl_operator_exp(nx,ham->a,a,f); + mgl_operator_lin(nx,ham->a,a,f,g,s); + mgl_operator_lin(nx,ham->a,s,f,g,s); #pragma omp parallel for for(long i=0;i<2*nx;i++) - { - register long ii=i-i1; - if(ii<0) ii=0; if(ii>nx-1) ii=nx-1; - double kk=M_PI*2*i/nx; - for(long j=0;ja[ii+nx*j], g1 = (h1+ham->a[ii+nx*(jLoadState(); return res; } //----------------------------------------------------------------------------- @@ -195,7 +312,7 @@ struct mgl_pde_ham }; void MGL_NO_EXPORT mgl_pde_hprep(const mgl_pde_ham *f) { - long nx = f->nx, ny = f->ny; + const long nx = f->nx, ny = f->ny; mglDataV x(nx,ny), y(nx,ny), z, r(nx,ny); mglDataW p(nx,ny), q(nx,ny); x.s = L"x"; y.s = L"y"; p.s = L"p"; q.s = L"q"; r.s=L"#$mgl"; @@ -420,7 +537,7 @@ HMDT MGL_EXPORT mgl_ode_solve(void (*func)(const mreal *x, mreal *dx, void *par) HMDT MGL_EXPORT mgl_ode_solve_ex(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par, void (*bord)(mreal *x, const mreal *xp, void *par)) { if(tmaxdt = rr[6] - rr[6-n7]; + ri->x0 = rr[0] - rr[-n7]; // NOTE: very rough formulas + ri->y0 = rr[1] - rr[1-n7]; // for corresponding with dt one + ri->z0 = rr[2] - rr[2-n7]; // for corresponding with dt one + double ch = sqrt(ri->x0*ri->x0 + ri->y0*ri->y0 + ri->z0*ri->z0); + ri->x0 /= ch; ri->y0 /= ch; ri->z0 /= ch; + ri->ch = ch/ri->dt; + ri->pt = rr[3]*ri->x0 + rr[4]*ri->y0 + rr[5]*ri->z0; + ri->q1 = rr[3]*ri->x1 + rr[4]*ri->y1 + rr[5]*ri->z1; + ri->q2 = rr[3]*ri->x2 + rr[4]*ri->y2 + rr[5]*ri->z2; + // NOTE previous point is used here! + tt = ri->x0*rp->x1 + ri->y0*rp->y1 + ri->z0*rp->z1; + ri->x1 = rp->x1 - tt*ri->x0; // vector g_1 + ri->y1 = rp->y1 - tt*ri->y0; + ri->z1 = rp->z1 - tt*ri->z0; + ri->t1 = tt/ch; + tt = sqrt(ri->x1*ri->x1 + ri->y1*ri->y1 + ri->z1*ri->z1); + ri->x1 /= tt; ri->y1 /= tt; ri->z1 /= tt; // norm for reducing numeric error + ri->x2 = ri->y1*ri->z0 - ri->y0*ri->z1; // vector g_2 + ri->y2 = ri->z1*ri->x0 - ri->z0*ri->x1; + ri->z2 = ri->x1*ri->y0 - ri->x0*ri->y1; + tt = ri->x0*rp->x2 + ri->y0*rp->y2 + ri->z0*rp->z2; + ri->t2 = tt/ch; + ri->d1 = (ri->q1-rp->q1)/ch; + ri->d2 = (ri->q2-rp->q2)/ch; } memcpy(ra,ra+1,sizeof(mgl_ap)); // setup zero point ra[0].pt = r[3]*ra[0].x0 + r[4]*ra[0].y0 + r[5]*ra[0].z0; @@ -554,7 +672,7 @@ MGL_NO_EXPORT void *mgl_qo2d_hprep(void *par) mgl_ap *ra = f->ra; const mreal *r = f->r; - long nx=t->n; + const long nx=t->n; #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif @@ -581,7 +699,7 @@ HADT MGL_EXPORT mgl_qo2d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal px { const mglData *ray=dynamic_cast(ray_dat); // NOTE: Ray must be mglData! if(!ray) return 0; - long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx; + const long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx; if(nx<2 || ini_im->GetNx()!=nx || nt<2) return 0; mglDataC *res=new mglDataC(nx,nt,1); @@ -706,7 +824,7 @@ MGL_NO_EXPORT void *mgl_qo3d_hprep(void *par) mgl_qo3d_ham *f = (mgl_qo3d_ham *)t->v; mgl_ap *ra = f->ra; const mreal *r = f->r; - long nx=t->n; + const long nx=t->n; #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif @@ -739,7 +857,7 @@ MGL_NO_EXPORT void *mgl_qo3d_post(void *par) { mglThreadD *t=(mglThreadD *)par; mgl_qo3d_ham *f = (mgl_qo3d_ham *)t->v; - long nx=t->n; + const long nx=t->n; #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif @@ -764,7 +882,7 @@ HADT MGL_EXPORT mgl_qo3d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal z, { const mglData *ray=dynamic_cast(ray_dat); // NOTE: Ray must be mglData! if(!ray) return 0; - long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx; // NOTE: only square grids are supported now (for simplicity) + const long nx=ini_re->GetNx(), nt=ray->ny, n7=ray->nx; // NOTE: only square grids are supported now (for simplicity) if(nx<2 || ini_re->GetNx()!=nx || ini_im->GetNx()*ini_im->GetNy()!=nx*nx || nt<2) return 0; mglDataC *res=new mglDataC(nx,nx,nt); @@ -915,7 +1033,7 @@ uintptr_t MGL_EXPORT mgl_qo3d_solve_(const char *ham, uintptr_t* ini_re, uintptr MGL_NO_EXPORT void *mgl_jacob2(void *par) { mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0], ny=t->p[1]; + const long nx=t->p[0], ny=t->p[1]; mreal *r=t->a; const mreal *x=t->b, *y=t->c; #if !MGL_HAVE_PTHREAD @@ -934,7 +1052,7 @@ MGL_NO_EXPORT void *mgl_jacob2(void *par) } HMDT MGL_EXPORT mgl_jacobian_2d(HCDT x, HCDT y) { - int nx = x->GetNx(), ny=x->GetNy(); + const long nx = x->GetNx(), ny=x->GetNy(); if(nx!=y->GetNx() || ny!=y->GetNy() || nx<2 || ny<2) return 0; mglData *r=new mglData(nx,ny,1); const mglData *xx=dynamic_cast(x); @@ -962,7 +1080,7 @@ HMDT MGL_EXPORT mgl_jacobian_2d(HCDT x, HCDT y) MGL_NO_EXPORT void *mgl_jacob3(void *par) { mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0], ny=t->p[1], nz=t->p[2]; + const long nx=t->p[0], ny=t->p[1], nz=t->p[2]; mreal *r=t->a; const mreal *x=t->b, *y=t->c, *z=t->d; #if !MGL_HAVE_PTHREAD @@ -985,7 +1103,7 @@ MGL_NO_EXPORT void *mgl_jacob3(void *par) } HMDT MGL_EXPORT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z) { - int nx = x->GetNx(), ny=x->GetNy(), nz=x->GetNz(), nn = nx*ny*nz; + const long nx = x->GetNx(), ny=x->GetNy(), nz=x->GetNz(), nn = nx*ny*nz; if(nx<2 || ny<2 || nz<2) return 0; if(nn!=y->GetNN() || nn!=z->GetNN()) return 0; mglData *r=new mglData(nx,ny,nz); @@ -1024,3 +1142,325 @@ uintptr_t MGL_EXPORT mgl_jacobian_2d_(uintptr_t* x, uintptr_t* y) uintptr_t MGL_EXPORT mgl_jacobian_3d_(uintptr_t* x, uintptr_t* y, uintptr_t* z) { return uintptr_t(mgl_jacobian_3d(_DA_(x), _DA_(y), _DA_(z))); } //----------------------------------------------------------------------------- +// +// Progonka +// +//----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_progonka_sr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, long n, long id, long i0, long di, bool difr) +{ + mreal *aa=dat, *bb=dat+n, *uu=dat+2*n; + mreal b0=B->vthr(i0), c0=C->vthr(i0), d0=D->vthr(id); + if(difr) d0 = (2.-b0)*d0-c0*D->vthr(id+di); + aa[0] = -c0/b0; bb[0] = d0/b0; + for(long i=1;ivthr(ii), b=B->vthr(ii), c=C->vthr(ii); + mreal d=difr?-a*D->vthr(dd-di)+(2.-b)*D->vthr(dd)-c*D->vthr(tt):D->vthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + } + uu[n-1] = bb[n-1]; + for(long i=n-2;i>=0;i--) uu[i] = bb[i]+aa[i]*uu[i+1]; +} +void MGL_NO_EXPORT mgl_progonka_pr(HCDT A, HCDT B, HCDT C, HCDT D, mreal *dat, long n, long id, long i0, long di, bool difr) +{ + mreal *aa=dat, *bb=dat+n, *gg=dat+2*n, *uu=dat+3*n; + mreal a0=A->vthr(i0), b0=B->vthr(i0), c0=C->vthr(i0), d0=D->vthr(id); + if(difr) d0 = -a0*D->vthr(id+di*(n-1))+(2.-b0)*d0-c0*D->vthr(id+di); + aa[0] =-c0/b0; bb[0] = d0/b0; gg[0] =-a0/b0; + for(long i=1;ivthr(ii), b=B->vthr(ii), c=C->vthr(ii); + mreal d=difr?-a*D->vthr(dd-di)+(2.-b)*D->vthr(dd)-c*D->vthr(il):D->vthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + gg[i] = -a*gg[i-1]/(b+a*aa[i-1]); + } + mreal P=bb[n-1]/(1.-gg[n-1]), Q=aa[n-1]/(1.-gg[n-1]); + aa[n-1] = Q; bb[n-1] = P; + for(long i=n-2;i>=0;i--) + { + bb[i] += aa[i]*bb[i+1]+gg[i]*P; + aa[i] = aa[i]*aa[i+1]+gg[i]*Q; + } + mreal u0 = bb[0]/(1.-aa[0]); + for(long i=0;ivthr(i0), c0=C->vthr(i0), d0=D->vthr(id); + uu[0] = d0/b0*(difr?(2.-b0):1.); + b0=B->vthr(i0+n*n-1); d0=D->vthr(id+n*n-1); + uu[n*n-1] = d0/b0*(difr?(2.-b0):1.); + long di = n-1, i1 = i0+n*(n-1), d1 = id+n*(n-1); + // suppose the square grid! + for(long j=1;jvthr(i0+j); c0=C->vthr(i0+j); d0=D->vthr(id+j); + if(difr) d0 = (2.-b0)*d0-c0*D->vthr(id+j+di); + aa[0] = -c0/b0; bb[0] = d0/b0; + for(long i=1;i<=j;i++) + { + register long ii=i0+j+di*i, dd=id+j+di*i; + mreal a=A->vthr(ii),b=B->vthr(ii),c=C->vthr(ii); + mreal d=difr?-a*D->vthr(dd-di)+(2.-b)*D->vthr(dd)-c*D->vthr(dd+di):D->vthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + } + uu[j+di*(j-1)] = bb[j]; + for(long i=j-1;i>=0;i--) + uu[j+di*i] = bb[i]+aa[i]*uu[j+di*i+di]; + // next top-right triangle + long j1=n-1-j; + b0=B->vthr(i1+j1); c0=C->vthr(i1+j1); d0=D->vthr(d1+j1); + if(difr) d0 = (2.-b0)*d0-c0*D->vthr(d1+j1-di); + aa[0] = -c0/b0; bb[0] = d0/b0; + for(long i=1;i<=j;i++) + { + register long ii=i1+j1-di*i, dd=d1+j1-di*i; + mreal a=A->vthr(ii),b=B->vthr(ii),c=C->vthr(ii); + mreal d=difr?-a*D->vthr(dd+di)+(2.-b)*D->vthr(dd)-c*D->vthr(dd-di):D->vthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + } + uu[j1+n*(n-1)-di*(j-1)] = bb[j]; + for(long i=j-1;i>=0;i--) + uu[j1+n*(n-1)-di*i] = bb[i]+aa[i]*uu[j1+n*(n-1)-di*i-di]; + } +} +//----------------------------------------------------------------------------- +HMDT MGL_EXPORT mgl_data_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how) +{ + const long nx=D->GetNx(),ny=D->GetNy(),nz=D->GetNz(); + const long nn=nx*ny*nz, np=nx*ny, na=A->GetNN(); + if(B->GetNN()!=na || C->GetNN()!=na) return 0; + mglData *r = new mglData(nx,ny,nz); + bool per = mglchr(how,'c'); + bool difr = mglchr(how,'d'); + if(mglchr(how,'x') && (na==nn || na==np || na==nx)) +#pragma omp parallel + { + mglData T(nx,4); mreal *uu=T.a+(per?3:2)*nx; +#pragma omp for collapse(2) + for(long k=0;ka[i+i0] = uu[i]; + } + } + else if(mglchr(how,'y') && (na==nn || na==np || na==ny)) +#pragma omp parallel + { + mglData T(ny,4); mreal *uu=T.a+(per?3:2)*ny; +#pragma omp for collapse(2) + for(long k=0;ka[j*nx+i0] = uu[j]; + } + } + else if(mglchr(how,'z') && (na==nn || na==nz)) +#pragma omp parallel + { + mglData T(nz,4); mreal *uu=T.a+(per?3:2)*nz; +#pragma omp for collapse(2) + for(long j=0;ja[k*np+i0] = uu[k]; + } + } + else if(mglchr(how,'h') && ny==nx && (na==nn || na==np) && nx>1) +#pragma omp parallel + { + mglData T(np,2); +#pragma omp for + for(long k=0;ka+k*np, T.a+np, np*sizeof(mreal)); + } + } + else { delete r; r=0; } + return r; +} +//----------------------------------------------------------------------------- +uintptr_t MGL_EXPORT mgl_data_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int l) +{ char *s=new char[l+1]; memcpy(s,how,l); s[l]=0; + uintptr_t r = uintptr_t(mgl_data_tridmat(_DA_(A),_DA_(B),_DA_(C),_DA_(D),s)); + delete []s; return r; +} +//----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_progonka_sc(HCDT A, HCDT B, HCDT C, HCDT D, dual *dat, long n, long id, long i0, long di, bool difr) +{ + dual *aa=dat, *bb=dat+n, *uu=dat+2*n; + dual b0=B->vcthr(i0), c0=C->vcthr(i0), d0=D->vcthr(id); + if(difr) d0 = (2.-b0)*d0-c0*D->vcthr(id+di); + aa[0] = -c0/b0; bb[0] = d0/b0; + for(long i=1;ivcthr(ii), b=B->vcthr(ii), c=C->vcthr(ii); + dual d=difr?-a*D->vcthr(dd-di)+(2.-b)*D->vcthr(dd)-c*D->vcthr(tt):D->vcthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + } + uu[n-1] = bb[n-1]; + for(long i=n-2;i>=0;i--) uu[i] = bb[i]+aa[i]*uu[i+1]; +} +void MGL_NO_EXPORT mgl_progonka_pc(HCDT A, HCDT B, HCDT C, HCDT D, dual *dat, long n, long id, long i0, long di, bool difr) +{ + dual *aa=dat, *bb=dat+n, *gg=dat+2*n, *uu=dat+3*n; + dual a0=A->vcthr(i0), b0=B->vcthr(i0), c0=C->vcthr(i0), d0=D->vcthr(id); + if(difr) d0 = -a0*D->vcthr(id+di*(n-1))+(2.-b0)*d0-c0*D->vcthr(id+di); + aa[0] =-c0/b0; bb[0] = d0/b0; gg[0] =-a0/b0; + for(long i=1;ivcthr(ii), b=B->vcthr(ii), c=C->vcthr(ii); + dual d=difr?-a*D->vcthr(dd-di)+(2.-b)*D->vcthr(dd)-c*D->vcthr(il):D->vcthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + gg[i] = -a*gg[i-1]/(b+a*aa[i-1]); + } + dual P=bb[n-1]/(1.-gg[n-1]), Q=aa[n-1]/(1.-gg[n-1]); + aa[n-1] = Q; bb[n-1] = P; + for(long i=n-2;i>=0;i--) + { + bb[i] += aa[i]*bb[i+1]+gg[i]*P; + aa[i] = aa[i]*aa[i+1]+gg[i]*Q; + } + dual u0 = bb[0]/(1.-aa[0]); + for(long i=0;ivcthr(i0), c0=C->vcthr(i0), d0=D->vcthr(id); + uu[0] = d0/b0*(difr?(2.-b0):1.); + b0=B->vcthr(i0+n*n-1); d0=D->vcthr(id+n*n-1); + uu[n*n-1] = d0/b0*(difr?(2.-b0):1.); + long di = n-1, i1 = i0+n*(n-1), d1 = id+n*(n-1); + // suppose the square grid! + for(long j=1;jvcthr(i0+j); c0=C->vcthr(i0+j); d0=D->vcthr(id+j); + if(difr) d0 = (2.-b0)*d0-c0*D->vcthr(id+j+di); + aa[0] = -c0/b0; bb[0] = d0/b0; + for(long i=1;i<=j;i++) + { + register long ii=i0+j+di*i, dd=id+j+di*i; + dual a=A->vcthr(ii),b=B->vcthr(ii),c=C->vcthr(ii); + dual d=difr?-a*D->vcthr(dd-di)+(2.-b)*D->vcthr(dd)-c*D->vcthr(dd+di):D->vcthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + } + uu[j+di*(j-1)] = bb[j]; + for(long i=j-1;i>=0;i--) + uu[j+di*i] = bb[i]+aa[i]*uu[j+di*i+di]; + // next top-right triangle + long j1=n-1-j; + b0=B->vcthr(i1+j1); c0=C->vcthr(i1+j1); d0=D->vcthr(d1+j1); + if(difr) d0 = (2.-b0)*d0-c0*D->vcthr(d1+j1-di); + aa[0] = -c0/b0; bb[0] = d0/b0; + for(long i=1;i<=j;i++) + { + register long ii=i1+j1-di*i, dd=d1+j1-di*i; + dual a=A->vcthr(ii),b=B->vcthr(ii),c=C->vcthr(ii); + dual d=difr?-a*D->vcthr(dd+di)+(2.-b)*D->vcthr(dd)-c*D->vcthr(dd-di):D->vcthr(dd); + aa[i] = -c/(b+a*aa[i-1]); + bb[i] = (d-a*bb[i-1])/(b+a*aa[i-1]); + } + uu[j1+n*(n-1)-di*(j-1)] = bb[j]; + for(long i=j-1;i>=0;i--) + uu[j1+n*(n-1)-di*i] = bb[i]+aa[i]*uu[j1+n*(n-1)-di*i-di]; + } +} +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how) +{ + const long nx=D->GetNx(),ny=D->GetNy(),nz=D->GetNz(); + const long nn=nx*ny*nz, np=nx*ny, na=A->GetNN(); + if(B->GetNN()!=na || C->GetNN()!=na) return 0; + mglDataC *r = new mglDataC(nx,ny,nz); + bool per = mglchr(how,'c'); + bool difr = mglchr(how,'d'); + if(mglchr(how,'x') && (na==nn || na==np || na==nx)) +#pragma omp parallel + { + mglDataC T(nx,4); dual *uu=T.a+(per?3:2)*nx; +#pragma omp for collapse(2) + for(long k=0;ka[i+i1] = uu[i]; + } + } + else if(mglchr(how,'y') && (na==nn || na==np || na==ny)) +#pragma omp parallel + { + mglDataC T(ny,4); dual *uu=T.a+(per?3:2)*ny; +#pragma omp for collapse(2) + for(long k=0;ka[j*nx+i0] = uu[j]; + } + } + else if(mglchr(how,'z') && (na==nn || na==nz)) +#pragma omp parallel + { + mglDataC T(nz,4); dual *uu=T.a+(per?3:2)*nz; +#pragma omp for collapse(2) + for(long j=0;ja[k*np+i1] = uu[k]; + } + } + else if(mglchr(how,'h') && ny==nx && (na==nn || na==np) && nx>1) +#pragma omp parallel + { + mglDataC T(np,2); +#pragma omp for + for(long k=0;ka+k*np, T.a+np, np*sizeof(dual)); + } + } + else { delete r; r=0; } + return r; +} +//----------------------------------------------------------------------------- +uintptr_t MGL_EXPORT mgl_datac_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int l) +{ char *s=new char[l+1]; memcpy(s,how,l); s[l]=0; + uintptr_t r = uintptr_t(mgl_datac_tridmat(_DA_(A),_DA_(B),_DA_(C),_DA_(D),s)); + delete []s; return r; +} +//----------------------------------------------------------------------------- diff --git a/src/pixel.cpp b/src/pixel.cpp index 82ef44c..60ded14 100644 --- a/src/pixel.cpp +++ b/src/pixel.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * pixel.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -20,6 +20,9 @@ #include #include "mgl2/canvas.h" #include "mgl2/thread.h" +#if MGL_HAVE_OMP +#include +#endif inline mreal get_persp(float pf, float z, float Depth) //{ return (1-pf)/(1-pf*z/Depth); } @@ -46,7 +49,7 @@ void mglCanvas::SetSize(int w,int h,bool clf) #if MGL_HAVE_PTHREAD pthread_mutex_lock(&mutexClf); #elif MGL_HAVE_OMP - omp_set_lock(&lockClf); + omp_set_lock((omp_lock_t*)lockClf); #endif if(G) { delete []G; delete []C; delete []Z; delete []G4;delete []GB;delete []OI; G=0; } G = new unsigned char[s*3]; @@ -60,7 +63,7 @@ void mglCanvas::SetSize(int w,int h,bool clf) #if MGL_HAVE_PTHREAD pthread_mutex_unlock(&mutexClf); #elif MGL_HAVE_OMP - omp_unset_lock(&lockClf); + omp_unset_lock((omp_lock_t*)lockClf); #endif InPlot(0,1,0,1,false); @@ -71,7 +74,7 @@ void mglCanvas::SetSize(int w,int h,bool clf) pthread_mutex_lock(&mutexPnt); pthread_mutex_lock(&mutexClf); #elif MGL_HAVE_OMP - omp_set_lock(&lockClf); + omp_set_lock((omp_lock_t*)lockClf); #endif const long m = long(Prm.size()); double dd = dx>dy?dy:dx; @@ -115,7 +118,7 @@ void mglCanvas::SetSize(int w,int h,bool clf) pthread_mutex_unlock(&mutexClf); pthread_mutex_unlock(&mutexPnt); #elif MGL_HAVE_OMP - omp_unset_lock(&lockClf); + omp_unset_lock((omp_lock_t*)lockClf); #endif ClfZB(); Finish(); } @@ -672,7 +675,7 @@ void mglCanvas::Finish() pthread_mutex_lock(&mutexPnt); pthread_mutex_lock(&mutexClf); #elif MGL_HAVE_OMP - omp_set_lock(&lockClf); + omp_set_lock((omp_lock_t*)lockClf); #endif if(Quality==MGL_DRAW_DOTS) { @@ -706,7 +709,7 @@ void mglCanvas::Finish() pthread_mutex_unlock(&mutexPnt); pthread_mutex_unlock(&mutexPrm); #elif MGL_HAVE_OMP - omp_unset_lock(&lockClf); + omp_unset_lock((omp_lock_t*)lockClf); #endif } //----------------------------------------------------------------------------- @@ -912,7 +915,6 @@ void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) const if(c2[3]) { const register unsigned a1=c1[3], a2=c2[3]; - if(a2==255 || a1==0) { memcpy(c1,c2,4); return; } if((Flag&3)==0) { register unsigned b1=255-a2; @@ -931,10 +933,10 @@ void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) const else if((Flag&3)==2) { register unsigned b1,b2,b3; - b1 = (c1[0]*a1 + c2[0]*a2)/256; c1[0] = b1<255 ? b1 : 255; - b2 = (c1[1]*a1 + c2[1]*a2)/256; c1[1] = b2<255 ? b2 : 255; - b3 = (c1[2]*a1 + c2[2]*a2)/256; c1[2] = b3<255 ? b3 : 255; - c1[3] = a1+a2>255? 255 : a1+a2; + b1 = (c1[0]*a1 + c2[0]*a2)/255; c1[0] = b1<255 ? b1 : 255; + b2 = (c1[1]*a1 + c2[1]*a2)/255; c1[1] = b2<255 ? b2 : 255; + b3 = (c1[2]*a1 + c2[2]*a2)/255; c1[2] = b3<255 ? b3 : 255; + c1[3] = 255; } } } @@ -1193,7 +1195,7 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * if(u<0) v += u*u; else if(u>dd) v += (u-dd)*(u-dd); // if(v>pw*pw) continue; - if(!(pd & ( 1L<dd) v += (u-dd)*(u-dd); // if(v>pw*pw) continue; - if(!(pd & (1L<dd) v += (u-dd)*(u-dd); register float pw=dr->PenWidth, dpw=3*pen_delta; if(dr->ObjId==HighId) { pw *= 2; dpw=2*pen_delta; } - if(v>pw*pw || !(dr->PDef & ( 1L<pPos+u/pw/1.5, 16)) ) )) return; + if(v>pw*pw || !(dr->PDef & ( (uint64_t)1<pPos+u/pw/1.5, 16)) ) )) return; mglPnt p(p1+d*(u/dd)); unsigned char r[4]; col2int(p,r,dr->ObjId); diff --git a/src/plot.cpp b/src/plot.cpp index 4226c31..30dc6bc 100644 --- a/src/plot.cpp +++ b/src/plot.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * plot.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -752,12 +752,13 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) { long m,n=y->GetNx(), pal; - if(mgl_check_dim1(gr,x,y,0,0,"Step")) return; + if(mgl_check_dim1(gr,x,y,0,0,"Step",true)) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Step",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); bool sh = mglchr(pen,'!'); + bool same = x->GetNx()==n; mreal zVal =gr->AdjustZMin(); char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); @@ -767,21 +768,33 @@ void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char if(gr->NeedStop()) break; long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; gr->NextColor(pal); - long n1 = gr->AddPnt(mglPoint(x->v(0,mx), y->v(0,my), zVal)); + mreal xx = x->v(0,mx); + long n1 = gr->AddPnt(mglPoint(same?xx:(xx+x->v(1,mx))/2, y->v(0,my), zVal)); if(mk) gr->mark_plot(n1,mk); + if(!same) n1 = gr->AddPnt(mglPoint(xx, y->v(0,my), zVal)); for(long i=1;iv(i,mx), y->v(i-1,my), zVal); + xx = x->v(i,mx); + p.Set(xx, y->v(i-1,my), zVal); mreal c = sh ? gr->NextColor(pal,i):gr->CDef; n1 = gr->AddPnt(p,c); gr->line_plot(n1,n2); if(i==1) gr->arrow_plot(n2,n1,gr->Arrow1); n2 = n1; // vertical p.y = y->v(i,my); n1 = gr->AddPnt(p,c); - if(mk) gr->mark_plot(n1,mk); gr->line_plot(n1,n2); - if(i==n-1) gr->arrow_plot(n1,n2,gr->Arrow2); + if(same && i==n-1) gr->arrow_plot(n1,n2,gr->Arrow2); + long nn = n1; + if(!same) nn = gr->AddPnt(mglPoint((xx+x->v(i+1,mx))/2, y->v(i,my), zVal)); + if(mk) gr->mark_plot(nn,mk); + } + if(!same) + { + p.Set(x->v(n,mx), y->v(n-1,my), zVal); + mreal c = sh ? gr->NextColor(pal,n-1):gr->CDef; + long n2 = gr->AddPnt(p,c); gr->line_plot(n1,n2); + gr->arrow_plot(n2,n1,gr->Arrow2); } } gr->EndGroup(); diff --git a/src/prc.cpp b/src/prc.cpp index 05496fb..e93dc02 100644 --- a/src/prc.cpp +++ b/src/prc.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * prc.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/prc/PRC.h b/src/prc/PRC.h index 78ee1bd..2cfb92f 100644 --- a/src/prc/PRC.h +++ b/src/prc/PRC.h @@ -18,6 +18,8 @@ typedef unsigned long uint32_t; #include #endif // _MSC_VER +#include + //const uint32_t PRCVersion=7094; // For Adobe Reader 8 or later const uint32_t PRCVersion=8137; // For Adobe Reader 9 or later diff --git a/src/prim.cpp b/src/prim.cpp index ec80c87..efec6be 100644 --- a/src/prim.cpp +++ b/src/prim.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * prim.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/s_hull/s_hull_pro.h b/src/s_hull/s_hull_pro.h index f9bb418..2e632ec 100644 --- a/src/s_hull/s_hull_pro.h +++ b/src/s_hull/s_hull_pro.h @@ -7,6 +7,7 @@ #include #include #include +#include /* for use in s_hull_pro.cpp diff --git a/src/surf.cpp b/src/surf.cpp index 288569d..70bc15d 100644 --- a/src/surf.cpp +++ b/src/surf.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * surf.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/src/tex_table.cc b/src/tex_table.cc index 6f277e6..86deba2 100644 --- a/src/tex_table.cc +++ b/src/tex_table.cc @@ -20,8 +20,8 @@ #include "mgl2/font.h" /// Table of LaTeX symbols and its UTF8 codes. This array MUST BE sorted!!! -MGL_EXPORT long mgl_tex_num=1924; -MGL_EXPORT mglTeXsymb mgl_tex_symb[] = { +const size_t mgl_tex_num=1924; +const mglTeXsymb mgl_tex_symb[] = { {0x23, L"#"}, {0x25, L"%"}, {0x26, L"&"}, diff --git a/src/vect.cpp b/src/vect.cpp index 9ef80fa..ae98f7c 100644 --- a/src/vect.cpp +++ b/src/vect.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * vect.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -498,23 +498,24 @@ void MGL_EXPORT mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_ // Flow 2d series // //----------------------------------------------------------------------------- -void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, long ss, bool vv) +void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, HCDT x, HCDT y, HCDT ax, HCDT ay, long ss, bool vv) { - long n=100*(ax.nx+ax.ny); - bool nboth = x.nx*x.ny!=ax.nx*ax.ny || y.nx*y.ny!=ax.nx*ax.ny; + long n=100*(ax->GetNx()+ax->GetNy()); + bool nboth = x->GetNx()*x->GetNy()!=ax->GetNx()*ax->GetNy() || y->GetNx()*y->GetNy()!=ax->GetNx()*ax->GetNy(); mglPoint *pp = new mglPoint[n], dp; mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z)); - mglPoint nx(ax.nx,ax.ny); + mglPoint nx(ax->GetNx(),ax->GetNy()); - mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2,acc=dt/20; + mreal dt = 0.5/(ax->GetNx() > ax->GetNy() ? ax->GetNx() : ax->GetNy()); + mreal e,f,g,ff[4],gg[4],h,s=2,acc=dt/20; if(u<0 || v<0) { dt = -dt; u = -u; v = -v; s *= -1;} long k=0; bool end = false; if(nboth) do{ mglPoint dif; - pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x; - pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x; + pp[k].x = x->Spline1(dif,u,0,0); f = ax->Spline1(u,v,0)/dif.x; + pp[k].y = y->Spline1(dif,v,0,0); g = ay->Spline1(u,v,0)/dif.x; pp[k].z = zVal; if(mgl_isbad(f+g)) break; else for(long m=0;mSpline1(dif,e,0,0); f = ax->Spline1(e,h,0)/dif.x; + y->Spline1(dif,h,0,0); g = ay->Spline1(e,h,0)/dif.x; h = 1+hypot(f,g); ff[1]=f*dt/h; gg[1]=g*dt/h; e = u+ff[1]/2; h = v+gg[1]/2; - x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; - y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + x->Spline1(dif,e,0,0); f = ax->Spline1(e,h,0)/dif.x; + y->Spline1(dif,h,0,0); g = ay->Spline1(e,h,0)/dif.x; h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; e = u+ff[2]; h = v+gg[2]; - x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; - y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + x->Spline1(dif,e,0,0); f = ax->Spline1(e,h,0)/dif.x; + y->Spline1(dif,h,0,0); g = ay->Spline1(e,h,0)/dif.x; h = 1+hypot(f,g); ff[3]=f*dt/h; gg[3]=g*dt/h; u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6; @@ -544,9 +545,9 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD else do{ mglPoint dif; register mreal xu,xv,yu,yv,det,xx,yy; - pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x; xv=dif.y; - pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0); + pp[k].x = x->Spline1(dif,u,v,0); xu=dif.x; xv=dif.y; + pp[k].y = y->Spline1(dif,u,v,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(u,v,0); yy = ay->Spline1(u,v,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; pp[k].z = zVal; if(mgl_isbad(f+g)) break; @@ -558,21 +559,21 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD // find next point by midpoint method h+=1; ff[0]=f*dt/h; gg[0]=g*dt/h; e = u+ff[0]/2; h = v+gg[0]/2; - x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; - y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + x->Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y->Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(e,h,0); yy = ay->Spline1(e,h,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; h = 1+hypot(f,g); ff[1]=f*dt/h; gg[1]=g*dt/h; e = u+ff[1]/2; h = v+gg[1]/2; - x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; - y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + x->Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y->Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(e,h,0); yy = ay->Spline1(e,h,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; e = u+ff[2]; h = v+gg[2]; - x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; - y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + x->Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y->Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(e,h,0); yy = ay->Spline1(e,h,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; h = 1+hypot(f,g); ff[3]=f*dt/h; gg[3]=g*dt/h; u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; @@ -583,7 +584,7 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD if(k>1) { long j,a=long(0.3*gr->GetArrowSize()/fabs(dt)); - gr->Reserve(k); j = gr->AddPnt(pp[0],pp[0].c); + gr->Reserve(k); j = gr->AddPnt(pp[0],pp[0].c); for(long i=1;iAddPnt(pp[i],pp[i].c); @@ -611,32 +612,42 @@ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha // allocate memory mreal zVal = gr->Min.z; bool cnt=!mglchr(sch,'#'); - mglData xx(x), yy(y), bx(ax), by(ay); + std::vector u, v; + if(mglchr(sch,'*')) for(long i=0;iGetNz();k++) { if(gr->NeedStop()) break; if(ax->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); - for(long i=0;iNeedStop()) { i=num; s=2; continue; } - u = 0; v = (i+1.)/(num+1.); - flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv); - u = 1; v = (i+1.)/(num+1.); - flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv); - u = (i+1.)/(num+1.); v = 0; - flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv); - u = (i+1.)/(num+1.); v = 1; - flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv); - if(cnt) - { - u = 0.5; v = (i+1.)/(num+1.); - flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv); - u = (i+1.)/(num+1.); v = 0.5; - flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv); - } - } + HMDT bx=mgl_data_subdata(ax,-1,-1,k), by=mgl_data_subdata(ay,-1,-1,k); +#pragma omp parallel for + for(long i=0;iNeedStop()) + flow(gr, zVal, u[i], v[i], x, y, bx, by,ss,vv); + mgl_delete_data(bx); mgl_delete_data(by); } gr->EndGroup(); } @@ -701,8 +712,7 @@ void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, H v = (j0-(dxu*dy-dx*dyu)/d)/m; } } - mglData xx(x), yy(y), bx(ax), by(ay); - flow(gr, z0, u, v, xx, yy, bx, by,ss,vv); + flow(gr, z0, u, v, x, y, ax, ay,ss,vv); gr->EndGroup(); } //----------------------------------------------------------------------------- @@ -729,17 +739,17 @@ void MGL_EXPORT mgl_flowp_2d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, ui // Flow 3d series // //----------------------------------------------------------------------------- -void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az,long ss,bool vv, bool xo, bool zo) +void flow(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az,long ss,bool vv, bool xo, bool zo) { - static long n=100*(ax.nx+ax.ny+ax.nz); - long nn = ax.nx*ax.ny*ax.nz; - bool nboth = x.nx*x.ny*x.nz!=nn || y.nx*y.ny*y.nz!=nn || z.nx*z.ny*z.nz!=nn; + static long n=100*(ax->GetNx()+ax->GetNy()+ax->GetNz()); + long nn = ax->GetNN(); + bool nboth = x->GetNN()!=nn || y->GetNN()!=nn || z->GetNN()!=nn; mglPoint *pp = new mglPoint[n], dp; mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z)); - mglPoint nx(ax.nx,ax.ny,ax.nz); + mglPoint nx(ax->GetNx(),ax->GetNy(),ax->GetNz()); - nn = (ax.nx > ax.ny ? ax.nx : ax.ny); - nn = (nn > ax.nz ? nn : ax.nz); + nn = (ax->GetNx() > ax->GetNy() ? ax->GetNz() : ax->GetNy()); + nn = (nn > ax->GetNz() ? nn : ax->GetNz()); mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1,acc=dt/20; if(u<0 || v<0 || w<0) { dt = -dt; u = -u; v = -v; w = -w; s *= -1;} @@ -747,9 +757,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl bool end = false; if(nboth) do{ mglPoint dif; - pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x; - pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x; - pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x; + pp[k].x = x->Spline1(dif,u,0,0); e = ax->Spline1(u,v,w)/dif.x; + pp[k].y = y->Spline1(dif,v,0,0); f = ay->Spline1(u,v,w)/dif.x; + pp[k].z = z->Spline1(dif,w,0,0); g = az->Spline1(u,v,w)/dif.x; if(mgl_isbad(e+f+g)) end = true; else for(long m=0;mSpline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x; + y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x; + z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x; h = 1+sqrt(e*e+f*f+g*g); ee[1]=e*dt/h; ff[1]=f*dt/h; gg[1]=g*dt/h; u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2; - x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; - y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; - z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x; + y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x; + z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x; h = 1+sqrt(e*e+f*f+g*g); ee[2]=e*dt/h; ff[2]=f*dt/h; gg[2]=g*dt/h; u1 = u+ee[2]; v1 = v+ff[2]; w1 = w+gg[2]; - x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; - y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; - z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x; + y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x; + z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x; h = 1+sqrt(e*e+f*f+g*g); ee[3]=e*dt/h; ff[3]=f*dt/h; gg[3]=g*dt/h; u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6; @@ -786,10 +796,10 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl else do{ mglPoint dif; register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz; - pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x; xv=dif.y; xw=dif.z; - pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x; yv=dif.y; yw=dif.z; - pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x; zv=dif.y; zw=dif.z; - xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w); + pp[k].x = x->Spline1(dif,u,v,w); xu=dif.x; xv=dif.y; xw=dif.z; + pp[k].y = y->Spline1(dif,u,v,w); yu=dif.x; yv=dif.y; yw=dif.z; + pp[k].z = z->Spline1(dif,u,v,w); zu=dif.x; zv=dif.y; zw=dif.z; + xx = ax->Spline1(u,v,w); yy = ay->Spline1(u,v,w); zz = az->Spline1(u,v,w); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -804,9 +814,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl // find next point by midpoint method h+=1; ee[0]=e*dt/h; ff[0]=f*dt/h; gg[0]=g*dt/h; u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2; - x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); - y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); - z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + x->Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax->Spline1(u1,v1,w1); + y->Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay->Spline1(u1,v1,w1); + z->Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az->Spline1(u1,v1,w1); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -814,9 +824,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl h = 1+sqrt(e*e+f*f+g*g); ee[1]=e*dt/h; ff[1]=f*dt/h; gg[1]=g*dt/h; u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2; - x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); - y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); - z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + x->Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax->Spline1(u1,v1,w1); + y->Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay->Spline1(u1,v1,w1); + z->Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az->Spline1(u1,v1,w1); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -824,9 +834,9 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl h = 1+sqrt(e*e+f*f+g*g); ee[2]=e*dt/h; ff[2]=f*dt/h; gg[2]=g*dt/h; u1 = u+ee[2]; v1 = v+ff[2]; w1 = w+gg[2]; - x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); - y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); - z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + x->Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax->Spline1(u1,v1,w1); + y->Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay->Spline1(u1,v1,w1); + z->Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az->Spline1(u1,v1,w1); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -885,33 +895,37 @@ void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, long ss = gr->AddTexture(sch); bool vv = mglchr(sch,'v'), xo = mglchr(sch,'x'), zo = mglchr(sch,'z'); - mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); - for(long i=0;i u, v, w; + for(long i=0;iNeedStop()) { i=j=num; s=2; continue; } - u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 0; - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); - u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 1; - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); - u = 0; v = (j+1.)/(num+1.); w = (i+1.)/(num+1.); - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); - u = 1; v = (j+1.)/(num+1.); w = (i+1.)/(num+1.); - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); - u = (i+1.)/(num+1.); v = 0; w = (j+1.)/(num+1.); - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); - u = (i+1.)/(num+1.); v = 1; w = (j+1.)/(num+1.); - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); + mreal t = (i+1.)/(num+1.), s = (j+1.)/(num+1.); + u.push_back(t); v.push_back(s); w.push_back(0); + u.push_back(-t); v.push_back(-s); w.push_back(0); + u.push_back(t); v.push_back(s); w.push_back(1); + u.push_back(-t); v.push_back(-s); w.push_back(-1); + + u.push_back(t); v.push_back(0); w.push_back(s); + u.push_back(-t); v.push_back(0); w.push_back(-s); + u.push_back(t); v.push_back(1); w.push_back(s); + u.push_back(-t); v.push_back(-1); w.push_back(-s); + + u.push_back(0); v.push_back(s); w.push_back(t); + u.push_back(0); v.push_back(-s); w.push_back(-t); + u.push_back(1); v.push_back(s); w.push_back(t); + u.push_back(-1); v.push_back(-s); w.push_back(-t); if(cnt) { - u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 0.5; - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); - u = 0.5; v = (j+1.)/(num+1.); w = (i+1.)/(num+1.); - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); - u = (i+1.)/(num+1.); v = 0.5; w = (j+1.)/(num+1.); - flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); + u.push_back(t); v.push_back(s); w.push_back(0.5); + u.push_back(-t); v.push_back(-s); w.push_back(-0.5); + u.push_back(t); v.push_back(0.5); w.push_back(s); + u.push_back(-t); v.push_back(-0.5); w.push_back(-s); + u.push_back(0.5); v.push_back(s); w.push_back(t); + u.push_back(-0.5); v.push_back(-s); w.push_back(-t); } } +#pragma omp parallel for + for(long i=0;iNeedStop()) + flow(gr, u[i], v[i], w[i], x, y, z, ax, ay, az,ss,vv,xo,zo); gr->EndGroup(); } //----------------------------------------------------------------------------- @@ -984,8 +998,7 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, w = (i0+(dx*(dyv*dzu-dyu*dzv)+dxu*(dy*dzv-dyv*dz)+dxv*(dyu*dz-dy*dzu))/d)/l; } } - mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); - flow(gr, u, v, w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); + flow(gr, u, v, w, x, y, z, ax, ay, az,ss,vv,xo,zo); gr->EndGroup(); } //----------------------------------------------------------------------------- @@ -1075,25 +1088,25 @@ void MGL_EXPORT mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const c // Pipe 2d series // //----------------------------------------------------------------------------- -void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, double r0,long sc) +void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, HCDT x, HCDT y, HCDT ax, HCDT ay, double r0,long sc) { - long n=100*(ax.nx+ax.ny); - bool nboth = x.nx*x.ny!=ax.nx*ax.ny || y.nx*y.ny!=ax.nx*ax.ny; + long n=100*(ax->GetNx()+ax->GetNy()); + bool nboth = x->GetNx()*x->GetNy()!=ax->GetNx()*ax->GetNy() || y->GetNx()*y->GetNy()!=ax->GetNx()*ax->GetNy(); mglPoint *pp = new mglPoint[n], dp; mreal *cc = new mreal[n]; mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z)); - mglPoint nx(ax.nx,ax.ny); + mglPoint nx(ax->GetNx(),ax->GetNy()); - mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2,acc=dt/20; + mreal dt = 0.5/(ax->GetNx() > ax->GetNy() ? ax->GetNx() : ax->GetNy()),e,f,g,ff[4],gg[4],h,s=2,acc=dt/20; mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2); if(u<0 || v<0) { dt = -dt; u = -u; v = -v; s *= -1;} long k=0; bool end = false; if(nboth) do{ mglPoint dif; - pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x; - pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x; + pp[k].x = x->Spline1(dif,u,0,0); f = ax->Spline1(u,v,0)/dif.x; + pp[k].y = y->Spline1(dif,v,0,0); g = ay->Spline1(u,v,0)/dif.x; pp[k].z = zVal; if(mgl_isbad(f+g)) end = true; else for(long m=0;mSpline1(dif,e,0,0); f = ax->Spline1(e,h,0)/dif.x; + y->Spline1(dif,h,0,0); g = ay->Spline1(e,h,0)/dif.x; h = 1+hypot(f,g); ff[1]=f*dt/h; gg[1]=g*dt/h; e = u+ff[1]/2; h = v+gg[1]/2; - x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; - y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + x->Spline1(dif,e,0,0); f = ax->Spline1(e,h,0)/dif.x; + y->Spline1(dif,h,0,0); g = ay->Spline1(e,h,0)/dif.x; h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; e = u+ff[2]; h = v+gg[2]; - x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; - y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + x->Spline1(dif,e,0,0); f = ax->Spline1(e,h,0)/dif.x; + y->Spline1(dif,h,0,0); g = ay->Spline1(e,h,0)/dif.x; h = 1+hypot(f,g); ff[3]=f*dt/h; gg[3]=g*dt/h; u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6; @@ -1125,9 +1138,9 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl else do{ mglPoint dif; register mreal xu,xv,yu,yv,det,xx,yy; - pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x; xv=dif.y; - pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0); + pp[k].x = x->Spline1(dif,u,v,0); xu=dif.x; xv=dif.y; + pp[k].y = y->Spline1(dif,u,v,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(u,v,0); yy = ay->Spline1(u,v,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; pp[k].z = zVal; if(mgl_isbad(f+g)) end = true; @@ -1141,21 +1154,21 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl // find next point by midpoint method h+=1; ff[0]=f*dt/h; gg[0]=g*dt/h; e = u+ff[0]/2; h = v+gg[0]/2; - x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; - y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + x->Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y->Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(e,h,0); yy = ay->Spline1(e,h,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; h = 1+hypot(f,g); ff[1]=f*dt/h; gg[1]=g*dt/h; e = u+ff[1]/2; h = v+gg[1]/2; - x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; - y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + x->Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y->Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(e,h,0); yy = ay->Spline1(e,h,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; e = u+ff[2]; h = v+gg[2]; - x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; - y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; - xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + x->Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y->Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax->Spline1(e,h,0); yy = ay->Spline1(e,h,0); det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; h = 1+hypot(f,g); ff[3]=f*dt/h; gg[3]=g*dt/h; u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; @@ -1216,31 +1229,41 @@ void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha bool cnt=!mglchr(sch,'#'); if(mglchr(sch,'i')) r0 = -fabs(r0); - mglData xx(x), yy(y), bx(ax), by(ay); + std::vector u, v; + if(mglchr(sch,'*')) for(long i=0;iGetNz();k++) { if(gr->NeedStop()) break; if(ax->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); - for(long i=0;iNeedStop()) { i=num; s=2; continue; } - u = 0; v = (i+1.)/(num+1.); - flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss); - u = 1; v = (i+1.)/(num+1.); - flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss); - u = (i+1.)/(num+1.); v = 0; - flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss); - u = (i+1.)/(num+1.); v = 1; - flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss); - if(cnt) - { - u = 0.5; v = (i+1.)/(num+1.); - flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss); - u = (i+1.)/(num+1.); v = 0.5; - flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss); - } - } + HMDT bx=mgl_data_subdata(ax,-1,-1,k), by=mgl_data_subdata(ay,-1,-1,k); +#pragma omp parallel for + for(long i=0;iNeedStop()) + flowr(gr, zVal, u[i], v[i], x, y, bx, by,r0,ss); + mgl_delete_data(bx); mgl_delete_data(by); } gr->EndGroup(); } @@ -1267,18 +1290,18 @@ void MGL_EXPORT mgl_pipe_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const // Pipe 3d series // //----------------------------------------------------------------------------- -void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mglData &y, const mglData &z, const mglData &ax, const mglData &ay, const mglData &az, double r0,long sc) +void flowr(mglBase *gr, double u, double v, double w, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, double r0,long sc) { - static long n=100*(ax.nx+ax.ny+ax.nz); - long nn = ax.nx*ax.ny*ax.nz; - bool nboth = x.nx*x.ny*x.nz!=nn || y.nx*y.ny*y.nz!=nn || z.nx*z.ny*z.nz!=nn; + static long n=100*(ax->GetNx()+ax->GetNy()+ax->GetNz()); + long nn = ax->GetNN(); + bool nboth = x->GetNN()!=nn || y->GetNN()!=nn || z->GetNN()!=nn; mglPoint *pp = new mglPoint[n], dp; mreal *cc = new mreal[n]; mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z)); - mglPoint nx(ax.nx,ax.ny,ax.nz); + mglPoint nx(ax->GetNx(),ax->GetNy(),ax->GetNz()); - nn = (ax.nx > ax.ny ? ax.nx : ax.ny); - nn = (nn > ax.nz ? nn : ax.nz); + nn = (ax->GetNx() > ax->GetNy() ? ax->GetNx() : ax->GetNy()); + nn = (nn > ax->GetNz() ? nn : ax->GetNz()); mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1,acc=dt/20; mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2); @@ -1288,9 +1311,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg bool end = false; if(nboth) do{ mglPoint dif; - pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x; - pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x; - pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x; + pp[k].x = x->Spline1(dif,u,0,0); e = ax->Spline1(u,v,w)/dif.x; + pp[k].y = y->Spline1(dif,v,0,0); f = ay->Spline1(u,v,w)/dif.x; + pp[k].z = z->Spline1(dif,w,0,0); g = az->Spline1(u,v,w)/dif.x; if(mgl_isbad(e+f+g)) end = true; else for(long m=0;mSpline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x; + y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x; + z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x; h = 1+sqrt(e*e+f*f+g*g); ee[1]=e*dt/h; ff[1]=f*dt/h; gg[1]=g*dt/h; u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2; - x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; - y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; - z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x; + y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x; + z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x; h = 1+sqrt(e*e+f*f+g*g); ee[2]=e*dt/h; ff[2]=f*dt/h; gg[2]=g*dt/h; u1 = u+ee[2]; v1 = v+ff[2]; w1 = w+gg[2]; - x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; - y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; - z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + x->Spline1(dif,u1,0,0); e = ax->Spline1(u1,v1,w1)/dif.x; + y->Spline1(dif,v1,0,0); f = ay->Spline1(u1,v1,w1)/dif.x; + z->Spline1(dif,w1,0,0); g = az->Spline1(u1,v1,w1)/dif.x; h = 1+sqrt(e*e+f*f+g*g); ee[3]=e*dt/h; ff[3]=f*dt/h; gg[3]=g*dt/h; u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6; @@ -1328,10 +1351,10 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg else do{ mglPoint dif; register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz; - pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x; xv=dif.y; xw=dif.z; - pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x; yv=dif.y; yw=dif.z; - pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x; zv=dif.y; zw=dif.z; - xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w); + pp[k].x = x->Spline1(dif,u,v,w); xu=dif.x; xv=dif.y; xw=dif.z; + pp[k].y = y->Spline1(dif,u,v,w); yu=dif.x; yv=dif.y; yw=dif.z; + pp[k].z = z->Spline1(dif,u,v,w); zu=dif.x; zv=dif.y; zw=dif.z; + xx = ax->Spline1(u,v,w); yy = ay->Spline1(u,v,w); zz = az->Spline1(u,v,w); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -1347,9 +1370,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg // find next point by midpoint method h+=1; ee[0]=e*dt/h; ff[0]=f*dt/h; gg[0]=g*dt/h; u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2; - x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); - y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); - z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + x->Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax->Spline1(u1,v1,w1); + y->Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay->Spline1(u1,v1,w1); + z->Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az->Spline1(u1,v1,w1); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -1357,9 +1380,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg h = 1+sqrt(e*e+f*f+g*g); ee[1]=e*dt/h; ff[1]=f*dt/h; gg[1]=g*dt/h; u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2; - x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); - y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); - z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + x->Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax->Spline1(u1,v1,w1); + y->Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay->Spline1(u1,v1,w1); + z->Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az->Spline1(u1,v1,w1); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -1367,9 +1390,9 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg h = 1+sqrt(e*e+f*f+g*g); ee[2]=e*dt/h; ff[2]=f*dt/h; gg[2]=g*dt/h; u1 = u+ee[2]; v1 = v+ff[2]; w1 = w+gg[2]; - x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); - y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); - z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + x->Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax->Spline1(u1,v1,w1); + y->Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay->Spline1(u1,v1,w1); + z->Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az->Spline1(u1,v1,w1); det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; @@ -1433,33 +1456,37 @@ void MGL_EXPORT mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, long ss = gr->AddTexture(sch); bool cnt=!mglchr(sch,'#'); - mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); - for(long i=0;i u, v, w; + for(long i=0;iNeedStop()) { i=j=num; s=2; continue; } - u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 0; - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); - u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 1; - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); - u = 0; v = (j+1.)/(num+1.); w = (i+1.)/(num+1.); - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); - u = 1; v = (j+1.)/(num+1.); w = (i+1.)/(num+1.); - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); - u = (i+1.)/(num+1.); v = 0; w = (j+1.)/(num+1.); - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); - u = (i+1.)/(num+1.); v = 1; w = (j+1.)/(num+1.); - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); + mreal t = (i+1.)/(num+1.), s = (j+1.)/(num+1.); + u.push_back(t); v.push_back(s); w.push_back(0); + u.push_back(-t); v.push_back(-s); w.push_back(0); + u.push_back(t); v.push_back(s); w.push_back(1); + u.push_back(-t); v.push_back(-s); w.push_back(-1); + + u.push_back(t); v.push_back(0); w.push_back(s); + u.push_back(-t); v.push_back(0); w.push_back(-s); + u.push_back(t); v.push_back(1); w.push_back(s); + u.push_back(-t); v.push_back(-1); w.push_back(-s); + + u.push_back(0); v.push_back(s); w.push_back(t); + u.push_back(0); v.push_back(-s); w.push_back(-t); + u.push_back(1); v.push_back(s); w.push_back(t); + u.push_back(-1); v.push_back(-s); w.push_back(-t); if(cnt) { - u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 0.5; - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); - u = 0.5; v = (j+1.)/(num+1.); w = (i+1.)/(num+1.); - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); - u = (i+1.)/(num+1.); v = 0.5; w = (j+1.)/(num+1.); - flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); + u.push_back(t); v.push_back(s); w.push_back(0.5); + u.push_back(-t); v.push_back(-s); w.push_back(-0.5); + u.push_back(t); v.push_back(0.5); w.push_back(s); + u.push_back(-t); v.push_back(-0.5); w.push_back(-s); + u.push_back(0.5); v.push_back(s); w.push_back(t); + u.push_back(-0.5); v.push_back(-s); w.push_back(-t); } } +#pragma omp parallel for + for(long i=0;iNeedStop()) + flowr(gr, u[i], v[i], w[i], x, y, z, ax, ay, az,r0,ss); gr->EndGroup(); } //----------------------------------------------------------------------------- diff --git a/src/volume.cpp b/src/volume.cpp index a6090a5..f34bb68 100644 --- a/src/volume.cpp +++ b/src/volume.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * surf.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -22,7 +22,6 @@ #include "mgl2/data.h" #include "mgl2/eval.h" #include "mgl2/base.h" -//#include //----------------------------------------------------------------------------- // // CloudQ series @@ -108,6 +107,21 @@ void MGL_EXPORT mgl_cloud_(uintptr_t *gr, uintptr_t *a, const char *sch, const c // Surf3 series // //----------------------------------------------------------------------------- +mreal MGL_NO_EXPORT mgl_get_norm(mreal x, mreal d1, mreal d2, mreal d3) +{ + mreal nx = d1*(1-x) + d2*x; + if(mgl_isbad(nx)) + { + nx = d1*(1+x) - d3*x; + if(mgl_isbad(nx)) + { + if(mgl_isfin(d1)) nx = d1; + if(mgl_isfin(d2)) nx = d2; + if(mgl_isfin(d3)) nx = d3; + } + } + return nx; +} mglPoint MGL_NO_EXPORT mgl_normal_3d(HCDT a, mglPoint p, bool inv, long n,long m,long l) { register long i,j,k; @@ -117,18 +131,17 @@ mglPoint MGL_NO_EXPORT mgl_normal_3d(HCDT a, mglPoint p, bool inv, long n,long m i = idvx(i,j,k)*(1-x) + a->dvx(i+1,j,k)*x; - ny = a->dvy(i,j,k)*(1-y) + a->dvy(i,j+1,k)*y; - nz = a->dvz(i,j,k)*(1-z) + a->dvz(i,j,k+1)*z; + nx = mgl_get_norm(x, a->dvx(i,j,k), a->dvx(i+1,j,k), i>0?a->dvx(i-1,j,k):NAN); + ny = mgl_get_norm(y, a->dvy(i,j,k), a->dvy(i,j+1,k), j>0?a->dvy(i,j-1,k):NAN); + nz = mgl_get_norm(z, a->dvz(i,j,k), a->dvz(i,j,k+1), k>0?a->dvz(i,j,k-1):NAN); return inv ? mglPoint(nx,ny,nz) : mglPoint(-nx,-ny,-nz); } //----------------------------------------------------------------------------- -mreal MGL_NO_EXPORT mgl_normal_1d(HCDT a, mreal x, bool inv, long n) +mreal MGL_NO_EXPORT mgl_normal_1d(HCDT a, mreal x, long n) { - register long i=long(x); x-=i; - mreal nx = a->dvx(i); - if(idvx(i+1)*x; - return inv ? nx : -nx; + register long i=long(x); + i = idvx(i), a->dvx(i+1), i>0?a->dvx(i-1):NAN); } //----------------------------------------------------------------------------- mglPoint MGL_NO_EXPORT mgl_find_norm(bool nboth, HCDT x, HCDT y, HCDT z, HCDT a, mglPoint u, bool inv, long n,long m,long l) @@ -136,9 +149,9 @@ mglPoint MGL_NO_EXPORT mgl_find_norm(bool nboth, HCDT x, HCDT y, HCDT z, HCDT a, mglPoint s = mgl_normal_3d(a,u,inv,n,m,l), t, q; if(nboth) { - q.x = s.x/mgl_normal_1d(x,u.x,true,n); - q.y = s.y/mgl_normal_1d(y,u.y,true,m); - q.z = s.z/mgl_normal_1d(z,u.z,true,l); + q.x = s.x/mgl_normal_1d(x,u.x,n); + q.y = s.y/mgl_normal_1d(y,u.y,m); + q.z = s.z/mgl_normal_1d(z,u.z,l); } else { @@ -262,6 +275,7 @@ void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z, { register long i1 = i+n*j; mreal a0 = a->v(i,j,k); + if(mgl_isnan(a0)) continue; if(iv(i+1,j,k)); @@ -275,7 +289,7 @@ void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z, { ky2[i1] = kk.size(); kk.push_back(mglPoint(i,j+d,k)); } } if(k>0) - { + { mreal d = mgl_d(val,a->v(i,j,k-1),a0); if(d>=0 && d<1) { kz[i1] = kk.size(); kk.push_back(mglPoint(i,j,k+d-1)); } @@ -285,36 +299,38 @@ void MGL_NO_EXPORT mgl_surf3ca_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z, if(b && c) for(size_t i=kk1;iAddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : + mreal cc = c->linear(u.x,u.y,u.z), bb = b->linear(u.x,u.y,u.z); + if(mgl_isnan(cc) || mgl_isnan(bb)) u.c = -1; else + u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)), - gr->GetC(ss,c->linear(u.x,u.y,u.z)), - mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), - gr->GetA(b->linear(u.x,u.y,u.z))); + gr->GetC(ss,cc), mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), gr->GetA(bb)); } else if(c) for(size_t i=kk1;iAddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : + mreal cc = c->linear(u.x,u.y,u.z); + if(mgl_isnan(cc)) u.c = -1; else + u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)), - gr->GetC(ss,c->linear(u.x,u.y,u.z)), - mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l)); + gr->GetC(ss,cc), mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l)); } else if(b) for(size_t i=kk1;iAddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : + mreal bb = b->linear(u.x,u.y,u.z); + if(mgl_isnan(bb)) u.c = -1; else + u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)), - cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), - gr->GetA(b->linear(u.x,u.y,u.z))); + cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), gr->GetA(bb)); } else for(size_t i=kk1;iAddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : + u.c = gr->AddPnt(nboth ? mglPoint(x->linear(u.x,0,0),y->linear(u.y,0,0),z->linear(u.z,0,0)) : mglPoint(x->linear(u.x,u.y,u.z),y->linear(u.x,u.y,u.z),z->linear(u.x,u.y,u.z)), cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l)); } - + if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire); } delete []kx1; delete []kx2; delete []ky1; @@ -408,20 +424,21 @@ void MGL_EXPORT mgl_surf3a_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, long num = mgl_isnan(r)?3:long(r+0.5); if(b->GetNx()==num && b->GetNy()==1 && b->GetNz()==1) { - mreal v,a0=gr->AlphaDef; + mreal a0=gr->AlphaDef; for(long i=0;iMax.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1); + mreal v = gr->Max.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1); gr->AlphaDef = gr->GetA(b->v(i)); mgl_surf3_xyz_val(gr,v,x,y,z,a,sch,0); } gr->AlphaDef = a0; } - else for(long i=0;iMax.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1); - mgl_surf3a_xyz_val(gr,v,x,y,z,a,b,sch,0); - } + else + for(long i=0;iMax.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1); + mgl_surf3a_xyz_val(gr,v,x,y,z,a,b,sch,0); + } gr->LoadState(); } //----------------------------------------------------------------------------- @@ -604,50 +621,43 @@ void MGL_EXPORT mgl_beam_val(HMGL gr, double val, HCDT tr, HCDT g1, HCDT g2, HCD if(tr->GetNx()<3 || tr->GetNy()GetNx()<3 || g1->GetNy()GetNx()<3 || g2->GetNy()SetWarn(mglWarnDim,"Beam"); return; } mglData x(a),y(a),z(a),b(a); - register long i,j,k,i0; mreal asum0=1; r = fabs(r); - if(flag & 4) for(j=0;jvthr(j)*a->vthr(j); + if(flag & 4) for(long j=0;jvthr(j)*a->vthr(j); if(asum0==0) { gr->SetWarn(mglWarnZero,"Beam"); return; } - for(i=0;iNeedStop()) break; + if(gr->NeedStop()) continue; if(flag & 4) { mreal asum=0, amax=0; - for(j=0;jvthr(j+m*l*i); asum += aa*aa; amax = amax>aa ? amax : aa; } amax = amax?sqrt(asum/asum0)/amax:0; -#pragma omp parallel for - for(j=0;jMax.z*i/(n-1.); + } + else for(long j=0;jv(0,i) + g1->v(0,i)*(2*j/(m-1.)-1)*r + g2->v(0,i)*(2*k/(l-1.)-1)*r; + y.a[i0] = tr->v(1,i) + g1->v(1,i)*(2*j/(m-1.)-1)*r + g2->v(1,i)*(2*k/(l-1.)-1)*r; + z.a[i0] = tr->v(2,i) + g1->v(2,i)*(2*j/(m-1.)-1)*r + g2->v(2,i)*(2*k/(l-1.)-1)*r; + } + if(flag & 2) for(long j=0;jMax.z*i/(n-1.); - } - else -#pragma omp parallel for collapse(2) - for(j=0;jv(0,i) + g1->v(0,i)*(2*j/(m-1.)-1)*r + g2->v(0,i)*(2*k/(l-1.)-1)*r; - y.a[i0] = tr->v(1,i) + g1->v(1,i)*(2*j/(m-1.)-1)*r + g2->v(1,i)*(2*k/(l-1.)-1)*r; - z.a[i0] = tr->v(2,i) + g1->v(2,i)*(2*j/(m-1.)-1)*r + g2->v(2,i)*(2*k/(l-1.)-1)*r; - } - if(flag & 2) -#pragma omp parallel for collapse(2) - for(j=0;j * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -86,20 +86,24 @@ void mglCanvasWnd::DelFrame(long i) //----------------------------------------------------------------------------- void mglCanvasWnd::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, void (*reload)(void *p)) { - ResetFrames(); - if(get(MGL_CLF_ON_UPD)) DefaultPlotParam(); - const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); - // use frames for quickly redrawing while adding/changing primitives - if(mgl_is_frames(this)) NewFrame(); + if(draw) + { + ResetFrames(); + if(get(MGL_CLF_ON_UPD)) DefaultPlotParam(); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); + // use frames for quickly redrawing while adding/changing primitives + if(mgl_is_frames(this)) NewFrame(); - int n = draw ? draw(this,par) : 0; - if(n=0) NumFig = n; - DrawFunc = draw; FuncPar = par; - LoadFunc = reload; + int n = draw(this,par); + if(n=0) NumFig = n; + DrawFunc = draw; FuncPar = par; + LoadFunc = reload; - if(mgl_is_frames(this)) EndFrame(); - if(n>=0) SetCurFig(0); - setlocale(LC_NUMERIC, loc.c_str()); + if(mgl_is_frames(this)) EndFrame(); + if(n>=0) SetCurFig(0); + setlocale(LC_NUMERIC, loc.c_str()); + } + else LoadFunc = 0; } //----------------------------------------------------------------------------- const unsigned char *mglCanvasWnd::GetBits() diff --git a/texinfo/concept_en.texi b/texinfo/concept_en.texi index c668416..c766a1f 100644 --- a/texinfo/concept_en.texi +++ b/texinfo/concept_en.texi @@ -8,7 +8,7 @@ used for different drawing functions. There are six most general (base) concepts: @enumerate @item -@strong{Any picture is created in memory first.} The internal (memory) representation can be different: bitmap picture (for @code{SetQuality(MGL_DRAW_LMEM)}) or the list of vector primitives (default). After that the user may decide what he/she want: save to file, display on the screen, run animation, do additional editing and so on. This approach assures a high portability of the program -- the source code will produce exactly the same picture in @emph{any} OS. Another big positive consequence is the ability to create the picture in the console program (using command line, without creating a window)! +@strong{Any picture is created in memory first.} The internal (memory) representation can be different: bitmap picture (for @code{SetQuality(MGL_DRAW_LMEM)} or @code{@ref{quality} 6}) or the list of vector primitives (default). After that the user may decide what he/she want: save to file, display on the screen, run animation, do additional editing and so on. This approach assures a high portability of the program -- the source code will produce exactly the same picture in @emph{any} OS. Another big positive consequence is the ability to create the picture in the console program (using command line, without creating a window)! @item @strong{Every plot settings (style of lines, font, color scheme) are specified by a string.} It provides convenience for user/programmer -- short string with parameters is more comprehensible than a large set of parameters. Also it provides portability -- the strings are the same in any OS so that it is not necessary to think about argument types. @item @@ -42,9 +42,9 @@ In addition to the general concepts I want to comment on some non-trivial or les Two axis representations are used in MathGL. The first one consists of normalizing coordinates of data points in axis range (see @ref{Axis settings}). If @code{SetCut()} is @code{true} then the outlier points are omitted, otherwise they are projected to the bounding box (see @ref{Cutting}). Also, the point will be omitted if it lies inside the box defined by @code{SetCutBox()} or if the value of formula @code{CutOff()} is nonzero for its coordinates. After that, transformation formulas defined by @code{SetFunc()} or @code{SetCoor()} are applied to the data point (see @ref{Curved coordinates}). Finally, the data point is plotted by one of the functions. -The range of @emph{x, y, z}-axis can be specified by @code{SetRange()} or @code{SetRanges()} functions. Its origin is specified by @code{SetOrigin()} function. At this you can you can use @code{NAN} values for selecting axis origin automatically. +The range of @emph{x, y, z}-axis can be specified by @code{SetRange()} or @ref{ranges} functions. Its origin is specified by @ref{origin} function. At this you can you can use @code{NAN} values for selecting axis origin automatically. -There is 4-th axis @emph{c} (color axis or colorbar) in addition to the usual axes @emph{x, y, z}. It sets the range of values for the surface coloring. Its borders are automatically set to values of z-range during the call of @code{SetRanges()} function. Also, one can directly set it by call @code{SetRange('c', ...)}. Use @code{Colorbar()} function for drawing the colorbar. +There is 4-th axis @emph{c} (color axis or colorbar) in addition to the usual axes @emph{x, y, z}. It sets the range of values for the surface coloring. Its borders are automatically set to values of z-range during the call of @ref{ranges} function. Also, one can directly set it by call @code{SetRange('c', ...)}. Use @ref{colorbar} function for drawing the colorbar. The form (appearence) of tick labels is controlled by @code{SetTicks()} function (@pxref{Ticks}). Function @var{SetTuneTicks} switches on/off tick enhancing by factoring out acommon multiplier (for small coordinate values, like 0.001 to 0.002, or large, like from 1000 to 2000) or common component (for narrow range, like from 0.999 to 1.000). Finally, you may use functions @code{SetTickTempl()} for setting templates for tick labels (it supports TeX symbols). Also, there is a possibility to print arbitrary text as tick labels the by help of @code{SetTicksVal()} function. @@ -86,7 +86,7 @@ melone color. @cindex Mark style @cindex Arrows -The line style is defined by the string which may contain specifications for color (@samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}), dashing style (@samp{-|;:ji=} or space), width (@samp{123456789}) and marks (@samp{*o+xsd.^v<>} and @samp{#} modifier). If one of the type of information is omitted then default values used with next color from palette (see @ref{Palette and colors}). Note, that internal color counter will be nullified by any change of palette. This includes even hidden change (for example, by @code{Box()} or @code{Axis()} functions). +The line style is defined by the string which may contain specifications for color (@samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}), dashing style (@samp{-|;:ji=} or space), width (@samp{123456789}) and marks (@samp{*o+xsd.^v<>} and @samp{#} modifier). If one of the type of information is omitted then default values used with next color from palette (see @ref{Palette and colors}). Note, that internal color counter will be nullified by any change of palette. This includes even hidden change (for example, by @ref{box} or @ref{axis} functions). @ifhtml @html By default palette contain following colors: dark grayH’, blueb’, greeng’, redr’, cyanc’, magentam’, yellowy’, grayh’, green-bluel’, sky-bluen’, orangeq’, green-yellowe’, blue-violetu’, purplep’. diff --git a/texinfo/concept_ru.texi b/texinfo/concept_ru.texi index d0bea93..8252f9e 100644 --- a/texinfo/concept_ru.texi +++ b/texinfo/concept_ru.texi @@ -6,7 +6,7 @@ Всего основных концепций (базисных идей) шесть: @enumerate @item -@strong{Все рисунки создаются в памяти.} Это могут быть как растровые картинки (для @code{SetQuality(MGL_DRAW_LMEM)}), так и векторные списки примитивов (по умолчанию). Дальнейшая судьба рисунков определяется пользователем: можно сохранить в файл, вывести на экран, создать анимацию/кино, дополнительно отредактировать и т.д. Такой подход обеспечивает высокую переносимость библиотеки -- один и тот же программный код создаст в точности одинаковый рисунок на @emph{любой} операционной системе. Кроме того, при таком подходе рисунки можно создавать непосредственно в консольной программе -- графическое окно не нужно! +@strong{Все рисунки создаются в памяти.} Это могут быть как растровые картинки (для @code{SetQuality(MGL_DRAW_LMEM)} или @code{@ref{quality} 6}), так и векторные списки примитивов (по умолчанию). Дальнейшая судьба рисунков определяется пользователем: можно сохранить в файл, вывести на экран, создать анимацию/кино, дополнительно отредактировать и т.д. Такой подход обеспечивает высокую переносимость библиотеки -- один и тот же программный код создаст в точности одинаковый рисунок на @emph{любой} операционной системе. Кроме того, при таком подходе рисунки можно создавать непосредственно в консольной программе -- графическое окно не нужно! @item @strong{Все настройки графиков (стиль линий, цветовые схемы поверхностей, стиль и цвет текста) задаются строками.} Это обеспечивает: удобство для пользователя -- короткую строку легче читать и здесь тяжелее ошибиться, чем в большом списке параметров; переносимость -- строки выглядят одинаково на всех платформах и не надо заботиться о типе и числе аргументов. @item @@ -40,9 +40,9 @@ Представление системы координат в MathGL состоит из двух частей. Вначале координаты нормируются в диапазон изменения осей координат (@pxref{Axis settings}). Если флаг @code{SetCut()} установлен, то точки вне интервала отбрасываются, в противном случае, они проецируются на ограничивающий параллелепипед (см. @ref{Cutting}). Кроме того, отбрасываются точки внутри границ, определенных переменными @var{CutMin}x@var{CutMax} и точки, для которых значение функции @code{CutOff}() не равно нулю. После этого формулы перехода в криволинейную систему координат @code{SetFunc()}применяются к каждой точке. Наконец, точка данных отображается с помощью одной из графических функций. -Диапазон изменения @emph{x, y, z}-координат задается функциями @code{SetRange()} или @code{SetRanges()}. Точка пересечения осей координат задается функцией @code{SetOrigin()}. При этом можно использовать NAN значения для автоматического выбора положения оси. +Диапазон изменения @emph{x, y, z}-координат задается функциями @code{SetRange()} или @ref{ranges}. Точка пересечения осей координат задается функцией @code{SetOrigin()}. При этом можно использовать NAN значения для автоматического выбора положения оси. -Кроме привычных осей @emph{x, y, z} есть еще одна ось -- цветовая шкала -- ось @emph{c}. Она используется при окрашивании поверхностей и задает границы изменения функции при окрашивании. Ее границы автоматически устанавливаются равными диапазону z-оси при вызове @code{SetRanges()}. Возможно и ручное изменение границ цветового интервала посредством вызова @code{SetRange('c', ...)}. Используйте @code{Colorbar()} для отображения цветовой шкалы. +Кроме привычных осей @emph{x, y, z} есть еще одна ось -- цветовая шкала -- ось @emph{c}. Она используется при окрашивании поверхностей и задает границы изменения функции при окрашивании. Ее границы автоматически устанавливаются равными диапазону z-оси при вызове @ref{ranges}. Возможно и ручное изменение границ цветового интервала посредством вызова @code{SetRange('c', ...)}. Используйте @ref{colorbar} для отображения цветовой шкалы. Вид меток по осям определяется функцией @code{SetTicks()} (@pxref{Ticks}). Функция @var{SetTuneTicks} включает/выключает выделение общего множителя (большого или малого факторов в диапазоне) для меток осей координат. Наконец, если стандартный вид меток не устраивает пользователя, то их шаблон можно задать явно (можно использовать и ТеХ символы), воспользовавшись функцией @code{SetTickTempl()}. Кроме того, в качестве меток можно вывести произвольный текст использовав функцию @code{SetTicksVal()}. diff --git a/texinfo/core_en.texi b/texinfo/core_en.texi index 92f29e3..ec36cfb 100644 --- a/texinfo/core_en.texi +++ b/texinfo/core_en.texi @@ -488,6 +488,15 @@ Sets RGB values for color with given @var{id}. This is global setting which infl @end ifclear +@anchor{gray} +@deftypefn {MGL command} {} gray @code{val} +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Gray (@code{bool} enable) +@deftypefnx {C function} @code{void} mgl_set_gray (@code{HMGL} gr, @code{int} enable) +@end ifclear +Sets the gray-scale mode on/off. +@end deftypefn + @c ================================================================== @external{} @node Masks, Error handling, Palette and colors, Graphics setup @@ -984,7 +993,7 @@ The line style of axis (@var{stl}), ticks (@var{tck}) and subticks (@var{sub}). @cindex Push @cindex Pop -These functions control how and where further plotting will be placed. There is a certain calling order of these functions for the better plot appearance. First one should be @ref{subplot}, @ref{multiplot} or @ref{inplot} for specifying the place. Second one can be @ref{title} for adding title for the subplot. After it a @ref{rotate} and @ref{aspect}. And finally any other plotting functions may be called. Alternatively you can use @ref{columnplot}, @ref{gridplot}, @ref{stickplot} or relative @ref{inplot} for positioning plots in the column (or grid, or stick) one by another without gap between plot axis (bounding boxes). @sref{Subplots} +These functions control how and where further plotting will be placed. There is a certain calling order of these functions for the better plot appearance. First one should be @ref{subplot}, @ref{multiplot} or @ref{inplot} for specifying the place. Second one can be @ref{title} for adding title for the subplot. After it a @ref{rotate}, @ref{shear} and @ref{aspect}. And finally any other plotting functions may be called. Alternatively you can use @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot} or relative @ref{inplot} for positioning plots in the column (or grid, or stick) one by another without gap between plot axis (bounding boxes). @sref{Subplots} @anchor{subplot} @deftypefn {MGL command} {} subplot @code{nx ny m ['stl'='<>_^' dx=0 dy=0]} @@ -1067,6 +1076,16 @@ Puts further plotting in @var{ind}-th cell of @var{nx}*@var{ny} grid. The positi Puts further plotting in @var{ind}-th cell of stick with @var{num} cells. At this, stick is rotated on angles @var{tet}, @var{phi}. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}). @end deftypefn +@anchor{shearplot} +@deftypefn {MGL command} {} shearplot @code{num ind sx sy [xd yd]} +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} ShearPlot (@code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd=@code{1}, @code{mreal} yd=@code{0}) +@deftypefnx {C function} @code{void} mgl_shearplot (@code{HMGL} gr, @code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd, @code{mreal} yd) +@end ifclear +Puts further plotting in @var{ind}-th cell of stick with @var{num} cells. At this, cell is sheared on values @var{sx}, @var{sy}. Stick direction is specified be @var{xd} and @var{yd}. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}). +@end deftypefn + + @anchor{title} @deftypefn {MGL command} {} title 'title' ['stl'='' @code{size=-2}] @ifclear UDAV @@ -1102,6 +1121,15 @@ Rotates a further plotting relative to each axis @{x, z, y@} consecutively on an Rotates a further plotting around vector @{@var{x}, @var{y}, @var{z}@} on angle @var{Tet}. @end deftypefn +@anchor{shear} +@deftypefn {MGL command} {} shear @code{sx sy} +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Shear (@code{mreal} sx, @code{mreal} sy) +@deftypefnx {C function} @code{void} mgl_shear (@code{HMGL} gr, @code{mreal} sx, @code{mreal} sy) +@end ifclear +Shears a further plotting on values @var{sx}, @var{sy}. +@end deftypefn + @anchor{aspect} @deftypefn {MGL command} {} aspect @code{ax ay [az=1]} @ifclear UDAV @@ -1178,12 +1206,14 @@ Functions in this group save or give access to produced picture. So, usually the Sets size of picture in pixels. This function @strong{should be} called before any other plotting because it completely remove picture contents if @var{clear}=@code{true}. Function just clear pixels and scale all primitives if @var{clear}=@code{false}. @end deftypefn +@anchor{setsizescl} +@deftypefn {MGL command} {} setsizescl @code{factor} @ifclear UDAV -@deftypefn {Method on @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor) +@deftypefnx {Method on @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor) @deftypefnx {C function} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor) +@end ifclear Set factor for width and height in all further calls of @ref{setsize}. @end deftypefn -@end ifclear @anchor{quality} @deftypefn {MGL command} {} quality [@code{val}=2] @@ -3181,6 +3211,8 @@ color scheme -- up-half (warm) corresponds to normal flow (like attractor), bott @item @samp{#} for starting threads from edges only; @item +@samp{*} for starting threads from a 2D array of points inside the data; +@item @samp{v} for drawing arrows on the threads; @item @samp{x}, @samp{z} for drawing tapes of normals in x-y and y-z planes correspondingly. diff --git a/texinfo/core_ru.texi b/texinfo/core_ru.texi index 31777bc..70aaae2 100644 --- a/texinfo/core_ru.texi +++ b/texinfo/core_ru.texi @@ -473,6 +473,15 @@ MGL не требует создания данного типа объекто @end deftypefn @end ifclear +@anchor{gray} +@deftypefn {Команда MGL} {} gray @code{val} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Gray (@code{bool} enable) +@deftypefnx {Функция С} @code{void} mgl_set_gray (@code{HMGL} gr, @code{int} enable) +@end ifclear +Включает/выключает вывод графика в оттенках серого. +@end deftypefn + @c ================================================================== @external{} @node Masks, Error handling, Palette and colors, Graphics setup @@ -966,7 +975,7 @@ Ternary -- специальный тип графика для 3 зависим @cindex Push @cindex Pop -Эти функции контролируют где и как график будет расположен. Существует определенный порядок вызова этих функций для лучшего вида графика. Вначале должны вызываться функции @ref{subplot}, @ref{multiplot} или @ref{inplot} для указания местоположения вывода. После них -- функции вращения @ref{rotate} и @ref{aspect}. И наконец любые другие функции для рисования графика. Вместо вращения графика можно вызвать функцию @ref{columnplot}, @ref{gridplot}, @ref{stickplot} или относительную @ref{inplot} для расположения графиков в столбец одного над другим без зазора между осями. @sref{Subplots} +Эти функции контролируют где и как график будет расположен. Существует определенный порядок вызова этих функций для лучшего вида графика. Вначале должны вызываться функции @ref{subplot}, @ref{multiplot} или @ref{inplot} для указания местоположения вывода. После них -- функции вращения @ref{rotate}, @ref{shear} и @ref{aspect}. И наконец любые другие функции для рисования графика. Вместо вращения графика можно вызвать функцию @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot} или относительную @ref{inplot} для расположения графиков в столбец одного над другим без зазора между осями. @sref{Subplots} @anchor{subplot} @deftypefn {Команда MGL} {} subplot @code{nx ny m ['stl'='<>_^' dx=0 dy=0]} @@ -1026,6 +1035,15 @@ Ternary -- специальный тип графика для 3 зависим Помещает последующий вывод в @var{ind}-ую ячейку "бруска" из @var{num} ячеек. При этом сам брусок повернут на углы @var{tet}, @var{phi}. Положение выбирается относительно последнего вызова @ref{subplot} (или @ref{inplot} с @var{rel}=@code{false}). @end deftypefn +@anchor{shearplot} +@deftypefn {Команда MGL} {} shearplot @code{num ind sx sy [xd yd]} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} ShearPlot (@code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd=@code{1}, @code{mreal} yd=@code{0}) +@deftypefnx {Функция С} @code{void} mgl_shearplot (@code{HMGL} gr, @code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd, @code{mreal} yd) +@end ifclear +Помещает последующий вывод в @var{ind}-ую ячейку "бруска" из @var{num} ячеек. При этом сама ячейка скошена на @var{sx}, @var{sy}. Направление бруска задается переменными @var{xd} и @var{yd}. Положение выбирается относительно последнего вызова @ref{subplot} (или @ref{inplot} с @var{rel}=@code{false}). +@end deftypefn + @anchor{title} @deftypefn {Команда MGL} {} title 'title' ['stl'='' @code{size=-2}] @ifclear UDAV @@ -1054,6 +1072,17 @@ Ternary -- специальный тип графика для 3 зависим Вращает систему координат относительно вектора @{@var{x}, @var{y}, @var{z}@} на угол @var{Tet}. @end deftypefn + +@anchor{shear} +@deftypefn {Команда MGL} {} shear @code{sx sy} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Shear (@code{mreal} sx, @code{mreal} sy) +@deftypefnx {Функция С} @code{void} mgl_shear (@code{HMGL} gr, @code{mreal} sx, @code{mreal} sy) +@end ifclear +Сдвигает (скашивает) систему координат на значения @var{sx}, @var{sy}. +@end deftypefn + + @anchor{aspect} @deftypefn {Команда MGL} {} aspect @code{ax ay [az=1]} @ifclear UDAV @@ -1132,12 +1161,14 @@ Ternary -- специальный тип графика для 3 зависим @end deftypefn +@anchor{setsizescl} +@deftypefn {Команда MGL} {} setsizescl @code{factor} @ifclear UDAV -@deftypefn {Метод класса @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor) @deftypefnx {Функция С} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor) +@end ifclear Задает множитель для высоты и ширины во всех последующих вызовах @ref{setsize}. @end deftypefn -@end ifclear @anchor{quality} @@ -3093,6 +3124,8 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command @item @samp{#} для использования нитей, начинающихся только на границе; @item +@samp{*} для использования нитей, начинающихся с двумерной сетки внутри данных; +@item @samp{v} для рисования стрелок на нитях; @item @samp{x}, @samp{z} для рисования лент нормалей, начинающихся в плоскостях x-y и y-z соответственно. diff --git a/texinfo/data_en.texi b/texinfo/data_en.texi index d2b7a1b..e5def93 100644 --- a/texinfo/data_en.texi +++ b/texinfo/data_en.texi @@ -1132,10 +1132,38 @@ By default quadratic averaging over 5 points is used. Find envelop for data values along direction @var{dir}. @end deftypefn +@anchor{diffract} +@deftypefn {MGL command} {} diffract dat 'how' @code{q} +@ifclear UDAV +@deftypefnx {Method on @code{mglDataC}} @code{void} Diffraction (@code{const char *}how, @code{mreal} q) +@deftypefnx {C function} @code{void} mgl_datac_diffr (@code{HADT} dat, @code{const char *}how, @code{mreal} q) +@end ifclear +Calculates one step of diffraction by finite-difference method with parameter @var{q}=@math{\delta t/\delta x^2} using method with 3-d order of accuracy. Parameter @var{how} may contain: +@itemize @bullet + @item @samp{xyz} for calculations along x-,y-,z-directions correspondingly; +@item + @samp{r} for using axial symmetric Laplace operator for x-direction; +@item + @samp{0} for zero boundary conditions; +@item + @samp{1} for constant boundary conditions; +@item + @samp{2} for linear boundary conditions; +@item + @samp{3} for parabolic boundary conditions; +@item + @samp{4} for exponential boundary conditions; +@item + @samp{5} for gaussian boundary conditions. +@end itemize +@end deftypefn + + @anchor{norm} @deftypefn {MGL command} {} norm dat @code{v1 v2 [sym=off dim=0]} @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} Norm (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{bool} sym=@code{false}, @code{int} dim=@code{0}) +@deftypefnx {Method on @code{mglData}} @code{void} Norm (@code{mreal} v1=@code{0}, @code{mreal} v2=@code{1}, @code{bool} sym=@code{false}, @code{long} dim=@code{0}) +@deftypefnx {C function} @code{void} mgl_data_norm (@code{HMDT} dat, @code{mreal} v1, @code{mreal} v2, @code{int} sym, @code{long} dim) @end ifclear Normalizes the data to range [@var{v1},@var{v2}]. If flag @var{sym}=@code{true} then symmetrical interval [-max(|v1|,|v2|), max(|v1|,|v2|)] is used. Modification will be applied only for slices >=@var{dim}. @end deftypefn @@ -1155,6 +1183,17 @@ Normalizes data slice-by-slice along direction @var{dir} the data in slices to r @end ifnottex @end deftypefn +@anchor{limit} +@deftypefn {MGL command} {} limit dat @code{val} +@ifclear UDAV +@deftypefnx {Method on @code{mglData}} @code{void} Limit (@code{mreal} val) +@deftypefnx {Method on @code{mglDataC}} @code{void} Limit (@code{mreal} val) +@deftypefnx {C function} @code{void} mgl_data_limit (@code{HMDT} dat, @code{mreal} val) +@deftypefnx {C function} @code{void} mgl_datac_limit (@code{HADT} dat, @code{mreal} val) +@end ifclear +Limits the data values to be inside the range [-@var{val},@var{val}], keeping the original sign of the value (phase for complex numbers). This is equivalent to operation @code{a[i] *= abs(a[i])=@var{dim}. @end deftypefn @@ -1141,6 +1168,17 @@ These functions change the data in some direction like differentiations, integra @end ifnottex @end deftypefn +@anchor{limit} +@deftypefn {Команда MGL} {} limit dat @code{val} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglData}} @code{void} Limit (@code{mreal} val) +@deftypefnx {Метод класса @code{mglDataC}} @code{void} Limit (@code{mreal} val) +@deftypefnx {Функция С} @code{void} mgl_data_limit (@code{HMDT} dat, @code{mreal} val) +@deftypefnx {Функция С} @code{void} mgl_datac_limit (@code{HADT} dat, @code{mreal} val) +@end ifclear +Ограничивает амплитуду данных диапазоном [-@var{val},@var{val}]. При этом сохраняется исходный знак (фаза для комплексных чисел). Эквивалентно операции @code{a[i] *= abs(a[i])Rotate(50,60); gr->Box(); gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect"); gr->Rotate(50,60); gr->Aspect(1,1,2); gr->Box(); - gr->SubPlot(2,2,3); gr->Title("Aspect in other direction"); - gr->Rotate(50,60); gr->Aspect(1,2,2); gr->Box(); + gr->SubPlot(2,2,3); gr->Title("Shear"); + gr->Box("c"); gr->Shear(0.2,0.1); gr->Box(); return 0; } @end verbatim @@ -735,7 +735,10 @@ int sample(mglGraph *gr) gr->GridPlot(2, 2, 3); gr->Box("m"); gr->Puts(mglPoint(0),"3","m"); gr->SubPlot(3,2,5,""); gr->Title("InPlot"); gr->Box(); gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r"); - gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot"); gr->Box(); + gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot and ShearPlot"); gr->Box(); + gr->ShearPlot(3, 0, 0.2, 0.1); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); + gr->ShearPlot(3, 1, 0.2, 0.1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); + gr->ShearPlot(3, 2, 0.2, 0.1); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); return 0; } @end verbatim @@ -3916,7 +3919,7 @@ int sample(mglGraph *gr) mglData in(9), arg(99), e, s; gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4"); gr->Plot(in,"ko "); gr->Box(); - e = in.Evaluate(arg); gr->Plot(e,"b.","legend 'Evaluate'"); + e = in.Evaluate(arg,false); gr->Plot(e,"b.","legend 'Evaluate'"); s = in.SubData(arg); gr->Plot(s,"r.","legend 'SubData'"); gr->Legend(2); } diff --git a/texinfo/example_ru.texi b/texinfo/example_ru.texi index 2fca8a2..8e42004 100644 --- a/texinfo/example_ru.texi +++ b/texinfo/example_ru.texi @@ -706,8 +706,8 @@ int sample(mglGraph *gr) gr->Rotate(50,60); gr->Box(); gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect"); gr->Rotate(50,60); gr->Aspect(1,1,2); gr->Box(); - gr->SubPlot(2,2,3); gr->Title("Aspect in other direction"); - gr->Rotate(50,60); gr->Aspect(1,2,2); gr->Box(); + gr->SubPlot(2,2,3); gr->Title("Shear"); + gr->Box("c"); gr->Shear(0.2,0.1); gr->Box(); return 0; } @end verbatim @@ -734,7 +734,10 @@ int sample(mglGraph *gr) gr->GridPlot(2, 2, 3); gr->Box("m"); gr->Puts(mglPoint(0),"3","m"); gr->SubPlot(3,2,5,""); gr->Title("InPlot"); gr->Box(); gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r"); - gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot"); gr->Box(); + gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot and ShearPlot"); gr->Box(); + gr->ShearPlot(3, 0, 0.2, 0.1); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); + gr->ShearPlot(3, 1, 0.2, 0.1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); + gr->ShearPlot(3, 2, 0.2, 0.1); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); return 0; } @end verbatim @@ -3899,7 +3902,7 @@ int sample(mglGraph *gr) mglData in(9), arg(99), e, s; gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4"); gr->Plot(in,"ko "); gr->Box(); - e = in.Evaluate(arg); gr->Plot(e,"b.","legend 'Evaluate'"); + e = in.Evaluate(arg,false); gr->Plot(e,"b.","legend 'Evaluate'"); s = in.SubData(arg); gr->Plot(s,"r.","legend 'SubData'"); gr->Legend(2); } diff --git a/texinfo/formats_en.texi b/texinfo/formats_en.texi index 96fee70..089d1a6 100644 --- a/texinfo/formats_en.texi +++ b/texinfo/formats_en.texi @@ -6,6 +6,7 @@ This appendix contain description of file formats used by MathGL. * Font files:: * MGLD format:: * JSON format:: +* IFS format:: @end menu @c ------------------------------------------------------------------ @@ -75,7 +76,7 @@ Here nT is the number of triangles; nL is the number of line vertexes; xA, yA, x @c ------------------------------------------------------------------ @external{} -@node JSON format, , MGLD format, File formats +@node JSON format, IFS format, MGLD format, File formats @section JSON format @nav{} @@ -97,7 +98,7 @@ array of coordinates of points (vertexes), each element is array in form [x, y, @item nprim number of primitives; @item prim -array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color]. +array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color]. Here @var{type} is kind of primitive (0 - mark, 1 - line, 2 - triangle, 3 - quadrangle, 4 - glyph), @var{n1}...@var{n4} is index of point for vertexes and @var{n2} can be index of glyph coordinate, @var{s} and @var{w} are size and width if applicable, @var{z} is average z-coordinate, @var{id} is primitive identification number, @var{p} is scaling factor for glyphs. @@ -112,4 +113,29 @@ number of glyph descriptions array of glyph descriptions, each element is array in form @code{[nL, [xP0, yP0, xP1, yP1 ...]]}. Here @code{nL} is the number of line vertexes; and @code{xP, yP, xQ, yQ} are coordinates of lines. Line coordinate xP=0x3fff, yP=0x3fff denote line breaking. @end table + +@c ------------------------------------------------------------------ +@external{} +@node IFS format, , JSON format, File formats +@section IFS format +@nav{} + +MathGL can read IFS fractal parameters (see @ref{ifsfile}) from a IFS file. Let remind IFS file format. File may contain several records. Each record contain the name of fractal (@samp{binary} in the example below) and the body of fractal, which is enclosed in curly braces @{@}. Symbol @samp{;} start the comment. If the name of fractal contain @samp{(3D)} or @samp{(3d)} then the 3d IFS fractal is specified. The sample below contain two fractals: @samp{binary} -- usual 2d fractal, and @samp{3dfern (3D)} -- 3d fractal. + +@verbatim + binary + { ; comment allowed here + ; and here + .5 .0 .0 .5 -2.563477 -0.000003 .333333 ; also comment allowed here + .5 .0 .0 .5 2.436544 -0.000003 .333333 + .0 -.5 .5 .0 4.873085 7.563492 .333333 + } + + 3dfern (3D) { + .00 .00 0 .0 .18 .0 0 0.0 0.00 0 0.0 0 .01 + .85 .00 0 .0 .85 .1 0 -0.1 0.85 0 1.6 0 .85 + .20 -.20 0 .2 .20 .0 0 0.0 0.30 0 0.8 0 .07 + -.20 .20 0 .2 .20 .0 0 0.0 0.30 0 0.8 0 .07 + } +@end verbatim @external{} diff --git a/texinfo/formats_ru.texi b/texinfo/formats_ru.texi index 96fee70..089d1a6 100644 --- a/texinfo/formats_ru.texi +++ b/texinfo/formats_ru.texi @@ -6,6 +6,7 @@ This appendix contain description of file formats used by MathGL. * Font files:: * MGLD format:: * JSON format:: +* IFS format:: @end menu @c ------------------------------------------------------------------ @@ -75,7 +76,7 @@ Here nT is the number of triangles; nL is the number of line vertexes; xA, yA, x @c ------------------------------------------------------------------ @external{} -@node JSON format, , MGLD format, File formats +@node JSON format, IFS format, MGLD format, File formats @section JSON format @nav{} @@ -97,7 +98,7 @@ array of coordinates of points (vertexes), each element is array in form [x, y, @item nprim number of primitives; @item prim -array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color]. +array of primitives, each element is array in form [type, n1, n2, n3, n4, id, s, w, p, z, color]. Here @var{type} is kind of primitive (0 - mark, 1 - line, 2 - triangle, 3 - quadrangle, 4 - glyph), @var{n1}...@var{n4} is index of point for vertexes and @var{n2} can be index of glyph coordinate, @var{s} and @var{w} are size and width if applicable, @var{z} is average z-coordinate, @var{id} is primitive identification number, @var{p} is scaling factor for glyphs. @@ -112,4 +113,29 @@ number of glyph descriptions array of glyph descriptions, each element is array in form @code{[nL, [xP0, yP0, xP1, yP1 ...]]}. Here @code{nL} is the number of line vertexes; and @code{xP, yP, xQ, yQ} are coordinates of lines. Line coordinate xP=0x3fff, yP=0x3fff denote line breaking. @end table + +@c ------------------------------------------------------------------ +@external{} +@node IFS format, , JSON format, File formats +@section IFS format +@nav{} + +MathGL can read IFS fractal parameters (see @ref{ifsfile}) from a IFS file. Let remind IFS file format. File may contain several records. Each record contain the name of fractal (@samp{binary} in the example below) and the body of fractal, which is enclosed in curly braces @{@}. Symbol @samp{;} start the comment. If the name of fractal contain @samp{(3D)} or @samp{(3d)} then the 3d IFS fractal is specified. The sample below contain two fractals: @samp{binary} -- usual 2d fractal, and @samp{3dfern (3D)} -- 3d fractal. + +@verbatim + binary + { ; comment allowed here + ; and here + .5 .0 .0 .5 -2.563477 -0.000003 .333333 ; also comment allowed here + .5 .0 .0 .5 2.436544 -0.000003 .333333 + .0 -.5 .5 .0 4.873085 7.563492 .333333 + } + + 3dfern (3D) { + .00 .00 0 .0 .18 .0 0 0.0 0.00 0 0.0 0 .01 + .85 .00 0 .0 .85 .1 0 -0.1 0.85 0 1.6 0 .85 + .20 -.20 0 .2 .20 .0 0 0.0 0.30 0 0.8 0 .07 + -.20 .20 0 .2 .20 .0 0 0.0 0.30 0 0.8 0 .07 + } +@end verbatim @external{} diff --git a/texinfo/parse_en.texi b/texinfo/parse_en.texi index e631a21..fa03fd7 100644 --- a/texinfo/parse_en.texi +++ b/texinfo/parse_en.texi @@ -24,7 +24,7 @@ MathGL library supports the simplest scripts for data handling and plotting. The @section MGL definition @nav{} -MGL script language is rather simple. Each string is a command. First word of string is the name of command. Other words are command arguments. Command may have up to 1000 arguments (at least for now). Words are separated from each other by space or tabulation symbol. The upper or lower case of words is important, i.e. variables @var{a} and @var{A} are different variables. Symbol @samp{#} starts the comment (all characters after # will be ignored). The exception is situation when @samp{#} is a part of some string. Also options can be specified after symbol @samp{;} (@pxref{Command options}). Symbol @samp{:} starts new command (like new line character) if it is not placed inside a string or inside brackets. +MGL script language is rather simple. Each string is a command. First word of string is the name of command. Other words are command arguments. Words are separated from each other by space or tabulation symbol. The upper or lower case of words is important, i.e. variables @var{a} and @var{A} are different variables. Symbol @samp{#} starts the comment (all characters after # will be ignored). The exception is situation when @samp{#} is a part of some string. Also options can be specified after symbol @samp{;} (@pxref{Command options}). Symbol @samp{:} starts new command (like new line character) if it is not placed inside a string or inside brackets. If string contain references to external parameters (substrings @samp{$0}, @samp{$1} ... @samp{$9}) or definitions (substrings @samp{$a}, @samp{$b} ... @samp{$z}) then before execution the values of parameter/definition will be substituted instead of reference. It allows to use the same MGL script for different parameters (filenames, paths, condition and so on). @@ -60,6 +60,13 @@ Before the first using all variables must be defined with the help of commands, Command may have several set of possible arguments (for example, @code{plot ydat} and @code{plot xdat ydat}). All command arguments for a selected set must be specified. However, some arguments can have default values. These argument are printed in [], like @code{text ydat ['stl'='']} or @code{text x y 'txt' ['fnt'='' size=-1]}. At this, the record @code{[arg1 arg2 arg3 ...]} means @code{[arg1 [arg2 [arg3 ...]]]}, i.e. you can omit only tailing arguments if you agree with its default values. For example, @code{text x y 'txt' '' 1} or @code{text x y 'txt' ''} is correct, but @code{text x y 'txt' 1} is incorrect (argument @code{'fnt'} is missed). +You can provide several variants of arguments for a command by using @samp{?} symbol for separating them. The actual argument being used is set by @ref{variant}. At this, the last argument is used if the value of @ref{variant} is large than the number of provided variants. By default the first argument is used (i.e. as for @code{variant 0}). For example, the first plot will be drawn by blue (default is the first argument @samp{b}), but the plot after @code{variant 1} will be drawn by red dash (the second is @samp{r|}): +@verbatim +fplot 'x' 'b'?'r' +variant 1 +fplot 'x^3' 'b'?'r|' +@end verbatim + @c ------------------------------------------------------------------ @external{} @@ -181,6 +188,12 @@ The code between @code{once on} and @code{once off} will be executed only once. Terminate execution. @end deftypefn +@cindex variant +@anchor{variant} +@deftypefn {MGL command} {} variant @code{val} +Set variant of argument(s) separated by @samp{?} symbol to be used in further commands. +@end deftypefn + @cindex rkstep @anchor{rkstep} @@ -434,6 +447,11 @@ Allow to parse @ref{load} command or not. Sends stop signal which terminate execution at next command. @end deftypefn +@deftypefn {Method on @code{mglParse}} @code{void} SetVariant (@code{int} var=@code{0}) +@deftypefnx {C function} @code{void} mgl_parser_variant (@code{HMPR} p, @code{int} var=@code{0}) +Sets variant of argument(s) separated by @samp{?} symbol to be used in further commands. +@end deftypefn + @deftypefn {Method on @code{mglParse}} @code{long} GetCmdNum () @deftypefnx {C function} @code{long} mgl_parser_cmd_num (@code{HMPR} p) diff --git a/texinfo/parse_ru.texi b/texinfo/parse_ru.texi index d51da36..f03006a 100644 --- a/texinfo/parse_ru.texi +++ b/texinfo/parse_ru.texi @@ -61,6 +61,13 @@ MathGL имеет встроенный скриптовый язык MGL для Команды могут иметь несколько наборов аргументов (например, @code{plot ydat} и @code{plot xdat ydat}). Все аргументы команды для выбранного набора должны быть указаны, однако часть из них могут иметь значения по умолчанию. Такие аргументы в описании команд будут помещены в квадратные скобки [], например @code{plot ydat ['stl'='' zval=nan]}. При этом запись @code{[arg1 arg2 arg3 ...]} подразумевает @code{[arg1 [arg2 [arg3 ...]]]}, т.е. опускать можно только аргументы с конца, если вы согласны с их значениями по умолчанию. Например, @code{plot ydat '' 1} или @code{plot ydat ''} правильно, а @code{plot ydat 1} не правильно (аргумент @code{'stl'} пропущен). +Можно предоставить несколько вариантов аргументов комманд при использовании символа @samp{?} для их разделения. Конкретный вариант аргумента, используемый при выполнении команды, задается значением команды @ref{variant}. При этом будет использован последний вариант, если задано слишком большое значение. По умолчанию используется первый вариант (т.е. как при @code{variant 0}). Например в следующем коде будет сначала нарисован график синим цветом (первый аргумент @samp{b}), а затем красным пунктиром -- после @code{variant 1} будет использован второй аргумент @samp{r|}: +@verbatim +fplot 'x' 'b'?'r' +variant 1 +fplot 'x^3' 'b'?'r|' +@end verbatim + @c TODO Translate it! @@ -75,80 +82,80 @@ MathGL имеет встроенный скриптовый язык MGL для @cindex chdir @anchor{chdir} -@deftypefn {MGL command} {} chdir 'path' +@deftypefn {Команда MGL} {} chdir 'path' Переходит в папку @var{path}. @end deftypefn @cindex ask @anchor{ask} -@deftypefn {MGL command} {} ask $N 'question' +@deftypefn {Команда MGL} {} ask $N 'question' Задает @var{N}-ый аргумент скрипта равным ответу пользователя на вопрос @var{question}. Обычно команда показывает диалог с вопросом и полем ввода текста ответа. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @cindex define @anchor{define} -@deftypefn {MGL command} {} define $N smth +@deftypefn {Команда MGL} {} define $N smth Задает @var{N}-ый аргумент скрипта равным @var{smth}. Отмечу, что @var{smth} используется как есть (с символами @samp{'} если присутствуют). Выполняется только подстановка других макроопределений $0...$9, $a...$z. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn -@deftypefn {MGL command} {} define name smth +@deftypefn {Команда MGL} {} define name smth Определяет константу (скаляр) с именем @code{name} и числовым значением @code{smth}. Позднее она может быть использована как обычное число. @end deftypefn @cindex defchr @anchor{defchr} -@deftypefn {MGL command} {} defchr $N smth +@deftypefn {Команда MGL} {} defchr $N smth Задает @var{N}-ый аргумент скрипта равным символу с UTF кодом @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @cindex defnum @anchor{defnum} -@deftypefn {MGL command} {} defnum $N smth +@deftypefn {Команда MGL} {} defnum $N smth Задает @var{N}-ый аргумент скрипта равным числовому значению @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @comment @cindex defpal @comment @anchor{defpal} -@comment @deftypefn {MGL command} {} defpal $N smth +@comment @deftypefn {Команда MGL} {} defpal $N smth @comment Задает @var{N}-ый аргумент скрипта равным символу палитры с индексом, найденным из @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z). @comment @end deftypefn @cindex call @anchor{call} -@deftypefn {MGL command} {} call 'fname' [ARG1 ARG2 ... ARG9] +@deftypefn {Команда MGL} {} call 'fname' [ARG1 ARG2 ... ARG9] Переходит к выполнению (вызывает) подпрограммы @var{fname} (или внешнего скрипта, если функция не была найдена). Опциональные аргументы передаются в подпрограмму. См. также @ref{func}. @end deftypefn @cindex func @anchor{func} -@deftypefn {MGL command} {} func 'fname' [narg=0] +@deftypefn {Команда MGL} {} func 'fname' [narg=0] Определяет подпрограмму с именем @var{fname} и задает число требуемых аргументов. Аргументы будут помещены в параметры скрипта $1, $2, ... $9. Отмечу, что выполнение основной программы будет остановлено при встрече @code{func} -- действует аналогично комманде @ref{stop}. См. также @ref{return}. @end deftypefn @cindex return @anchor{return} -@deftypefn {MGL command} {} return +@deftypefn {Команда MGL} {} return Возвращается из подпрограммы. См. также @ref{func}. @end deftypefn @cindex load @anchor{load} -@deftypefn {MGL command} {} load 'filename' +@deftypefn {Команда MGL} {} load 'filename' Загружает дополнительные команды MGL из внешней динамической библиотеки @var{filename}. Данная библиотека должна содержать массив с именем @code{mgl_cmd_extra} типа @code{mglCommand}, который содержит описание новых комманд. @end deftypefn @cindex if @anchor{if} -@deftypefn {MGL command} {} if dat 'cond' +@deftypefn {Команда MGL} {} if dat 'cond' Начинает блок команд, выполняемый если каждый элемент @var{dat} удовлетворяет условию @var{cond}. @end deftypefn -@deftypefn {MGL command} {} if @code{val} +@deftypefn {Команда MGL} {} if @code{val} Начинает блок команд, выполняемый если @code{val} не ноль. @end deftypefn @cindex elseif @anchor{elseif} -@deftypefn {MGL command} {} elseif dat 'cond' +@deftypefn {Команда MGL} {} elseif dat 'cond' Начинает блок команд, выполняемый если предыдущий @code{if} или @code{elseif} не был выполнен и каждый элемент @var{dat} удовлетворяет условию @var{cond}. @end deftypefn -@deftypefn {MGL command} {} elseif @code{val} +@deftypefn {Команда MGL} {} elseif @code{val} Начинает блок команд, выполняемый если предыдущий @code{if} или @code{elseif} не был выполнен и @code{val} не ноль. @end deftypefn @cindex else @@ -164,7 +171,7 @@ MathGL имеет встроенный скриптовый язык MGL для @cindex for @anchor{for} -@deftypefn {MGL command} {} for $N @code{v1 v2 [dv=1]} +@deftypefn {Команда MGL} {} for $N @code{v1 v2 [dv=1]} Начинает блок команд, выполняемый в цикле с $@var{N}-ым аргументом изменяющимся от @var{v1} до @var{v2} с шагом @var{dv}. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @deftypefn {Команда MGL} {} for $N dat @@ -178,18 +185,27 @@ MathGL имеет встроенный скриптовый язык MGL для @cindex once @anchor{once} -@deftypefn {MGL command} {} once @code{val} +@deftypefn {Команда MGL} {} once @code{val} Определяет код (между @code{once on} и @code{once off}) который будет выполнен только один раз. Полезно для работы с большими данными в программах типа UDAV. @end deftypefn @cindex stop @anchor{stop} -@deftypefn {MGL command} {} stop +@deftypefn {Команда MGL} {} stop Останавливает выполнение скрипта. @end deftypefn + +@cindex variant +@anchor{variant} +@deftypefn {Команда MGL} {} variant @code{val} +Задает вариант аргумента(ов), разделенных символом @samp{?}, для всех последующих комманд. +@end deftypefn + + + @cindex rkstep @anchor{rkstep} -@deftypefn {MGL command} {} rkstep eq1;... var1;... [@code{dt=1}] +@deftypefn {Команда MGL} {} rkstep eq1;... var1;... [@code{dt=1}] Выполняет один шаг решения системы обыкновенных дифференциальных уравнений @{var1' = eq1, ... @} с временным шагом @var{dt}. Здесь переменные @samp{var1}, ... -- переменные, определенные в MGL скрипте ранее. При решении используется метод Рунге-Кутта 4-го порядка. @end deftypefn @@ -443,6 +459,11 @@ As an additional feature, when an image is not found or cannot be included, inst Посылает сигнал завершения выполнения для следующей команды. @end deftypefn +@deftypefn {Метод класса @code{mglParse}} @code{void} SetVariant (@code{int} var=@code{0}) +@deftypefnx {Функция С} @code{void} mgl_parser_variant (@code{HMPR} p, @code{int} var=@code{0}) +Задает вариант аргумента(ов), разделенных символом @samp{?}, для всех последующих комманд. +@end deftypefn + @deftypefn {Метод класса @code{mglParse}} @code{long} GetCmdNum () @deftypefnx {Функция С} @code{long} mgl_parser_cmd_num (@code{HMPR} p) @@ -469,10 +490,10 @@ As an additional feature, when an image is not found or cannot be included, inst Возвращает описание команды MGL с именем @var{name}. @end deftypefn -@deftypefn {Method on @code{mglParse}} @code{void} RK_Step (@code{const char *}eqs, @code{const char *}vars, @code{mreal} dt=@code{1}) -@deftypefnx {Method on @code{mglParse}} @code{void} RK_Step (@code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt=@code{1}) -@deftypefnx {C function} @code{void} mgl_rk_step (@code{HMPR} p, @code{const char *}eqs, @code{const char *}vars, @code{mreal} dt) -@deftypefnx {C function} @code{void} mgl_rk_step_w (@code{HMPR} p, @code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt) +@deftypefn {Метод класса @code{mglParse}} @code{void} RK_Step (@code{const char *}eqs, @code{const char *}vars, @code{mreal} dt=@code{1}) +@deftypefnx {Метод класса @code{mglParse}} @code{void} RK_Step (@code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt=@code{1}) +@deftypefnx {Функция С} @code{void} mgl_rk_step (@code{HMPR} p, @code{const char *}eqs, @code{const char *}vars, @code{mreal} dt) +@deftypefnx {Функция С} @code{void} mgl_rk_step_w (@code{HMPR} p, @code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt) Make one step for ordinary differential equation(s) @{var1' = eq1, ... @} with time-step @var{dt}. Here strings @var{eqs} and @var{vars} contain the equations and variable names separated by symbol @samp{;}. The variable(s) @samp{var1}, ... are the ones, defined in MGL script previously. The Runge-Kutta 4-th order method is used. @end deftypefn diff --git a/texinfo/symbols_en.texi b/texinfo/symbols_en.texi index 00e102b..16be554 100644 --- a/texinfo/symbols_en.texi +++ b/texinfo/symbols_en.texi @@ -70,6 +70,8 @@ one of marks (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); +set to start flow threads from 2d array inside data (see @ref{flow}); + operation in @ref{Textual formulas}. @item + @@ -112,14 +114,16 @@ line dashing style (see @ref{Line styles}); stop color scheme parsing (see @ref{Color scheme}); -range operation in @ref{MGL scripts}. +range operation in @ref{MGL scripts}; + +separator of commands in @ref{MGL scripts}. @item ; line dashing style (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); -end of an option in @ref{MGL scripts} or in @ref{Command options}. +start of an option in @ref{MGL scripts} or in @ref{Command options}. @item < one of marks (see @ref{Line styles}); @@ -176,7 +180,9 @@ set to draw edges for @ref{cone}; set to draw filled boxes for @ref{boxs}; -reduce text size inside a string (see @ref{Font styles}). +reduce text size inside a string (see @ref{Font styles}); + +operation in @ref{Textual formulas}. @item ^ one of marks (see @ref{Line styles}); diff --git a/texinfo/symbols_ru.texi b/texinfo/symbols_ru.texi index 00e102b..16be554 100644 --- a/texinfo/symbols_ru.texi +++ b/texinfo/symbols_ru.texi @@ -70,6 +70,8 @@ one of marks (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); +set to start flow threads from 2d array inside data (see @ref{flow}); + operation in @ref{Textual formulas}. @item + @@ -112,14 +114,16 @@ line dashing style (see @ref{Line styles}); stop color scheme parsing (see @ref{Color scheme}); -range operation in @ref{MGL scripts}. +range operation in @ref{MGL scripts}; + +separator of commands in @ref{MGL scripts}. @item ; line dashing style (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); -end of an option in @ref{MGL scripts} or in @ref{Command options}. +start of an option in @ref{MGL scripts} or in @ref{Command options}. @item < one of marks (see @ref{Line styles}); @@ -176,7 +180,9 @@ set to draw edges for @ref{cone}; set to draw filled boxes for @ref{boxs}; -reduce text size inside a string (see @ref{Font styles}). +reduce text size inside a string (see @ref{Font styles}); + +operation in @ref{Textual formulas}. @item ^ one of marks (see @ref{Line styles}); diff --git a/texinfo/version.texi.in b/texinfo/version.texi.in index 8ac338c..150c272 100644 --- a/texinfo/version.texi.in +++ b/texinfo/version.texi.in @@ -1,4 +1,4 @@ @set VERSION ${MathGL_VERSION_MAJOR}.${MathGL_VERSION_MINOR} @set MINVER -@c @set MINVER .1 +@set MINVER .1 @set NIGHT ${MGL_NIGHT} diff --git a/texinfo/version_hist.txt b/texinfo/version_hist.txt index a1087f1..5a71907 100644 --- a/texinfo/version_hist.txt +++ b/texinfo/version_hist.txt @@ -1,3 +1,5 @@ +2.3.5.1 Released 30 May 2015 +2.3.5 Released 16 May 2015 2.3.4 Released 11 February 2015 2.3.3 Released 01 June 2015 2.3.2 Released 2 February 2015 diff --git a/texinfo/web_en.texi b/texinfo/web_en.texi index 967c477..62510b1 100644 --- a/texinfo/web_en.texi +++ b/texinfo/web_en.texi @@ -52,8 +52,12 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c @strong{Latest news} @itemize -@item @emph{13 February 2016.} -New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes, which denoted @ref{News, here}. + +@item @strong{20 June 2016.} +New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{NOTE}: there is incompatible change -- the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking. + +@item @emph{16 May 2016.} +New version (v.2.3.5) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes, which denoted @ref{News, here}. @item @emph{7 August 2014.} New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}. @end itemize @@ -75,6 +79,123 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne @itemize +@item @strong{20 June 2016.} +New version (v.2.3.5.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{INCOMPATIBLE}: the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking. + +@item @strong{16 May 2016.} +New version (v.2.3.5) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes: +@itemize @bullet +@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra) + +@itemize @bullet +@item +@code{\MGL@@codes}: Bugfix: category code for tabulators is changed too +@item +@code{\MGL@@quality}: 9 is accepted as quality value now +@item +@code{\MGL@@scale}: Now accepts any positive value +@item +@code{\MGL@@test@@switch}: New command to verify and validate switching arguments +@item +@code{\mglTeX}: Add a small negative space in the logo, between the "mgl" and "TEX" +@item +@code{\mglTeX}: Declared now as robust command +@item +@code{\mglcomments}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on} +@item +@code{\mglgraphics}: New command options: @code{gray, mglscale, quality, variant} +@item +@code{\mglname}: Now writes the MGL code line @samp{setsize 600 400} to the main script +@item +@code{\mglplot}: Added @code{\bgroup} and @code{\egroup} in order to keep changes private +@item +New command options: @code{gray, mglscale, quality, variant} +@item +@code{\mglsettings}: Added options @code{gray} and @code{variant} +@item +Now calls the @code{\mglswitch} and @code{\mglcomments} commands for the switch and comments options, respectively +@item +@code{\mglswitch}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on} +@item +mglTeX now depends on the ifpdf package +@item +Change definition of @code{\mglcommentname} from MGL comment to mglTEX comment +@item +Introduce the concept of global, local and private settings in the documentation +@item +New commands: @code{\mglgray} (to activate/deactivate) gray-scale mode locally, and @code{\mglvariant} (to set variant of arguments in MGL scripts locally) +@item +New package option @code{9q} for setting quality to 9 (for testing purposes of the author) +@item +New package options @code{0v, 1v, 2v} to select variant of arguments in MGL scripts +@item +New package options @code{gray, color} to activate/deactivate gray-scale mode for graphics +@item +Remove the @code{\MGL@@setkeys} command, since it isn’t needed as first thought +@item +Rename @code{\MGL@@document@@scripts} to @code{\MGL@@doc@@scripts} +@item +Rename @code{\MGL@@script@@name} to @code{\MGL@@script} +@item +Rename command @code{\MGL@@graph@@ext} to @code{\MGL@@imgext} +@item +Rename command @code{\mglcommonscriptname} to @code{\mglsetupscriptname} +@item +Rename environment @code{mglcommon} to @code{mglsetupscript} (@code{mglcommon} is still available, but deprecated) +@item +Rename family @code{MGL@@keys} as @code{MGL@@gr@@keys} for consistency +@item +Reorganize and update documentation +@item +Some minor bugfixes +@item +The MGL code line @samp{setsize 600 400} is now automatically written to the main script in order for the scaling options and commands to work +@item +@code{mgl}: New environment options: gray, mglscale, quality, variant +@item +@code{\mglcode}: New environment options: gray, mglscale, quality, variant +@end itemize + +@item +Add MGL command @ref{variant} to select proper variant of arguments (like @samp{var1?var2?var3?...}) in MGL commands. +@item +Remove limitation of maximal number (was 1000) of arguments for MGL commands. This is actual for 'list' command. +@item +Add mglWnd::Widget() for accessing widget which is used for drawing. +@item +Add @ref{gray} for producing gray-scaled image. +@item +Add MGL command @ref{setsizescl} for scaling all further @ref{setsize}. +@item +Add @ref{shear} for shearing plot. +@item +Add @ref{shearplot} for placing plots side-by-side with some shearing. +@item +Add @ref{limit} for limit maximal absolute value of data. +@item +Add @ref{tridmat} for tridiagonal matrix algorithm. +@item +Add MGL command @ref{diffract} for single step diffraction calculation. +@item +Add @ref{ifsfile} for reading IFS fractal parameters from *.ifs file. +@item +Add style @samp{*} for 2d versions of @ref{flow} to draw threads from points inside axis range. +@item +Add @samp{norm()} to the list of known functions +@item +Compatibility changes for MS VisualStudio, MacOS, Win64. +@item +Bugfix for legend export into EPS and SVG. +@item +Bugfix for importing data from std::vector. +@item +Improve Surf3*() drawing. +@item +Force NAN if divided by 0 in formulas. +@item +Option "-S" of mglconv now perform scaling in any cases +@end itemize + @item @strong{13 February 2016.} New version (v.2.3.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes: @itemize @bullet diff --git a/texinfo/web_ru.texi b/texinfo/web_ru.texi index 967c477..f53e3f9 100644 --- a/texinfo/web_ru.texi +++ b/texinfo/web_ru.texi @@ -52,8 +52,10 @@ Generally, MathGL is GPL library. However, you can use LGPL license for MathGL c @strong{Latest news} @itemize -@item @emph{13 February 2016.} -New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes, which denoted @ref{News, here}. +@item @strong{20 June 2016.} +New version (v.@value{VERSION}@value{MINVER}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{NOTE}: there is incompatible change -- the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking. +@item @emph{16 May 2016.} +New version (v.2.3.5) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes, which denoted @ref{News, here}. @item @emph{7 August 2014.} New version (v.2.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are many major improvements for both MathGL core and for UDAV, which denoted @ref{News, here}. @end itemize @@ -75,6 +77,123 @@ Javascript interface was developed with support of @url{http://www.datadvance.ne @itemize +@item @strong{20 June 2016.} +New version (v.2.3.5.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are compatibility changes and bugfixes. @strong{INCOMPATIBLE}: the library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly to reduce the possible error of wrong Qt libs linking. + +@item @strong{16 May 2016.} +New version (v.2.3.5) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes: +@itemize @bullet +@item Update @ref{LaTeX package} (thanks to Diego Sejas Viscarra) + +@itemize @bullet +@item +@code{\MGL@@codes}: Bugfix: category code for tabulators is changed too +@item +@code{\MGL@@quality}: 9 is accepted as quality value now +@item +@code{\MGL@@scale}: Now accepts any positive value +@item +@code{\MGL@@test@@switch}: New command to verify and validate switching arguments +@item +@code{\mglTeX}: Add a small negative space in the logo, between the "mgl" and "TEX" +@item +@code{\mglTeX}: Declared now as robust command +@item +@code{\mglcomments}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on} +@item +@code{\mglgraphics}: New command options: @code{gray, mglscale, quality, variant} +@item +@code{\mglname}: Now writes the MGL code line @samp{setsize 600 400} to the main script +@item +@code{\mglplot}: Added @code{\bgroup} and @code{\egroup} in order to keep changes private +@item +New command options: @code{gray, mglscale, quality, variant} +@item +@code{\mglsettings}: Added options @code{gray} and @code{variant} +@item +Now calls the @code{\mglswitch} and @code{\mglcomments} commands for the switch and comments options, respectively +@item +@code{\mglswitch}: Now accepts arguments 0 (equivalent to @code{off}) and 1 (equivalent to @code{on}), besides the usual @code{off} and @code{on} +@item +mglTeX now depends on the ifpdf package +@item +Change definition of @code{\mglcommentname} from MGL comment to mglTEX comment +@item +Introduce the concept of global, local and private settings in the documentation +@item +New commands: @code{\mglgray} (to activate/deactivate) gray-scale mode locally, and @code{\mglvariant} (to set variant of arguments in MGL scripts locally) +@item +New package option @code{9q} for setting quality to 9 (for testing purposes of the author) +@item +New package options @code{0v, 1v, 2v} to select variant of arguments in MGL scripts +@item +New package options @code{gray, color} to activate/deactivate gray-scale mode for graphics +@item +Remove the @code{\MGL@@setkeys} command, since it isn’t needed as first thought +@item +Rename @code{\MGL@@document@@scripts} to @code{\MGL@@doc@@scripts} +@item +Rename @code{\MGL@@script@@name} to @code{\MGL@@script} +@item +Rename command @code{\MGL@@graph@@ext} to @code{\MGL@@imgext} +@item +Rename command @code{\mglcommonscriptname} to @code{\mglsetupscriptname} +@item +Rename environment @code{mglcommon} to @code{mglsetupscript} (@code{mglcommon} is still available, but deprecated) +@item +Rename family @code{MGL@@keys} as @code{MGL@@gr@@keys} for consistency +@item +Reorganize and update documentation +@item +Some minor bugfixes +@item +The MGL code line @samp{setsize 600 400} is now automatically written to the main script in order for the scaling options and commands to work +@item +@code{mgl}: New environment options: gray, mglscale, quality, variant +@item +@code{\mglcode}: New environment options: gray, mglscale, quality, variant +@end itemize + +@item +Add MGL command @ref{variant} to select proper variant of arguments (like @samp{var1?var2?var3?...}) in MGL commands. +@item +Remove limitation of maximal number (was 1000) of arguments for MGL commands. This is actual for 'list' command. +@item +Add mglWnd::Widget() for accessing widget which is used for drawing. +@item +Add @ref{gray} for producing gray-scaled image. +@item +Add MGL command @ref{setsizescl} for scaling all further @ref{setsize}. +@item +Add @ref{shear} for shearing plot. +@item +Add @ref{shearplot} for placing plots side-by-side with some shearing. +@item +Add @ref{limit} for limit maximal absolute value of data. +@item +Add @ref{tridmat} for tridiagonal matrix algorithm. +@item +Add MGL command @ref{diffract} for single step diffraction calculation. +@item +Add @ref{ifsfile} for reading IFS fractal parameters from *.ifs file. +@item +Add style @samp{*} for 2d versions of @ref{flow} to draw threads from points inside axis range. +@item +Add @samp{norm()} to the list of known functions +@item +Compatibility changes for MS VisualStudio, MacOS, Win64. +@item +Bugfix for legend export into EPS and SVG. +@item +Bugfix for importing data from std::vector. +@item +Improve Surf3*() drawing. +@item +Force NAN if divided by 0 in formulas. +@item +Option "-S" of mglconv now perform scaling in any cases +@end itemize + @item @strong{13 February 2016.} New version (v.2.3.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new functions, plot types and styles, improvement in MGL scripts and in mgltex, some speeding up and bugfixes: @itemize @bullet diff --git a/texinfo/widget_en.texi b/texinfo/widget_en.texi index d9f5169..79cb4b4 100644 --- a/texinfo/widget_en.texi +++ b/texinfo/widget_en.texi @@ -176,6 +176,12 @@ showing the last mouse click position in the widget. Gets last position of mouse click. @end deftypefn +@deftypefn {Method on @code{mglWnd}} @code{void *} Widget () +@deftypefnx {C function} @code{void *} mgl_fltk_widget (@code{HMGL} gr) +@deftypefnx {C function} @code{void *} mgl_qt_widget (@code{HMGL} gr) +Return pointer to widget (@ref{Fl_MathGL class} or @ref{QMathGL class}) used for plotting. +@end deftypefn + @c ------------------------------------------------------------------ @external{} diff --git a/texinfo/widget_ru.texi b/texinfo/widget_ru.texi index 5066c58..7f08187 100644 --- a/texinfo/widget_ru.texi +++ b/texinfo/widget_ru.texi @@ -177,6 +177,12 @@ public: Возвращает положение щелчка мыши. @end deftypefn +@deftypefn {Method on @code{mglWnd}} @code{void *} Widget () +@deftypefnx {C function} @code{void *} mgl_fltk_widget (@code{HMGL} gr) +@deftypefnx {C function} @code{void *} mgl_qt_widget (@code{HMGL} gr) +Возвращает указатель на виджет (@ref{Fl_MathGL class} or @ref{QMathGL class}), используемый для рисования. +@end deftypefn + @c ------------------------------------------------------------------ @external{} @node mglDraw class, Fl_MathGL class, mglWnd class, Widget classes diff --git a/todo.txt b/todo.txt index 2bef216..c86c56f 100644 --- a/todo.txt +++ b/todo.txt @@ -47,19 +47,23 @@ void DrawGlyph(int id, mglPoint pos, double angle, double scale, const char *stl 11. Iris plot -- https://en.wikipedia.org/wiki/Iris_flower_data_set 12. Parallel drawing in QMathGL. +17. Speed up QMathGL + option to whole redraw instead of view + ZZ. Update *.i for new functions {before release!!!} ============= DOCUMENTATION ============= -A. Paper about MathGL!!! 6099610006 +A. Paper about MathGL!!! B. Add chapter with real samples C. Translate to Russian everything D. Docs about JS interface -6. Update Qt and UDAV figures - -YY. Sample like http://pyxplot.org.uk/examples/05ap/02hlines/index.html using Stem() +1. Update Qt and UDAV figures +2. Sample about PDE -- add 'tridmat' + 'diffract' +3. Replace mgl-qt!!! +4. Step_xy() now can have x.nx>y.nx -- same as Bars() +5. Docs about 'flame2d' ============= UDAV ============= diff --git a/udav/CMakeLists.txt b/udav/CMakeLists.txt index 4c80b36..8ed4e9a 100644 --- a/udav/CMakeLists.txt +++ b/udav/CMakeLists.txt @@ -18,16 +18,6 @@ if(WIN32) set(udav_src ${udav_src} udav.rc) endif(WIN32) -if(MGL_HAVE_HDF5) -# target_link_libraries(mgl ${HDF5_LIBRARIES}) - include_directories(${HDF5_INCLUDE_DIR}) -endif(MGL_HAVE_HDF5) - -if(MGL_HAVE_GSL) -# target_link_libraries(mgl ${GSL_LIB} ${GSL_CBLAS_LIB} ) - include_directories(${GSL_INCLUDE_DIR}) -endif(MGL_HAVE_GSL) - if(enable-qt5) include(../cmake-qt5.txt) qt5_add_resources(udav_rc_src ${udav_rc} ) @@ -38,11 +28,9 @@ endif(enable-qt5) add_executable(udav ${udav_src} ${udav_moc_hdr} ${udav_rc_src}) #set_target_properties(udav PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -pthread") if(enable-qt5) - target_link_libraries(udav mgl-qt5) - qt5_use_modules(udav ${MGL_QT5_LIBS}) + target_link_libraries(udav mgl-qt5 ${MGL_QT5_LIBS}) else(enable-qt5) - target_link_libraries(udav mgl-qt4) - qt4_use_modules(udav ${MGL_QT4_LIBS}) + target_link_libraries(udav mgl-qt4 ${MGL_QT4_LIBS}) endif(enable-qt5) if(MGL_HAVE_PTHREAD) diff --git a/udav/anim_dlg.h b/udav/anim_dlg.h index 4a34682..0637591 100644 --- a/udav/anim_dlg.h +++ b/udav/anim_dlg.h @@ -21,6 +21,9 @@ #define ANIMPARAM_H //----------------------------------------------------------------------------- #include +#if defined(_MSC_VER) +#include +#endif //----------------------------------------------------------------------------- class QLineEdit; class QTextEdit; diff --git a/udav/dat_pnl.cpp b/udav/dat_pnl.cpp index 950886a..eec9d76 100644 --- a/udav/dat_pnl.cpp +++ b/udav/dat_pnl.cpp @@ -145,7 +145,7 @@ void DatPanel::setVar(mglDataA *v) nx = ny = nz = kz = 0; if(v) { - QString s = QString::fromStdWString(v->s); + QString s = QString::fromWCharArray(v->s.c_str()); v->o = this; v->func = deleteDat; refresh(); setWindowTitle(s + tr(" - UDAV variable")); @@ -211,7 +211,7 @@ void DatPanel::putValue(int r, int c) if(s=="nan") f=NAN; else if(s=="inf") f=INFINITY; else if(s=="-inf") f=-INFINITY; - else g = mgl_str2dual(s.toStdString().c_str()); //f = s.toDouble(); + else g = mgl_str2dual(s.toLocal8Bit().constData()); //f = s.toDouble(); f = real(g); mglDataC *cc = dynamic_cast(var); if(cc) @@ -251,15 +251,15 @@ void DatPanel::save() { bool ok; QString s = QInputDialog::getText(this, tr("UDAV - Export to PNG"), tr("Enter color scheme for picture"), QLineEdit::Normal, MGL_DEF_SCH, &ok); - if(ok) var->Export(fn.toStdString().c_str(), s.toStdString().c_str()); + if(ok) var->Export(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } else if(ext=="h5" || ext=="hdf") { bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Save to HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromStdWString(var->s), &ok); - if(ok) var->SaveHDF(fn.toStdString().c_str(), s.toStdString().c_str()); + QString s = QInputDialog::getText(this, tr("UDAV - Save to HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->s.c_str()), &ok); + if(ok) var->SaveHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } - else var->Save(fn.toStdString().c_str()); + else var->Save(fn.toLocal8Bit().constData()); } //----------------------------------------------------------------------------- void DatPanel::load() @@ -273,15 +273,15 @@ void DatPanel::load() { bool ok; QString s = QInputDialog::getText(this, tr("UDAV - Import PNG"), tr("Enter color scheme for picture"), QLineEdit::Normal, MGL_DEF_SCH, &ok); - if(ok) d->Import(fn.toStdString().c_str(), s.toStdString().c_str()); + if(ok) d->Import(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } else if(ext=="h5" || ext=="hdf") { bool ok; - QString s = QInputDialog::getText(this, tr("UDAV - Read from HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromStdWString(var->s), &ok); - if(ok) d->ReadHDF(fn.toStdString().c_str(), s.toStdString().c_str()); + QString s = QInputDialog::getText(this, tr("UDAV - Read from HDF"), tr("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->s.c_str()), &ok); + if(ok) d->ReadHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } - else d->Read(fn.toStdString().c_str()); + else d->Read(fn.toLocal8Bit().constData()); refresh(); } //----------------------------------------------------------------------------- @@ -465,7 +465,7 @@ void DatPanel::hist() bool res = d->exec(); if(res && !v1->text().isEmpty() && !v2->text().isEmpty() && !id->text().isEmpty()) { - mglData *vv = dynamic_cast(parser.AddVar(id->text().toStdString().c_str())); + mglData *vv = dynamic_cast(parser.AddVar(id->text().toLocal8Bit().constData())); if(vv) vv->Set(mgl_data_hist(var, nm->value(), v1->text().toDouble(), v2->text().toDouble(),0)); updateDataItems(); } @@ -558,7 +558,7 @@ void DatPanel::newdat() bool res = d->exec(); QString val = f1->text(), mgl; int k = c->currentIndex(); - QString self = QString::fromStdWString(var->s); + QString self = QString::fromWCharArray(var->s.c_str()); if(res) { if(k<0) @@ -594,7 +594,7 @@ void DatPanel::newdat() if(!mgl.isEmpty()) { mglGraph gr; - parser.Execute(&gr,mgl.toStdString().c_str()); + parser.Execute(&gr,mgl.toLocal8Bit().constData()); if(k>=6) opers += mgl+"\n"; updateDataItems(); } @@ -635,7 +635,7 @@ void DatPanel::oper() bool res = d->exec(); QString val = f1->text(), mgl; int k = c->currentIndex(); - QString self = QString::fromStdWString(var->s); + QString self = QString::fromWCharArray(var->s.c_str()); if(res) { if(k<0) @@ -665,7 +665,7 @@ void DatPanel::oper() if(!mgl.isEmpty()) { mglGraph gr; - parser.Execute(&gr,mgl.toStdString().c_str()); + parser.Execute(&gr,mgl.toLocal8Bit().constData()); opers += mgl+"\n"; updateDataItems(); } @@ -836,5 +836,5 @@ void DatPanel::toolLeft(QBoxLayout *l) bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); } //----------------------------------------------------------------------------- -QString DatPanel::dataName() { return QString::fromStdWString(var->s); } +QString DatPanel::dataName() { return QString::fromWCharArray(var->s.c_str()); } //----------------------------------------------------------------------------- diff --git a/udav/data_dlg.cpp b/udav/data_dlg.cpp index 3ad3c55..af3f0f4 100644 --- a/udav/data_dlg.cpp +++ b/udav/data_dlg.cpp @@ -132,7 +132,7 @@ void DataDialog::updateNames() for(i=0;iaddItem(QString::fromStdWString(v->s)); + if(v) name->addItem(QString::fromWCharArray(v->s.c_str())); } } //----------------------------------------------------------------------------- diff --git a/udav/files_dlg.h b/udav/files_dlg.h index 2bb3177..1db3a5a 100644 --- a/udav/files_dlg.h +++ b/udav/files_dlg.h @@ -21,6 +21,9 @@ #define FILES_DLG_H //----------------------------------------------------------------------------- #include +#if defined(_MSC_VER) +#include +#endif class QLineEdit; class QComboBox; class QRadioButton; diff --git a/udav/find_dlg.h b/udav/find_dlg.h index 921c259..221901c 100644 --- a/udav/find_dlg.h +++ b/udav/find_dlg.h @@ -24,6 +24,9 @@ class QCheckBox; class QLineEdit; class QPushButton; +#if defined(_MSC_VER) +#include +#endif //----------------------------------------------------------------------------- /// Dialog for finding something in text class FindDialog : public QDialog diff --git a/udav/help_pnl.h b/udav/help_pnl.h index 132f7ed..c6e4a1d 100644 --- a/udav/help_pnl.h +++ b/udav/help_pnl.h @@ -21,6 +21,9 @@ #define HELP_PNL_H //----------------------------------------------------------------------------- #include +#if defined(_MSC_VER) +#include +#endif class QTextBrowser; class QLineEdit; //----------------------------------------------------------------------------- diff --git a/udav/hint_dlg.cpp b/udav/hint_dlg.cpp index be555e4..bb67fe0 100644 --- a/udav/hint_dlg.cpp +++ b/udav/hint_dlg.cpp @@ -24,37 +24,33 @@ #include "hint_dlg.h" #include "mgl2/data_cf.h" //----------------------------------------------------------------------------- -#define qtr HintDialog::tr -QString hints[] = { - qtr("You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel."), - qtr("You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zoom/perspective, middle button for shift."), - qtr("You may quickly draw the data from file. Just use: udav 'filename.dat' in command line."), - qtr("You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later you can paste it directly into yours document or presentation."), - qtr("You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'."), - qtr("You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'."), - qtr("You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops."), - qtr("New drawing never clears things drawn already. For example, you can make a surface with contour lines by calling commands 'surf' and 'cont' one after another (in any order). "), - qtr("You can put several plots in the same image by help of commands 'subplot' or 'inplot'."), - qtr("All indexes (of data arrays, subplots and so on) are always start from 0."), - qtr("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview."), - qtr("You can use command 'once on|off' for marking the block which should be executed only once. For example, this can be the block of large data reading/creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute this block."), - qtr("You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script."), - qtr("You can type arbitrary expression as input argument for data or number. In last case (for numbers), the first value of data array is used."), - qtr("There is powerful calculator with a lot of special functions. You can use buttons or keyboard to type the expression. Also you can use existed variables in the expression."), - qtr("The calculator can help you to put complex expression in the script. Just type the expression (which may depend on coordinates x,y,z and so on) and put it into the script."), - qtr("You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert."), - qtr("The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script."), - qtr("You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously."), - qtr("") -}; -//----------------------------------------------------------------------------- // // Hint dialog // //----------------------------------------------------------------------------- HintDialog::HintDialog(QWidget *parent) : QDialog(parent) { - for(numHints=0;!hints[numHints].isEmpty();numHints++); + hints.append(tr("You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel.")); + hints.append(tr("You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zoom/perspective, middle button for shift.")); + hints.append(tr("You may quickly draw the data from file. Just use: udav 'filename.dat' in command line.")); + hints.append(tr("You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later you can paste it directly into yours document or presentation.")); + hints.append(tr("You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'.")); + hints.append(tr("You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'.")); + hints.append(tr("You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops.")); + hints.append(tr("New drawing never clears things drawn already. For example, you can make a surface with contour lines by calling commands 'surf' and 'cont' one after another (in any order). ")); + hints.append(tr("You can put several plots in the same image by help of commands 'subplot' or 'inplot'.")); + hints.append(tr("All indexes (of data arrays, subplots and so on) are always start from 0.")); + hints.append(tr("You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview.")); + hints.append(tr("You can use command 'once on|off' for marking the block which should be executed only once. For example, this can be the block of large data reading/creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute this block.")); + hints.append(tr("You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script.")); + hints.append(tr("You can type arbitrary expression as input argument for data or number. In last case (for numbers), the first value of data array is used.")); + hints.append(tr("There is powerful calculator with a lot of special functions. You can use buttons or keyboard to type the expression. Also you can use existed variables in the expression.")); + hints.append(tr("The calculator can help you to put complex expression in the script. Just type the expression (which may depend on coordinates x,y,z and so on) and put it into the script.")); + hints.append(tr("You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert.")); + hints.append(tr("The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script.")); + hints.append(tr("You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously.")); + + numHints=hints.size(); cur = int(mgl_rnd()*numHints); setWindowTitle(tr("UDAV - Hint")); QHBoxLayout *a; diff --git a/udav/hint_dlg.h b/udav/hint_dlg.h index 338b222..8bb2a66 100644 --- a/udav/hint_dlg.h +++ b/udav/hint_dlg.h @@ -23,7 +23,6 @@ #include #include class QCheckBox; -extern QString hints[]; //----------------------------------------------------------------------------- /// Dialog for showing hints class HintDialog : public QDialog @@ -42,6 +41,7 @@ private slots: private: int cur; int numHints; + QVector hints; QTextEdit *text; QCheckBox *start; }; diff --git a/udav/info_dlg.cpp b/udav/info_dlg.cpp index 528da56..fadae24 100644 --- a/udav/info_dlg.cpp +++ b/udav/info_dlg.cpp @@ -63,7 +63,7 @@ void InfoDialog::refresh(bool force) { if(!var || (!force && (!allowRefresh || !isVisible()))) return; QString text, name, sub; - name = QString::fromStdWString(var->s); + name = QString::fromWCharArray(var->s.c_str()); sub = "(:,:,"+QString::number(kz)+")\n"; int i = kind->currentIndex(); if(i<1) text = "yrange "+name+"\nplot "+name + sub; diff --git a/udav/mem_pnl.cpp b/udav/mem_pnl.cpp index 7b9da01..fa1db0e 100644 --- a/udav/mem_pnl.cpp +++ b/udav/mem_pnl.cpp @@ -83,7 +83,7 @@ void MemPanel::newTable() QString name = QInputDialog::getText(this, tr("UDAV - New variable"), tr("Enter name for new variable"), QLineEdit::Normal, "", &ok); if(!ok || name.isEmpty()) return; - mglDataA *v = parser.AddVar(name.toStdString().c_str()); + mglDataA *v = parser.AddVar(name.toLocal8Bit().constData()); QWidget *t; if(v->o) t = (QWidget *)v->o; else t = newDataWnd(infoDlg,wnd,v); @@ -96,7 +96,7 @@ void MemPanel::editData(int n) if(tab->rowCount()<1) return; if(n<0) n = tab->currentRow(); if(n<0) n = 0; - mglDataA *v = parser.FindVar(tab->item(n,0)->text().toStdString().c_str()); + mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData()); if(!v) return; QWidget *t; if(v->o) t = (QWidget *)v->o; @@ -109,9 +109,9 @@ void MemPanel::delData() if(tab->rowCount()<1) return; int n = tab->currentRow(); if(n<0) n = 0; - mglDataA *v = parser.FindVar(tab->item(n,0)->text().toStdString().c_str()); + mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData()); if(!v && v->o) ((QWidget *)v->o)->close(); - parser.DeleteVar(tab->item(n,0)->text().toStdString().c_str()); + parser.DeleteVar(tab->item(n,0)->text().toLocal8Bit().constData()); refresh(); } //----------------------------------------------------------------------------- @@ -128,10 +128,10 @@ void MemPanel::infoData() if(tab->rowCount()<1) return; int n = tab->currentRow(); if(n<0) n = 0; - mglDataA *v = parser.FindVar(tab->item(n,0)->text().toStdString().c_str()); + mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData()); if(!v) return; infoDlg->setVar(v); - QString s = QString::fromStdWString(v->s); + QString s = QString::fromWCharArray(v->s.c_str()); infoDlg->setWindowTitle(s + tr(" - UDAV preview")); infoDlg->refresh(); infoDlg->show(); @@ -149,7 +149,7 @@ void MemPanel::refresh() { mglDataA *v = parser.GetVar(i); if(!v) continue; - s = QString::fromStdWString(v->s); + s = QString::fromWCharArray(v->s.c_str()); it = new QTableWidgetItem(s); tab->setItem(m,0,it); it->setFlags(flags); s.sprintf("%ld * %ld * %ld", v->GetNx(), v->GetNy(), v->GetNz()); diff --git a/udav/newcmd_dlg.cpp b/udav/newcmd_dlg.cpp index 3d1d24f..39e295b 100644 --- a/udav/newcmd_dlg.cpp +++ b/udav/newcmd_dlg.cpp @@ -248,10 +248,12 @@ void NewCmdDialog::nameChanged(int s) // clear old kind->clear(); kinds.clear(); for(k=0;ksetText(QString::fromLocal8Bit(parser.CmdDesc(n.toStdString().c_str()))); + QByteArray qcmd = n.toLatin1(); + const char *cmd = qcmd.constData(); + if(!parser.CmdType(cmd)) return; + info->setText(parser.CmdDesc(cmd)); - par = QString::fromLocal8Bit(parser.CmdFormat(n.toStdString().c_str())); + par = parser.CmdFormat(cmd); int i0 = par.indexOf(' '); // first space if present if(i0<0) { kind->addItem(par); return; } // no arguments // parse kind of arguments diff --git a/udav/open_dlg.cpp b/udav/open_dlg.cpp index 58ae5fd..961d47e 100644 --- a/udav/open_dlg.cpp +++ b/udav/open_dlg.cpp @@ -116,29 +116,29 @@ void DataOpenDialog::prepareResult() // prepare unique value of name for next time char buf[32]; snprintf(buf,32,"mgl_%d",numDataOpened); buf[31]=0; name->setText(buf); - mglData *v = dynamic_cast(parser.AddVar(data.toStdString().c_str())); + mglData *v = dynamic_cast(parser.AddVar(data.toLocal8Bit().constData())); if(!v) return; int dd=0; if(rA->isChecked()) // auto sizes { - setlocale(LC_NUMERIC, "C"); v->Read(file.toStdString().c_str()); setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, "C"); v->Read(file.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); if(v->nx==1) { v->nx = v->ny; v->ny = v->nz; } code=QString("#read %1 '%2'\n").arg(data).arg(file); } else if(rM->isChecked()) // manual sizes { int x=nx->text().toInt(), y=ny->text().toInt(), z=nz->text().toInt(); - setlocale(LC_NUMERIC, "C"); v->Read(file.toStdString().c_str(),x,y,z); setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, "C"); v->Read(file.toLocal8Bit().constData(),x,y,z); setlocale(LC_NUMERIC, ""); code=QString("#read %1 '%2' %3 %4 %5\n").arg(data).arg(file).arg(x).arg(y).arg(z); } else if(r2->isChecked()) // matrix { - setlocale(LC_NUMERIC, "C"); v->ReadMat(file.toStdString().c_str()); setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, "C"); v->ReadMat(file.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); code=QString("#readmat %1 '%2'\n").arg(data).arg(file); dd=1; } else if(r3->isChecked()) // 3d-data { - setlocale(LC_NUMERIC, "C"); v->ReadMat(file.toStdString().c_str(),3); setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, "C"); v->ReadMat(file.toLocal8Bit().constData(),3); setlocale(LC_NUMERIC, ""); code=QString("#readmat %1 '%2' 3\n").arg(data).arg(file); dd=2; } if(scr->lineEdit()->text().isEmpty() || scr->lineEdit()->text()==tr("default")) @@ -173,7 +173,7 @@ void DataOpenDialog::prepareResult() void DataOpenDialog::setFile(const QString &fname) { file=fname; - mglData d(file.toStdString().c_str()); + mglData d(file.toLocal8Bit().constData()); rA->setText(tr("Auto detect data sizes (%1 x %2 x %3)").arg(d.nx).arg(d.ny).arg(d.nz)); } //----------------------------------------------------------------------------- diff --git a/udav/opt_dlg.h b/udav/opt_dlg.h index 2e25952..796c1e1 100644 --- a/udav/opt_dlg.h +++ b/udav/opt_dlg.h @@ -21,6 +21,9 @@ #define OPTION_DLG_H //----------------------------------------------------------------------------- #include +#if defined(_MSC_VER) +#include +#endif class QLineEdit; class QComboBox; class QRadioButton; diff --git a/udav/setup_dlg.h b/udav/setup_dlg.h index 5b501a9..6e365a4 100644 --- a/udav/setup_dlg.h +++ b/udav/setup_dlg.h @@ -21,6 +21,9 @@ #define SETUPDIALOG_H //----------------------------------------------------------------------------- #include +#if defined(_MSC_VER) +#include +#endif class QLineEdit; class QCheckBox; class QComboBox; diff --git a/udav/style_dlg.cpp b/udav/style_dlg.cpp index f9e0c29..d98c7c5 100644 --- a/udav/style_dlg.cpp +++ b/udav/style_dlg.cpp @@ -451,7 +451,7 @@ void StyleDialog::updatePic() else result += col[i-1]; } i = width->value(); if(i>1) result += char('0'+i); - gr.Plot(x,y,result.toStdString().c_str()); + gr.Plot(x,y,result.toLocal8Bit().constData()); break; case 1: // color sceheme case 3: // manual mask @@ -492,7 +492,7 @@ void StyleDialog::updatePic() i = axial->currentIndex(); if(i>0) result = result+':'+char('x'+i-1); - gr.Surf(a,result.toStdString().c_str()); + gr.Surf(a,result.toLocal8Bit().constData()); break; case 2: // text style if(font_sch->isChecked()) for(j=0;j<7;j++) @@ -518,7 +518,7 @@ void StyleDialog::updatePic() if(rbL->isChecked()) result += 'L'; if(rbC->isChecked()) result += 'C'; if(rbR->isChecked()) result += 'R'; - gr.Puts(mglPoint(0,-0.5),"Font test",result.toStdString().c_str(),-10); + gr.Puts(mglPoint(0,-0.5),"Font test",result.toLocal8Bit().constData(),-10); break; } result = "'" + result + "'"; diff --git a/udav/subplot_dlg.cpp b/udav/subplot_dlg.cpp index 80b1c64..07ddedf 100644 --- a/udav/subplot_dlg.cpp +++ b/udav/subplot_dlg.cpp @@ -231,6 +231,7 @@ void SubplotDialog::updatePic() { static mglGraph gr; gr.SetSize(pic->width(),pic->height()); mglParse par; + wchar_t *wcmd; setlocale(LC_NUMERIC, "C"); QString stl="'"; // style for subplot @@ -255,7 +256,11 @@ void SubplotDialog::updatePic() { cmd += ":title '"+title->text()+"'"; if(!fmt.isEmpty()) cmd += fmt; } if(Tet || Phi) cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi); if(Ax!=1 || Ay!=1) cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay); - par.Execute(&gr, cmd.toStdWString().c_str()); gr.Box(); + wcmd = new wchar_t[cmd.size()+1]; + cmd.toWCharArray(wcmd); + wcmd[cmd.size()] = 0; + par.Execute(&gr, wcmd); gr.Box(); + delete[] wcmd; res->setText(cmd); } else if(cm->isChecked()) // multiplot @@ -267,7 +272,11 @@ void SubplotDialog::updatePic() { cmd += ":title '"+title->text()+"'"; if(!fmt.isEmpty()) cmd += fmt; } if(Tet || Phi) cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi); if(Ax!=1 || Ay!=1) cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay); - par.Execute(&gr, cmd.toStdWString().c_str()); gr.Box(); + wcmd = new wchar_t[cmd.size() + 1]; + cmd.toWCharArray(wcmd); + wcmd[cmd.size()] = 0; + par.Execute(&gr, wcmd); gr.Box(); + delete[] wcmd; res->setText(cmd); } else if(cg->isChecked()) // gridplot @@ -277,7 +286,11 @@ void SubplotDialog::updatePic() for(int i=0;isetText(cmd); } else if(cs->isChecked()) // stickplot @@ -286,7 +299,11 @@ void SubplotDialog::updatePic() for(int i=0;isetText(cmd); } else if(cc->isChecked()) // columnplot // TODO add angles @@ -297,7 +314,11 @@ void SubplotDialog::updatePic() cmd = "columnplot "+QString::number(n)+" "+QString::number(k)+" "+QString::number(d); if(Tet || Phi) cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi); if(Ax!=1 || Ay!=1) cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay); - par.Execute(&gr, cmd.toStdWString().c_str()); gr.Box(); + wcmd = new wchar_t[cmd.size() + 1]; + cmd.toWCharArray(wcmd); + wcmd[cmd.size()] = 0; + par.Execute(&gr, wcmd); gr.Box(); + delete[] wcmd; res->setText(cmd); } else if(ci->isChecked()) // inplot @@ -308,7 +329,11 @@ void SubplotDialog::updatePic() { cmd += ":title '"+title->text()+"'"; if(!fmt.isEmpty()) cmd += fmt; } if(Tet || Phi) cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi); if(Ax!=1 || Ay!=1) cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay); - par.Execute(&gr, cmd.toStdWString().c_str()); gr.Box(); + wcmd = new wchar_t[cmd.size() + 1]; + cmd.toWCharArray(wcmd); + wcmd[cmd.size()] = 0; + par.Execute(&gr, wcmd); gr.Box(); + delete[] wcmd; res->setText(cmd); } setlocale(LC_NUMERIC, ""); diff --git a/udav/text_pnl.cpp b/udav/text_pnl.cpp index 293c10b..4167327 100644 --- a/udav/text_pnl.cpp +++ b/udav/text_pnl.cpp @@ -63,7 +63,7 @@ TextPanel::TextPanel(QWidget *parent) : QWidget(parent) if(!files_dlg) files_dlg= new FilesDialog; register int i,n=parser.GetCmdNum(); - for(i=0;is.length()>2) vars<s); + if(v && v->s.length()>2) vars<s.c_str()); } setCompleter(mglCompleter); } @@ -293,7 +293,7 @@ void TextPanel::loadHDF5(const QString &fileName) hid_t hf,hg,hd,hs,ht; hsize_t dims[3]; long rank; - hf = H5Fopen(fileName.toStdString().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + hf = H5Fopen(fileName.toLocal8Bit().constData(), H5F_ACC_RDONLY, H5P_DEFAULT); if(!hf) return; hg = H5Gopen(hf, "/"); hsize_t num, nx, ny, nz, i; @@ -359,7 +359,7 @@ void TextPanel::saveHDF5(const QString &fileName) long rank = 3; H5Eset_auto(0,0); - hf = H5Fcreate(fileName.toStdString().c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + hf = H5Fcreate(fileName.toLocal8Bit().constData(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if(hf<0) { setStatus(tr("Could not write to %1").arg(fileName)); @@ -372,7 +372,7 @@ void TextPanel::saveHDF5(const QString &fileName) txt += edit->toPlainText(); dims[0] = txt.length()+1; char *buf = new char[dims[0]+1]; - memcpy(buf, txt.toStdString().c_str(), dims[0]); + memcpy(buf, txt.toLocal8Bit().constData(), dims[0]); buf[dims[0]]=0; hs = H5Screate_simple(1, dims, 0); hd = H5Dcreate(hf, "mgl_script", H5T_C_S1, hs, H5P_DEFAULT); diff --git a/udav/textedit.cpp b/udav/textedit.cpp index 7a04610..846f54f 100644 --- a/udav/textedit.cpp +++ b/udav/textedit.cpp @@ -305,7 +305,8 @@ bool TextEdit::isErrLine(int line) const void TextEdit::setErrMessage(const QString &mess) { err.clear(); - const char *s = mess.toStdString().c_str(); + QByteArray qs = mess.toLatin1(); + const char *s = qs.constData(); s = strstr(s,"in line "); while(s) { diff --git a/udav/textedit.h b/udav/textedit.h index 6a54db9..080cafd 100644 --- a/udav/textedit.h +++ b/udav/textedit.h @@ -41,6 +41,9 @@ #define TEXTEDIT_H //----------------------------------------------------------------------------- #include +#if defined(_MSC_VER) +#include +#endif //----------------------------------------------------------------------------- class QCompleter; class Numb; diff --git a/udav/udav_wnd.cpp b/udav/udav_wnd.cpp index 9ce96a6..f885946 100644 --- a/udav/udav_wnd.cpp +++ b/udav/udav_wnd.cpp @@ -424,9 +424,11 @@ void MainWindow::editPosChanged() for(i=0;imgl->getGraph(), fileName.toStdString().c_str()); + mgl_set_plotid(graph->mgl->getGraph(), fileName.toLocal8Bit().constData()); edit->setModified(false); if(filename.isEmpty()) setWindowTitle(tr("untitled - UDAV")); diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index 9dca3b1..b3c6932 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -1,15 +1,19 @@ -include_directories(${GSL_INCLUDE_DIR}) add_executable(make_pas make_pas.cpp) add_executable(mglconv mglconv.cpp) -target_link_libraries(mglconv mgl) +if(MSVC) +set(link_type -static) +else(MSVC) +set(link_type) +endif(MSVC) +target_link_libraries(mglconv mgl${link_type} ${getopt_lib-static}) install( TARGETS mglconv RUNTIME DESTINATION bin ) add_executable(mgl.cgi mglcgi.cpp) -target_link_libraries(mgl.cgi mgl) +target_link_libraries(mgl.cgi mgl${link_type}) install( TARGETS mgl.cgi # should be /usr/lib/cgi-bin/ @@ -20,12 +24,10 @@ if(QT_ENABLED) add_executable(mglview mglview.cpp) if(enable-qt5) include(../cmake-qt5.txt) - target_link_libraries(mglview mgl-qt5) - qt5_use_modules(mglview ${MGL_QT5_LIBS}) + target_link_libraries(mglview mgl-qt5${link_type} ${getopt_lib-static} ${MGL_QT5_LIBS}) else(enable-qt5) include(../cmake-qt4.txt) - target_link_libraries(mglview mgl-qt4) - qt4_use_modules(mglview ${MGL_QT4_LIBS}) + target_link_libraries(mglview mgl-qt4${link_type} ${getopt_lib-static} ${MGL_QT4_LIBS}) endif(enable-qt5) install( diff --git a/utils/make_pas.cpp b/utils/make_pas.cpp index fd38efd..eb67790 100644 --- a/utils/make_pas.cpp +++ b/utils/make_pas.cpp @@ -1,5 +1,7 @@ #include #include +#include + const char *files[] = { diff --git a/utils/mglcgi.cpp b/utils/mglcgi.cpp index befec30..ea72b90 100644 --- a/utils/mglcgi.cpp +++ b/utils/mglcgi.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mglcgi.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * diff --git a/utils/mglconv.cpp b/utils/mglconv.cpp index 9f6551c..f9dd480 100644 --- a/utils/mglconv.cpp +++ b/utils/mglconv.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * mglconv.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -20,6 +20,12 @@ #include #include #include "mgl2/mgl.h" + +#ifdef _MSC_VER +#define mnpos (std::basic_string::size_type)-1 +#else +#define mnpos std::wstring::npos +#endif void mgl_error_print(const char *Message, void *par); void mgl_ask_gets(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- @@ -35,7 +41,7 @@ int main(int argc, char *argv[]) while(1) { - int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:"); + int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:v:g:"); if(ch>='1' && ch<='9') p.AddParam(ch-'0', optarg); else if(ch=='s') { @@ -52,10 +58,12 @@ int main(int argc, char *argv[]) else if(ch=='L') setlocale(LC_CTYPE, optarg); else if(ch=='S') mgl_set_size_scl(atof(optarg)); else if(ch=='q') gr.SetQuality(atoi(optarg)); + else if(ch=='v') p.SetVariant(atoi(optarg)); + else if(ch=='g') gr.Gray(atoi(optarg)); else if(ch=='A') { std::wstring str; - for(long i=0;optarg[i];i++) str.push_back(optarg[i]); + for(size_t i=0;optarg[i];i++) str.push_back(optarg[i]); var.push_back(str); } else if(ch=='C') @@ -82,6 +90,8 @@ int main(int argc, char *argv[]) "\t-s fname set MGL script for setting up the plot\n" "\t-S val set scaling factor for images\n" "\t-q val set quality for output (val=0...9)\n" + "\t-g val set gray-scale mode (val=0|1)\n" + "\t-v val set variant of arguments\n" "\t-o name set output file name\n" "\t-n no default output (script should save results by itself)\n" "\t-A val add animation value val\n" @@ -107,16 +117,16 @@ int main(int argc, char *argv[]) while(!feof(fp) && size_t(cw=fgetwc(fp))!=WEOF) str.push_back(cw); if(*iname) fclose(fp); - unsigned long n; - for(long i=0;;) // collect exact values + size_t n; + for(size_t i=0;;) // collect exact values { n = str.find(L"##a ",i); - if(n==std::string::npos) break; + if (n == mnpos) break; i = n+4; var.push_back(str.substr(i,str.find('\n',i))); } n = str.find(L"##c "); - if(n!=std::string::npos) - { + if (n != mnpos) + { double v1,v2,dv,v; wscanf(str.c_str()+n+4,L"%lg%lg%lg",&v1,&v2,&dv); wchar_t ss[64]; @@ -124,18 +134,19 @@ int main(int argc, char *argv[]) { mglprintf(ss,64,L"%g",v); var.push_back(ss); } } bool gif = !strcmp(oname+strlen(oname)-4,".gif"); + gr.SetSize(600,400); // specially call for "S" option if(var.size()>1) // there is animation { if(gif) gr.StartGIF(oname); - for(unsigned long i=0;i * + * Copyright (C) 2007-2016 Alexey Balakin * * * * 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 * @@ -22,13 +22,10 @@ #include "mgl2/mgl.h" #include "mgl2/qt.h" +#include "mgl2/parser.h" //----------------------------------------------------------------------------- std::wstring str, opt; mglParse p(true); -void mgl_error_print(const char *Message, void *par); -void mgl_ask_fltk(const wchar_t *quest, wchar_t *res); -void mgl_ask_qt(const wchar_t *quest, wchar_t *res); -void mgl_ask_gets(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- int show(mglGraph *gr) { @@ -41,9 +38,10 @@ int main(int argc, char **argv) { char iname[256]=""; mgl_suppress_warn(true); + bool gray = false; while(1) { - int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hL:s:"); + int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hL:s:g:v:"); if(ch>='1' && ch<='9') p.AddParam(ch-'0', optarg); else if(ch=='s') { @@ -56,6 +54,8 @@ int main(int argc, char **argv) fclose(fp); } } + else if(ch=='v') p.SetVariant(atoi(optarg)); + else if(ch=='g') gray= atoi(optarg); else if(ch=='L') setlocale(LC_CTYPE, optarg); else if(ch=='h' || (ch==-1 && optind>=argc)) { @@ -65,6 +65,8 @@ int main(int argc, char **argv) "\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" + "\t-g val set gray-scale mode (val=0|1)\n" + "\t-v val set variant of arguments\n" "\t-s opt set MGL script for setting up the plot\n" "\t-L loc set locale to loc\n" "\t- get script from standard input\n" @@ -93,6 +95,8 @@ int main(int argc, char **argv) mgl_ask_func = mgl_ask_gets; mgl_ask_func = mgl_ask_qt; mglQT gr(mgld?NULL:show, *iname?iname:"mglview"); + if(gray) gr.Gray(gray); + if(mgld) { gr.Setup(false); diff --git a/widgets/CMakeLists.txt b/widgets/CMakeLists.txt index f05ea5a..f08f449 100644 --- a/widgets/CMakeLists.txt +++ b/widgets/CMakeLists.txt @@ -1,11 +1,11 @@ include(GenerateExportHeader) -add_compiler_export_flags() if(MGL_HAVE_FLTK) mgl_add_lib(fltk fltk.cpp ../include/mgl2/fltk.h) target_include_directories(mgl-fltk SYSTEM PUBLIC ${FLTK_INCLUDE_DIR}) target_include_directories(mgl-fltk-static SYSTEM PUBLIC ${FLTK_INCLUDE_DIR}) target_link_libraries(mgl-fltk mgl ${FLTK_LIBRARIES}) + target_link_libraries(mgl-fltk-static mgl-static ${FLTK_LIBRARIES}) endif(MGL_HAVE_FLTK) if(MGL_HAVE_GLUT) @@ -13,13 +13,14 @@ if(MGL_HAVE_GLUT) target_include_directories(mgl-glut SYSTEM PUBLIC ${GLUT_INCLUDE_DIR}) target_include_directories(mgl-glut-static SYSTEM PUBLIC ${GLUT_INCLUDE_DIR}) target_link_libraries(mgl-glut mgl ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES}) + target_link_libraries(mgl-glut-static mgl-static ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES}) endif(MGL_HAVE_GLUT) if(MGL_HAVE_WX) mgl_add_lib(wx wx.cpp ../include/mgl2/wx.h) include(${wxWidgets_USE_FILE}) - target_link_libraries(mgl-wx mgl) - target_link_libraries(mgl-wx ${wxWidgets_LIBRARIES}) + target_link_libraries(mgl-wx mgl ${wxWidgets_LIBRARIES}) + target_link_libraries(mgl-wx-static mgl-static ${wxWidgets_LIBRARIES}) endif(MGL_HAVE_WX) add_subdirectory( qt4 ) diff --git a/widgets/fltk.cpp b/widgets/fltk.cpp index 5516813..b093728 100644 --- a/widgets/fltk.cpp +++ b/widgets/fltk.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * fltk.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -175,6 +175,14 @@ void Fl_MathGL::update() const char *buf = mgl_get_mess(gr); if(*buf) fl_message("%s",buf); } + else if(mgl_get_num_frame(gr)>0) + { + mgl_set_alpha(gr,flag&1); mgl_set_light(gr,flag&2); + if(tet_val) tet = tet_val->value(); + if(phi_val) phi = phi_val->value(); + mgl_zoom(gr,x1,y1,x2,y2); mgl_view(gr,-phi,-tet,0); + mgl_get_frame(gr,0); + } if(mgl_get_width(gr)!=w() || mgl_get_height(gr)!=h()) size(mgl_get_width(gr), mgl_get_height(gr)); gr->AskStop(false); redraw(); @@ -349,8 +357,8 @@ void Fl_MGLView::exec_pause() } if(mutex) { - if(pauseC) pthread_mutex_lock(mutex); - else pthread_mutex_unlock(mutex); + pthread_mutex_trylock(mutex); + if(!pauseC) pthread_mutex_unlock(mutex); } #endif } @@ -764,6 +772,11 @@ HMGL MGL_EXPORT mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char g->Window(0,0,draw,title,par,load); return g; } +void* mgl_fltk_widget(HMGL gr) +{ + mglCanvasFL *g = dynamic_cast(gr); + return g?g->mgl:NULL; +} int MGL_EXPORT mgl_fltk_run() { return Fl::run(); } //----------------------------------------------------------------------------- uintptr_t MGL_EXPORT mgl_create_graph_fltk_(const char *title, int l) diff --git a/widgets/glut.cpp b/widgets/glut.cpp index 99651d6..4298fc9 100644 --- a/widgets/glut.cpp +++ b/widgets/glut.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * glut.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * diff --git a/widgets/qt.cpp b/widgets/qt.cpp index 485abe9..b7b2f6c 100644 --- a/widgets/qt.cpp +++ b/widgets/qt.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * qt.cpp is part of Math Graphic Library * - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -330,8 +330,15 @@ void QMathGL::update() else if(draw) { mglGraph g(gr); draw->Draw(&g); } if(mgl_is_frames(gr)) mgl_end_frame(gr); setlocale(LC_NUMERIC, ""); - gr->AskStop(false); afterPlot(); + gr->AskStop(false); } + else if(mgl_get_num_frame(gr)>0) + { + mgl_set_alpha(gr,alpha); mgl_set_light(gr,light); +// mgl_zoom(gr,x1,y1,x2,y2); mgl_view(gr,-phi,-tet,0); + mgl_get_frame(gr,0); + } + afterPlot(); } //----------------------------------------------------------------------------- void QMathGL::afterPlot() @@ -359,7 +366,7 @@ void QMathGL::drawPrim() { mgl_set_obj_id(gr,i+MGL_MAX_LINES); QString tst = primitives.section('\n',i,i); - pr.Parse(&gg,primitives.section('\n',i,i).toStdString().c_str(),i+MGL_MAX_LINES); + pr.Parse(&gg,primitives.section('\n',i,i).toLocal8Bit().constData(),i+MGL_MAX_LINES); } gg.SetRanges(ox1,ox2); gg.Pop(); setlocale(LC_NUMERIC, ""); } @@ -671,7 +678,7 @@ void QMathGL::exportGIF(QString fname) if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); else #if MGL_HAVE_GIF - mgl_write_gif(gr,setExtension(fname,"png").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_gif(gr,setExtension(fname,"png").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); #else img.save(setExtension(fname,"gif")); #endif @@ -683,7 +690,7 @@ void QMathGL::exportPNG(QString fname) if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); else #if MGL_HAVE_PNG - mgl_write_png(gr,setExtension(fname,"png").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_png(gr,setExtension(fname,"png").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); #else img.save(setExtension(fname,"png")); #endif @@ -695,7 +702,7 @@ void QMathGL::exportPNGs(QString fname) if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); else #if MGL_HAVE_PNG - mgl_write_png_solid(gr,setExtension(fname,"png").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_png_solid(gr,setExtension(fname,"png").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); #else img.save(setExtension(fname,"png")); #endif @@ -707,7 +714,7 @@ void QMathGL::exportJPG(QString fname) if(fname.isEmpty()) QMessageBox::critical(this, appName, tr("No filename."),QMessageBox::Ok,0,0); else #if MGL_HAVE_JPEG - mgl_write_jpg(gr,setExtension(fname,"jpg").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_jpg(gr,setExtension(fname,"jpg").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); #else img.save(setExtension(fname,"jpg")); #endif @@ -720,7 +727,7 @@ void QMathGL::exportBPS(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_bps(gr,setExtension(fname,"eps").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_bps(gr,setExtension(fname,"eps").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -732,7 +739,7 @@ void QMathGL::exportEPS(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_eps(gr,setExtension(fname,"eps").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_eps(gr,setExtension(fname,"eps").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -744,7 +751,7 @@ void QMathGL::exportSVG(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_svg(gr,setExtension(fname,"svg").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_svg(gr,setExtension(fname,"svg").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -756,7 +763,7 @@ void QMathGL::exportXYZ(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_xyz(gr,setExtension(fname,"xyz").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_xyz(gr,setExtension(fname,"xyz").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -768,7 +775,7 @@ void QMathGL::exportTEX(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_tex(gr,setExtension(fname,"tex").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_tex(gr,setExtension(fname,"tex").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -780,7 +787,7 @@ void QMathGL::exportOFF(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_off(gr,setExtension(fname,"off").toStdString().c_str(), appName.toStdString().c_str(),0); + mgl_write_off(gr,setExtension(fname,"off").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),0); setlocale(LC_NUMERIC, ""); } } @@ -792,7 +799,7 @@ void QMathGL::exportOBJ(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_obj(gr,setExtension(fname,"obj").toStdString().c_str(), appName.toStdString().c_str(),1); + mgl_write_obj(gr,setExtension(fname,"obj").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),1); setlocale(LC_NUMERIC, ""); } } @@ -804,7 +811,7 @@ void QMathGL::exportSTL(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_stl(gr,setExtension(fname,"stl").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_stl(gr,setExtension(fname,"stl").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -816,7 +823,7 @@ void QMathGL::exportSTL(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_x3d(gr,setExtension(fname,"x3d").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_x3d(gr,setExtension(fname,"x3d").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } }*/ @@ -828,7 +835,7 @@ void QMathGL::exportTGA(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_tga(gr,setExtension(fname,"tga").toStdString().c_str(), appName.toStdString().c_str()); + mgl_write_tga(gr,setExtension(fname,"tga").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -840,7 +847,7 @@ void QMathGL::exportPRC(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_write_prc(gr,setExtension(fname,"prc").toStdString().c_str(), appName.toStdString().c_str(),1); + mgl_write_prc(gr,setExtension(fname,"prc").toLocal8Bit().constData(), appName.toLocal8Bit().constData(),1); setlocale(LC_NUMERIC, ""); } } @@ -852,7 +859,7 @@ void QMathGL::exportMGLD(QString fname) else { setlocale(LC_NUMERIC, "C"); - mgl_export_mgld(gr,setExtension(fname,"mgld").toStdString().c_str(), appName.toStdString().c_str()); + mgl_export_mgld(gr,setExtension(fname,"mgld").toLocal8Bit().constData(), appName.toLocal8Bit().constData()); setlocale(LC_NUMERIC, ""); } } @@ -884,7 +891,7 @@ void QMathGL::copyClickCoor() //----------------------------------------------------------------------------- void QMathGL::setMGLFont(QString path) { if(path.isEmpty()) mgl_restore_font(gr); - else mgl_load_font(gr,path.toStdString().c_str(),0); } + else mgl_load_font(gr,path.toLocal8Bit().constData(),0); } //----------------------------------------------------------------------------- void QMathGL::setSize(int w, int h) { @@ -1324,6 +1331,11 @@ HMGL MGL_EXPORT mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *t g->Window(0,0,draw,title,par,load); return g; } +void* mgl_qt_widget(HMGL gr) +{ + mglCanvasQT *g = dynamic_cast(gr); + return g?g->QMGL:NULL; +} int MGL_EXPORT mgl_qt_run() { return (qApp)?qApp->exec():-1; } //----------------------------------------------------------------------------- uintptr_t MGL_EXPORT mgl_create_graph_qt_(const char *title, int l) diff --git a/widgets/qt4/CMakeLists.txt b/widgets/qt4/CMakeLists.txt index 569f931..df45e98 100644 --- a/widgets/qt4/CMakeLists.txt +++ b/widgets/qt4/CMakeLists.txt @@ -1,29 +1,22 @@ include(GenerateExportHeader) -add_compiler_export_flags() if(enable-qt4) include(../../cmake-qt4.txt) set(MGL_QT4_FILES ../qt.cpp ../../include/mgl2/qt.h ../../include/mgl2/qmathgl.h) mgl_add_lib(qt4 ${MGL_QT4_FILES}) - qt4_use_modules(mgl-qt4 ${MGL_QT4_LIBS}) - qt4_use_modules(mgl-qt4-static ${MGL_QT4_LIBS}) - target_link_libraries(mgl-qt4 mgl) - target_link_libraries(mgl-qt4-static mgl) - if(NOT enable-qt5asqt) + target_link_libraries(mgl-qt4 mgl ${MGL_QT4_LIBS}) + target_link_libraries(mgl-qt4-static mgl-static ${MGL_QT4_LIBS}) + if(enable-qt4asqt) mgl_add_lib(qt ${MGL_QT4_FILES}) - qt4_use_modules(mgl-qt ${MGL_QT4_LIBS}) - qt4_use_modules(mgl-qt-static ${MGL_QT4_LIBS}) - target_link_libraries(mgl-qt mgl) - target_link_libraries(mgl-qt-static mgl) - endif(NOT enable-qt5asqt) + target_link_libraries(mgl-qt mgl ${MGL_QT4_LIBS}) + target_link_libraries(mgl-qt-static mgl-static ${MGL_QT4_LIBS}) + endif(enable-qt4asqt) if(MGL_HAVE_FLTK AND NOT enable-qt5) mgl_add_lib(wnd ${MGL_QT4_FILES} ../fltk.cpp ../../include/mgl2/fltk.h) target_include_directories(mgl-wnd SYSTEM PUBLIC ${FLTK_INCLUDE_DIR}) target_include_directories(mgl-wnd-static SYSTEM PUBLIC ${FLTK_INCLUDE_DIR}) - qt4_use_modules(mgl-wnd ${MGL_QT4_LIBS}) - qt4_use_modules(mgl-wnd-static ${MGL_QT4_LIBS}) - target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES}) - target_link_libraries(mgl-wnd-static mgl ${FLTK_LIBRARIES}) + target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES} ${MGL_QT4_LIBS}) + target_link_libraries(mgl-wnd-static mgl-static ${FLTK_LIBRARIES} ${MGL_QT4_LIBS}) endif(MGL_HAVE_FLTK AND NOT enable-qt5) endif(enable-qt4) diff --git a/widgets/qt5/CMakeLists.txt b/widgets/qt5/CMakeLists.txt index dcc30e5..aa70337 100644 --- a/widgets/qt5/CMakeLists.txt +++ b/widgets/qt5/CMakeLists.txt @@ -1,28 +1,21 @@ include(GenerateExportHeader) -add_compiler_export_flags() if(enable-qt5) include(../../cmake-qt5.txt) set(MGL_QT5_FILES ../qt.cpp ../../include/mgl2/qt.h ../../include/mgl2/qmathgl.h) mgl_add_lib(qt5 ${MGL_QT5_FILES}) - qt5_use_modules(mgl-qt5 ${MGL_QT5_LIBS}) - qt5_use_modules(mgl-qt5-static ${MGL_QT5_LIBS}) - target_link_libraries(mgl-qt5 mgl) - target_link_libraries(mgl-qt5-static mgl) + target_link_libraries(mgl-qt5 mgl ${MGL_QT5_LIBS}) + target_link_libraries(mgl-qt5-static mgl-static ${MGL_QT5_LIBS}) if(enable-qt5asqt) mgl_add_lib(qt ${MGL_QT5_FILES}) - qt5_use_modules(mgl-qt ${MGL_QT5_LIBS}) - qt5_use_modules(mgl-qt-static ${MGL_QT5_LIBS}) - target_link_libraries(mgl-qt mgl) - target_link_libraries(mgl-qt-static mgl) + target_link_libraries(mgl-qt mgl ${MGL_QT5_LIBS}) + target_link_libraries(mgl-qt-static mgl-static ${MGL_QT5_LIBS}) endif(enable-qt5asqt) if(MGL_HAVE_FLTK) mgl_add_lib(wnd ${MGL_QT5_FILES} ../fltk.cpp ../../include/mgl2/fltk.h) target_include_directories(mgl-wnd SYSTEM PUBLIC ${FLTK_INCLUDE_DIR}) target_include_directories(mgl-wnd-static SYSTEM PUBLIC ${FLTK_INCLUDE_DIR}) - qt5_use_modules(mgl-wnd ${MGL_QT5_LIBS}) - qt5_use_modules(mgl-wnd-static ${MGL_QT5_LIBS}) - target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES}) - target_link_libraries(mgl-wnd-static mgl ${FLTK_LIBRARIES}) + target_link_libraries(mgl-wnd mgl ${FLTK_LIBRARIES} ${MGL_QT5_LIBS}) + target_link_libraries(mgl-wnd-static mgl-static ${FLTK_LIBRARIES} ${MGL_QT5_LIBS}) endif(MGL_HAVE_FLTK) endif(enable-qt5) diff --git a/widgets/wx.cpp b/widgets/wx.cpp index b364010..99a2c86 100644 --- a/widgets/wx.cpp +++ b/widgets/wx.cpp @@ -1,6 +1,6 @@ /*************************************************************************** * wx.cpp is part of Math Graphic Library * - * Copyright (C) 2007-2014 Alexey Balakin * + * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * @@ -202,6 +202,12 @@ void wxMathGL::Update() dlg.ShowModal(); } } + else if(mgl_get_num_frame(gr)>0) + { + mgl_set_alpha(gr,alpha); mgl_set_light(gr,light); +// mgl_zoom(gr,x1,y1,x2,y2); mgl_view(gr,-phi,-tet,0); + mgl_get_frame(gr,0); + } MousePos.Empty(); Repaint(); } //----------------------------------------------------------------------------- @@ -313,7 +319,7 @@ const char *mglw_str(const wxString &str) { static char *buf=0; if(buf) delete []buf; - long i, n=str.Len(); + size_t i, n=str.Len(); buf = new char[n+1]; buf[n]=0; for(i=0;i

!rAld`vouPR98qT2l=o7b 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%0Dq_e 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 z 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