From a34bddcfd60b401f81f8f8bbd500ee644c48e6ee Mon Sep 17 00:00:00 2001 From: kgv Date: Sat, 20 Mar 2021 00:31:01 +0300 Subject: [PATCH] 0032315: Configuration, CMake - fix building Draw Harness plugins as static libraries DPLUGIN() macros no more defines exported function PLUGINFACTORY when building static libraries. DRAWEXE executable now pre-loads a set of plugins when building static libraries. dversion - added WebAssembly info. --- .gitattributes | 4 + CMakeLists.txt | 6 - adm/cmake/occt_csf.cmake | 4 + adm/cmake/occt_toolkit.cmake | 18 +- adm/cmake/tcl.cmake | 377 +++++++++++++-------------- adm/scripts/cmake_gen.bat | 1 + adm/scripts/wasm_build.bat | 1 + samples/webgl/occt-webgl-sample.html | 174 ++++++------- samples/webgl/occt-webgl-viewer.js | 56 ++-- src/DRAWEXE/CMakeLists.txt | 36 +++ src/DRAWEXE/DRAWEXE.cxx | 34 +++ src/DRAWEXE/DRAWEXE.html | 68 +++++ src/DRAWEXE/EXTERNLIB_STATIC | 75 ++++++ src/Draw/Draw_BasicCommands.cxx | 8 + src/Draw/Draw_PluginMacro.hxx | 11 +- src/OS/Draw.tcl | 44 +--- 16 files changed, 560 insertions(+), 357 deletions(-) create mode 100644 src/DRAWEXE/DRAWEXE.html create mode 100644 src/DRAWEXE/EXTERNLIB_STATIC diff --git a/.gitattributes b/.gitattributes index ee61c69baf..e3a283a2ca 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,8 @@ .gitattributes eol=lf .gitignore eol=lf *.txt eol=lf +*.htm eol=lf +*.html eol=lf *.h eol=lf *.c eol=lf *.inl eol=lf @@ -29,6 +31,7 @@ *.xib eol=lf *.plist eol=lf *.java eol=lf +*.js eol=lf *.igs eol=lf *.iges eol=lf *.stp eol=lf @@ -44,6 +47,7 @@ FILES eol=lf PACKAGES eol=lf EXTERNLIB eol=lf +EXTERNLIB_STATIC eol=lf UDLIST eol=lf tests/* eol=lf tests/*/* eol=lf diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a5ab483d9..7eee96bc4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -447,12 +447,6 @@ foreach (OCCT_MODULE ${OCCT_MODULES}) endif() endforeach() -# DRAWEXE excluded when library build is static -if (NOT BUILD_SHARED_LIBS) - list (REMOVE_ITEM BUILD_TOOLKITS DRAWEXE) - message (STATUS "Info: DRAWEXE is not included due to ${BUILD_LIBRARY_TYPE} build library type") -endif() - # accumulate all used toolkits list (REMOVE_DUPLICATES BUILD_TOOLKITS) set (RAW_BUILD_TOOLKITS) diff --git a/adm/cmake/occt_csf.cmake b/adm/cmake/occt_csf.cmake index 0938850c69..e1b7b92798 100644 --- a/adm/cmake/occt_csf.cmake +++ b/adm/cmake/occt_csf.cmake @@ -118,6 +118,10 @@ else() OCCT_CHECK_AND_UNSET (OpenGlLibs_LIB) endif() + elseif (EMSCRIPTEN) + set (CSF_ThreadLibs "pthread rt stdc++") + set (CSF_OpenGlesLibs "EGL GLESv2") + set (CSF_dl "dl") elseif (ANDROID) set (CSF_ThreadLibs "c") set (CSF_OpenGlesLibs "EGL GLESv2") diff --git a/adm/cmake/occt_toolkit.cmake b/adm/cmake/occt_toolkit.cmake index acbaac55ec..8f09fbeef4 100644 --- a/adm/cmake/occt_toolkit.cmake +++ b/adm/cmake/occt_toolkit.cmake @@ -22,7 +22,7 @@ if ("${OCCT_TOOLKITS_NAME_SUFFIX}" STREQUAL "") set (OCCT_TOOLKITS_NAME_SUFFIX "TOOLKITS") endif() -# parce PACKAGES file +# parse PACKAGES file FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/PACKAGES" USED_PACKAGES) if ("${USED_PACKAGES}" STREQUAL "") set (USED_PACKAGES ${PROJECT_NAME}) @@ -39,7 +39,7 @@ set (PRECOMPILED_DEFS) if (NOT BUILD_SHARED_LIBS) list (APPEND PRECOMPILED_DEFS "-DOCCT_NO_PLUGINS") - if (WIN32) + if (WIN32 AND NOT EXECUTABLE_PROJECT) list (APPEND PRECOMPILED_DEFS "-DOCCT_STATIC_BUILD") endif() endif() @@ -228,6 +228,10 @@ if (EXECUTABLE_PROJECT) install (TARGETS ${PROJECT_NAME} DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}") + + if (EMSCRIPTEN) + install(FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${PROJECT_NAME}.wasm DESTINATION "${INSTALL_DIR_BIN}/${OCCT_INSTALL_BIN_LETTER}") + endif() else() add_library (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RESOURCE_FILES} ${${PROJECT_NAME}_MOC_FILES}) @@ -283,8 +287,12 @@ endif() set (USED_TOOLKITS_BY_CURRENT_PROJECT) set (USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT) -# parce EXTERNLIB file -FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS) +# parse EXTERNLIB file +if (CUSTOM_EXTERNLIB) + set (USED_EXTERNLIB_AND_TOOLKITS ${CUSTOM_EXTERNLIB}) +else() + FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS) +endif() foreach (USED_ITEM ${USED_EXTERNLIB_AND_TOOLKITS}) string (REGEX MATCH "^ *#" COMMENT_FOUND ${USED_ITEM}) if (NOT COMMENT_FOUND) @@ -383,7 +391,7 @@ else() endif() endif() -if (BUILD_SHARED_LIBS) +if (BUILD_SHARED_LIBS OR EXECUTABLE_PROJECT) if(IS_VTK_9XX) string (REGEX REPLACE "vtk" "VTK::" USED_TOOLKITS_BY_CURRENT_PROJECT "${USED_TOOLKITS_BY_CURRENT_PROJECT}") endif() diff --git a/adm/cmake/tcl.cmake b/adm/cmake/tcl.cmake index 77359a6204..fdfc3e42c6 100644 --- a/adm/cmake/tcl.cmake +++ b/adm/cmake/tcl.cmake @@ -1,6 +1,6 @@ # tcl -if (NOT DEFINED INSTALL_TCL AND BUILD_SHARED_LIBS) +if (NOT DEFINED INSTALL_TCL) set (INSTALL_TCL OFF CACHE BOOL "${INSTALL_TCL_DESCR}") endif() @@ -14,30 +14,30 @@ if (NOT DEFINED 3RDPARTY_TCL_INCLUDE_DIR) set (3RDPARTY_TCL_INCLUDE_DIR "" CACHE FILEPATH "The directory containing headers of tcl") endif() -if (BUILD_SHARED_LIBS) - # tcl library file (with absolute path) - if (NOT DEFINED 3RDPARTY_TCL_LIBRARY OR NOT 3RDPARTY_TCL_LIBRARY_DIR) - set (3RDPARTY_TCL_LIBRARY "" CACHE FILEPATH "tcl library" FORCE) - endif() - # tcl library directory - if (NOT DEFINED 3RDPARTY_TCL_LIBRARY_DIR) - set (3RDPARTY_TCL_LIBRARY_DIR "" CACHE FILEPATH "The directory containing tcl library") - endif() +# tcl library file (with absolute path) +if (NOT DEFINED 3RDPARTY_TCL_LIBRARY OR NOT 3RDPARTY_TCL_LIBRARY_DIR) + set (3RDPARTY_TCL_LIBRARY "" CACHE FILEPATH "tcl library" FORCE) +endif() - # tcl shared library (with absolute path) - if (WIN32) - if (NOT DEFINED 3RDPARTY_TCL_DLL OR NOT 3RDPARTY_TCL_DLL_DIR) - set (3RDPARTY_TCL_DLL "" CACHE FILEPATH "tcl shared library" FORCE) - endif() - endif() +# tcl library directory +if (NOT DEFINED 3RDPARTY_TCL_LIBRARY_DIR) + set (3RDPARTY_TCL_LIBRARY_DIR "" CACHE FILEPATH "The directory containing tcl library") +endif() - # tcl shared library directory - if (WIN32 AND NOT DEFINED 3RDPARTY_TCL_DLL_DIR) - set (3RDPARTY_TCL_DLL_DIR "" CACHE FILEPATH "The directory containing tcl shared library") +# tcl shared library (with absolute path) +if (WIN32) + if (NOT DEFINED 3RDPARTY_TCL_DLL OR NOT 3RDPARTY_TCL_DLL_DIR) + set (3RDPARTY_TCL_DLL "" CACHE FILEPATH "tcl shared library" FORCE) endif() endif() +# tcl shared library directory +if (WIN32 AND NOT DEFINED 3RDPARTY_TCL_DLL_DIR) + set (3RDPARTY_TCL_DLL_DIR "" CACHE FILEPATH "The directory containing tcl shared library") +endif() + + # search for tcl in user defined directory if (NOT 3RDPARTY_TCL_DIR AND 3RDPARTY_DIR) FIND_PRODUCT_DIR("${3RDPARTY_DIR}" tcl TCL_DIR_NAME) @@ -64,204 +64,198 @@ if (NOT 3RDPARTY_TCL_INCLUDE_DIR) endif() endif() -if (BUILD_SHARED_LIBS) - # tcl dir and library - if (NOT 3RDPARTY_TCL_LIBRARY) - if (TCL_LIBRARY AND EXISTS "${TCL_LIBRARY}") - set (3RDPARTY_TCL_LIBRARY "${TCL_LIBRARY}" CACHE FILEPATH "TCL library" FORCE) +# tcl dir and library +if (NOT 3RDPARTY_TCL_LIBRARY) + if (TCL_LIBRARY AND EXISTS "${TCL_LIBRARY}") + set (3RDPARTY_TCL_LIBRARY "${TCL_LIBRARY}" CACHE FILEPATH "TCL library" FORCE) - if (NOT 3RDPARTY_TCL_LIBRARY_DIR) - get_filename_component (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY}" PATH) - set (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY_DIR}" CACHE FILEPATH "The directory containing TCL library" FORCE) - endif() + if (NOT 3RDPARTY_TCL_LIBRARY_DIR) + get_filename_component (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY}" PATH) + set (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY_DIR}" CACHE FILEPATH "The directory containing TCL library" FORCE) endif() endif() +endif() +if (WIN32) + if (NOT 3RDPARTY_TCL_DLL) + set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll .a) - if (WIN32) - if (NOT 3RDPARTY_TCL_DLL) - set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll .a) - - set (DLL_FOLDER_FOR_SEARCH "") - if (3RDPARTY_TCL_DLL_DIR) - set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DLL_DIR}") - elseif (3RDPARTY_TCL_DIR) - set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DIR}/bin") - elseif (3RDPARTY_TCL_LIBRARY_DIR) - get_filename_component (3RDPARTY_TCL_LIBRARY_DIR_PARENT "${3RDPARTY_TCL_LIBRARY_DIR}" PATH) - set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_LIBRARY_DIR_PARENT}/bin") - endif() - - set (3RDPARTY_TCL_DLL "3RDPARTY_TCL_DLL-NOTFOUND" CACHE FILEPATH "TCL shared library" FORCE) - find_library (3RDPARTY_TCL_DLL NAMES ${CSF_TclLibs} - PATHS "${DLL_FOLDER_FOR_SEARCH}" - NO_DEFAULT_PATH) + set (DLL_FOLDER_FOR_SEARCH "") + if (3RDPARTY_TCL_DLL_DIR) + set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DLL_DIR}") + elseif (3RDPARTY_TCL_DIR) + set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DIR}/bin") + elseif (3RDPARTY_TCL_LIBRARY_DIR) + get_filename_component (3RDPARTY_TCL_LIBRARY_DIR_PARENT "${3RDPARTY_TCL_LIBRARY_DIR}" PATH) + set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_LIBRARY_DIR_PARENT}/bin") endif() + + set (3RDPARTY_TCL_DLL "3RDPARTY_TCL_DLL-NOTFOUND" CACHE FILEPATH "TCL shared library" FORCE) + find_library (3RDPARTY_TCL_DLL NAMES ${CSF_TclLibs} + PATHS "${DLL_FOLDER_FOR_SEARCH}" + NO_DEFAULT_PATH) endif() endif() COMPLIANCE_PRODUCT_CONSISTENCY(TCL) -if (BUILD_SHARED_LIBS) - # tcl dir and library - if (NOT 3RDPARTY_TCL_LIBRARY) - set (3RDPARTY_TCL_LIBRARY "3RDPARTY_TCL_LIBRARY-NOTFOUND" CACHE FILEPATH "TCL library" FORCE) - find_library (3RDPARTY_TCL_LIBRARY NAMES ${CSF_TclLibs} - PATHS "${3RDPARTY_TCL_LIBRARY_DIR}" - NO_DEFAULT_PATH) - - # search in another place if previous search doesn't find anything - find_library (3RDPARTY_TCL_LIBRARY NAMES ${CSF_TclLibs} - PATHS "${3RDPARTY_TCL_DIR}/lib" - NO_DEFAULT_PATH) - - - if (NOT 3RDPARTY_TCL_LIBRARY OR NOT EXISTS "${3RDPARTY_TCL_LIBRARY}") - set (3RDPARTY_TCL_LIBRARY "" CACHE FILEPATH "TCL library" FORCE) - endif() - - if (NOT 3RDPARTY_TCL_LIBRARY_DIR AND 3RDPARTY_TCL_LIBRARY) - get_filename_component (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY}" PATH) - set (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY_DIR}" CACHE FILEPATH "The directory containing TCL library" FORCE) - endif() - endif() - - set (3RDPARTY_TCL_LIBRARY_VERSION "") - if (3RDPARTY_TCL_LIBRARY AND EXISTS "${3RDPARTY_TCL_LIBRARY}") - get_filename_component (TCL_LIBRARY_NAME "${3RDPARTY_TCL_LIBRARY}" NAME) - string(REGEX REPLACE "^.*tcl([0-9]\\.*[0-9]).*$" "\\1" TCL_LIBRARY_VERSION "${TCL_LIBRARY_NAME}") - - if (NOT "${TCL_LIBRARY_VERSION}" STREQUAL "${TCL_LIBRARY_NAME}") - set (3RDPARTY_TCL_LIBRARY_VERSION "${TCL_LIBRARY_VERSION}") - else() # if the version isn't found - seek other library with 8.6 or 8.5 version in the same dir - message (STATUS "Info: TCL version isn't found") - endif() - endif() - - set (3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT "") - if (3RDPARTY_TCL_LIBRARY_VERSION) - string (REGEX REPLACE "^.*([0-9])[^0-9]*[0-9].*$" "\\1" 3RDPARTY_TCL_MAJOR_VERSION "${3RDPARTY_TCL_LIBRARY_VERSION}") - string (REGEX REPLACE "^.*[0-9][^0-9]*([0-9]).*$" "\\1" 3RDPARTY_TCL_MINOR_VERSION "${3RDPARTY_TCL_LIBRARY_VERSION}") - set (3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT "${3RDPARTY_TCL_MAJOR_VERSION}.${3RDPARTY_TCL_MINOR_VERSION}") - endif() - - if (WIN32) - if (NOT 3RDPARTY_TCL_DLL) - set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll .a) - - set (DLL_FOLDER_FOR_SEARCH "") - if (3RDPARTY_TCL_DLL_DIR) - set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DLL_DIR}") - elseif (3RDPARTY_TCL_DIR) - set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DIR}/bin") - else() - get_filename_component (3RDPARTY_TCL_LIBRARY_DIR_PARENT "${3RDPARTY_TCL_LIBRARY_DIR}" PATH) - set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_LIBRARY_DIR_PARENT}/bin") - endif() - - set (3RDPARTY_TCL_DLL "3RDPARTY_TCL_DLL-NOTFOUND" CACHE FILEPATH "TCL shared library" FORCE) - find_library (3RDPARTY_TCL_DLL NAMES tcl${3RDPARTY_TCL_LIBRARY_VERSION} - PATHS "${DLL_FOLDER_FOR_SEARCH}" +# tcl dir and library +if (NOT 3RDPARTY_TCL_LIBRARY) + set (3RDPARTY_TCL_LIBRARY "3RDPARTY_TCL_LIBRARY-NOTFOUND" CACHE FILEPATH "TCL library" FORCE) + find_library (3RDPARTY_TCL_LIBRARY NAMES ${CSF_TclLibs} + PATHS "${3RDPARTY_TCL_LIBRARY_DIR}" NO_DEFAULT_PATH) - if (NOT 3RDPARTY_TCL_DLL OR NOT EXISTS "${3RDPARTY_TCL_DLL}") - set (3RDPARTY_TCL_DLL "" CACHE FILEPATH "TCL shared library" FORCE) - endif() - endif() - if (NOT 3RDPARTY_TCL_DLL_DIR AND 3RDPARTY_TCL_DLL) - get_filename_component (3RDPARTY_TCL_DLL_DIR "${3RDPARTY_TCL_DLL}" PATH) - set (3RDPARTY_TCL_DLL_DIR "${3RDPARTY_TCL_DLL_DIR}" CACHE FILEPATH "The directory containing TCL shared library" FORCE) - endif() + # search in another place if previous search doesn't find anything + find_library (3RDPARTY_TCL_LIBRARY NAMES ${CSF_TclLibs} + PATHS "${3RDPARTY_TCL_DIR}/lib" + NO_DEFAULT_PATH) + + if (NOT 3RDPARTY_TCL_LIBRARY OR NOT EXISTS "${3RDPARTY_TCL_LIBRARY}") + set (3RDPARTY_TCL_LIBRARY "" CACHE FILEPATH "TCL library" FORCE) endif() - # include found paths to common variables - if (3RDPARTY_TCL_INCLUDE_DIR AND EXISTS "${3RDPARTY_TCL_INCLUDE_DIR}") - list (APPEND 3RDPARTY_INCLUDE_DIRS "${3RDPARTY_TCL_INCLUDE_DIR}") - else() - list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_TCL_INCLUDE_DIR) + if (NOT 3RDPARTY_TCL_LIBRARY_DIR AND 3RDPARTY_TCL_LIBRARY) + get_filename_component (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY}" PATH) + set (3RDPARTY_TCL_LIBRARY_DIR "${3RDPARTY_TCL_LIBRARY_DIR}" CACHE FILEPATH "The directory containing TCL library" FORCE) endif() +endif() - if (3RDPARTY_TCL_LIBRARY AND EXISTS "${3RDPARTY_TCL_LIBRARY}") - list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_TCL_LIBRARY_DIR}") - else() - list (APPEND 3RDPARTY_NO_LIBS 3RDPARTY_TCL_LIBRARY_DIR) +set (3RDPARTY_TCL_LIBRARY_VERSION "") +if (3RDPARTY_TCL_LIBRARY AND EXISTS "${3RDPARTY_TCL_LIBRARY}") + get_filename_component (TCL_LIBRARY_NAME "${3RDPARTY_TCL_LIBRARY}" NAME) + string(REGEX REPLACE "^.*tcl([0-9]\\.*[0-9]).*$" "\\1" TCL_LIBRARY_VERSION "${TCL_LIBRARY_NAME}") + + if (NOT "${TCL_LIBRARY_VERSION}" STREQUAL "${TCL_LIBRARY_NAME}") + set (3RDPARTY_TCL_LIBRARY_VERSION "${TCL_LIBRARY_VERSION}") + else() # if the version isn't found - seek other library with 8.6 or 8.5 version in the same dir + message (STATUS "Info: TCL version isn't found") endif() +endif() + +set (3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT "") +if (3RDPARTY_TCL_LIBRARY_VERSION) + string (REGEX REPLACE "^.*([0-9])[^0-9]*[0-9].*$" "\\1" 3RDPARTY_TCL_MAJOR_VERSION "${3RDPARTY_TCL_LIBRARY_VERSION}") + string (REGEX REPLACE "^.*[0-9][^0-9]*([0-9]).*$" "\\1" 3RDPARTY_TCL_MINOR_VERSION "${3RDPARTY_TCL_LIBRARY_VERSION}") + set (3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT "${3RDPARTY_TCL_MAJOR_VERSION}.${3RDPARTY_TCL_MINOR_VERSION}") +endif() + +if (WIN32) + if (NOT 3RDPARTY_TCL_DLL) + set (CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll .a) + + set (DLL_FOLDER_FOR_SEARCH "") + if (3RDPARTY_TCL_DLL_DIR) + set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DLL_DIR}") + elseif (3RDPARTY_TCL_DIR) + set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_DIR}/bin") + else() + get_filename_component (3RDPARTY_TCL_LIBRARY_DIR_PARENT "${3RDPARTY_TCL_LIBRARY_DIR}" PATH) + set (DLL_FOLDER_FOR_SEARCH "${3RDPARTY_TCL_LIBRARY_DIR_PARENT}/bin") + endif() + + set (3RDPARTY_TCL_DLL "3RDPARTY_TCL_DLL-NOTFOUND" CACHE FILEPATH "TCL shared library" FORCE) + find_library (3RDPARTY_TCL_DLL NAMES tcl${3RDPARTY_TCL_LIBRARY_VERSION} + PATHS "${DLL_FOLDER_FOR_SEARCH}" + NO_DEFAULT_PATH) + + if (NOT 3RDPARTY_TCL_DLL OR NOT EXISTS "${3RDPARTY_TCL_DLL}") + set (3RDPARTY_TCL_DLL "" CACHE FILEPATH "TCL shared library" FORCE) + endif() + endif() + if (NOT 3RDPARTY_TCL_DLL_DIR AND 3RDPARTY_TCL_DLL) + get_filename_component (3RDPARTY_TCL_DLL_DIR "${3RDPARTY_TCL_DLL}" PATH) + set (3RDPARTY_TCL_DLL_DIR "${3RDPARTY_TCL_DLL_DIR}" CACHE FILEPATH "The directory containing TCL shared library" FORCE) + endif() +endif() + +# include found paths to common variables +if (3RDPARTY_TCL_INCLUDE_DIR AND EXISTS "${3RDPARTY_TCL_INCLUDE_DIR}") + list (APPEND 3RDPARTY_INCLUDE_DIRS "${3RDPARTY_TCL_INCLUDE_DIR}") +else() + list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_TCL_INCLUDE_DIR) +endif() + +if (3RDPARTY_TCL_LIBRARY AND EXISTS "${3RDPARTY_TCL_LIBRARY}") + list (APPEND 3RDPARTY_LIBRARY_DIRS "${3RDPARTY_TCL_LIBRARY_DIR}") +else() + list (APPEND 3RDPARTY_NO_LIBS 3RDPARTY_TCL_LIBRARY_DIR) +endif() + +if (WIN32) + if (3RDPARTY_TCL_DLL OR EXISTS "${3RDPARTY_TCL_DLL}") + list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_TCL_DLL_DIR}") + else() + list (APPEND 3RDPARTY_NO_DLLS 3RDPARTY_TCL_DLL_DIR) + endif() +endif() + +# install tcl +if (INSTALL_TCL) + # include occt macros. compiler_bitness, os_wiht_bit, compiler + OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros") + + OCCT_MAKE_OS_WITH_BITNESS() + OCCT_MAKE_COMPILER_SHORT_NAME() if (WIN32) - if (3RDPARTY_TCL_DLL OR EXISTS "${3RDPARTY_TCL_DLL}") - list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_TCL_DLL_DIR}") + # tcl 8.6 requires zlib. install all dlls from tcl bin folder that may contain zlib also + + # collect and install all dlls from tcl dll dirs + file (GLOB TCL_DLLS "${3RDPARTY_TCL_DLL_DIR}/*.dll") + + if (SINGLE_GENERATOR) + install (FILES ${TCL_DLLS} DESTINATION "${INSTALL_DIR_BIN}") else() - list (APPEND 3RDPARTY_NO_DLLS 3RDPARTY_TCL_DLL_DIR) + install (FILES ${TCL_DLLS} + CONFIGURATIONS Release + DESTINATION "${INSTALL_DIR_BIN}") + install (FILES ${TCL_DLLS} + CONFIGURATIONS RelWithDebInfo + DESTINATION "${INSTALL_DIR_BIN}i") + install (FILES ${TCL_DLLS} + CONFIGURATIONS Debug + DESTINATION "${INSTALL_DIR_BIN}d") endif() - endif() - - # install tcl - if (INSTALL_TCL) - # include occt macros. compiler_bitness, os_wiht_bit, compiler - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros") - - OCCT_MAKE_OS_WITH_BITNESS() - OCCT_MAKE_COMPILER_SHORT_NAME() - - if (WIN32) - # tcl 8.6 requires zlib. install all dlls from tcl bin folder that may contain zlib also - - # collect and install all dlls from tcl dll dirs - file (GLOB TCL_DLLS "${3RDPARTY_TCL_DLL_DIR}/*.dll") - - if (SINGLE_GENERATOR) - install (FILES ${TCL_DLLS} DESTINATION "${INSTALL_DIR_BIN}") - else() - install (FILES ${TCL_DLLS} - CONFIGURATIONS Release - DESTINATION "${INSTALL_DIR_BIN}") - install (FILES ${TCL_DLLS} - CONFIGURATIONS RelWithDebInfo - DESTINATION "${INSTALL_DIR_BIN}i") - install (FILES ${TCL_DLLS} - CONFIGURATIONS Debug - DESTINATION "${INSTALL_DIR_BIN}d") - endif() - else() - get_filename_component(3RDPARTY_TCL_LIBRARY_REALPATH ${3RDPARTY_TCL_LIBRARY} REALPATH) - - if (SINGLE_GENERATOR) - install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} DESTINATION "${INSTALL_DIR_LIB}") - else() - install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} - CONFIGURATIONS Release - DESTINATION "${INSTALL_DIR_LIB}") - install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} - CONFIGURATIONS RelWithDebInfo - DESTINATION "${INSTALL_DIR_LIB}i") - install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} - CONFIGURATIONS Debug - DESTINATION "${INSTALL_DIR_LIB}d") - endif() - endif() - - if (TCL_TCLSH_VERSION) - # tcl is required to install in lib folder (without) - install (DIRECTORY "${3RDPARTY_TCL_LIBRARY_DIR}/tcl8" DESTINATION "${INSTALL_DIR_LIB}") - install (DIRECTORY "${3RDPARTY_TCL_LIBRARY_DIR}/tcl${TCL_TCLSH_VERSION}" DESTINATION "${INSTALL_DIR_LIB}") - else() - message (STATUS "\nWarning: tclX.X subdir won't be copied during the installation process.") - message (STATUS "Try seeking tcl within another folder by changing 3RDPARTY_TCL_DIR variable.") - endif() - - set (USED_3RDPARTY_TCL_DIR "") else() - # the library directory for using by the executable - if (WIN32) - set (USED_3RDPARTY_TCL_DIR ${3RDPARTY_TCL_DLL_DIR}) + get_filename_component(3RDPARTY_TCL_LIBRARY_REALPATH ${3RDPARTY_TCL_LIBRARY} REALPATH) + + if (SINGLE_GENERATOR) + install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} DESTINATION "${INSTALL_DIR_LIB}") else() - set (USED_3RDPARTY_TCL_DIR ${3RDPARTY_TCL_LIBRARY_DIR}) + install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} + CONFIGURATIONS Release + DESTINATION "${INSTALL_DIR_LIB}") + install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} + CONFIGURATIONS RelWithDebInfo + DESTINATION "${INSTALL_DIR_LIB}i") + install (FILES ${3RDPARTY_TCL_LIBRARY_REALPATH} + CONFIGURATIONS Debug + DESTINATION "${INSTALL_DIR_LIB}d") endif() endif() - mark_as_advanced (3RDPARTY_TCL_LIBRARY 3RDPARTY_TCL_DLL) + if (TCL_TCLSH_VERSION) + # tcl is required to install in lib folder (without) + install (DIRECTORY "${3RDPARTY_TCL_LIBRARY_DIR}/tcl8" DESTINATION "${INSTALL_DIR_LIB}") + install (DIRECTORY "${3RDPARTY_TCL_LIBRARY_DIR}/tcl${TCL_TCLSH_VERSION}" DESTINATION "${INSTALL_DIR_LIB}") + else() + message (STATUS "\nWarning: tclX.X subdir won't be copied during the installation process.") + message (STATUS "Try seeking tcl within another folder by changing 3RDPARTY_TCL_DIR variable.") + endif() + + set (USED_3RDPARTY_TCL_DIR "") +else() + # the library directory for using by the executable + if (WIN32) + set (USED_3RDPARTY_TCL_DIR ${3RDPARTY_TCL_DLL_DIR}) + else() + set (USED_3RDPARTY_TCL_DIR ${3RDPARTY_TCL_LIBRARY_DIR}) + endif() endif() +mark_as_advanced (3RDPARTY_TCL_LIBRARY 3RDPARTY_TCL_DLL) + if (TK_FOUND AND 3RDPARTY_TCL_DIR) get_filename_component (TK_WISH_ABSOLUTE "${TK_WISH}" ABSOLUTE) @@ -285,10 +279,3 @@ OCCT_CHECK_AND_UNSET (TK_LIBRARY) OCCT_CHECK_AND_UNSET (TK_INCLUDE_PATH) OCCT_CHECK_AND_UNSET (TK_WISH) -if (NOT BUILD_SHARED_LIBS) - OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_LIBRARY) - OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_LIBRARY_DIR) - OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_DLL) - OCCT_CHECK_AND_UNSET (3RDPARTY_TCL_DLL_DIR) - OCCT_CHECK_AND_UNSET (INSTALL_TCL) -endif() diff --git a/adm/scripts/cmake_gen.bat b/adm/scripts/cmake_gen.bat index 0a0ac0dff5..428107902b 100644 --- a/adm/scripts/cmake_gen.bat +++ b/adm/scripts/cmake_gen.bat @@ -12,6 +12,7 @@ set VS=14 set VSDATA=2015 set VSPLATFORM=Win64 set "BUILD_DIR=build-vs%VS%-%VSPLATFORM%" +set "OCCT3RDPARTY=" set "INSTALL_DIR=%SrcRoot%\install" set BUILD_ADDITIONAL_TOOLKITS= diff --git a/adm/scripts/wasm_build.bat b/adm/scripts/wasm_build.bat index af9bfcd14c..1284cb7f76 100644 --- a/adm/scripts/wasm_build.bat +++ b/adm/scripts/wasm_build.bat @@ -173,6 +173,7 @@ if ["%toCMake%"] == ["1"] ( -D 3RDPARTY_TCL_INCLUDE_DIR:PATH="%aTcl%/include" ^ -D 3RDPARTY_TCL_LIBRARY_DIR:PATH="%aTcl%/lib" ^ -D 3RDPARTY_TCL_LIBRARY:FILEPATH="%aTcl%/lib/libtcl.a" ^ + -D USE_TK:BOOL="OFF" ^ "%aCasSrc%" if errorlevel 1 ( diff --git a/samples/webgl/occt-webgl-sample.html b/samples/webgl/occt-webgl-sample.html index c04add8b47..a831e3e1f0 100644 --- a/samples/webgl/occt-webgl-sample.html +++ b/samples/webgl/occt-webgl-sample.html @@ -1,87 +1,87 @@ - - - - - -OCCT WebGL Viewer Sample - - - -

OCCT WebGL Viewer Sample

-
- - -
- -
- - - -
-

Console output:

-

- - - - + + + + + +OCCT WebGL Viewer Sample + + + +

OCCT WebGL Viewer Sample

+
+ + +
+ +
+ + + +
+

Console output:

+

+ + + + diff --git a/samples/webgl/occt-webgl-viewer.js b/samples/webgl/occt-webgl-viewer.js index 484b519231..4dc2ec1202 100644 --- a/samples/webgl/occt-webgl-viewer.js +++ b/samples/webgl/occt-webgl-viewer.js @@ -1,28 +1,28 @@ -var OccViewerModule = -{ - print: (function() { - var anElement = document.getElementById('output'); - return function(theText) { anElement.innerHTML += theText + "
"; }; - })(), - printErr: function(theText) { - //var anElement = document.getElementById('output'); - //anElement.innerHTML += theText + "
"; - console.warn(theText); - }, - canvas: (function() { - var aCanvas = document.getElementById('occViewerCanvas'); - var aGlCtx = aCanvas.getContext ('webgl2', { alpha: false, depth: true, antialias: false, preserveDrawingBuffer: true } ); - if (aGlCtx == null) { aGlCtx = aCanvas.getContext ('webgl', { alpha: false, depth: true, antialias: false, preserveDrawingBuffer: true } ); } - return aCanvas; - })(), - - onRuntimeInitialized: function() { - //console.log(" @@ onRuntimeInitialized()" + Object.getOwnPropertyNames(OccViewerModule)); - } -}; - -const OccViewerModuleInitialized = createOccViewerModule(OccViewerModule); -OccViewerModuleInitialized.then(function(Module) { - //OccViewerModule.setCubemapBackground ("cubemap.jpg"); - OccViewerModule.openFromUrl ("ball", "samples/Ball.brep"); -}); +var OccViewerModule = +{ + print: (function() { + var anElement = document.getElementById('output'); + return function(theText) { anElement.innerHTML += theText + "
"; }; + })(), + printErr: function(theText) { + //var anElement = document.getElementById('output'); + //anElement.innerHTML += theText + "
"; + console.warn(theText); + }, + canvas: (function() { + var aCanvas = document.getElementById('occViewerCanvas'); + var aGlCtx = aCanvas.getContext ('webgl2', { alpha: false, depth: true, antialias: false, preserveDrawingBuffer: true } ); + if (aGlCtx == null) { aGlCtx = aCanvas.getContext ('webgl', { alpha: false, depth: true, antialias: false, preserveDrawingBuffer: true } ); } + return aCanvas; + })(), + + onRuntimeInitialized: function() { + //console.log(" @@ onRuntimeInitialized()" + Object.getOwnPropertyNames(OccViewerModule)); + } +}; + +const OccViewerModuleInitialized = createOccViewerModule(OccViewerModule); +OccViewerModuleInitialized.then(function(Module) { + //OccViewerModule.setCubemapBackground ("cubemap.jpg"); + OccViewerModule.openFromUrl ("ball", "samples/Ball.brep"); +}); diff --git a/src/DRAWEXE/CMakeLists.txt b/src/DRAWEXE/CMakeLists.txt index bdf6279949..45e9f4d123 100644 --- a/src/DRAWEXE/CMakeLists.txt +++ b/src/DRAWEXE/CMakeLists.txt @@ -1,5 +1,41 @@ project(DRAWEXE) +unset (CUSTOM_EXTERNLIB) +if (NOT BUILD_SHARED_LIBS) + # link specific list of plugins explicitly + FILE_TO_LIST ("src/${PROJECT_NAME}/EXTERNLIB_STATIC" CUSTOM_EXTERNLIB) + if (USE_OPENGL) + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGles) + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGlesTest) + list (REMOVE_ITEM CUSTOM_EXTERNLIB CSF_OpenGlesLibs) + elseif(USE_GLES2) + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGl) + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGlTest) + list (REMOVE_ITEM CUSTOM_EXTERNLIB CSF_OpenGlLibs) + else() + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGles) + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGlesTest) + list (REMOVE_ITEM CUSTOM_EXTERNLIB CSF_OpenGlesLibs) + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGl) + list (REMOVE_ITEM CUSTOM_EXTERNLIB TKOpenGlTest) + list (REMOVE_ITEM CUSTOM_EXTERNLIB CSF_OpenGlLibs) + endif() +endif() + set (EXECUTABLE_PROJECT ON) OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) unset (EXECUTABLE_PROJECT) +unset (CUSTOM_EXTERNLIB) + +if (EMSCRIPTEN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s MAX_WEBGL_VERSION=2") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH=1") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --bind") + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s MODULARIZE=1") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s EXPORT_NAME='createDRAWEXE'") + + install(FILES ${PROJECT_NAME}.html DESTINATION "${INSTALL_DIR_BIN}/${OCCT_INSTALL_BIN_LETTER}") + install(FILES ../DrawResources/lamp.ico DESTINATION "${INSTALL_DIR_BIN}/${OCCT_INSTALL_BIN_LETTER}") +endif() diff --git a/src/DRAWEXE/DRAWEXE.cxx b/src/DRAWEXE/DRAWEXE.cxx index 782d490887..4e3e7f4c66 100644 --- a/src/DRAWEXE/DRAWEXE.cxx +++ b/src/DRAWEXE/DRAWEXE.cxx @@ -16,6 +16,20 @@ #include #include #include +#include +#include + +#ifdef OCCT_NO_PLUGINS + #include + #include + #if defined(HAVE_OPENGL) || defined(HAVE_GLES2) + #include + #endif + #include + #include + #include + #include +#endif //======================================================================= //function : Draw_InitAppli @@ -24,9 +38,29 @@ void Draw_InitAppli (Draw_Interpretor& di) { +#if defined(__EMSCRIPTEN__) + // open JavaScript console within the Browser to see this output + Handle(Message_PrinterSystemLog) aJSConsolePrinter = new Message_PrinterSystemLog ("DRAWEXE"); + Message::DefaultMessenger()->AddPrinter (aJSConsolePrinter); +#endif + Draw::Commands (di); DBRep::BasicCommands (di); DrawTrSurf::BasicCommands (di); + +#ifdef OCCT_NO_PLUGINS + // load a couple of plugins + BOPTest::Factory (di); + DPrsStd::Factory (di); + XSDRAWSTLVRML::Factory (di); + XDEDRAW::Factory (di); + #if defined(HAVE_OPENGL) || defined(HAVE_GLES2) + ViewerTest::Factory (di); + OpenGlTest::Factory (di); + #endif + //TObjDRAW::Factory (di); + //QADraw::Factory (di); +#endif } #include diff --git a/src/DRAWEXE/DRAWEXE.html b/src/DRAWEXE/DRAWEXE.html new file mode 100644 index 0000000000..4147bf1a24 --- /dev/null +++ b/src/DRAWEXE/DRAWEXE.html @@ -0,0 +1,68 @@ + + + + + +OCCT Draw Harness + + + +

OCCT Draw Harness

+
+ +
+

Output (open JavaScript console):

+

+ + + + diff --git a/src/DRAWEXE/EXTERNLIB_STATIC b/src/DRAWEXE/EXTERNLIB_STATIC new file mode 100644 index 0000000000..6833c00b06 --- /dev/null +++ b/src/DRAWEXE/EXTERNLIB_STATIC @@ -0,0 +1,75 @@ +TKTopTest +TKDCAF +TKXSDRAW +TKXDEDRAW +TKOpenGlTest +TKOpenGlesTest +TKViewerTest +TKDraw +TKMeshVS +TKXDESTEP +TKSTEP +TKSTEPAttr +TKSTEP209 +TKSTEPBase +TKXDEIGES +TKIGES +TKXSBase +TKVRML +TKSTL +TKRWMesh +TKBinXCAF +TKXmlXCAF +TKBin +TKXml +TKXmlL +TKBinL +TKOpenGl +TKOpenGles +TKXCAF +TKVCAF +TKStd +TKCAF +TKV3d +TKHLR +TKMesh +TKService +TKOffset +TKFillet +TKFeat +TKBool +TKBO +TKShHealing +TKPrim +TKTopAlgo +TKGeomAlgo +TKBRep +TKGeomBase +TKG3d +TKG2d +TKMath +TKStdL +TKLCAF +TKCDF +TKernel +CSF_TclLibs +CSF_OpenVR +CSF_OpenGlLibs +CSF_OpenGlesLibs +CSF_FFmpeg +CSF_FreeImagePlus +CSF_FREETYPE +CSF_user32 +CSF_advapi32 +CSF_XwLibs +CSF_dpsLibs +CSF_XmuLibs +CSF_fontconfig +CSF_objc +CSF_Appkit +CSF_IOKit +CSF_winmm +CSF_ThreadLibs +CSF_wsock32 +CSF_psapi +CSF_androidlog diff --git a/src/Draw/Draw_BasicCommands.cxx b/src/Draw/Draw_BasicCommands.cxx index 9c7d182a25..897e007957 100644 --- a/src/Draw/Draw_BasicCommands.cxx +++ b/src/Draw/Draw_BasicCommands.cxx @@ -452,6 +452,12 @@ static Standard_Integer dversion(Draw_Interpretor& di, Standard_Integer, const c #else di << "Architecture: ARM 32-bit\n"; #endif +#elif defined(__EMSCRIPTEN__) + #if defined(__LP64__) + di << "Architecture: WASM 64-bit\n"; + #else + di << "Architecture: WASM 32-bit\n"; + #endif #else di << "Architecture: unrecognized\n"; #endif @@ -475,6 +481,8 @@ static Standard_Integer dversion(Draw_Interpretor& di, Standard_Integer, const c #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) #include di << "OS: BSD (BSD = " << BSD << ")\n"; +#elif defined(__EMSCRIPTEN__) + di << "OS: WebAssembly (Emscripten SDK " << __EMSCRIPTEN_major__ << "." << __EMSCRIPTEN_minor__ << "." << __EMSCRIPTEN_tiny__ << ")\n"; #else di << "OS: unrecognized\n"; #endif diff --git a/src/Draw/Draw_PluginMacro.hxx b/src/Draw/Draw_PluginMacro.hxx index 4c7d77e436..badfb8ebdb 100644 --- a/src/Draw/Draw_PluginMacro.hxx +++ b/src/Draw/Draw_PluginMacro.hxx @@ -16,10 +16,13 @@ #ifndef _Draw_PluginMacro_HeaderFile #define _Draw_PluginMacro_HeaderFile +#ifdef OCCT_NO_PLUGINS +#define DPLUGIN(name) +#else #define DPLUGIN(name) \ -extern "C" {Standard_EXPORT void PLUGINFACTORY(Draw_Interpretor&);} \ -void PLUGINFACTORY(Draw_Interpretor& theDI) { \ - name::Factory(theDI);} \ -\ +extern "C" Standard_EXPORT void PLUGINFACTORY(Draw_Interpretor& theDI) { \ + name::Factory(theDI); \ +} +#endif #endif diff --git a/src/OS/Draw.tcl b/src/OS/Draw.tcl index 786ff58584..3d7eaef53c 100644 --- a/src/OS/Draw.tcl +++ b/src/OS/Draw.tcl @@ -11,9 +11,7 @@ # Alternatively, this file may be used under the terms of Open CASCADE # commercial license or contractual agreement. -;# -;# Liste des toolkits WOK sous forme de full path -;# +;# Return list of toolkits proc Draw:toolkits { } { set aResult [list TKDraw TKTopTest TKViewerTest TKXSDRAW TKDCAF TKXDEDRAW TKTObjDRAW TKQADraw] @@ -35,41 +33,23 @@ proc Draw:toolkits { } { return $aResult } -;# ;# Autres UDs a prendre. Listes de triplets ;# { ar typ UD str } Tous les types de UD vont dans un sous directory nomme root/str ;# Ils seront dans CAS3.0/str de l'archive de type ar (source/runtime) ;# { ar typ UD {} } Tous les types de UD vont dans root/UD/src => CAS3.0/src -;# proc Draw:ressources { } { - return [list \ - [list both r DrawResources {}] \ - [list both x DRAWEXE {}] \ - ] -} -proc Draw:freefiles { } { - return {} -} -;# -;# Nom du module -;# -proc Draw:name { } { - return Draw -} -proc Draw:alias { } { - return DRAW -} -proc Draw:depends { } { - return [list DataExchange] + return [list \ + [list both r DrawResources {}] \ + [list both x DRAWEXE {}] \ + ] } -proc Draw:acdepends { } { - return [list TCLTK] -} +proc Draw:freefiles { } { return {} } + +proc Draw:name { } { return Draw } +proc Draw:alias { } { return DRAW } +proc Draw:depends { } { return [list DataExchange] } +proc Draw:acdepends { } { return [list TCLTK] } -;# ;# Returns a list of exported features. -;# -proc Draw:Export { } { - return [list source runtime wokadm api] -} +proc Draw:Export { } { return [list source runtime wokadm api] }