1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-08 14:17:06 +03:00

Compare commits

..

6 Commits

Author SHA1 Message Date
abv
9f7af82cde On Apple with XCode 9.4.1 and onwards, the compiler optimization is disabled for method gp_Mat::Transpose() as optimizer generates invalid code when that method is used. 2018-07-27 14:22:00 +03:00
abv
e23f5331d9 0029978: Data Exchange, macOS - the result of reading some entity from STEP looks odd
Code is optimized manually to avoid bug of XCode 9.4 compiler optimizer
2018-07-27 14:21:41 +03:00
abv
d54e1b4c57 # fix shader 2018-07-12 14:01:27 +03:00
abv
0f3127a3bc Set OCC_VERSION_DEVELOPMENT to "fuji" to distinguish this specific build 2018-07-04 20:14:06 +03:00
asl
7dced57d92 0024437: Efficient HLR visualization based on OpenGL and GLSL
New interior style Aspect_IS_OUTLINE is supported for Graphic3d_AspectFillArea3d.
If this style is set, the triangles primitive array is drawn using the outline shader

A new flag theMostAllowedEdgeClass is passed to the methods StdPrs_ShadedShape: Add, FillFaceBoundaries.
It defines the most allowed continuity class of edges that will be included into the presentation.
The edges with more continuity will be ignored.
By default, the value is CN, i.e. all edges are included into the presentation.
The new methods in AIS_Shape: SetMostContinuityClass, MostContinuityClass allows specifying the most allowed continuity class of edges at the level of shape's presentation
2018-07-03 10:42:17 +03:00
ifv
2b751582ac 0029734: Modeling Algorithms - Compute global properties of tessellated shape
New algorithms calculating global properties on mesh data have been added:
- BRepGProp_MeshCinert computes the global properties of polylines represented by a set of points;
- BRepGProp_MeshProps computes the global properties of a surface mesh.

Existing tool BRepGProp now automatically uses new algorithm for triangulation-only faces.
By default, algorithm will use exact geometry objects (surfaces), when it is available (as before the patch);
this behavior can be switched by a new flag UseTriangulation, forcing usage of triangulation instead of exact geometry when both defined.
2018-07-03 10:12:22 +03:00
3178 changed files with 50250 additions and 79928 deletions

4
.gitignore vendored
View File

@@ -1,10 +1,14 @@
# standard directories for derived files in CASROOT
/.adm
/sun
/lin
/mac
/ao1
/sil
/wnt
/doc
/drv
/inc
/work

View File

@@ -63,7 +63,7 @@ set (BUILD_RESOURCES OFF CACHE BOOL "${BUILD_RESOURCES_DESCR}")
# single-configuration generator
set (SINGLE_GENERATOR OFF)
if (DEFINED CMAKE_BUILD_TYPE)
if (CMAKE_BUILD_TYPE)
set (SINGLE_GENERATOR ON)
endif()
@@ -481,6 +481,7 @@ OCCT_IS_PRODUCT_REQUIRED (CSF_FreeImagePlus CAN_USE_FREEIMAGE)
OCCT_IS_PRODUCT_REQUIRED (CSF_TclLibs USE_TCL)
OCCT_IS_PRODUCT_REQUIRED (CSF_FREETYPE USE_FREETYPE)
OCCT_IS_PRODUCT_REQUIRED (CSF_OpenGlLibs CAN_USE_GLES2)
OCCT_IS_PRODUCT_REQUIRED (CSF_GL2PS CAN_USE_GL2PS)
OCCT_IS_PRODUCT_REQUIRED (CSF_TBB CAN_USE_TBB)
OCCT_IS_PRODUCT_REQUIRED (CSF_EIGEN CAN_USE_EIGEN)
@@ -608,6 +609,24 @@ else()
OCCT_CHECK_AND_UNSET ("INSTALL_GLES2")
endif()
# GL2PS
if (NOT DEFINED ANDROID AND CAN_USE_GL2PS)
set (USE_GL2PS OFF CACHE BOOL "${USE_GL2PS_DESCR}")
if (USE_GL2PS)
add_definitions (-DHAVE_GL2PS)
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/gl2ps")
else()
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_GL2PS")
OCCT_CHECK_AND_UNSET ("INSTALL_GL2PS")
endif()
else()
OCCT_CHECK_AND_UNSET ("USE_GL2PS")
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_GL2PS")
OCCT_CHECK_AND_UNSET ("INSTALL_GL2PS")
endif()
# TBB
if (NOT DEFINED ANDROID AND CAN_USE_TBB)
set (USE_TBB OFF CACHE BOOL "${USE_TBB_DESCR}")
@@ -899,19 +918,11 @@ if (BUILD_SAMPLES_MFC OR BUILD_SAMPLES_QT)
OCCT_COPY_FILE_OR_DIR ("adm/templates/sample.${SCRIPT_EXT}" "${CMAKE_BINARY_DIR}")
endif()
if (WIN32)
# env script for draw in building environment
OCCT_CONFIGURE ("adm/templates/env.${SCRIPT_EXT}.in" "env.${SCRIPT_EXT}")
# install env script
install (FILES "${CMAKE_BINARY_DIR}/env.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SCRIPT}")
else()
set (SUB_ENV_NAME "env.${SCRIPT_EXT}")
set (SUB_ENV_BUILD_NAME "env.install.${SCRIPT_EXT}")
# install env script
OCCT_CONFIGURE_AND_INSTALL ("adm/templates/env.install.${SCRIPT_EXT}.in" "${SUB_ENV_BUILD_NAME}" "${SUB_ENV_NAME}" "${INSTALL_DIR_SCRIPT}")
# env script for draw in building environment
OCCT_CONFIGURE ("adm/templates/env.build.${SCRIPT_EXT}.in" "env.${SCRIPT_EXT}")
endif()
# env script for draw in building environment
OCCT_CONFIGURE ("adm/templates/env.${SCRIPT_EXT}.in" "env.${SCRIPT_EXT}")
# install env script
install (FILES "${CMAKE_BINARY_DIR}/env.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SCRIPT}")
# copy DrawAppliInit from OCCT source to build directory
if (NOT EXISTS "${CMAKE_BINARY_DIR}/DrawAppliInit")

View File

@@ -1,17 +1,17 @@
wnt WOKSteps_exec_link DRAWEXE #WOKStep_EXELink(exec.tks)
lin WOKSteps_exec_link DRAWEXE #WOKStep_EXELink(exec.tks)
wnt cmplrs_cxx f -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_cxx b -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_cxx f -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_GL2PS -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_cxx b -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_GL2PS -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_cxx Aspect (wnt cmplrs_cxx b) -D_AFXDLL
wnt cmplrs_cxx (wnt cmplrs_cxx b) -D_AFXDLL -D_AFXDLL
wnt cmplrs_c f -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_c b -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_c f -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_GL2PS -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_c b -D_CRT_SECURE_NO_DEPRECATE -DHAVE_FREEIMAGE -DHAVE_GL2PS -DHAVE_TBB -DHAVE_OPENCL
wnt cmplrs_c NIS (wnt cmplrs_c b) -DSILGL -DSILGL_VRS=50
lin cmplrs_cxx f -DOCC_CONVERT_SIGNALS -D_GNU_SOURCE=1 -DHAVE_FREEIMAGE -DHAVE_TBB -DHAVE_OPENCL
lin cmplrs_cxx b -DOCC_CONVERT_SIGNALS -D_GNU_SOURCE=1 -DHAVE_FREEIMAGE -DHAVE_TBB -DHAVE_OPENCL
lin cmplrs_cxx f -DOCC_CONVERT_SIGNALS -D_GNU_SOURCE=1 -DHAVE_FREEIMAGE -DHAVE_GL2PS -DHAVE_TBB -DHAVE_OPENCL
lin cmplrs_cxx b -DOCC_CONVERT_SIGNALS -D_GNU_SOURCE=1 -DHAVE_FREEIMAGE -DHAVE_GL2PS -DHAVE_TBB -DHAVE_OPENCL
lin cmplrs_c f -D_GNU_SOURCE=1 -fexceptions
lin cmplrs_c b -D_GNU_SOURCE=1 -fexceptions

View File

@@ -105,7 +105,6 @@ n BRepIntCurveSurface
n BRepLib
n BRepMAT2d
n BRepMesh
n BRepMeshData
n BRepOffset
n BRepOffsetAPI
n BRepPrim
@@ -142,8 +141,6 @@ n HLRTopoBRep
n HLRAppli
n Hatch
n HatchGen
n IMeshData
n IMeshTools
n IntCurve
n IntCurveSurface
n IntCurvesFace

View File

@@ -277,6 +277,26 @@ macro (THIRDPARTY_PRODUCT PRODUCT_NAME HEADER_NAME LIBRARY_CSF_NAME LIBRARY_NAME
endif()
endif()
if("${PRODUCT_NAME}" STREQUAL "GL2PS")
get_filename_component(GL2PSLIB ${3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX}} NAME)
if (SINGLE_GENERATOR)
install (FILES "${ABS_PATH}" DESTINATION "${INSTALL_DIR_LIB}" RENAME ${GL2PSLIB}.1)
else()
install (FILES "${ABS_PATH}"
CONFIGURATIONS Release
DESTINATION "${INSTALL_DIR_LIB}"
RENAME ${GL2PSLIB}.1)
install (FILES "${ABS_PATH}"
CONFIGURATIONS RelWithDebInfo
DESTINATION "${INSTALL_DIR_LIB}i"
RENAME ${GL2PSLIB}.1)
install (FILES "${ABS_PATH}"
CONFIGURATIONS Debug
DESTINATION "${INSTALL_DIR_LIB}d"
RENAME ${GL2PSLIB}.1)
endif()
endif()
endif()
else()
# the library directory for using by the executable

View File

@@ -37,10 +37,6 @@ foreach (LIBRARY_NAME ${CSF_FFmpeg})
set (3RDPARTY_FFMPEG_LIBRARY_DIR_${LIBRARY_NAME} "" CACHE PATH "The directory containing FFmpeg framework (${LIBRARY_NAME})")
endif()
if (NOT DEFINED 3RDPARTY_FFMPEG_LIBRARY_DIR)
set (3RDPARTY_FFMPEG_LIBRARY_DIR "" CACHE PATH "The directory containing FFmpeg libraries")
endif()
if (WIN32)
if (NOT DEFINED 3RDPARTY_FFMPEG_DLL_${LIBRARY_NAME} OR NOT 3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME} OR NOT EXISTS "${3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME}}")
set (3RDPARTY_FFMPEG_DLL_${LIBRARY_NAME} "" CACHE FILEPATH "FFmpeg shared libraries (${LIBRARY_NAME})" FORCE)
@@ -51,9 +47,6 @@ foreach (LIBRARY_NAME ${CSF_FFmpeg})
if (NOT DEFINED 3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME})
set (3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME} "" CACHE PATH "The directory containing FFmpeg shared libraries (${LIBRARY_NAME})")
endif()
if (NOT DEFINED 3RDPARTY_FFMPEG_DLL_DIR)
set (3RDPARTY_FFMPEG_DLL_DIR "" CACHE PATH "The directory containing FFmpeg shared libraries")
endif()
endif()
# check 3RDPARTY_${PRODUCT_NAME}_ paths for consistency with specified 3RDPARTY_${PRODUCT_NAME}_DIR
@@ -63,7 +56,6 @@ foreach (LIBRARY_NAME ${CSF_FFmpeg})
if (3RDPARTY_FFMPEG_LIBRARY_${LIBRARY_NAME} AND EXISTS "${3RDPARTY_FFMPEG_LIBRARY_${LIBRARY_NAME}}")
get_filename_component (3RDPARTY_FFMPEG_LIBRARY_DIR_${LIBRARY_NAME} "${3RDPARTY_FFMPEG_LIBRARY_${LIBRARY_NAME}}" PATH)
set (3RDPARTY_FFMPEG_LIBRARY_DIR "${3RDPARTY_FFMPEG_LIBRARY_DIR_${LIBRARY_NAME}}" CACHE PATH "The directory containing FFmpeg libraries" FORCE)
set (3RDPARTY_FFMPEG_LIBRARY_DIR_${LIBRARY_NAME} "${3RDPARTY_FFMPEG_LIBRARY_DIR_${LIBRARY_NAME}}" CACHE PATH "The directory containing FFmpeg library (${LIBRARY_NAME})" FORCE)
else()
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FFMPEG_DIR 3RDPARTY_FFMPEG_LIBRARY_DIR_${LIBRARY_NAME} PATH "The directory containing FFmpeg library (${LIBRARY_NAME})")
@@ -74,7 +66,6 @@ foreach (LIBRARY_NAME ${CSF_FFmpeg})
if (3RDPARTY_FFMPEG_DLL_${LIBRARY_NAME} AND EXISTS "${3RDPARTY_FFMPEG_DLL_${LIBRARY_NAME}}")
get_filename_component (3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME} "${3RDPARTY_FFMPEG_DLL_${LIBRARY_NAME}}" PATH)
set (3RDPARTY_FFMPEG_DLL_DIR "${3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME}}" CACHE PATH "The directory containing FFmpeg shared libraries" FORCE)
set (3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME} "${3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME}}" CACHE PATH "The directory containing FFmpeg shared library (${LIBRARY_NAME})" FORCE)
else()
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FFMPEG_DIR 3RDPARTY_FFMPEG_DLL_DIR_${LIBRARY_NAME} PATH "The directory containing FFmpeg shared library (${LIBRARY_NAME})")

View File

@@ -61,8 +61,8 @@ endif()
# check 3RDPARTY_FREETYPE_ paths for consistency with specified 3RDPARTY_FREETYPE_DIR
if (3RDPARTY_FREETYPE_DIR AND EXISTS "${3RDPARTY_FREETYPE_DIR}")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build FILEPATH "The directory containing ft2build.h header")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 FILEPATH "The directory containing ftheader.h header")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build FILEPATH "the path to ft2build.h")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 FILEPATH "the path to ftheader.h")
if (BUILD_SHARED_LIBS)
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR 3RDPARTY_FREETYPE_LIBRARY FILEPATH "the path to freetype library")
@@ -119,8 +119,8 @@ if (IS_BUILTIN_SEARCH_REQUIRED)
# check the found paths for consistency with specified 3RDPARTY_FREETYPE_DIR
if (3RDPARTY_FREETYPE_DIR AND EXISTS "${3RDPARTY_FREETYPE_DIR}")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR FREETYPE_INCLUDE_DIR_ft2build FILEPATH "The directory containing ft2build.h header")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR FREETYPE_INCLUDE_DIR_freetype2 FILEPATH "The directory containing ftheader.h header")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR FREETYPE_INCLUDE_DIR_ft2build FILEPATH "the path to ft2build.h")
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR FREETYPE_INCLUDE_DIR_freetype2 FILEPATH "the path to ftheader.h")
if (BUILD_SHARED_LIBS)
CHECK_PATH_FOR_CONSISTENCY (3RDPARTY_FREETYPE_DIR FREETYPE_LIBRARY FILEPATH "freetype library")
endif()
@@ -129,13 +129,13 @@ if (IS_BUILTIN_SEARCH_REQUIRED)
# assign the found paths to corresponding 3RDPARTY_FREETYPE_ variables
if (NOT 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build OR NOT EXISTS "${3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build}")
if (FREETYPE_INCLUDE_DIR_ft2build AND EXISTS "${FREETYPE_INCLUDE_DIR_ft2build}")
set (3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build "${FREETYPE_INCLUDE_DIR_ft2build}" CACHE FILEPATH "The directory containing ft2build.h header" FORCE)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build "${FREETYPE_INCLUDE_DIR_ft2build}" CACHE FILEPATH "the path to ft2build.h" FORCE)
endif()
endif()
if (NOT 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 OR NOT EXISTS "${3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2}")
if (FREETYPE_INCLUDE_DIR_freetype2 AND EXISTS "${FREETYPE_INCLUDE_DIR_freetype2}")
set (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 "${FREETYPE_INCLUDE_DIR_freetype2}" CACHE FILEPATH "The directory containing ftheader.h header" FORCE)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 "${FREETYPE_INCLUDE_DIR_freetype2}" CACHE FILEPATH "the path to ftheader.h" FORCE)
endif()
endif()
@@ -162,7 +162,7 @@ if (NOT 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build OR NOT EXISTS "${3RDPARTY_FREETYP
set (FT2BUILD_NAMES ft2build.h config/ft2build.h freetype/config/ft2build.h)
# set 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build as notfound, otherwise find_library can't assign a new value to 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build
set (3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build "3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build-NOTFOUND" CACHE FILEPATH "The directory containing ft2build.h header" FORCE)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build "3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build-NOTFOUND" CACHE FILEPATH "the path to ft2build.h" FORCE)
# cmake (version < 3.0) doesn't find ft2build.h of freetype (version is >= 2.5.1)
# do search taking into account freetype structure of 2.5.1 version
@@ -185,7 +185,7 @@ if (3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build AND EXISTS "${3RDPARTY_FREETYPE_INCLU
else()
list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build "" CACHE FILEPATH "The directory containing ft2build.h header" FORCE)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build "" CACHE FILEPATH "the path to ft2build.h" FORCE)
endif()
# ftheader.h
@@ -193,7 +193,7 @@ if (NOT 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 OR NOT EXISTS "${3RDPARTY_FREETY
set (FTHEADER_NAMES ftheader.h config/ftheader.h freetype/config/ftheader.h)
# set 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 as notfound, otherwise find_library can't assign a new value to 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2
set (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 "3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2-NOTFOUND" CACHE FILEPATH "The directory containing ftheader.h header" FORCE)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 "3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2-NOTFOUND" CACHE FILEPATH "the path to ftheader.h" FORCE)
if (3RDPARTY_FREETYPE_DIR AND EXISTS "${3RDPARTY_FREETYPE_DIR}")
find_path (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 NAMES ${FTHEADER_NAMES}
@@ -214,7 +214,7 @@ if (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 AND EXISTS "${3RDPARTY_FREETYPE_INCL
else()
list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 "" CACHE FILEPATH "The directory containing ftheader.h header" FORCE)
set (3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2 "" CACHE FILEPATH "the path to ftheader.h" FORCE)
endif()
# freetype library

3
adm/cmake/gl2ps.cmake Normal file
View File

@@ -0,0 +1,3 @@
#GL2PS
THIRDPARTY_PRODUCT("GL2PS" "gl2ps.h" "CSF_GL2PS" "d")

View File

@@ -58,13 +58,21 @@ if (USE_TCL)
endif()
endif()
# GL2PS
if (NOT DEFINED ANDROID)
if (USE_GL2PS)
set (CSF_GL2PS "gl2ps")
else()
set (CSF_GL2PS)
endif()
endif()
if (WIN32)
set (CSF_advapi32 "advapi32.lib")
set (CSF_gdi32 "gdi32.lib")
set (CSF_user32 "user32.lib")
set (CSF_shell32 "shell32.lib")
set (CSF_wsock32 "wsock32.lib")
set (CSF_psapi "psapi.lib")
set (CSF_psapi "Psapi.lib")
set (CSF_d3d9 "D3D9.lib")
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore" OR USE_GLES2)
set (CSF_OpenGlLibs "libEGL libGLESv2")

View File

@@ -86,13 +86,8 @@ if (MSVC AND (MSVC_VERSION GREATER 1400))
endif()
# generate a single response file which enlist all of the object files
if (NOT DEFINED CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS)
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
endif()
if (NOT DEFINED CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS)
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
endif()
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
# increase compiler warnings level (-W4 for MSVC, -Wextra for GCC)
if (MSVC)
if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")

View File

@@ -40,7 +40,7 @@ Precompiled headers are generated automatically by Cotire tool.")
# install variables
set (INSTALL_DIR_DESCR
"The place where built OCCT libraries, headers, test cases (INSTALL_TEST_CASES variable),
samples (INSTALL_SAMPLES_DESCR variable) and certain 3rdparties (INSTALL_TBB and
samples (INSTALL_SAMPLES_DESCR variable) and certain 3rdparties (INSTALL_GL2PS, INSTALL_TBB and
other similar variables) will be placed during the installation process (building INSTALL project)")
set (INSTALL_DIR_WITH_VERSION_DESCR
@@ -88,6 +88,7 @@ INSTALL_MESSAGE (INSTALL_EIGEN "EIGEN header files")
INSTALL_MESSAGE (INSTALL_EGL "EGL binaries")
INSTALL_MESSAGE (INSTALL_GLES2 "OpenGL ES 2.0 binaries")
INSTALL_MESSAGE (INSTALL_FREETYPE "FreeType binaries")
INSTALL_MESSAGE (INSTALL_GL2PS "GL2PS binaries")
INSTALL_MESSAGE (INSTALL_TBB "TBB binaries")
INSTALL_MESSAGE (INSTALL_TCL "TCL binaries")
INSTALL_MESSAGE (INSTALL_TK "TK binaries")
@@ -164,6 +165,10 @@ set (USE_GLES2_DESCR
"Indicates whether OpenGL ES 2.0 should be used in OCCT visualization
module instead of desktop OpenGL")
set (USE_GL2PS_DESCR
"Indicates whether GL2PS product should be used in OCCT visualization
module for support of vector image formats (PS, EPS etc)")
set (USE_TBB_DESCR
"Indicates whether TBB is used or not. TBB stands for Threading Building Blocks,
the technology of Intel Corp, which comes with different mechanisms and patterns for

View File

@@ -139,6 +139,9 @@ proc wokdep:gui:UpdateList {} {
wokdep:SearchFreeType anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
wokdep:SearchX11 anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
if { "$::HAVE_GLES2" == "true" } {
if { "$::HAVE_GL2PS" == "true" } {
lappend anIncErrs "Error: gl2ps can not be used with OpenGL ES"
}
wokdep:SearchEGL anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
wokdep:SearchGLES anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
}
@@ -148,6 +151,9 @@ proc wokdep:gui:UpdateList {} {
if { "$::HAVE_FFMPEG" == "true" } {
wokdep:SearchFFmpeg anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
}
if { "$::HAVE_GL2PS" == "true" } {
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "gl2ps" "gl2ps.h" "gl2ps" {"gl2ps"}
}
if { "$::HAVE_TBB" == "true" } {
wokdep:SearchTBB anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
}
@@ -409,6 +415,8 @@ entry .myFrame.mySrchEntry -textvariable PRODUCTS_PATH -width 80
ttk::button .myFrame.mySrchBrowseBtn -text "Browse" -command wokdep:gui:BrowsePartiesRoot
checkbutton .myFrame.myChecks.myFImageCheck -offvalue "false" -onvalue "true" -variable HAVE_FREEIMAGE -command wokdep:gui:UpdateList
ttk::label .myFrame.myChecks.myFImageLbl -text "Use FreeImage"
checkbutton .myFrame.myChecks.myGl2psCheck -offvalue "false" -onvalue "true" -variable HAVE_GL2PS -command wokdep:gui:UpdateList
ttk::label .myFrame.myChecks.myGl2psLbl -text "Use GL2PS"
checkbutton .myFrame.myChecks.myTbbCheck -offvalue "false" -onvalue "true" -variable HAVE_TBB -command wokdep:gui:UpdateList
ttk::label .myFrame.myChecks.myTbbLbl -text "Use Intel TBB"
if { "$::tcl_platform(os)" != "Darwin" } {
@@ -537,6 +545,9 @@ if { "$::tcl_platform(os)" != "Darwin" } {
grid .myFrame.myChecks.myZLibCheck -row $aCheckRowIter -column 6 -sticky e
grid .myFrame.myChecks.myZLibLbl -row $aCheckRowIter -column 7 -sticky w
grid .myFrame.myChecks.myGl2psCheck -row $aCheckRowIter -column 8 -sticky e
grid .myFrame.myChecks.myGl2psLbl -row $aCheckRowIter -column 9 -sticky w
grid .myFrame.myChecks.myQt4Check -row $aCheckRowIter -column 10 -sticky e
grid .myFrame.myChecks.myQt4Lbl -row $aCheckRowIter -column 11 -sticky w

View File

@@ -65,7 +65,7 @@ if { [info exists ::env(SHORTCUT_HEADERS)] } {
}
# fetch environment variables (e.g. set by custom.sh or custom.bat) and set them as tcl variables with the same name
set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo}
set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_GL2PS HAVE_ZLIB HAVE_LIBLZMA HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo}
foreach anEnvIter $THE_ENV_VARIABLES {
set ${anEnvIter} "false"
if { [info exists ::env(${anEnvIter})] } {

View File

@@ -1263,16 +1263,12 @@ proc wokUtils:FILES:FileToString { fin } {
# List extensions of compilable files in OCCT
proc osutils:compilable {thePlatform} {
if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } { return [list .c .cxx .cpp .mm] }
if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } {
return [list .c .cxx .cpp .mm]
}
return [list .c .cxx .cpp]
}
# List extensions of header file in OCCT
proc osutils:fileExtensionsHeaders {thePlatform} {
if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } { return [list .h .hxx .hpp .lxx .pxx .gxx ] }
return [list .h .hxx .hpp .lxx .pxx .gxx .mm ]
}
proc osutils:commonUsedTK { theToolKit } {
set anUsedToolKits [list]
set aDepToolkits [LibToLink $theToolKit]
@@ -1322,6 +1318,9 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } {
if { "$::HAVE_FFMPEG" == "true" } {
set aLibsMap(CSF_FFmpeg) "avcodec avformat swscale avutil"
}
if { "$::HAVE_GL2PS" == "true" } {
set aLibsMap(CSF_GL2PS) "gl2ps"
}
if { "$::HAVE_TBB" == "true" } {
set aLibsMap(CSF_TBB) "tbb tbbmalloc"
}
@@ -1345,7 +1344,6 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } {
set aLibsMap(CSF_advapi32) "advapi32"
set aLibsMap(CSF_gdi32) "gdi32"
set aLibsMap(CSF_user32) "user32 comdlg32"
set aLibsMap(CSF_shell32) "shell32"
set aLibsMap(CSF_opengl32) "opengl32"
set aLibsMap(CSF_wsock32) "wsock32"
set aLibsMap(CSF_netapi32) "netapi32"
@@ -1470,7 +1468,8 @@ proc osutils:tk:units { tkloc } {
}
proc osutils:justwnt { listloc } {
set goaway [list Xw]
# ImageUtility is required for support for old (<6.5.4) versions of OCCT
set goaway [list Xdps Xw ImageUtility WOKUnix]
return [osutils:juststation $goaway $listloc]
}
@@ -1560,28 +1559,31 @@ proc wokUtils:FILES:wtail { f n } {
}
# Generate entry for one source file in Visual Studio 10 project file
proc osutils:vcxproj:cxxfile { theFile theParams } {
if { $theParams == "" } {
return " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $theFile 3]]\" />\n"
proc osutils:vcxproj:file { file params } {
append text " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $file 3]]\">\n"
if { $params != "" } {
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Debug|Win32\'\">[string trim ${params}] %(AdditionalOptions)</AdditionalOptions>\n"
}
if { $params != "" } {
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Release|Win32\'\">[string trim ${params}] %(AdditionalOptions)</AdditionalOptions>\n"
}
if { $params != "" } {
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Debug|x64\'\">[string trim ${params}] %(AdditionalOptions)</AdditionalOptions>\n"
}
if { $params != "" } {
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Release|x64\'\">[string trim ${params}] %(AdditionalOptions)</AdditionalOptions>\n"
}
set aParams [string trim ${theParams}]
append text " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $theFile 3]]\">\n"
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Debug|Win32\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Release|Win32\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Debug|x64\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
append text " <AdditionalOptions Condition=\"\'\$(Configuration)|\$(Platform)\'==\'Release|x64\'\">${aParams} %(AdditionalOptions)</AdditionalOptions>\n"
append text " </ClCompile>\n"
return $text
}
# Generate entry for one header file in Visual Studio 10 project file
proc osutils:vcxproj:hxxfile { theFile } { return " <ClInclude Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $theFile 3]]\" />\n" }
# Generate Visual Studio 2010 project filters file
proc osutils:vcxproj:filters { dir proj theCxxFilesMap theHxxFilesMap } {
upvar $theCxxFilesMap aCxxFilesMap
upvar $theHxxFilesMap aHxxFilesMap
proc osutils:vcxproj:filters { dir proj theFilesMap } {
upvar $theFilesMap aFilesMap
# header
append text "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
@@ -1592,25 +1594,17 @@ proc osutils:vcxproj:filters { dir proj theCxxFilesMap theHxxFilesMap } {
append text " <Filter Include=\"Source files\">\n"
append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
append text " </Filter>\n"
append text " <Filter Include=\"Header files\">\n"
append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
append text " </Filter>\n"
foreach unit $aCxxFilesMap(units) {
foreach unit $aFilesMap(units) {
append text " <Filter Include=\"Source files\\${unit}\">\n"
append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
append text " </Filter>\n"
}
foreach unit $aHxxFilesMap(units) {
append text " <Filter Include=\"Header files\\${unit}\">\n"
append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
append text " </Filter>\n"
}
append text " </ItemGroup>\n"
# list of cxx files
# list of files
append text " <ItemGroup>\n"
foreach unit $aCxxFilesMap(units) {
foreach file $aCxxFilesMap($unit) {
foreach unit $aFilesMap(units) {
foreach file $aFilesMap($unit) {
append text " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $file 3]]\">\n"
append text " <Filter>Source files\\${unit}</Filter>\n"
append text " </ClCompile>\n"
@@ -1618,19 +1612,51 @@ proc osutils:vcxproj:filters { dir proj theCxxFilesMap theHxxFilesMap } {
}
append text " </ItemGroup>\n"
# list of hxx files
# end
append text "</Project>"
# write file
set fp [open [set fvcproj [file join $dir ${proj}.vcxproj.filters]] w]
fconfigure $fp -translation crlf
puts $fp $text
close $fp
return ${proj}.vcxproj.filters
}
# Generate Visual Studio 2011 project filters file
proc osutils:vcx1proj:filters { dir proj theFilesMap } {
upvar $theFilesMap aFilesMap
# header
append text "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
append text "<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n"
# list of "filters" (units)
append text " <ItemGroup>\n"
foreach unit $aHxxFilesMap(units) {
foreach file $aHxxFilesMap($unit) {
append text " <ClInclude Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $file 3]]\">\n"
append text " <Filter>Header files\\${unit}</Filter>\n"
append text " </ClInclude>\n"
append text " <Filter Include=\"Source files\">\n"
append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
append text " </Filter>\n"
foreach unit $aFilesMap(units) {
append text " <Filter Include=\"Source files\\${unit}\">\n"
append text " <UniqueIdentifier>[OS:genGUID]</UniqueIdentifier>\n"
append text " </Filter>\n"
}
append text " </ItemGroup>\n"
# list of files
append text " <ItemGroup>\n"
foreach unit $aFilesMap(units) {
foreach file $aFilesMap($unit) {
append text " <ClCompile Include=\"..\\..\\..\\[wokUtils:EASY:bs1 [wokUtils:FILES:wtail $file 3]]\">\n"
append text " <Filter>Source files\\${unit}</Filter>\n"
append text " </ClCompile>\n"
}
}
append text " </ItemGroup>\n"
append text " <ItemGroup>\n"
append text " <ResourceCompile Include=\"${proj}.rc\" />\n"
append text " <ResourceCompile Include=\"${proj}.rc\" />"
append text " </ItemGroup>\n"
# end
@@ -1703,9 +1729,9 @@ proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
set anIncPaths "..\\..\\..\\inc"
# set aTKDefines ""
set aFilesSection ""
set aVcFilesCxx(units) ""
set aVcFilesHxx(units) ""
set aVcFilesX(units) ""
set listloc [osutils:tk:units $theToolKit]
set resultloc [osutils:justwnt $listloc]
if [array exists written] { unset written }
#puts "\t1 [wokparam -v %CMPLRS_CXX_Options [w_info -f]] father"
#puts "\t2 [wokparam -v %CMPLRS_CXX_Options] branch"
@@ -1714,10 +1740,9 @@ proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
set fxloparamfcxx [lindex [osutils:intersect3 [_get_options wnt cmplrs_cxx f] [_get_options wnt cmplrs_cxx b]] 2]
set fxloparamfc [lindex [osutils:intersect3 [_get_options wnt cmplrs_c f] [_get_options wnt cmplrs_c b]] 2]
set fxloparam ""
foreach fxlo $listloc {
foreach fxlo $resultloc {
set xlo $fxlo
set aSrcFiles [osutils:tk:cxxfiles $xlo wnt]
set aHxxFiles [osutils:tk:hxxfiles $xlo wnt]
set aSrcFiles [osutils:tk:files $xlo wnt]
set fxlo_cmplrs_options_cxx [_get_options wnt cmplrs_cxx $fxlo]
if {$fxlo_cmplrs_options_cxx == ""} {
set fxlo_cmplrs_options_cxx [_get_options wnt cmplrs_cxx b]
@@ -1746,22 +1771,12 @@ proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
foreach aSrcFile [lsort $aSrcFiles] {
if { ![info exists written([file tail $aSrcFile])] } {
set written([file tail $aSrcFile]) 1
append aFilesSection [osutils:vcxproj:cxxfile $aSrcFile $needparam]
append aFilesSection [osutils:vcxproj:file $aSrcFile $needparam]
} else {
puts "Warning : in vcproj more than one occurences for [file tail $aSrcFile]"
}
if { ! [info exists aVcFilesCxx($xlo)] } { lappend aVcFilesCxx(units) $xlo }
lappend aVcFilesCxx($xlo) $aSrcFile
}
foreach aHxxFile [lsort $aHxxFiles] {
if { ![info exists written([file tail $aHxxFile])] } {
set written([file tail $aHxxFile]) 1
append aFilesSection [osutils:vcxproj:hxxfile $aHxxFile]
} else {
puts "Warning : in vcproj more than one occurences for [file tail $aHxxFile]"
}
if { ! [info exists aVcFilesHxx($xlo)] } { lappend aVcFilesHxx(units) $xlo }
lappend aVcFilesHxx($xlo) $aHxxFile
if { ! [info exists aVcFilesX($xlo)] } { lappend aVcFilesX(units) $xlo }
lappend aVcFilesX($xlo) $aSrcFile
}
} else {
append aFilesSection "\t\t\t<Filter\n"
@@ -1777,9 +1792,15 @@ proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
}
append aFilesSection "\t\t\t</Filter>\n"
}
# macros
# append aTKDefines ";__${xlo}_DLL"
# common includes
# append anIncPaths ";..\\..\\..\\src\\${xlo}"
}
regsub -all -- {__TKINC__} $theProjTmpl $anIncPaths theProjTmpl
# regsub -all -- {__TKDEFS__} $theProjTmpl $aTKDefines theProjTmpl
regsub -all -- {__FILES__} $theProjTmpl $aFilesSection theProjTmpl
# write file
@@ -1789,8 +1810,12 @@ proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
close $aFile
# write filters file for vc10+
if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
lappend aVcFiles [osutils:vcxproj:filters $theOutDir $theToolKit aVcFilesCxx aVcFilesHxx]
if { "$theVcVer" == "vc7" || "$theVcVer" == "vc8" || "$theVcVer" == "vc9" } {
# nothing
} elseif { "$theVcVer" == "vc10" } {
lappend aVcFiles [osutils:vcxproj:filters $theOutDir $theToolKit aVcFilesX]
} else {
lappend aVcFiles [osutils:vcx1proj:filters $theOutDir $theToolKit aVcFilesX]
}
# write resource file
@@ -1822,14 +1847,16 @@ proc osutils:tk:loadunit { loc map } {
return
}
# Returns the list of all files name in a toolkit within specified list of file extensions.
proc osutils:tk:files { tkloc theExtensions } {
# Returns the list of all compilable files name in a toolkit, or devunit of any type
# Tfiles lists for each unit the type of file that can be compiled.
proc osutils:tk:files { tkloc thePlatform } {
set Tfiles(source,nocdlpack) {source pubinclude}
set Tfiles(source,toolkit) {}
set Tfiles(source,executable) {source pubinclude}
set listloc [concat [osutils:tk:units $tkloc] $tkloc]
#puts " listloc = $listloc"
set l_comp [osutils:compilable $thePlatform]
set resultloc $listloc
set lret {}
foreach loc $resultloc {
@@ -1854,7 +1881,7 @@ proc osutils:tk:files { tkloc theExtensions } {
#puts $type
foreach f $map($type) {
#puts $f
if { [lsearch $theExtensions [file extension $f]] != -1 } {
if { [lsearch $l_comp [file extension $f]] != -1 } {
lappend lret $f
}
}
@@ -1863,16 +1890,10 @@ proc osutils:tk:files { tkloc theExtensions } {
return $lret
}
# Returns the list of all compilable files name in a toolkit.
proc osutils:tk:cxxfiles { tkloc thePlatform } { return [osutils:tk:files $tkloc [osutils:compilable $thePlatform]] }
# Returns the list of all header files name in a toolkit.
proc osutils:tk:hxxfiles { tkloc thePlatform } { return [osutils:tk:files $tkloc [osutils:fileExtensionsHeaders $thePlatform]] }
# Generate Visual Studio project file for executable
proc osutils:vcprojx { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
set aVcFiles {}
foreach f [osutils:tk:cxxfiles $theToolKit wnt] {
foreach f [osutils:tk:files $theToolKit wnt] {
set aProjTmpl [osutils:vcproj:readtemplate $theVcVer $isUWP 1]
set aProjName [file rootname [file tail $f]]
@@ -1907,16 +1928,15 @@ proc osutils:vcprojx { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
regsub -all -- {__TKDEP__} $aProjTmpl $aUsedLibs aProjTmpl
set aFilesSection ""
set aVcFilesCxx(units) ""
set aVcFilesHxx(units) ""
set aVcFilesX(units) ""
if { ![info exists written([file tail $f])] } {
set written([file tail $f]) 1
if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
append aFilesSection [osutils:vcxproj:cxxfile $f ""]
if { ! [info exists aVcFilesCxx($theToolKit)] } { lappend aVcFilesCxx(units) $theToolKit }
lappend aVcFilesCxx($theToolKit) $f
append aFilesSection [osutils:vcxproj:file $f ""]
if { ! [info exists aVcFilesX($theToolKit)] } { lappend aVcFilesX(units) $theToolKit }
lappend aVcFilesX($theToolKit) $f
} else {
append aFilesSection "\t\t\t<Filter\n"
append aFilesSection "\t\t\t\tName=\"$theToolKit\"\n"
@@ -1928,8 +1948,10 @@ proc osutils:vcprojx { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
puts "Warning : in vcproj there are than one occurences for [file tail $f]"
}
#puts "$aProjTmpl $aFilesSection"
# set aTKDefines ";__${theToolKit}_DLL"
set anIncPaths "..\\..\\..\\inc"
regsub -all -- {__TKINC__} $aProjTmpl $anIncPaths aProjTmpl
# regsub -all -- {__TKDEFS__} $aProjTmpl $aTKDefines aProjTmpl
regsub -all -- {__FILES__} $aProjTmpl $aFilesSection aProjTmpl
regsub -all -- {__CONF__} $aProjTmpl Application aProjTmpl
@@ -1945,12 +1967,9 @@ proc osutils:vcprojx { theVcVer isUWP theOutDir theToolKit theGuidsMap } {
# write filters file for vc10
if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } {
lappend aVcFiles [osutils:vcxproj:filters $theOutDir $aProjName aVcFilesCxx aVcFilesHxx]
lappend aVcFiles [osutils:vcxproj:filters $theOutDir $aProjName aVcFilesX]
}
# write resource file
lappend aVcFiles [osutils:readtemplate:rc $theOutDir $aProjName]
set aCommonSettingsFileTmpl ""
if { "$theVcVer" == "vc7" || "$theVcVer" == "vc8" } {
# nothing
@@ -2133,7 +2152,7 @@ proc osutils:cbptk { theCmpl theOutDir theToolKit thePlatform} {
if [array exists written] { unset written }
foreach fxlo $resultloc {
set xlo $fxlo
set aSrcFiles [osutils:tk:cxxfiles $xlo $thePlatform]
set aSrcFiles [osutils:tk:files $xlo $thePlatform]
foreach aSrcFile [lsort $aSrcFiles] {
if { ![info exists written([file tail $aSrcFile])] } {
set written([file tail $aSrcFile]) 1
@@ -2227,7 +2246,7 @@ proc osutils:cbpx { theCmpl theOutDir theToolKit thePlatform } {
set aWokArch "$::env(ARCH)"
set aCbpFiles {}
foreach aSrcFile [osutils:tk:cxxfiles $theToolKit $thePlatform] {
foreach aSrcFile [osutils:tk:files $theToolKit $thePlatform] {
# collect list of referred libraries to link with
set aUsedLibs [list]
set aFrameworks [list]
@@ -2666,7 +2685,7 @@ proc osutils:xcdtk:deps {theToolKit theTargetType theGuidsMap theFileRefSection
set aDepToolkits [lappend [wokUtils:LIST:Purge [osutils:tk:close $theToolKit]] $theToolKit]
if { "$theTargetType" == "executable" } {
set aFile [osutils:tk:cxxfiles $theToolKit mac]
set aFile [osutils:tk:files $theToolKit mac]
set aProjName [file rootname [file tail $aFile]]
set aDepToolkits [LibToLinkX $theToolKit $aProjName]
}
@@ -2732,7 +2751,7 @@ proc osutils:xcdtk:sources {theToolKit theTargetType theSrcFileRefSection theGro
set aGuidsMap($aPackage) [OS:genGUID "xcd"]
}
set aSrcFiles [osutils:tk:cxxfiles $xlo mac]
set aSrcFiles [osutils:tk:files $xlo mac]
foreach aSrcFile [lsort $aSrcFiles] {
set aFileExt "sourcecode.cpp.cpp"

View File

@@ -58,6 +58,7 @@ set (OpenCASCADE_BUILD_SHARED_LIBS @BUILD_SHARED_LIBS@)
set (OpenCASCADE_WITH_TCL @USE_TCL@)
set (OpenCASCADE_WITH_FREETYPE @USE_FREETYPE@)
set (OpenCASCADE_WITH_FREEIMAGE @USE_FREEIMAGE@)
set (OpenCASCADE_WITH_GL2PS @USE_GL2PS@)
set (OpenCASCADE_WITH_TBB @USE_TBB@)
set (OpenCASCADE_WITH_VTK @USE_VTK@)
set (OpenCASCADE_WITH_FFMPEG @USE_FFMPEG@)

View File

@@ -11,6 +11,7 @@ if /I "%VCVER%" == "@COMPILER@" (
set "FREEIMAGE_DIR=@3RDPARTY_FREEIMAGE_DLL_DIRS@"
set "EGL_DIR=@3RDPARTY_EGL_DLL_DIRS@"
set "GLES2_DIR=@3RDPARTY_GLES2_DLL_DIRS@"
set "GL2PS_DIR=@3RDPARTY_GL2PS_DLL_DIRS@"
set "TBB_DIR=@3RDPARTY_TBB_DLL_DIR@"
set "VTK_DIR=@3RDPARTY_VTK_DLL_DIR@"
set "FFMPEG_DIR=@3RDPARTY_FFMPEG_DLL_DIR@"

View File

@@ -9,6 +9,7 @@ if [ "$1" == "@BIN_LETTER@" ]; then
export TK_DIR="@3RDPARTY_TK_LIBRARY_DIR@"
export FREETYPE_DIR="@3RDPARTY_FREETYPE_LIBRARY_DIR@"
export FREEIMAGE_DIR="@3RDPARTY_FREEIMAGE_LIBRARY_DIRS@"
export GL2PS_DIR="@3RDPARTY_GL2PS_LIBRARY_DIRS@"
export TBB_DIR="@3RDPARTY_TBB_LIBRARY_DIR@"
export VTK_DIR="@3RDPARTY_VTK_LIBRARY_DIR@"
export FFMPEG_DIR="@3RDPARTY_FFMPEG_LIBRARY_DIR@"

View File

@@ -13,6 +13,7 @@ if /I "%VCVER%" == "@COMPILER@" (
set "FREEIMAGE_DIR=@USED_3RDPARTY_FREEIMAGE_DIRS@"
set "EGL_DIR=@USED_3RDPARTY_EGL_DIRS@"
set "GLES2_DIR=@USED_3RDPARTY_GLES2_DIRS@"
set "GL2PS_DIR=@USED_3RDPARTY_GL2PS_DIRS@"
set "TBB_DIR=@USED_3RDPARTY_TBB_DIR@"
set "VTK_DIR=@USED_3RDPARTY_VTK_DIR@"
set "FFMPEG_DIR=@USED_3RDPARTY_FFMPEG_DIR@"

View File

@@ -9,6 +9,7 @@ if [ "$1" == "@BIN_LETTER@" ]; then
export TK_DIR="@USED_3RDPARTY_TK_DIR@"
export FREETYPE_DIR="@USED_3RDPARTY_FREETYPE_DIR@"
export FREEIMAGE_DIR="@USED_3RDPARTY_FREEIMAGE_DIRS@"
export GL2PS_DIR="@USED_3RDPARTY_GL2PS_DIRS@"
export TBB_DIR="@USED_3RDPARTY_TBB_DIR@"
export VTK_DIR="@USED_3RDPARTY_VTK_DIR@"
export FFMPEG_DIR="@USED_3RDPARTY_FFMPEG_DIR@"

View File

@@ -19,6 +19,7 @@ set "HAVE_TBB=false"
set "HAVE_OPENCL=false"
set "HAVE_FREEIMAGE=false"
set "HAVE_FFMPEG=false"
set "HAVE_GL2PS=false"
set "HAVE_VTK=false"
set "HAVE_GLES2=false"
set "HAVE_D3D=false"
@@ -155,6 +156,7 @@ set "CSF_OPT_CMPL="
set "PRODUCTS_DEFINES="
if ["%HAVE_TBB%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_TBB" & set "CSF_DEFINES=HAVE_TBB;%CSF_DEFINES%"
if ["%HAVE_OPENCL%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_OPENCL" & set "CSF_DEFINES=HAVE_OPENCL;%CSF_DEFINES%"
if ["%HAVE_GL2PS%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_GL2PS" & set "CSF_DEFINES=HAVE_GL2PS;%CSF_DEFINES%"
if ["%HAVE_FREEIMAGE%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FREEIMAGE" & set "CSF_DEFINES=HAVE_FREEIMAGE;%CSF_DEFINES%"
if ["%HAVE_FFMPEG%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FFMPEG" & set "CSF_DEFINES=HAVE_FFMPEG;%CSF_DEFINES%"
if ["%HAVE_VTK%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_VTK" & set "CSF_DEFINES=HAVE_VTK;%CSF_DEFINES%"

View File

@@ -126,6 +126,7 @@ if not ["%FREETYPE_DIR%"] == [""] set "PATH=%FREETYPE_DIR%;%PATH%"
if not ["%FREEIMAGE_DIR%"] == [""] set "PATH=%FREEIMAGE_DIR%;%PATH%"
if not ["%EGL_DIR%"] == [""] set "PATH=%EGL_DIR%;%PATH%"
if not ["%GLES2_DIR%"] == [""] set "PATH=%GLES2_DIR%;%PATH%"
if not ["%GL2PS_DIR%"] == [""] set "PATH=%GL2PS_DIR%;%PATH%"
if not ["%TBB_DIR%"] == [""] set "PATH=%TBB_DIR%;%PATH%"
if not ["%VTK_DIR%"] == [""] set "PATH=%VTK_DIR%;%PATH%"
if not ["%FFMPEG_DIR%"] == [""] set "PATH=%FFMPEG_DIR%;%PATH%"

View File

@@ -1,137 +0,0 @@
#!/bin/bash
aScriptPath=${BASH_SOURCE%/*}; if [ -d "${aScriptPath}" ]; then cd "$aScriptPath"; fi; aScriptPath="$PWD";
# ----- For compatability with external application using CASROOT -----
if [ "${CASROOT}" == "" ]; then
export CASROOT="${aScriptPath}"
fi
# ----- Define path to 3rdparty products -----
export THIRDPARTY_DIR="@3RDPARTY_DIR@"
# ----- Read script arguments -----
shopt -s nocasematch
export CASDEB="";
if [[ "$1" == "debug" ]]; then export CASDEB="d"; fi
if [[ "$1" == "d" ]]; then export CASDEB="d"; fi
if [[ "$1" == "relwithdeb" ]]; then export CASDEB="i"; fi
if [[ "$1" == "i" ]]; then export CASDEB="i"; fi
shopt -u nocasematch
# ----- Set path to 3rd party and OCCT libraries -----
anArch=`uname -m`
if [ "$anArch" != "x86_64" ] && [ "$anArch" != "ia64" ]; then
export ARCH="32";
else
export ARCH="64";
fi
aSystem=`uname -s`
if [ "$aSystem" == "Darwin" ]; then
export WOKSTATION="mac";
export ARCH="64";
else
export WOKSTATION="lin";
fi
# ----- Set local settings -----
if [ -e "${CASROOT}/custom.sh" ]; then
source "${CASROOT}/custom.sh" "${CASDEB}" "${ARCH}"
fi
THRDPARTY_PATH=""
if [ "$TCL_DIR" != "" ]; then
THRDPARTY_PATH="${TCL_DIR}:${THRDPARTY_PATH}"
fi
if [ "$TK_DIR" != "" ]; then
THRDPARTY_PATH="${TK_DIR}:${THRDPARTY_PATH}"
fi
if [ "$FREETYPE_DIR" != "" ]; then
THRDPARTY_PATH="${FREETYPE_DIR}:${THRDPARTY_PATH}"
fi
if [ "$FREEIMAGE_DIR" != "" ]; then
THRDPARTY_PATH="${FREEIMAGE_DIR}:${THRDPARTY_PATH}"
fi
if [ "$TBB_DIR" != "" ]; then
THRDPARTY_PATH="${TBB_DIR}:${THRDPARTY_PATH}"
fi
if [ "$VTK_DIR" != "" ]; then
THRDPARTY_PATH="${VTK_DIR}:${THRDPARTY_PATH}"
fi
if [ "$FFMPEG_DIR" != "" ]; then
THRDPARTY_PATH="${FFMPEG_DIR}:${THRDPARTY_PATH}"
fi
if [ "$QTDIR" != "" ]; then
THRDPARTY_PATH="${QTDIR}/lib:${THRDPARTY_PATH}"
fi
if [ "$TK_DIR" != "$TCL_DIR" ]; then
if [ "$TK_DIR" != "" ]; then
export TK_LIBRARY="${TK_DIR}/../lib/tk${TK_VERSION_WITH_DOT}"
fi
if [ "$TCL_DIR" != "" ]; then
export TCL_LIBRARY="${TCL_DIR}/../lib/tcl${TCL_VERSION_WITH_DOT}"
fi
fi
if [ "$LD_LIBRARY_PATH" != "" ]; then
export LD_LIBRARY_PATH="${THRDPARTY_PATH}:${LD_LIBRARY_PATH}"
else
export LD_LIBRARY_PATH="${THRDPARTY_PATH}"
fi
if [ "$CSF_OCCTBinPath" != "" ]; then
export PATH="${CSF_OCCTBinPath}:${PATH}"
fi
if [ "$CSF_OCCTLibPath" != "" ]; then
if [ "$LD_LIBRARY_PATH" != "" ]; then
export LD_LIBRARY_PATH="${CSF_OCCTLibPath}:${LD_LIBRARY_PATH}"
else
export LD_LIBRARY_PATH="${CSF_OCCTLibPath}"
fi
fi
if [ "$WOKSTATION" == "mac" ]; then
if [ "$DYLD_LIBRARY_PATH" != "" ]; then
export DYLD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${DYLD_LIBRARY_PATH}"
else
export DYLD_LIBRARY_PATH="${LD_LIBRARY_PATH}"
fi
fi
# ----- Set envoronment variables used by OCCT -----
export CSF_LANGUAGE=us
export MMGT_CLEAR=1
export CSF_SHMessage="${CSF_OCCTResourcePath}/SHMessage"
export CSF_MDTVTexturesDirectory="${CSF_OCCTResourcePath}/Textures"
export CSF_ShadersDirectory="${CSF_OCCTResourcePath}/Shaders"
export CSF_XSMessage="${CSF_OCCTResourcePath}/XSMessage"
export CSF_TObjMessage="${CSF_OCCTResourcePath}/TObj"
export CSF_StandardDefaults="${CSF_OCCTResourcePath}/StdResource"
export CSF_PluginDefaults="${CSF_OCCTResourcePath}/StdResource"
export CSF_XCAFDefaults="${CSF_OCCTResourcePath}/StdResource"
export CSF_TObjDefaults="${CSF_OCCTResourcePath}/StdResource"
export CSF_StandardLiteDefaults="${CSF_OCCTResourcePath}/StdResource"
export CSF_IGESDefaults="${CSF_OCCTResourcePath}/XSTEPResource"
export CSF_STEPDefaults="${CSF_OCCTResourcePath}/XSTEPResource"
export CSF_XmlOcafResource="${CSF_OCCTResourcePath}/XmlOcafResource"
export CSF_MIGRATION_TYPES="${CSF_OCCTResourcePath}/StdResource/MigrationSheet.txt"
# ----- Draw Harness special stuff -----
if [ -e "${CSF_OCCTResourcePath}/DrawResources" ]; then
export DRAWHOME="${CSF_OCCTResourcePath}/DrawResources"
export CSF_DrawPluginDefaults="${CSF_OCCTResourcePath}/DrawResources"
if [ -e "${CSF_OCCTResourcePath}/DrawResources/DrawDefault" ]; then
export DRAWDEFAULT="${CSF_OCCTResourcePath}/DrawResources/DrawDefault"
fi
fi

View File

@@ -11,6 +11,7 @@ export HAVE_TBB="false";
export HAVE_OPENCL="false";
export HAVE_FREEIMAGE="false";
export HAVE_FFMPEG="false";
export HAVE_GL2PS="false";
export HAVE_VTK="false";
export HAVE_GLES2="false";
export HAVE_ZLIB="false";
@@ -95,6 +96,7 @@ if [ "$HAVE_TBB" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -D
if [ "$HAVE_OPENCL" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_OPENCL"; fi
if [ "$HAVE_FREEIMAGE" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FREEIMAGE"; fi
if [ "$HAVE_FFMPEG" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FFMPEG"; fi
if [ "$HAVE_GL2PS" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_GL2PS"; fi
if [ "$HAVE_GLES2" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_GLES2"; fi
if [ "$HAVE_VTK" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_VTK"; fi
if [ "$HAVE_ZLIB" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_ZLIB"; fi

View File

@@ -57,6 +57,10 @@ if [ "$FREEIMAGE_DIR" != "" ]; then
THRDPARTY_PATH="${FREEIMAGE_DIR}:${THRDPARTY_PATH}"
fi
if [ "$GL2PS_DIR" != "" ]; then
THRDPARTY_PATH="${GL2PS_DIR}:${THRDPARTY_PATH}"
fi
if [ "$TBB_DIR" != "" ]; then
THRDPARTY_PATH="${TBB_DIR}:${THRDPARTY_PATH}"
fi

View File

@@ -110,7 +110,7 @@
<PreprocessorDefinitions>NDEBUG;No_Exception;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>.\..\..\..\win32\__VCVER__\bin\__TKNAM__.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win32\__VCVER__\lib;$(CSF_OPT_LIB32);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -159,7 +159,7 @@
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>.\..\..\..\win32\__VCVER__\bind\__TKNAM__.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win32\__VCVER__\libd;$(CSF_OPT_LIB32D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -206,7 +206,7 @@
<PreprocessorDefinitions>NDEBUG;No_Exception;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>.\..\..\..\win64\__VCVER__\bin\__TKNAM__.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win64\__VCVER__\lib;$(CSF_OPT_LIB64);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -255,7 +255,7 @@
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>.\..\..\..\win64\__VCVER__\bind\__TKNAM__.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win64\__VCVER__\libd;$(CSF_OPT_LIB64D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

View File

@@ -103,7 +103,7 @@
<PreprocessorDefinitions>NDEBUG;No_Exception;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win32\__VCVER__\lib;$(CSF_OPT_LIB32);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>__VCReleasePDB__</GenerateDebugInformation>
@@ -149,7 +149,7 @@
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win32\__VCVER__\libd;$(CSF_OPT_LIB32D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -193,7 +193,7 @@
<PreprocessorDefinitions>NDEBUG;No_Exception;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win64\__VCVER__\lib;$(CSF_OPT_LIB64);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>__VCReleasePDB__</GenerateDebugInformation>
@@ -238,7 +238,7 @@
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
<AdditionalDependencies>__TKDEP__;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\win64\__VCVER__\libd;$(CSF_OPT_LIB64D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -248,11 +248,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
__FILES__
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="__XQTNAM__.rc" />
</ItemGroup>
__FILES__ </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>

View File

@@ -89,14 +89,6 @@ file (APPEND ${OCCT_CONFIG_FOR_DOXYGEN} "\nEXTERNAL_SEARCH = NO")
# Formula options
file (APPEND ${OCCT_CONFIG_FOR_DOXYGEN} "\nMATHJAX_RELPATH = ${3RDPARTY_MATHJAX_RELATIVE_PATH}")
# If MSVC is used as build system, change warning format to the one recognized by MSVC
if (MSVC)
file (APPEND ${OCCT_CONFIG_FOR_DOXYGEN} "\nWARN_FORMAT = \"$file($line): $text\"")
endif()
# Avoid Doxygen parsing messages in the build log
file (APPEND ${OCCT_CONFIG_FOR_DOXYGEN} "\nQUIET = YES")
# Copy index file to provide fast access to HTML documentation
file(COPY "${OCCT_OVERVIEW_RESOURCE_DIR}/index.html" DESTINATION "${OCCT_GENERATED_OVERVIEW_DIR}")

View File

@@ -19,6 +19,7 @@ There are two types of third-party products, which are necessary to build OCCT:
* FreeType 2.4.10 - 2.5.3;
* Optional products:
* TBB 3.x - 4.x;
* gl2ps 1.3.5 - 1.3.8;
* FreeImage 3.14.1 - 3.16.0;
* VTK 6.1.0.
@@ -107,6 +108,32 @@ This third-party product is installed with binaries from the archive that can b
Go to the **Download** page, find the release version you need and pick the archive for Linux platform.
To install, unpack the downloaded archive of TBB product.
@subsection dev_guides__building_3rdparty_linux_3_2 gl2ps
Download the necessary archive from http://geuz.org/gl2ps/ and unpack it.
1. Install or build *cmake* product from the source file.
2. Start *cmake* in GUI mode with the directory where the source files of gl2ps are located:
ccmake GL2PS_SRC_DIR
* Press <i>[c]</i> to make the initial configuration;
* Define the necessary options in *CMAKE_INSTALL_PREFIX*
* Press <i>[c]</i> to make the final configuration
* Press <i>[g]</i> to generate Makefile and exit
or just run the following command:
cmake DCMAKE_INSTALL_PREFIX=GL2PS_INSTALL_DIR DCMAKE_BUILD_TYPE=Release
3. Start the building of gl2ps:
make
4. Start the installation of gl2ps. Binaries will be installed according to the *CMAKE_INSTALL_PREFIX* option.
make install
@subsection dev_guides__building_3rdparty_linux_3_3 FreeImage
Download the necessary archive from http://sourceforge.net/projects/freeimage/files/Source%20Distribution/
@@ -194,7 +221,7 @@ Download the necessary archive from http://www.vtk.org/VTK/resources/software.ht
make
4. Start the installation of VTK. Binaries will be installed according to the *VTK_INSTALL_PREFIX* option.
4. Start the installation of gl2ps. Binaries will be installed according to the *VTK_INSTALL_PREFIX* option.
make install
@@ -205,7 +232,7 @@ Download the necessary archive from http://www.vtk.org/VTK/resources/software.ht
All 3rd-party products required for building of OCCT could be installed
from official repositories. You may install them from console using apt-get utility:
sudo apt-get install tcllib tklib tcl-dev tk-dev libfreetype-dev libxt-dev libxmu-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libfreeimage-dev libtbb-dev
sudo apt-get install tcllib tklib tcl-dev tk-dev libfreetype-dev libxt-dev libxmu-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libfreeimage-dev libtbb-dev libgl2ps-dev
To launch binaries built with WOK you need to install C shell and 32-bit libraries on x86_64 distributives:

View File

@@ -17,6 +17,7 @@ There are two types of third-party products, which are necessary to build OCCT:
* FreeType 2.4.10 - 2.5.3.
* Optional products:
* TBB 3.x - 4.x;
* gl2ps 1.3.5 - 1.3.8;
* FreeImage 3.14.1 - 3.16.0
@section dev_guides__building_3rdparty_osx_2 Building Mandatory Third-party Products
@@ -105,6 +106,33 @@ Go to the **Download** page, find the release version you need (e.g. *tbb30_018o
and pick the archive for Mac OS X platform.
To install, unpack the downloaded archive of TBB 3.0 product (*tbb30_018oss_osx.tgz*).
@subsection dev_guides__building_3rdparty_osx_3_2 gl2ps 1.3.5
Download the necessary archive from http://geuz.org/gl2ps/ and unpack it.
1. Install or build cmake product from the source file.
2. Start cmake in GUI mode with the directory, where the source files of *fl2ps* are located:
ccmake GL2PS_SRC_DIR
* Press <i>[c]</i> to make the initial configuration;
* Define the necessary options in *CMAKE_INSTALL_PREFIX*;
* Press <i>[c]</i> to make the final configuration;
* Press <i>[g]</i> to generate Makefile and exit.
or just run the following command:
cmake DCMAKE_INSTALL_PREFIX=GL2PS_INSTALL_DIR DCMAKE_BUILD_TYPE=Release
3. Start the building of gl2ps
make
4. Start the installation of gl2ps. Binaries will be installed according to the *CMAKE_INSTALL_PREFIX* option
make install
@subsection dev_guides__building_3rdparty_osx_3_3 FreeImage 3.14.1 or 3.15.x
Download the necessary archive from

View File

@@ -17,6 +17,7 @@ There are two types of third-party products used by OCCT:
* FreeType 2.4.10 -- 2.5.3.
* Optional products:
* TBB 3.x -- 4.x;
* gl2ps 1.3.5 -- 1.3.8;
* FreeImage 3.14.1 -- 3.16.0;
* VTK 6.1.0.
@@ -155,6 +156,85 @@ Unpack the downloaded archive of TBB product into the *3rdparty* folder.
Further in this document, this folder is referred to as *tbb*.
@subsection dev_guides__building_3rdparty_win_3_2 gl2ps
This third-party product should be built as a dynamically loadable library (dll file).
You can download its sources from http://geuz.org/gl2ps/src/.
### The building procedure
1. Unpack the downloaded archive of gl2ps product (e.g. *gl2ps-1.3.5.tgz*) into the *3rdparty* folder.
As a result, you will get a folder named, for example, *3rdparty\\gl2ps-1.3.5-source*.
Rename it into <i>gl2ps-platform-compiler-building mode</i>, where
* **platform** -- *win32* or *win64*;
* **compiler** -- *vc8*, *vc9* or *vc10*;
* **building mode** -- *opt* (for release) or *deb* (for debug).
For example, <i>gl2ps-win64-vc10-deb</i>
Further in this document, this folder is referred to as *gl2ps*.
2. Download (from http://www.cmake.org/cmake/resources/software.html)
and install the *CMake* build system.
3. Edit the file *gl2ps\\CMakeLists.txt*.
After line 113 in *CMakeLists.txt*:
set_target_properties(shared PROPERTIES COMPILE_FLAGS \"-DGL2PSDLL -DGL2PSDLL_EXPORTS\")
add the following line:
add_definitions(-D_USE_MATH_DEFINES)
Attention: If Cygwin was installed on your computer, make sure that there is no path to it in the *PATH* variable to avoid possible conflicts during the configuration.
4. Launch CMake <i>(cmake-gui.exe)</i> using the Program menu.
In CMake:
* Define where the source code is.
This path must point to *gl2ps* folder.
* Define where to build the binaries.
This path must point to the folder where generated gl2ps project binaries will be placed
(for example, *gl2ps\\bin*).
Further in this document, this folder is referred to as *gl2ps_bin*.
* Press **Configure** button.
@figure{/dev_guides/building/3rdparty/images/3rdparty_image004.png}
* Select the generator (the compiler and the target platform -- 32 or 64 bit) in the pop-up window.
@figure{/dev_guides/building/3rdparty/images/3rdparty_image005.png}
* Press **Finish** button to return to the main CMake window.
Expand the ENABLE group and uncheck ENABLE_PNG and ENABLE_ZLIB check boxes.
@figure{/dev_guides/building/3rdparty/images/3rdparty_image006.png}
* Expand the CMAKE group and define *CMAKE_INSTALL_PREFIX* which is the path where you want to install the build results, for example, *c:\\occ3rdparty\\gl2ps-1.3.5*.
@figure{/dev_guides/building/3rdparty/images/3rdparty_image007.png}
* Press **Configure** button again, then press **Generate** button to generate Visual Studio projects. After completion, close CMake application.
5. Open the solution file *gl2ps_bin\\gl2ps.sln* in Visual Studio.
* Select a configuration to build
* Choose **Release** to build Release binaries.
* Choose **Debug** to build Debug binaries.
* Select a platform to build.
* Choose **Win32** to build for a 32 bit platform.
* Choose **x64** to build for a 64 bit platform.
* Build the solution.
* Build the *INSTALL* project.
As a result, you should have the installed gl2ps product in the *CMAKE_INSTALL_PREFIX* path.
@subsection dev_guides__building_3rdparty_win_3_3 FreeImage
This third-party product should be built as a dynamically loadable library (.dll file).

View File

@@ -82,12 +82,14 @@ The following table gives the full list of environment variables used at the con
|----------|------|---------|
| CMAKE_BUILD_TYPE | String | Specifies the build type on single-configuration generators (such as make). Possible values are Debug, Release and RelWithDebInfo |
| USE_FREEIMAGE | Boolean flag | Indicates whether FreeImage product should be used in OCCT visualization module for support of popular graphics image formats (PNG, BMP, etc.) |
| USE_GL2PS | Boolean flag | Indicates whether GL2PS product should be used in OCCT visualization module for support of vector image formats (PS, EPS, etc.) |
| USE_TBB | Boolean flag | Indicates whether TBB 3rd party is used or not. TBB stands for Threading Building Blocks, the technology of Intel Corp, which comes with different mechanisms and patterns for injecting parallelism into your application. OCCT remains parallel even without TBB product |
| USE_VTK | Boolean flag | Indicates whether VTK 3rd party is used or not. VTK stands for Visualization ToolKit, the technology of Kitware Inc intended for general-purpose scientific visualization. OCCT comes with a bridge between CAD data representation and VTK by means of its dedicated VIS component (VTK Integration Services). You may skip this 3rd party unless you are planning to use VTK visualization for OCCT geometry. See the official documentation @ref occt_user_guides__vis for the details on VIS |
| 3RDPARTY_DIR | Path | Defines the root directory where all required 3rd party products will be searched. Once you define this path it is very convenient to click "Configure" button in order to let CMake automatically detect all necessary products|
| 3RDPARTY_FREETYPE_* | Path | Path to Freetype binaries |
| 3RDPARTY_TCL_* 3RDPARTY_TK_* | Path | Path to Tcl/Tk binaries |
| 3RDPARTY_FREEIMAGE* | Path | Path to Freeimage binaries |
| 3RDPARTY_GL2PS_* | Path | Path to GL2PS binaries |
| 3RDPARTY_TBB* | Path | Path to TBB binaries |
| 3RDPARTY_VTK_* | Path | Path to VTK binaries |
| BUILD_MODULE_<MODULE>| Boolean flag | Indicates whether the corresponding OCCT module should be built or not. It should be noted that some toolkits of a module can be built even if this module is not checked (this happens if some other modules depend on these toolkits). The main modules and their descriptions can be found in @ref user_guides |
@@ -115,6 +117,7 @@ The following table gives the full list of environment variables used at the con
| INSTALL_DIR_DOC | Path | Relative path to the documentation installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_DOC}) |
| INSTALL_FREETYPE | Boolean flag | Indicates whether Freetype binaries should be installed into the installation directory |
| INSTALL_FREEIMAGE* | Boolean flag | Indicates whether Freeimage binaries should be installed into the installation directory |
| INSTALL_GL2PS | Boolean flag | Indicates whether GL2PS binaries should be installed into the installation directory |
| INSTALL_TBB | Boolean flag | Indicates whether TBB binaries should be installed into the installation directory |
| INSTALL_VTK | Boolean flag | Indicates whether VTK binaries should be installed into the installation directory |
| INSTALL_TCL | Boolean flag | Indicates whether TCL binaries should be installed into the installation directory |

View File

@@ -26,7 +26,7 @@ The environment is defined in the file *custom.sh* (on Linux and OS X) or *custo
* "HardLink* - hard links to headers located in *src* will be created.
* For optional third-party libraries, set corresponding environment variable <i>HAVE_<LIBRARY_NAME></i> to either *false*, e.g.:
~~~~~
export HAVE_FREEIMAGE=false
export HAVE_GL2PS=false
~~~~~
Alternatively, or when *custom.sh* or *custom.bat* does not exist, you can launch **genconf** tool to configure environment interactively:

View File

@@ -27,7 +27,7 @@ The environment is defined in the file *custom.sh* which can be edited directly:
* "HardLink* - hard links to headers located in *src* will be created.
* For optional third-party libraries, set corresponding environment variable <i>HAVE_<LIBRARY_NAME></i> to either *false*, e.g.:
~~~~~
export HAVE_FREEIMAGE=false
export HAVE_GL2PS=false
~~~~~
Alternatively, or when *custom.sh* does not exist, you can launch *genconf.sh* to configure environment interactively:

View File

@@ -134,7 +134,7 @@ Add a relative path to *svn.md* in file <i>dox/FILES.txt</i>. For instance
dev_guides/svn/svn.md
@endverbatim
**Note** that the order of paths to documents in *FILES.txt* is reproduced in the Table of Contents in the HTML output, thus they need to be placed logically.
**Note** that the order of paths to documents in *FILES.txt* is reproduced in the Table of Contents in the HTML output. Please, place them logically.
**Note** that you should specify a file tag, not the document name. See @ref OCCT_DM_SECTION_A_1 "Header and hierarchic document structure" section for details.
@@ -180,7 +180,7 @@ For example:
@subsubsection occt_ocaf_1_1_1 The document and the data framework
@endverbatim
**Note** that section names can be used for references within the document and in other documents, so it is necessary to use the common prefix indicative of the document name for all section names in the given document.
Please, note that section names can be used for references within the document and in other documents, so it is necessary to use the common prefix indicative of the document name for all section names in the given document.
For example, *occt_ocaf* for sections in Open CASCADE Application Framework manual.
The remaining part of section names in most documents consists only of numbers, for example *1_1*. Actually, the hierarchical structure of the output table of contents is not based on these numbers and is generated automatically.

View File

@@ -11,13 +11,14 @@ Guide to installing and using Git for OCCT development {#occt_dev_guides__git_gu
to OCCT developers who are not familiar with this tool
and to facilitate the use of the official OCCT Git repository for code contribution to OCCT.
It can be useful to learn more about Git concepts and tools from a book a or manual.
Reading this document does not exempt from the need to learn Git concepts and tools.
Please consult a book or manual describing Git to get acquainted with this tool.
Many good books on Git can be found at http://git-scm.com/documentation
For the experienced Git users it can be enough to read sections 1 and 3
of this document to start working with the repository.
Familiarize yourselves with the @ref occt_dev_guides__contribution_workflow "Contribution Workflow document"
Please make sure to get familiar with the Contribution Workflow document
that describes how Git is used for processing contributions to OCCT.
This and related documents are available at the Resources page
@@ -82,7 +83,7 @@ The official repository contains:
@subsection occt_gitguide_1_5 Version of Git
The repository is tested to work with Git 1.7.6 and above.
Avoid using versions below 1.7.1 as they are known to cause troubles.
Please do not use versions below 1.7.1 as they are known to cause troubles.
@section occt_gitguide_2 Installing Tools for Work with Git
@@ -249,7 +250,7 @@ Click **Save** to input the key to the system.
It is typical to use your e-mail address or workstation name for this field; no restrictions are set by the portal.
**Note** that some time (5-10 min) is needed for the system
Please note that some time (5-10 min) is needed for the system
to update the configuration after the new key is added.
After that time, you can try accessing Git.

View File

@@ -51,7 +51,7 @@ for (Standard_Integer aGr = 1; aGr <= aLen; ++aGr)
* All occurrences of *Select3D_Projector* in the application code (if any) should be replaced with *Handle(Select3D_Projector)*.
* The code of inheritors of *Select3D_SensitiveEntity* should be updated if they override <i>Matches()</i> (this is probable, if clipping planes are used).
* Constructor for *V3d_Plane* has been changed, so the extra argument should be removed if used in the application. It is necessary to add a new plane using method *V3d_Viewer::AddPlane()* if *V3d_Viewer* has been used to manage clipping planes list (this does not affect clipping planes representation). Have a look at the source code for new DRAWEXE *vclipplane* command in *ViewerTest_ObjectsCommands.cxx, VClipPlane* to see how clipping planes can be managed in the application.
* Constructor for *V3d_Plane* has been changed, so the extra argument should be removed if used in the application. It is necessary to add a new plane using method *V3d_Viewer::AddPlane()* if *V3d_Viewer* has been used to manage clipping planes list (this does not affect clipping planes representation). Please, have a look at the source code for new DRAWEXE *vclipplane* command in *ViewerTest_ObjectsCommands.cxx, VClipPlane* to see how clipping planes can be managed in the application.
@section upgrade_652 Upgrade to OCCT 6.5.2
@@ -112,14 +112,14 @@ Porting of user applications from an earlier OCCT version to version 6.6.0 requi
It is necessary to introduce the corresponding changes in the applications for which the order of sub-shapes resulting from a Boolean operation is important. It is strongly recommended to use identification methods not relying on the order of sub-shapes (e.g. OCAF naming).
* If you need to use OCCT on Mac OS X with X11 (without Cocoa), build OCCT with defined pre-processor macro *CSF_MAC_USE_GLX11*. XLib front-end (previously the only way for unofficial OCCT builds on Mac OS X) is now disabled by default on this platform. If your application has no support for Cocoa framework you may build OCCT with XLib front-end adding *MACOSX_USE_GLX* macro to compiler options (you may check the appropriate option in WOK configuration GUI and in CMake configuration). Notice that XQuartz (XLib implementation for Mac OS X) now is an optional component and does not provide a sufficient level of integrity with native (Cocoa-based) applications in the system. It is not possible to build OCCT with both XLib and Cocoa at the same time due to symbols conflict in OpenGL functions.
* Animation mode and degeneration presentation mode (simplified presentation for animation) and associated methods have been removed from 3D viewer functionality.
Correspondingly, the code using methods *SetAnimationModeOn(), SetAnimationModeOff(), AnimationModeIsOn(), AnimationMode(), Tumble(), SetDegenerateModeOn(), SetDegenerateModeOff()* and *DegenerateModeIsOn()* of classes *V3d_View* and *Visual3d_View* will need to be removed or redesigned. Hidden Line Removal presentation was not affected; however, the old code that used methods *V3d_View::SetDegenerateModeOn* or *V3d_View::SetDegenerateModeOff* to control HLR presentation should be updated to use *V3d_View::SetComputedMode* method instead.
Correspondingly, the code using methods *SetAnimationModeOn(), SetAnimationModeOff(), AnimationModeIsOn(), AnimationMode(), Tumble(), SetDegenerateModeOn(), SetDegenerateModeOff()* and *DegenerateModeIsOn()* of classes *V3d_View* and *Visual3d_View* will need to be removed or redesigned. Please, notice that Hidden Line Removal presentation was not affected; however, the old code that used methods *V3d_View::SetDegenerateModeOn* or *V3d_View::SetDegenerateModeOff* to control HLR presentation should be updated to use *V3d_View::SetComputedMode* method instead.
* Calls of *Graphic3d_Group::BeginPrimitives()* and *Graphic3d_Group::EndPrimitives()* should be removed from the application code.
* Application functionality for drawing 2D graphics that was formerly based on *TKV2d* API should be migrated to *TKV3d* API. The following changes are recommended for this migration:
* A 2D view can be implemented as a *V3d_View* instance belonging to *V3d_Viewer* managed by *AIS_InteractiveContext* instance. To turn *V3d_View* into a 2D view, the necessary view orientation should be set up at the view initialization stage using *V3d_View::SetProj()* method, and view rotation methods simply should not be called.
* Any 2D graphic entity (formerly represented with *AIS2D_InteractiveObject*) should become a class derived from *AIS_InteractiveObject* base. These entities should be manipulated in a view using *AIS_InteractiveContext* class API.
* All drawing code should be put into *Compute()* virtual method of a custom interactive object class and use API of *Graphic3d* package. In particular, all geometry should be drawn using class hierarchy derived from *Graphic3d_ArrayOfPrimitives*. Normally, the Z coordinate for 2D geometry should be constant, unless the application implements some advanced 2D drawing techniques like e.g. multiple "Z layers" of drawings.
* Interactive selection of 2D presentations should be set up inside *ComputeSelection()* virtual method of a custom interactive object class, using standard sensitive entities from *Select3D* package and standard or custom entity owners derived from *SelectMgr_EntityOwner* base.
Refer to the Visualization User's Guide for further details concerning OCCT 3D visualization and selection classes. See also *Viewer2D* OCCT sample application, which shows how 2D drawing can be implemented using TKV3d API.
Please refer to the Visualization User's Guide for further details concerning OCCT 3D visualization and selection classes. See also *Viewer2D* OCCT sample application, which shows how 2D drawing can be implemented using TKV3d API.
* Run-time graphic driver library loading mechanism based on *CSF_GraphicShr* environment variable usage has been replaced by explicit linking against *TKOpenGl* library. The code sample below shows how the graphic driver should be created and initialized in the application code:
~~~~
// initialize a new viewer with OpenGl graphic driver
@@ -161,10 +161,10 @@ Porting of user applications from an earlier OCCT version to version 6.7.0 requi
@subsection upgrade_670_clipping Object-level clipping and capping algorithm.
* It might be necessary to revise and port code related to management of view-level clipping to use *Graphic3d_ClipPlane* instead of *V3d_Plane* instances. Note that *V3d_Plane* class has been preserved -- as previously, it can be used as plane representation. Another approach to represent *Graphic3d_ClipPlane* in a view is to use custom presentable object.
* The list of arguments of *Select3D_SensitiveEntity::Matches()* method for picking detection has changed. Since now, for correct selection clipping, the implementations should perform a depth clipping check and return (as output argument) minimum depth value found at the detected part of sensitive. Refer to CDL / Doxygen documentation to find descriptive hints and snippets.
* It might be necessary to revise and port code related to management of view-level clipping to use *Graphic3d_ClipPlane* instead of *V3d_Plane* instances. Please note that *V3d_Plane* class has been preserved -- as previously, it can be used as plane representation. Another approach to represent *Graphic3d_ClipPlane* in a view is to use custom presentable object.
* The list of arguments of *Select3D_SensitiveEntity::Matches()* method for picking detection has changed. Since now, for correct selection clipping, the implementations should perform a depth clipping check and return (as output argument) minimum depth value found at the detected part of sensitive. Please refer to CDL / Doxygen documentation to find descriptive hints and snippets.
* *Select3D_SensitiveEntity::ComputeDepth()* abstract method has been removed. Custom implementations should provide depth checks by method *Matches()* instead -- all data required for it is available within a scope of single method.
* It might be necessary to revise the code of custom sensitive entities and port *Matches()* and *ComputeDepth()* methods to ensure proper selection clipping. Note that obsolete signature of *Matches* is not used anymore by the selector. If your class inheriting *Select3D_SensitiveEntity* redefines the method with old signature the code should not compile as the return type has been changed. This is done to prevent override of removed methods.
* It might be necessary to revise the code of custom sensitive entities and port *Matches()* and *ComputeDepth()* methods to ensure proper selection clipping. Please note that obsolete signature of *Matches* is not used anymore by the selector. If your class inheriting *Select3D_SensitiveEntity* redefines the method with old signature the code should not compile as the return type has been changed. This is done to prevent override of removed methods.
@subsection upgrade_670_markers Redesign of markers presentation
@@ -210,7 +210,7 @@ If *ViewMapping* and *ViewOrientation* were used directly, this functionality ha
The current perspective model is not fully backward compatible, so the old perspective-related functionality needs to be reviewed.
Revise application-specific custom presentations to provide a proper bounding box, otherwise the object might become erroneously clipped by automatic *ZFit* or frustum culling algorithms enabled by default.
Please revise application-specific custom presentations to provide proper bounding box. Otherwise object might become erroneously clipped by automatic *ZFit* or frustum culling algorithms enabled by default.
@subsection upgrade_680_connected_objects Redesign of Connected Interactive Objects
@@ -987,11 +987,11 @@ The applications that use *gp_Quaternion* to convert Yaw-Pitch-Roll angles (or o
@subsection upgrade_zoom_persistent_selection Zoom Persistent Selection
Zoom persistent selection introduces a new structure *Graphic3d_TransformPers* to transform persistence methods and parameters and a new class *Graphic3d_WorldViewProjState* to refer to the camera transformation state. You might need to update your code to deal with the new classes if you were using the related features. Keep in mind the following:
Zoom persistent selection introduces a new structure *Graphic3d_TransformPers* to transform persistence methods and parameters and a new class *Graphic3d_WorldViewProjState* to refer to the camera transformation state. You might need to update your code to deal with the new classes if you were using the related features. Please, keep in mind the following:
* *Graphic3d_Camera::ModelViewState* has been renamed to *Graphic3d_Camera::WorldViewState*.
* Transformation matrix utilities from *OpenGl_Utils* namespace have been moved to *Graphic3d_TransformUtils* and *Graphic3d_TransformUtils.hxx* header respectively.
* Matrix stack utilities from *OpenGl_Utils* namespace have been moved to *OpenGl_MatrixStack* class and *OpenGl_MatrixStack.hxx* header respectively.
* *OpenGl_View* methods *Begin/EndTransformPersistence* have been removed. Use *Graphic3d_TransformPers::Apply()* instead to apply persistence to perspective and world-view projection matrices.
* *OpenGl_View* methods *Begin/EndTransformPersistence* have been removed. Please, use *Graphic3d_TransformPers::Apply()* instead to apply persistence to perspective and world-view projection matrices.
@subsection upgrade_occt700_correction_of_texture Texture mapping of objects
@@ -1091,7 +1091,7 @@ The following environment variables have become redundant:
* *CSF_UnitsLexicon* and *CSF_UnitsDefinition* are no more used. Units definition (*UnitsAPI/Lexi_Expr.dat* and *UnitsAPI/Units.dat*) is now embedded into source code.
* *CSF_XSMessage* and *CSF_XHMessage* are now optional.
English messages (XSMessage/\*XSTEP.us* and SHMessage/\*SHAPE.us*) are now embedded into source code
English messages (XSMessage/*XSTEP.us* and SHMessage/*SHAPE.us*) are now embedded into source code
and automatically loaded when environment variables are not set.
* *CSF_ShadersDirectory* is not required any more, though it still can be used to load custom shaders.
Mandatory GLSL resources are now embedded into source code.
@@ -1124,7 +1124,7 @@ The following classes have been changed:
* *BRepTools_Modifier* class now has two modes of work. They are defined by the boolean parameter *MutableInput*, which is turned off by default. This means that the algorithm always makes a copy of a sub-shape (e.g. vertex) if its tolerance is to be increased in the output shape. The old mode corresponds to *MutableInput* turned on. This change may impact an application if it implements a class derived from *BRepTools_Modifier*.
* The second parameter *theIsOuterWire* of method *ShapeAnalysis_Wire::CheckSmallArea* has been removed.
* In class *GeomPlate_CurveConstraint*, two constructors taking boundary curves of different types have been replaced with one constructor taking the curve of an abstract type.
* The last optional argument *RemoveInvalidFaces* has been removed from the constructor of class *BRepOffset_MakeOffset* and method *Initialize*.
* The last optional argument *RemoveInvalidFaces* has been removed from the constructor of class *BRepOffset_MakeOffset* and method *Initialize*.
* The public method *BOPDS_DS::VerticesOnIn* has been renamed into *SubShapesOnIn* and the new output parameter *theCommonPB* has been added.
@section upgrade_occt720 Upgrade to OCCT 7.2.0
@@ -1546,8 +1546,6 @@ Since the new version, the method *BRepAdaptor_CompCurve::IsPeriodic()* will alw
@subsection upgrade_730_removed Removed features
* The methods *SetDeflection*, *SetEpsilonT*, *SetDiscretize* of the class *IntTools_EdgeFace* have been removed as redundant.
* Deprecated functionality *V3d_View::Export()*, related enumerations Graphic3d_ExportFormat, Graphic3d_SortType
as well as optional dependency from gl2ps library have been removed.
@subsection upgrade_730_BuilderSolid Boolean Operations - Solid Builder algorithm
@@ -1578,110 +1576,3 @@ Class *Message_PrinterOStream* can be used instead of *CDM_COutMessageDriver* to
If custom driver class is used in the application, that class shall be reimplemented inheriting from *Message_Printer* instead of *CDM_MessageDriver*.
Method *Send()* should be redefined instead of method *Write()* of *CDM_MessageDriver*.
To use the custom printer in OCAF, it can be either added to default messenger or set into the custom *Message_Messenger* object created in the method *MessageDriver()* of a class inheriting *CDF_Application*.
@section upgrade_occt740 Upgrade to OCCT 7.4.0
@subsection upgrade_740_BRepPrimAPI_MakeRevol Changes in BRepPrimAPI_MakeRevol algorithm
Previously the algorithm could create a shape with the same degenerated edge shared between some faces. Now it is prevented. The algorithm creates the different copy of this edge for each face. The method *Generated(...)* has been changed in order to apply restriction to the input shape: input shape can be only of type VERTEX, EDGE, FACE or SOLID. For input shape of another type the method always returns empty list.
@subsection upgrade_740_extremaalgo Changes in behavior of Extrema algorithms
Since OCCT 7.4.0 exception is thrown on the attempt of taking points in case of infinite number of solution (IsParallel status). Request of distances is available as before. Method NbExt() always returns 1 in such cases.
@subsection upgrade_740_removed Removed features
* The following methods of the class *BRepAlgoAPI_BooleanOperation* have been removed as obsolete or replaced:
- *BuilderCanWork* can be replaced with *IsDone* or *HasErrors* method.
- *FuseEdges* removed as obsolete.
- *RefineEdges* replaced with new method *SimplifyResult*.
* The method *ImagesResult* of the class *BOPAlgo_BuilderShape* has been removed as unused. The functionality of this method can be completely replaced by the history methods *Modified* and *IsDeleted*.
* The method *TrackHistory* of the classes *BOPAlgo_RemoveFeatures* and *BRepAlgoAPI_Defeaturing* has been renamed to *SetToFillHistory*.
* The method *GetHistory* of the class *BRepAlgoAPI_Defeaturing* has been renamed to *History*.
* The classes *BRepAlgo_BooleanOperations* and *BRepAlgo_DSAccess* have been removed as obsolete. Please use the BRepAlgoAPI_* classes to perform Boolean operations.
* *BRepAlgo_DataMapOfShapeBoolean* has been removed as unused.
* *BRepAlgo_DataMapOfShapeInterference* has been removed as unused.
* *BRepAlgo_EdgeConnector* has been removed as unused.
* *BRepAlgo_SequenceOfSequenceOfInteger* has been removed as unused.
@subsection upgrade_740_localcontext Local Context removal
Previously deprecated Local Context functionality has been removed from AIS package,
so that related methods have been removed from AIS_InteractiveContext interface:
*HasOpenedContext()*, *HighestIndex()*, *LocalContext()*, *LocalSelector()*, *OpenLocalContext()*, *CloseLocalContext()*,
*IndexOfCurrentLocal()*, *CloseAllContexts()*, *ResetOriginalState()*, *ClearLocalContext()*, *UseDisplayedObjects()*, *NotUseDisplayedObjects()*,
*SetShapeDecomposition()*, *SetTemporaryAttributes()*, *ActivateStandardMode()*, *DeactivateStandardMode()*, *KeepTemporary()*,
*SubIntensityOn()*, *SubIntensityOff()*, *ActivatedStandardModes()*, *IsInLocal()*, *AddOrRemoveSelected()* taking TopoDS_Shape.
A set of deprecated methods previously related to Local Context and now redirecting to other methods has been preserved to simplify porting; they will be removed in next release.
@subsection upgrade_740_geomconvert Changes in behavior of Convert algorithms
Now methods *GeomConvert::ConcatG1*, *GeomConvert::ConcatC1*, *Geom2dConvert::ConcatG1*, *Geom2dConvert::ConcatC1* modify the input argument representing the flag of closedness.
@subsection upgrade_740_selection Changes in selection API and picked point calculation algorithm.
*SelectBasics_PickResult* structure has been extended, so that it now defines a 3D point on the detected entity in addition to Depth value along picking ray.
*SelectMgr_SelectingVolumeManager::Overlap()* methods have been corrected to fill in *SelectBasics_PickResult* structure (depth and 3D point) instead of only depth value, so that custom *Select3D_SensitiveEntity* implementation should be updated accordingly (including *Select3D_SensitiveSet* subclasses).
@subsection upgrade_740_ocafpersistence Document format version management improvement.
Previously Document format version restored by *DocumentRetrievalDriver* was propagated using static methods of the corresponding units (like *MDataStd* or *MNaming*) to static variables of these units and after that became accessible to Drivers of these units.
Now Document format version is available to drivers via *RelocationTable*. The Relocation table now keeps *HeaderData* of the document and a format version can be extracted in the following way: *theRelocTable.GetHeaderData()->StorageVersion()*.
Obsolete methods: *static void SetDocumentVersion (const Standard_Integer DocVersion)* and *static Standard_Integer DocumentVersion()* have been removed from *BinMDataStd*, *BinMNaming*, *XmlMDataStd* and *XmlMNaming*.
@subsection upgrade_740_changed_api_of_brepmesh BRepMesh - revision of the data model
The entire structure of *BRepMesh* component has been revised and separated into several logically connected classes.
In new version, deflection is controlled more accurately, this may be necessary to tune parameters of call of the BRepMesh algorithm on the application side to obtain the same quality of presentation and/or performance as before.
*BRepMesh_FastDiscret* and *BRepMesh_FastDiscretFace* classes have been removed.
The following changes have been introduced in the API of *BRepMesh_IncrementalMesh*, component entry point:
* Due to revised logic, *adaptiveMin* parameter of the constructor has been removed as meaningless;
* *BRepMesh_FastDiscret::Parameters* has been moved to a separate structure called *IMeshTools_Parameters*; the signatures of related methods have been changed correspondingly.
* Interface of *BRepMesh_Delaun* class has been changed.
Example of usage:
Case 1 (explicit parameters):
~~~~
#include <IMeshData_Status.hxx>
#include <IMeshTools_Parameters.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
Standard_Boolean meshing_explicit_parameters()
{
BRepMesh_IncrementalMesh aMesher (aShape, 0.1, Standard_False, 0.5, Standard_True);
const Standard_Integer aStatus = aMesher.GetStatusFlags();
return !aStatus;
}
Standard_Boolean meshing_new()
{
IMeshTools_Parameters aMeshParams;
aMeshParams.Deflection = 0.1;
aMeshParams.Angle = 0.5;
aMeshParams.Relative = Standard_False;
aMeshParams.InParallel = Standard_True;
aMeshParams.MinSize = Precision::Confusion();
aMeshParams.InternalVerticesMode = Standard_True;
aMeshParams.ControlSurfaceDeflection = Standard_True;
BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams);
const Standard_Integer aStatus = aMesher.GetStatusFlags();
return !aStatus;
}
~~~~
@subsection upgrade_740_chamfer Changes in API of Chamfer algorithms
Some public methods of the class BRepFilletAPI_MakeChamfer are released from excess arguments:
- method Add for symmetric chamfer now takes only 2 arguments: distance and edge;
- method GetDistAngle now takes only 3 arguments: index of contour, distance and angle.
@subsection upgrade_740_interiorstyles Interior styles
* *Aspect_IS_HOLLOW* is now an alias to *Aspect_IS_EMPTY* and does not implicitly enables drawing mesh edges anymore.
Specify Graphic3d_AspectFillArea3d::SetDrawEdges(true) with Graphic3d_AspectFillArea3d::SetInteriorStyle(Aspect_IS_EMPTY) to get previous behavior of Aspect_IS_HOLLOW style.
* *Aspect_IS_HIDDENLINE* does not implicitly enables drawing mesh edges anymore.
Specify Graphic3d_AspectFillArea3d::SetDrawEdges(true) with Graphic3d_AspectFillArea3d::SetInteriorStyle(Aspect_IS_HIDDENLINE) to get previous behavior of Aspect_IS_HIDDENLINE style.

View File

@@ -32,7 +32,7 @@ Open CASCADE Technology is free software; you can redistribute it and / or modif
@ref license_lgpl_21 "GNU Lesser General Public License (LGPL) version 2.1", with additional @ref occt_lgpl_exception "exception".
Note that LGPL imposes some obligations on the application linked with Open CASCADE Technology.
If you wish to use OCCT in a proprietary application, please pay a special attention to address the requirements of LGPL section 6.
If you wish to use OCCT in a proprietary application, please, pay special attention to address the requirements of LGPL section 6.
At minimum the following should be considered:
1. Add the notice visible to the users of your application clearly stating that Open CASCADE Technology is used in this application, and that they have rights in this regard according to LGPL.
Such notice can be added in About dialog box (this is mandatory if this box contains copyright statements) or a similar place and/or in the documentation.
@@ -55,7 +55,7 @@ disclaimer.
You are hereby informed that all software is a property of its respective authors and is protected by
international and domestic laws on intellectual property and trademarks.
Should you need further information, directly contact the authors.
Should you need further information, please directly contact the authors.
**CAS.CADE** and **Open CASCADE** are registered trademarks of
OPEN CASCADE S.A.S.
@@ -80,7 +80,7 @@ and, in case you need any further information, directly contact their authors.
**Qt** is a cross-platform application framework that is widely used for developing application software
with graphical user interface (GUI). Qt is free and open source software distributed under
the terms of the GNU Lesser General Public License. In OCCT Qt is used for programming samples.
If you need further information on Qt, refer to Qt Homepage (https://www.qt.io/)
If you need further information on Qt, please, refer to Qt Homepage (https://www.qt.io/)
**Tcl** is a high-level programming language. Tk is a graphical user interface (GUI) toolkit,
with buttons, menus, listboxes, scrollbars, and so on. Taken together Tcl and Tk provide a solution
@@ -88,7 +88,11 @@ to develop cross-platform graphical user interfaces with a native look and feel.
Scriptics Corp., Sun Microsystems, and other companies. However, Tcl/Tk is an open source, and
the copyright allows you to use, modify, and redistribute Tcl/Tk for any purpose, without an
explicit license agreement and without paying any license fees or royalties.
To use Tcl/Tk, refer to the Licensing Terms (https://www.tcl.tk/software/tcltk/license.html).
To use Tcl/Tk, please refer to the Licensing Terms (https://www.tcl.tk/software/tcltk/license.html).
**GL2PS** is developed by Christophe Geuzaine and others. It is optionally used by OCCT to
export content of OpenGL scene to vector graphics formats (PS, PDF, EMF, SVG).
The library is licensed under GL2PS license (http://www.geuz.org/gl2ps/COPYING.GL2PS).
**FreeType 2** is developed by Antoine Leca, David Turner, Werner Lemberg and others.
It is a software font engine that is designed to be small, efficient, highly customizable and
@@ -109,12 +113,12 @@ implementation of 3D viewer. OpenGL specification is developed by the
Khronos group, https://www.khronos.org/opengl/. OCCT code includes header
file *glext.h* obtained from Khronos web site.
**VTK** -- The **Visualization Toolkit (VTK)** is an open-source, freely available software system for 3D computer graphics, image processing and visualization. OCCT VIS component provides adaptation functionality for visualization of OCCT topological shapes by means of VTK library. If you need further information on VTK, refer to VTK Homepage http://www.vtk.org/.
**VTK** -- The **Visualization Toolkit (VTK)** is an open-source, freely available software system for 3D computer graphics, image processing and visualization. OCCT VIS component provides adaptation functionality for visualization of OCCT topological shapes by means of VTK library. If you need further information on VTK, please, refer to VTK Homepage http://www.vtk.org/.
**Doxygen** developed by Dimitri van Heesch is open source documentation system for
C++, C, Java, Objective-C, Python, IDL, PHP and C#. This product is used in Open CASCADE Technology
for automatic creation of Technical Documentation from C++ header files.
If you need further information on Doxygen, refer to https://www.stack.nl/~dimitri/doxygen/index.html.
If you need further information on Doxygen, please refer to https://www.stack.nl/~dimitri/doxygen/index.html.
**Graphviz** is open source graph visualization software developed by John Ellson, Emden Gansner, Yifan Hu and Arif Bilgin.
Graph visualization is representiation of structured information as diagrams of abstract graphs and networks.
@@ -222,6 +226,7 @@ for which OCCT is certified to work.
| Freetype (for text rendering) | FreeType 2.4.11-2.7.1 https://sourceforge.net/projects/freetype/files/ |
| FreeImage (optional, for support of common 2D graphic formats) | FreeImage 3.17.0+ https://sourceforge.net/projects/freeimage/files |
| FFmpeg (optional, for video recording) | FFmpeg 3.1+ https://www.ffmpeg.org/download.html |
| gl2ps (optional, for export contents of OCCT viewer to vector formats) | gl2ps-1.3.8+ http://geuz.org/gl2ps/ |
| Intel TBB (optional, for multithreaded algorithms) | TBB 4.x or 5.x https://www.threadingbuildingblocks.org/ |
| VTK (for VTK Integration Services | VTK 6.1+ http://www.vtk.org/download/ |
| Doxygen (optional for building documentation) | Doxygen 1.8.5+ https://www.stack.nl/~dimitri/doxygen/download.html |
@@ -396,7 +401,7 @@ the specified resource file and activates the commands implemented in the plug-i
The whole process of using the plug-in mechanism as well as the instructions for extending Test Harness is described in the @ref occt_user_guides__test_harness.
Draw Test Harness provides an environment for OCCT automated testing system.
Check its @ref occt_dev_guides__tests "Automated Testing System" for details.
Please, consult its @ref occt_dev_guides__tests "Automated Testing System" for details.
Remarks:

View File

@@ -16,6 +16,7 @@ WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = \\$file:\$line: \$text\
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.md *.dox
RECURSIVE = YES
@@ -55,6 +56,6 @@ USE_MATHJAX = YES
MATHJAX_FORMAT = HTML-CSS
# Define alias for inserting images in uniform way (both HTML and PDF)
ALIASES += figure{1}="\image html \1"
ALIASES += figure{2}="\image html \1 \2"
ALIASES += figure{3}="\image html \1 \2"
ALIASES += figure{1}="\image html \1 \n"
ALIASES += figure{2}="\image html \1 \2 \n"
ALIASES += figure{3}="\image html \1 \2 \n"

View File

@@ -16,6 +16,7 @@ WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = \\$file:\$line: \$text\
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.md *.dox
RECURSIVE = YES
@@ -48,6 +49,6 @@ LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
# Define alias for inserting images in uniform way (both HTML and PDF)
ALIASES += figure{1}="\image latex \1"
ALIASES += figure{2}="\image latex \1 \2"
ALIASES += figure{3}="\image latex \1 \2 width=\3"
ALIASES += figure{1}="\image latex \1 \n"
ALIASES += figure{2}="\image latex \1 \2 \n"
ALIASES += figure{3}="\image latex \1 \2 width=\3 \n"

View File

@@ -56,7 +56,7 @@ This module also provides a variety of general-purpose services, such as:
* Progress indication and user break interfaces, giving a possibility even for low-level algorithms to communicate with the user in a universal and convenient way;
* and many others...
See the details in @ref occt_user_guides__foundation_classes "Foundation Classes User's Guide"
Please, see the details in @ref occt_user_guides__foundation_classes "Foundation Classes User's Guide"
See also: our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
@@ -85,7 +85,7 @@ Topology defines relationships between simple geometric entities. A shape, whic
Complex shapes can be defined as assemblies of simpler entities.
See the details in @ref occt_user_guides__modeling_data "Modeling Data User's Guide"
Please, see the details in @ref occt_user_guides__modeling_data "Modeling Data User's Guide"
3D geometric models can be stored in OCCT native BREP format.
See @ref occt_user_guides__brep_wp "BREP Format Description White Paper" for details on the format.
@@ -147,7 +147,7 @@ See @ref occt_user_guides__boolean_operations "Boolean Operations" User's Guide
@figure{/technical_overview/images/0004.png}
See the details in @ref occt_user_guides__modeling_algos "Modeling Algorithms User's Guide".
Please, see the details in @ref occt_user_guides__modeling_algos "Modeling Algorithms User's Guide".
See also: our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
@@ -204,7 +204,7 @@ Here are just a few examples:
@figure{/technical_overview/images/0008.png, "Display of shape cross-section and dimensions"}
For more details, see @ref occt_user_guides__visualization "Visualization User's Guide".
For more details see @ref occt_user_guides__visualization "Visualization User's Guide".
The visualization of OCCT topological shapes by means of VTK library provided by VIS component is described in a separate @ref occt_user_guides__vis "VTK Integration Services" User's Guide.
@@ -263,7 +263,7 @@ Each sub-domain of Shape Healing has its own scope of functionality:
| Customization | Modifies the shape representation to fit specific needs. | The shape is not modified, only the mathematical form of its internal representation is changed. |
| Processing | Mechanism of shape modification via a user-editable resource file. | |
For more details, refer to @ref occt_user_guides__shape_healing "Shape Healing User's guide".
For more details refer to @ref occt_user_guides__shape_healing "Shape Healing User's guide".
See also: our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
@@ -285,7 +285,7 @@ OCAF differs from any other CAD framework in the organization of application dat
OCAF organizes and embeds these attributes in a document. OCAF documents, in their turn, are managed by an OCAF application.
For more details, see @ref occt_user_guides__ocaf "OCAF User's Guide".
For more details see @ref occt_user_guides__ocaf "OCAF User's Guide".
See also: our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
@@ -310,4 +310,4 @@ In addition, **Test Harness** provides commands to create and manipulate curves
You can add custom commands to test or demonstrate any new functionalities, which you develop.
For more details, see @ref occt_user_guides__test_harness "Draw Test Harness Manual".
For more details see @ref occt_user_guides__test_harness "Draw Test Harness Manual".

View File

@@ -797,7 +797,7 @@ The General Fuse algorithm has a set of options, which allow speeding-up the ope
* Usage of Oriented Bounding Boxes in the operation;
* History support.
For more detailed information on these options, see the @ref occt_algorithms_11a "Advanced options" section.
For more detailed information on these options please see the @ref occt_algorithms_11a "Advanced options" section.
@subsection occt_algorithms_7_3b Usage
@@ -900,7 +900,7 @@ bbuild result
@subsection occt_algorithms_7_3 Examples
Have a look at the examples to better understand the definitions.
Please, have a look at the examples, which can help to better understand the definitions.
@subsubsection occt_algorithms_7_3_1 Case 1: Three edges intersecting at a point
@@ -1891,21 +1891,6 @@ The input data for this step is as follows:
| 2.3 | Build solids <i>(SDi)</i> from *SFS*. | *BOPAlgo_BuilderSolid* |
| 2.4 | Add the solids <i>(SDi)</i> to the result | |
@subsection occt_algorithms_bop_on_opensolids Boolean operations on open solids
The Boolean operations on open solids are tricky enough that the standard approach of Boolean operations for building the result, based on the splits of solids does not work.
It happens because the algorithm for splitting solids (*BOPAlgo_BuilderSolid*) always tries to create the closed loops (shells) and make solids from them. But if the input solid is not closed, what can be expected from its splits?
For performing Boolean Operations on open solids another approach is used, which does not rely on the splits of the solids to be correct, but tries to select the splits of faces, which are necessary for the given type of operation.
The point here is that the type of Boolean operation clearly defines the states for the faces to be taken into result:
- For **COMMON** operation all the faces from the arguments located inside any solid of the opposite group must be taken;
- For **FUSE** operation all the faces from the arguments located outside of all solids of the opposite group must be taken;
- For **CUT** operation all the faces from the Objects located outside of all solids of the Tools and all faces from the Tools located inside any solid of the Objects must be taken;
- For **CUT21** operation all the faces from the Objects located inside any solid of the Tools and all faces from the Tools located outside of all solids of the Objects must be taken.
From the selected faces the result solids are built. Please note, that the result may contain as normal (closed) solids as the open ones.
Even with this approach, the correct result of Boolean operation on open solids cannot be always guaranteed.
This is explained by non-manifold nature of open solids: in some cases classification of a face depends on the point of the face chosen for classification.
@section occt_algorithms_10a Section Algorithm
@subsection occt_algorithms_10a_1 Arguments
@@ -2443,7 +2428,7 @@ A lot of failures of GFA algorithm can be caused by bugs in low-level algorithms
* The Projection Algorithm is used at the Intersection step. The purpose of Projection Algorithm is to compute 2D curves on surfaces. Wrong results here lead to incorrect or missing faces in the final GFA result.
* The Classification Algorithm is used at the Building step. The bugs in the Classification Algorithm lead to errors in selecting shape parts (edges, faces, solids) and ultimately to a wrong final GFA result.
The description below illustrates some known GFA limitations. It does not enumerate exhaustively all problems that can arise in practice. Please address cases of Algorithm failure to the OCCT Maintenance Service.
The description below illustrates some known GFA limitations. It does not enumerate exhaustively all problems that can arise in practice. Please, address cases of Algorithm failure to the OCCT Maintenance Service.
@subsection occt_algorithms_10_1 Arguments
@@ -2539,7 +2524,7 @@ Let us also consider a cylinder-based *Face 2* with radii *R=3000* and *H=6000*
@figure{/user_guides/boolean_operations/images/operations_image047.png,"P-Curves for Face 2",230}
Pay attention to the Zoom value of the Figures.
Please, pay attention to the Zoom value of the Figures.
It is obvious that starting with some value of *ScF*, e.g. *ScF>1000000*, all sloped p-Curves on *Face 2* will be almost vertical. At least, there will be no difference between the values of angles computed by standard C Run-Time Library functions, such as *double acos(double x)*. The loss of accuracy in computation of angles can cause failure of some BP sub-algorithms, such as building faces from a set of edges or building solids from a set of faces.
@@ -3085,50 +3070,6 @@ generated gf2 com_hist f2
~~~~
@section occt_algorithms_simplification BOP result simplification
The API algorithms implementing Boolean Operations provide possibility to simplify the result shape by unification of the connected tangential edges and faces.
This simplification is performed by the method *SimplifyResult* which is implemented in the class *BRepAlgoAPI_BuilderAlgo* (General Fuse operation).
It makes it available for users of the classes *BRepAlgoAPI_BooleanOperation* (all Boolean Operations) and *BRepAlgoAPI_Splitter* (split operation).
The simplification is performed by the means of *ShapeUpgrade_UnifySameDom* algorithm. The result of operation is overwritten with the simplified result.
The simplification is performed without creation of the Internal shapes, i.e. shapes connections will never be broken. It is performed on the whole result shape.
Thus, if the input shapes contained connected tangent edges or faces unmodified during the operation they will also be unified.
History of the simplification is merged into the main history of operation, thus it will be accounted when asking for Modified, Generated and Deleted shapes.
Some options of the main operation are passed into the Unifier:
- Fuzzy tolerance of the operation is given to the Unifier as the linear tolerance.
- Non destructive mode here controls the safe input mode in Unifier.
For controlling this possibility in DRAW the command **bsimplify** has been implemented. See the @ref occt_draw_bop_options "Boolean Operations options" chapter in draw user guide.
@subsection occt_algorithms_simplification_examples Examples
Here is the simple example of simplification of the result of Fuse operation of two boxes:
~~~~
bsimplify -f 1
box b1 10 10 15
box b2 3 7 0 10 10 15
bclearobjects
bcleartools
baddobjects b1
baddtools b2
bfillds
bapibop r 1
~~~~
<table align="center">
<tr>
<td>@figure{/user_guides/boolean_operations/images/bop_simple_001.png, "Not simplified result", 420}</td>
<td>@figure{/user_guides/boolean_operations/images/bop_simple_002.png, "Simplified result", 420}</td>
</tr>
</table>
@section occt_algorithms_11b Usage

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1682,7 +1682,7 @@ All these functions are provided by geometric processor package <i> gp</i>. Its
The *gp* package defines the basic geometric entities used for algebraic calculation and basic analytical geometry in 2d & 3d space. It also provides basic transformations such as identity, rotation, translation, mirroring, scale transformations, combinations of transformations, etc. Entities are handled by value.
Note that <i> gp</i> curves and surfaces are analytic: there is no parameterization and no orientation on <i>gp</i> entities, i.e. these entities do not provide functions which work with these properties.
Please, note that <i> gp</i> curves and surfaces are analytic: there is no parameterization and no orientation on <i>gp</i> entities, i.e. these entities do not provide functions which work with these properties.
If you need, you may use more evolved data structures provided by <i> Geom</i> (in 3D space) and <i> Geom2d</i> (in the plane). However, the definition of <i> gp</i> entities is identical to the one of equivalent <i> Geom</i> and <i> Geom2d</i> entities, and they are located in the plane or in space with the same kind of positioning systems. They implicitly contain the orientation, which they express on the <i> Geom </i> and <i> Geom2d </i> entities, and they induce the definition of their parameterization.

View File

@@ -9,7 +9,7 @@ The IGES interface reads IGES files and translates them to Open CASCADE Technolo
Other kinds of data such as colors and names can be read or written with the help of XDE tools <i> IGESCAFControl_Reader</i> and <i> IGESCAFControl_Writer</i>.
**Note** :
Please, note:
* an IGES model is an IGES file that has been loaded into memory.
* an IGES entity is an entity in the IGES normal sense.
@@ -178,10 +178,10 @@ if (!Interface_Static::SetRVal ("read.maxprecision.val",0.1))
Default value is 1.
<h4>read.stdsameparameter.mode</h4>
defines the using of *BRepLib\::SameParameter*. Its possible values are:
* 0 (Off) -- *BRepLib\::SameParameter* is not called,
* 1 (On) -- *BRepLib\::SameParameter* is called.
*BRepLib\::SameParameter* is used through *ShapeFix_Edge\::SameParameter*. It ensures that the resulting edge will have the lowest tolerance taking pcurves either unmodified from the IGES file or modified by *BRepLib\::SameParameter*.
defines the using of *BRepLib::SameParameter*. Its possible values are:
* 0 (Off) -- *BRepLib::SameParameter* is not called,
* 1 (On) -- *BRepLib::SameParameter* is called.
*BRepLib::SameParameter* is used through *ShapeFix_Edge::SameParameter*. It ensures that the resulting edge will have the lowest tolerance taking pcurves either unmodified from the IGES file or modified by *BRepLib::SameParameter*.
Read this parameter with:
~~~~~
Standard_Integer mv = Interface_Static::IVal("read.stdsameparameter.mode");
@@ -202,7 +202,7 @@ The processor also decides to re-compute either the 3D or the 2D curve even if
* the number of sub-curves in the 2D curve is different from the number of sub-curves in the 3D curve. This can be either due to different numbers of sub-curves given in the IGES file or because of splitting of curves during translation.
* 3D or 2D curve is a Circular Arc (entity type 100) starting and ending in the same point (note that this case is incorrect according to the IGES standard).
The parameter *read.surfacecurve.mode* defines which curve (3D or 2D) is used for re-computing the other one:
The parameter *read.surfacecurve.mode* defines which curve (3D or 2D) is used for re-computing the other one:
* *Default(0)* use the preference flag value in the entity's Parameter Data section. The flag values are:
* 0: no preference given,
* 1: use 2D for 142 entities and 3D for 141 entities,
@@ -251,7 +251,7 @@ Default value is 0.01.
<h4>read.iges.bspline.approxd1.mode</h4>
This parameter is obsolete (it is rarely used in real practice). If set to True, it affects the translation of bspline curves of degree 1 from IGES: these curves (which geometrically are polylines) are split by duplicated points, and the translator attempts to convert each of the obtained parts to a bspline of a higher continuity.
Read this parameter with:
Read this parameter with:
~~~~~
Standard_Real bam = Interface_Static::CVal("read.iges.bspline.approxd1.mode");
~~~~~
@@ -266,9 +266,9 @@ Default value is Off.
<h4>read.iges.resource.name and read.iges.sequence</h4>
These two parameters define the name of the resource file and the name of the sequence of operators (defined in that file) for Shape Processing, which is automatically performed by the IGES translator. The Shape Processing is a user-configurable step, which is performed after the translation and consists in application of a set of operators to a resulting shape. This is a very powerful tool allowing to customize the shape and to adapt it to the needs of a receiving application. By default, the sequence consists of a single operator *ShapeFix* that calls Shape Healing from the IGES translator.
Find an example of the resource file for IGES (which defines parameters corresponding to the sequence applied by default, i.e. if the resource file is not found) in the Open CASCADE Technology sources by the path <i>%CASROOT%/src/XSTEPResource/IGES</i>.
Please find an example of the resource file for IGES (which defines parameters corresponding to the sequence applied by default, i.e. if the resource file is not found) in the Open CASCADE Technology installation, by the path <i>%CASROOT%/src/XSTEPResource/IGES</i> .
IGES translator will use that file if you define the environment variable *CSF_IGESDefaults*, which should point to the directory where the resource file resides. Note that if you change parameter *read.iges.resource.name*, you should change the name of the resource file and the name of the environment variable correspondingly. The variable should contain a path to the resource file.
In order for the IGES translator to use that file, you have to define the environment variable *CSF_IGESDefaults*, which should point to the directory where the resource file resides. Note that if you change parameter *read.iges.resource.name*, you should change the name of the resource file and the name of the environment variable correspondingly. The variable should contain a path to the resource file.
Default values:
* read.iges.resource.name -- IGES,
@@ -286,7 +286,7 @@ A list of entities can be formed by invoking the method *IGESControl_Reader::Gi
Handle(TColStd_HSequenceOfTransient) list = reader.GiveList();
~~~~~
Several predefined operators can be used to select a list of entities of a specific type.
To make a selection, use the method *IGESControl_Reader::GiveList* with the selection type in quotation marks as an argument. You can also make cumulative selections. For example, you would use the following syntax:
To make a selection, you use the method *IGESControl_Reader::GiveList* with the selection type in quotation marks as an argument. You can also make cumulative selections. For example, you would use the following syntax:
1. Requesting the faces in the file:
~~~~~
faces = Reader.GiveList("iges-faces");
@@ -400,12 +400,12 @@ reader.PrintTransferInfo (failsonly, mode);
~~~~~
displays the messages that appeared during the last invocation of *Transfer* or *TransferRoots*.
If *failsonly* is *IFSelect_FailOnly*, only fail messages will be output, if it is *IFSelect_FailAndWarn*, all messages will be output. Parameter “mode” can have *IFSelect_xxx* values where *xxx* can be:
* *GeneralCount* -- gives general statistics on the transfer (number of translated IGES entities, number of fails and warnings, etc)
* *CountByItem* -- gives the number of IGES entities with their types per message.
* *ListByItem* -- gives the number of IGES entities with their type and DE numbers per message.
* *ResultCount* -- gives the number of resulting OCCT shapes per type.
* *Mapping* -- gives mapping between roots of the IGES file and the resulting OCCT shape per IGES and OCCT type.
If *failsonly* is *IFSelect_FailOnly*, only fail messages will be output, if it is *IFSelect_FailAndWarn*, all messages will be output. Parameter “mode” can have *IFSelect_xxx* values where *xxx* can be:
* *GeneralCount* -- gives general statistics on the transfer (number of translated IGES entities, number of fails and warnings, etc)
* *CountByItem* -- gives the number of IGES entities with their types per message.
* *ListByItem* -- gives the number of IGES entities with their type and DE numbers per message.
* *ResultCount* -- gives the number of resulting OCCT shapes per type.
* *Mapping* -- gives mapping between roots of the IGES file and the resulting OCCT shape per IGES and OCCT type.
@subsection occt_iges_2_4 Mapping of IGES entities to Open CASCADE Technology shapes
@@ -577,7 +577,7 @@ All methods are in charge of transferring curves from IGES curve entities <i>(
* *IGESToBRep_TopoCurve::TransferPoint* -- vertex is constructed from a Point entity with tolerance *EpsGeom*UnitFactor*.
* *IGESToBRep_TopoCurve::Transfer2dPoint* -- vertex is constructed from a Point entity with tolerance *EpsCoeff*.
* *IGESToBRep_TopoCurve::TransferCompositeCurveGeneral* -- obtains shapes (edges or wires) from other methods and adds them into the resulting wire. Two adjacent edges of the wire can be connected with tolerance up to *MaxTol*.
* *IGESToBRep_TopoCurve::TransferCurveOnFace* and *IGESToBRep_TopoCurve::TransferBoundaryOnFace* build a wire from 3D and 2D representations of a curve on surface. Edges and vertices of the wire cannot have tolerance larger than *MaxTol*. The value *EpsGeom*UnitFactor* is passed into *ShapeFix_Wire::SetPrecision* and *MaxTol* is passed into *ShapeFix_Wire::MaxTolerance*. To find out how these parameters affect the resulting tolerance changes, refer to class *ShapeFix_Wire*.
* *IGESToBRep_TopoCurve::TransferCurveOnFace* and *IGESToBRep_TopoCurve::TransferBoundaryOnFace* build a wire from 3D and 2D representations of a curve on surface. Edges and vertices of the wire cannot have tolerance larger than *MaxTol*. The value *EpsGeom*UnitFactor* is passed into *ShapeFix_Wire::SetPrecision* and *MaxTol* is passed into *ShapeFix_Wire::MaxTolerance*. To find out how these parameters affect the resulting tolerance changes, please, refer to class *ShapeFix_Wire*.
* *IGESToBRep_TopoCurve::TransferTopoBasicCurve* and *IGESToBRep_TopoCurve::Transfer2dTopoBasicCurve* -- the boundary vertices of an edge (or a wire if a curve was of C0 continuity) translated from a basis IGES curve (*BSplineCurve, CopiousData, Line,* etc.) are built with tolerance *EpsGeom*UnitFactor*, the edge tolerance is *Precision::Confusion*. If a curve was divided into several edges, the common vertices of such adjacent edges have tolerance *Precision::Confusion*.
@@ -710,7 +710,7 @@ if (!Interface_Static::SetRVal(;write.precision.val;,0.01))
~~~~~
Default value is 0.0001.
<h4>write.iges.resource.name</h4> and <h4>write.iges.sequence</h4> are the same as the corresponding read.iges.\* parameters. Note that the default sequence for writing contains *DirectFaces* operator, which converts elementary surfaces based on left-hand axes (valid in CASCADE) to right-hand axes (which are valid only in IGES).
<h4>write.iges.resource.name</h4> and <h4>write.iges.sequence</h4> are the same as the corresponding read.iges.\* parameters, please, see above. Note that the default sequence for writing contains *DirectFaces* operator, which converts elementary surfaces based on left-hand axes (valid in CASCADE) to right-hand axes (which are valid only in IGES).
Default values :
~~~~~

View File

@@ -30,10 +30,10 @@ Each of the listed plugins is embedded in the common framework, thus it is possi
There are two launch modes:
1. Launch **TInspectorEXE** executable sample. For more details see @ref occt_inspector_4_1 "TInspectorEXE" section;
2. Launch DRAW, load plugin INSPECTOR, and use *tinspector* command.
For more details, see @ref occt_inspector_4_2 "Launch in DRAW Test Harness" section.
For more details see @ref occt_inspector_4_2 "Launch in DRAW Test Harness" section.
**Note**. If you have no Inspector library in your build directory, make sure that OCCT is compiled with *BUILD_Inspector*
Note. If you have no Inspector library in your build directory, please, make sure that OCCT is compiled with *BUILD_Inspector*
option ON. For more details see @ref occt_inspector_5 "Build procedure".
@@ -290,7 +290,7 @@ Selection controls switch on/off the possibility to set selection in the context
| Select Presentations | *AIS_InteractiveObject* | Calls *AddOrRemoveSelected* of interactive object for the selected item. |
| Select Owners | *SelectMgr_EntityOwner* or <br> *SelectMgr_SensitiveEntity* | Calls *AddOrRemoveSelected* of *SelectMgr_EntityOwner* for the selected item. |
Note that the initial selection in the context will be cleared.
Please, note that the initial selection in the context will be cleared.
If the button is toggled, the button selection is active. Only one button may be toggled at the moment.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 44 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -1,715 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-dasharray="none" shape-rendering="auto" font-family="'Dialog'" width="1032" text-rendering="auto" fill-opacity="1" contentScriptType="text/ecmascript" color-interpolation="auto" color-rendering="auto" preserveAspectRatio="xMidYMid meet" font-size="12" viewBox="0 0 1032 595" fill="black" stroke="black" image-rendering="auto" stroke-miterlimit="10" zoomAndPan="magnify" version="1.0" stroke-linecap="square" stroke-linejoin="miter" contentStyleType="text/css" font-style="normal" height="595" stroke-width="1" stroke-dashoffset="0" font-weight="normal" stroke-opacity="1">
<!--Generated by the Batik Graphics2D SVG Generator-->
<defs id="genericDefs"/>
<g>
<defs id="defs1">
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M131 9 L316 9 L316 206 L131 206 L131 9 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M131 9 L314 9 L314 204 L131 204 L131 9 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
<path d="M146 14 L299 14 L299 32 L146 32 L146 14 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
<path d="M146 14 L302 14 L302 32 L146 32 L146 14 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
<path d="M136 37 L256 37 L256 55 L136 55 L136 37 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
<path d="M136 37 L258 37 L258 55 L136 55 L136 37 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath7">
<path d="M136 53 L233 53 L233 71 L136 71 L136 53 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath8">
<path d="M136 53 L235 53 L235 71 L136 71 L136 53 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath9">
<path d="M136 69 L243 69 L243 87 L136 87 L136 69 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath10">
<path d="M136 69 L245 69 L245 87 L136 87 L136 69 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath11">
<path d="M136 85 L264 85 L264 103 L136 103 L136 85 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath12">
<path d="M136 85 L266 85 L266 103 L136 103 L136 85 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath13">
<path d="M136 101 L271 101 L271 119 L136 119 L136 101 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath14">
<path d="M136 101 L273 101 L273 119 L136 119 L136 101 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath15">
<path d="M136 117 L276 117 L276 145 L136 145 L136 117 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath16">
<path d="M136 117 L278 117 L278 145 L136 145 L136 117 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath17">
<path d="M136 143 L296 143 L296 171 L136 171 L136 143 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18">
<path d="M136 143 L298 143 L298 171 L136 171 L136 143 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath19">
<path d="M136 169 L286 169 L286 187 L136 187 L136 169 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath20">
<path d="M136 169 L288 169 L288 187 L136 187 L136 169 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath21">
<path d="M132 35 L313 35 L313 203 L132 203 L132 35 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath22">
<path d="M455 44 L745 44 L745 565 L455 565 L455 44 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath23">
<path d="M455 44 L743 44 L743 563 L455 563 L455 44 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath24">
<path d="M532 49 L666 49 L666 67 L532 67 L532 49 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath25">
<path d="M532 49 L669 49 L669 67 L532 67 L532 49 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath26">
<path d="M460 72 L694 72 L694 90 L460 90 L460 72 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath27">
<path d="M460 72 L696 72 L696 90 L460 90 L460 72 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath28">
<path d="M460 88 L552 88 L552 106 L460 106 L460 88 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath29">
<path d="M460 88 L554 88 L554 106 L460 106 L460 88 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath30">
<path d="M460 104 L722 104 L722 122 L460 122 L460 104 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath31">
<path d="M460 104 L724 104 L724 122 L460 122 L460 104 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath32">
<path d="M460 120 L700 120 L700 138 L460 138 L460 120 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath33">
<path d="M460 120 L702 120 L702 138 L460 138 L460 120 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath34">
<path d="M460 136 L705 136 L705 154 L460 154 L460 136 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath35">
<path d="M460 136 L707 136 L707 154 L460 154 L460 136 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath36">
<path d="M460 152 L704 152 L704 170 L460 170 L460 152 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath37">
<path d="M460 152 L706 152 L706 170 L460 170 L460 152 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath38">
<path d="M460 168 L697 168 L697 186 L460 186 L460 168 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath39">
<path d="M460 168 L699 168 L699 186 L460 186 L460 168 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath40">
<path d="M460 184 L710 184 L710 202 L460 202 L460 184 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath41">
<path d="M460 184 L712 184 L712 202 L460 202 L460 184 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath42">
<path d="M460 200 L561 200 L561 218 L460 218 L460 200 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath43">
<path d="M460 200 L563 200 L563 218 L460 218 L460 200 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath44">
<path d="M460 216 L583 216 L583 234 L460 234 L460 216 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath45">
<path d="M460 216 L585 216 L585 234 L460 234 L460 216 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath46">
<path d="M460 232 L547 232 L547 250 L460 250 L460 232 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath47">
<path d="M460 232 L549 232 L549 250 L460 250 L460 232 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath48">
<path d="M460 248 L538 248 L538 266 L460 266 L460 248 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath49">
<path d="M460 248 L540 248 L540 266 L460 266 L460 248 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath50">
<path d="M460 264 L567 264 L567 282 L460 282 L460 264 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath51">
<path d="M460 264 L569 264 L569 282 L460 282 L460 264 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath52">
<path d="M460 280 L543 280 L543 298 L460 298 L460 280 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath53">
<path d="M460 280 L545 280 L545 298 L460 298 L460 280 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath54">
<path d="M460 296 L574 296 L574 314 L460 314 L460 296 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath55">
<path d="M460 296 L576 296 L576 314 L460 314 L460 296 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath56">
<path d="M460 312 L564 312 L564 330 L460 330 L460 312 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath57">
<path d="M460 312 L566 312 L566 330 L460 330 L460 312 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath58">
<path d="M460 328 L580 328 L580 346 L460 346 L460 328 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath59">
<path d="M460 328 L582 328 L582 346 L460 346 L460 328 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath60">
<path d="M460 344 L573 344 L573 362 L460 362 L460 344 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath61">
<path d="M460 344 L575 344 L575 362 L460 362 L460 344 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath62">
<path d="M460 360 L575 360 L575 378 L460 378 L460 360 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath63">
<path d="M460 360 L577 360 L577 378 L460 378 L460 360 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath64">
<path d="M460 376 L564 376 L564 394 L460 394 L460 376 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath65">
<path d="M460 376 L566 376 L566 394 L460 394 L460 376 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath66">
<path d="M460 392 L566 392 L566 410 L460 410 L460 392 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath67">
<path d="M460 392 L568 392 L568 410 L460 410 L460 392 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath68">
<path d="M460 408 L569 408 L569 426 L460 426 L460 408 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath69">
<path d="M460 408 L571 408 L571 426 L460 426 L460 408 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath70">
<path d="M460 424 L571 424 L571 442 L460 442 L460 424 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath71">
<path d="M460 424 L573 424 L573 442 L460 442 L460 424 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath72">
<path d="M460 440 L568 440 L568 458 L460 458 L460 440 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath73">
<path d="M460 440 L570 440 L570 458 L460 458 L460 440 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath74">
<path d="M460 456 L570 456 L570 474 L460 474 L460 456 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath75">
<path d="M460 456 L572 456 L572 474 L460 474 L460 456 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath76">
<path d="M460 472 L561 472 L561 490 L460 490 L460 472 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath77">
<path d="M460 472 L563 472 L563 490 L460 490 L460 472 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath78">
<path d="M460 488 L563 488 L563 506 L460 506 L460 488 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath79">
<path d="M460 488 L565 488 L565 506 L460 506 L460 488 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath80">
<path d="M460 504 L574 504 L574 522 L460 522 L460 504 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath81">
<path d="M460 504 L576 504 L576 522 L460 522 L460 504 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath82">
<path d="M460 520 L576 520 L576 538 L460 538 L460 520 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath83">
<path d="M460 520 L578 520 L578 538 L460 538 L460 520 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath84">
<path d="M460 536 L516 536 L516 554 L460 554 L460 536 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath85">
<path d="M460 536 L518 536 L518 554 L460 554 L460 536 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath86">
<path d="M456 70 L742 70 L742 562 L456 562 L456 70 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath87">
<path d="M131 225 L316 225 L316 315 L131 315 L131 225 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath88">
<path d="M131 225 L314 225 L314 313 L131 313 L131 225 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath89">
<path d="M140 230 L304 230 L304 248 L140 248 L140 230 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath90">
<path d="M140 230 L307 230 L307 248 L140 248 L140 230 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath91">
<path d="M136 253 L292 253 L292 281 L136 281 L136 253 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath92">
<path d="M136 253 L294 253 L294 281 L136 281 L136 253 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath93">
<path d="M132 251 L313 251 L313 312 L132 312 L132 251 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath94">
<path d="M131 333 L316 333 L316 423 L131 423 L131 333 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath95">
<path d="M131 333 L314 333 L314 421 L131 421 L131 333 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath96">
<path d="M148 338 L297 338 L297 356 L148 356 L148 338 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath97">
<path d="M148 338 L300 338 L300 356 L148 356 L148 338 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath98">
<path d="M136 361 L308 361 L308 389 L136 389 L136 361 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath99">
<path d="M136 361 L310 361 L310 389 L136 389 L136 361 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath100">
<path d="M132 359 L313 359 L313 420 L132 420 L132 359 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath101">
<path d="M131 441 L316 441 L316 586 L131 586 L131 441 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath102">
<path d="M131 441 L314 441 L314 584 L131 584 L131 441 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath103">
<path d="M162 446 L283 446 L283 464 L162 464 L162 446 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath104">
<path d="M162 446 L286 446 L286 464 L162 464 L162 446 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath105">
<path d="M136 469 L222 469 L222 487 L136 487 L136 469 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath106">
<path d="M136 469 L224 469 L224 487 L136 487 L136 469 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath107">
<path d="M136 485 L206 485 L206 503 L136 503 L136 485 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath108">
<path d="M136 485 L208 485 L208 503 L136 503 L136 485 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath109">
<path d="M136 501 L207 501 L207 519 L136 519 L136 501 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath110">
<path d="M136 501 L209 501 L209 519 L136 519 L136 501 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath111">
<path d="M136 517 L204 517 L204 535 L136 535 L136 517 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath112">
<path d="M136 517 L206 517 L206 535 L136 535 L136 517 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath113">
<path d="M136 533 L209 533 L209 551 L136 551 L136 533 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath114">
<path d="M136 533 L211 533 L211 551 L136 551 L136 533 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath115">
<path d="M136 549 L210 549 L210 567 L136 567 L136 549 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath116">
<path d="M136 549 L212 549 L212 567 L136 567 L136 549 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath117">
<path d="M136 565 L207 565 L207 583 L136 583 L136 565 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath118">
<path d="M136 565 L209 565 L209 583 L136 583 L136 565 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath119">
<path d="M132 467 L313 467 L313 583 L132 583 L132 467 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath120">
<path d="M851 105 L1023 105 L1023 207 L851 207 L851 105 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath121">
<path d="M851 105 L1021 105 L1021 205 L851 205 L851 105 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath122">
<path d="M856 110 L1015 110 L1015 128 L856 128 L856 110 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath123">
<path d="M856 110 L1018 110 L1018 128 L856 128 L856 110 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath124">
<path d="M856 133 L939 133 L939 151 L856 151 L856 133 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath125">
<path d="M856 133 L941 133 L941 151 L856 151 L856 133 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath126">
<path d="M856 149 L941 149 L941 167 L856 167 L856 149 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath127">
<path d="M856 149 L943 149 L943 167 L856 167 L856 149 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath128">
<path d="M856 165 L923 165 L923 183 L856 183 L856 165 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath129">
<path d="M856 165 L925 165 L925 183 L856 183 L856 165 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath130">
<path d="M852 131 L1020 131 L1020 204 L852 204 L852 131 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath131">
<path d="M-1 -1 L1033 -1 L1033 596 L-1 596 L-1 -1 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath132">
<path d="M58 177 L113 177 L113 192 L58 192 L58 177 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath133">
<path d="M124 128 L134 128 L134 137 L124 137 L124 128 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath134">
<path d="M22 211 L77 211 L77 226 L22 226 L22 211 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath135">
<path d="M124 86 L134 86 L134 95 L124 95 L124 86 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath136">
<path d="M22 436 L77 436 L77 451 L22 451 L22 436 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath137">
<path d="M124 510 L134 510 L134 519 L124 519 L124 510 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath138">
<path d="M363 129 L401 129 L401 144 L363 144 L363 129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath139">
<path d="M406 105 L460 105 L460 120 L406 120 L406 105 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath140">
<path d="M311 105 L384 105 L384 120 L311 120 L311 105 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath141">
<path d="M443 121 L458 121 L458 130 L443 130 L443 121 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath142">
<path d="M312 121 L322 121 L322 130 L312 130 L312 121 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath143">
<path d="M366 271 L404 271 L404 286 L366 286 L366 271 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath144">
<path d="M409 251 L463 251 L463 266 L409 266 L409 251 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath145">
<path d="M309 251 L362 251 L362 266 L309 266 L309 251 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath146">
<path d="M443 264 L458 264 L458 273 L443 273 L443 264 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath147">
<path d="M312 264 L322 264 L322 273 L312 273 L312 264 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath148">
<path d="M366 504 L404 504 L404 519 L366 519 L366 504 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath149">
<path d="M409 484 L463 484 L463 499 L409 499 L409 484 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath150">
<path d="M311 484 L359 484 L359 499 L311 499 L311 484 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath151">
<path d="M443 497 L458 497 L458 506 L443 506 L443 497 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath152">
<path d="M312 497 L322 497 L322 506 L312 506 L312 497 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath153">
<path d="M366 379 L404 379 L404 394 L366 394 L366 379 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath154">
<path d="M409 359 L463 359 L463 374 L409 374 L409 359 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath155">
<path d="M317 359 L356 359 L356 374 L317 374 L317 359 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath156">
<path d="M443 372 L458 372 L458 381 L443 381 L443 372 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath157">
<path d="M312 372 L322 372 L322 381 L312 381 L312 372 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath158">
<path d="M771 163 L826 163 L826 178 L771 178 L771 163 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath159">
<path d="M741 156 L751 156 L751 165 L741 165 L741 156 Z"/>
</clipPath>
</defs>
<g fill="rgb(131,122,133)" font-family="'Segoe UI'" stroke-linejoin="round" stroke="rgb(131,122,133)" font-weight="bold" stroke-width="0" stroke-miterlimit="0">
<rect x="133" y="11" clip-path="url(#clipPath1)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="193" stroke="none"/>
<rect x="134" y="12" clip-path="url(#clipPath1)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="193" stroke="none"/>
<rect x="132" y="10" clip-path="url(#clipPath2)" fill="white" width="181" rx="2.5" ry="2.5" height="193" stroke="none"/>
</g>
<g stroke-linecap="butt" fill="rgb(77,137,20)" font-family="'Segoe UI'" stroke="rgb(77,137,20)" font-weight="bold" stroke-width="1.1">
<rect x="132" y="10" clip-path="url(#clipPath2)" fill="none" width="180" rx="2.5" ry="2.5" height="192"/>
<image x="147" y="15" clip-path="url(#clipPath3)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABSUlEQVR42mNgGGjA&#13;&#10;CCIKFhz5/+DJJyj3PxAyQiQYkdggmf8IjYoyvAwTEmwYWUCc+48/MUxMswNrBhnC&#13;&#10;CNUB4QEN+c8INhtoHlSMgSF31kGwGrAB//7+Y+BgYwZrOXHjMYOFuhyDk2cB3La9&#13;&#10;O/rB9EmQnIYsxIh/EOcwwRSxMDOBNdc1r2FgYYE44dDuiWDs7FHIwAaUB8mB1IDU&#13;&#10;wgCcxcrMCFZweHUpkM0EFWOCs0GaQHJgC5gZMQ0ACTbVhjDYhnbDFbCwMCHYQBok&#13;&#10;B1LDiuQCFljwgmzwNFFhYAAqgDnR1C4bTJ8/Mg1MgzSD1ICM/AcNAxaI/n8MzExM&#13;&#10;4LDxMVMFK7h0bAYkBiAxCxbzNVODR8X//0gGgIB/w0ZopCFIWFQiJxpIygCyoXEN&#13;&#10;N2BphRdJKTCmcztqIJILwC5QURKGm0gsAOkZHAAAeQpotyJG88kAAAAASUVORK5C&#13;&#10;YII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="166" y="28" clip-path="url(#clipPath4)" fill="black" stroke="none" xml:space="preserve">IMeshTools_Parameters</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="137" y="38" clip-path="url(#clipPath5)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="51" clip-path="url(#clipPath6)" stroke="none">Deflection : Real [1]</text>
<image x="137" y="54" clip-path="url(#clipPath7)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="67" clip-path="url(#clipPath8)" stroke="none">Angle : Real [1]</text>
<image x="137" y="70" clip-path="url(#clipPath9)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="83" clip-path="url(#clipPath10)" stroke="none">MinSize : Real [1]</text>
<image x="137" y="86" clip-path="url(#clipPath11)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="99" clip-path="url(#clipPath12)" stroke="none">Relative : Boolean [1]</text>
<image x="137" y="102" clip-path="url(#clipPath13)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="115" clip-path="url(#clipPath14)" stroke="none">InParallel : Boolean [1]</text>
<image x="137" y="123" clip-path="url(#clipPath15)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="130" clip-path="url(#clipPath16)" stroke="none">InternalVerticesMode : </text>
<text xml:space="preserve" x="156" y="143" clip-path="url(#clipPath16)" stroke="none">Boolean [1]</text>
<image x="137" y="149" clip-path="url(#clipPath17)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="156" clip-path="url(#clipPath18)" stroke="none">ControlSurfaceDeflection : </text>
<text xml:space="preserve" x="156" y="169" clip-path="url(#clipPath18)" stroke="none">Boolean [1]</text>
<image x="137" y="170" clip-path="url(#clipPath19)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="183" clip-path="url(#clipPath20)" stroke="none">CleanModel : Boolean [1]</text>
</g>
<g stroke-linecap="butt" fill="rgb(77,137,20)" font-family="'Segoe UI'" stroke="rgb(77,137,20)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath21)" fill="none" x1="133" x2="312" y1="36" y2="36"/>
<rect x="457" y="46" clip-path="url(#clipPath22)" fill="rgb(131,122,133)" width="286" rx="2.5" opacity="0.2549" ry="2.5" height="517" stroke="none"/>
<rect x="458" y="47" clip-path="url(#clipPath22)" fill="rgb(131,122,133)" width="286" rx="2.5" opacity="0.2549" ry="2.5" height="517" stroke="none"/>
<rect x="456" y="45" clip-path="url(#clipPath23)" fill="white" width="286" rx="2.5" ry="2.5" height="517" stroke="none"/>
<rect x="456" y="45" clip-path="url(#clipPath23)" fill="none" width="285" rx="2.5" ry="2.5" height="516" stroke="rgb(173,127,168)"/>
<image stroke="rgb(173,127,168)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(173,127,168)" clip-path="url(#clipPath24)" preserveAspectRatio="none" height="16" x="533" y="50" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmMHsEzceMVhoyDFYVK6EazjRHg4Xh2iAOIcJ2VQWZiawooKF&#13;&#10;x8HsM12RYHEQDeKDxEHyIDYMoBnACFZ0oTcKzAZhmDgIg8QhhjNiN4AVaPKEeEsG&#13;&#10;g+JlYDYr1CYYGyQOkmfF6gJgELMCTfYyUYEqYmTQLlgClgLRID5IHCQPYv+DhgEL&#13;&#10;Qv8/BmYmiNN8zVTB9N2pcSghDxOHqEczAAT8GjaB08F/NBIGECkEyGZkxDRgaYUX&#13;&#10;0ekgpnM7ZiCSA1iwmUq2AUvKPQfQCypKwiR5AaSeKgAABcZdRqE6GaQAAAAASUVO&#13;&#10;RK5CYII=" xlink:actuate="onLoad"/>
<text x="552" y="63" clip-path="url(#clipPath25)" fill="black" stroke="none" xml:space="preserve">IMeshTools_Context</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="461" y="73" clip-path="url(#clipPath26)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="86" clip-path="url(#clipPath27)" stroke="none">myParameters : IMeshTools_Parameters [1]</text>
<image x="461" y="89" clip-path="url(#clipPath28)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="102" clip-path="url(#clipPath29)" stroke="none">myModel : [1]</text>
<image x="461" y="105" clip-path="url(#clipPath30)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="118" clip-path="url(#clipPath31)" stroke="none">myModelBuilder : IMeshTools_ModelBuilder [1]</text>
<image x="461" y="121" clip-path="url(#clipPath32)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="134" clip-path="url(#clipPath33)" stroke="none">myEdgeDiscret : IMeshTools_ModelAlgo [1]</text>
<image x="461" y="137" clip-path="url(#clipPath34)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="150" clip-path="url(#clipPath35)" stroke="none">myModelHealer : IMeshTools_ModelAlgo [1]</text>
<image x="461" y="153" clip-path="url(#clipPath36)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="166" clip-path="url(#clipPath37)" stroke="none">myPreProcessor : IMeshTools_ModelAlgo [1]</text>
<image x="461" y="169" clip-path="url(#clipPath38)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="182" clip-path="url(#clipPath39)" stroke="none">myFaceDiscret : IMeshTools_ModelAlgo [1]</text>
<image x="461" y="185" clip-path="url(#clipPath40)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVR42mNgGAWM&#13;&#10;ICJr1qH/pGqclmYH1ssCIn7/+ccwI8OeaM0ZMw/C2WADfgIN+At0Q8rUfRDR/zC3&#13;&#10;obGBYE62E8Ov339RDfjx6w/DHyjdne2G0+aSqbsZ/gAN/I5kABOI+P4TaMA/EA2R&#13;&#10;EGSBYlYELcfBwLCq2JWBk5mBYWWRK8N/IIC74BvQ5l9A7rfff8AG/P4PcTmIYIR5&#13;&#10;A6iRrckLbvOvum0IL3z/9Res6fuPPwyRTetRnH20LRCFn2OgwzDlwhVI8AABxACg&#13;&#10;zaBAXNkQyMCIFmgggGwzuhjYAFCoupWvRDgXKZVcmRAOtxnZFSAAcgnYgKsTIxhx&#13;&#10;Bv2E8P8wxSBgJ63McOjpXdRoJARgAYYtEBmJTX2gAMNmAAC8fn+eU+XlTAAAAABJRU5ErkJggg==" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="198" clip-path="url(#clipPath41)" stroke="none">myPostProcessor : IMeshTools_ModelAlgo [1]</text>
<image x="461" y="201" clip-path="url(#clipPath42)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="214" clip-path="url(#clipPath43)" stroke="none">GetParameters()</text>
<image x="461" y="217" clip-path="url(#clipPath44)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="230" clip-path="url(#clipPath45)" stroke="none">ChangeParameters()</text>
<image x="461" y="233" clip-path="url(#clipPath46)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="246" clip-path="url(#clipPath47)" stroke="none">BuildModel()</text>
<image x="461" y="249" clip-path="url(#clipPath48)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="262" clip-path="url(#clipPath49)" stroke="none">GetModel()</text>
<image x="461" y="265" clip-path="url(#clipPath50)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="278" clip-path="url(#clipPath51)" stroke="none">DiscretizeEdges()</text>
<image x="461" y="281" clip-path="url(#clipPath52)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="294" clip-path="url(#clipPath53)" stroke="none">HealModel()</text>
<image x="461" y="297" clip-path="url(#clipPath54)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="310" clip-path="url(#clipPath55)" stroke="none">PreProcessModel()</text>
<image x="461" y="313" clip-path="url(#clipPath56)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="326" clip-path="url(#clipPath57)" stroke="none">DiscretizeFaces()</text>
<image x="461" y="329" clip-path="url(#clipPath58)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="342" clip-path="url(#clipPath59)" stroke="none">PostProcessModel()</text>
<image x="461" y="345" clip-path="url(#clipPath60)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="358" clip-path="url(#clipPath61)" stroke="none">SetModelBuilder()</text>
<image x="461" y="361" clip-path="url(#clipPath62)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="374" clip-path="url(#clipPath63)" stroke="none">GetModelBuilder()</text>
<image x="461" y="377" clip-path="url(#clipPath64)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="390" clip-path="url(#clipPath65)" stroke="none">SetEdgeDiscret()</text>
<image x="461" y="393" clip-path="url(#clipPath66)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="406" clip-path="url(#clipPath67)" stroke="none">GetEdgeDiscret()</text>
<image x="461" y="409" clip-path="url(#clipPath68)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="422" clip-path="url(#clipPath69)" stroke="none">SetModelHealer()</text>
<image x="461" y="425" clip-path="url(#clipPath70)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="438" clip-path="url(#clipPath71)" stroke="none">GetModelHealer()</text>
<image x="461" y="441" clip-path="url(#clipPath72)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="454" clip-path="url(#clipPath73)" stroke="none">SetPreProcessor()</text>
<image x="461" y="457" clip-path="url(#clipPath74)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="470" clip-path="url(#clipPath75)" stroke="none">GetPreProcessor()</text>
<image x="461" y="473" clip-path="url(#clipPath76)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="486" clip-path="url(#clipPath77)" stroke="none">SetFaceDiscret()</text>
<image x="461" y="489" clip-path="url(#clipPath78)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="502" clip-path="url(#clipPath79)" stroke="none">GetFaceDiscret()</text>
<image x="461" y="505" clip-path="url(#clipPath80)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="518" clip-path="url(#clipPath81)" stroke="none">SetPostProcessor()</text>
<image x="461" y="521" clip-path="url(#clipPath82)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="534" clip-path="url(#clipPath83)" stroke="none">GetPostProcessor()</text>
<image x="461" y="537" clip-path="url(#clipPath84)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="480" y="550" clip-path="url(#clipPath85)" stroke="none">Clean()</text>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath86)" fill="none" x1="457" x2="741" y1="71" y2="71"/>
<rect x="133" y="227" clip-path="url(#clipPath87)" fill="rgb(131,122,133)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="86" stroke="none"/>
<rect x="134" y="228" clip-path="url(#clipPath87)" fill="rgb(131,122,133)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="86" stroke="none"/>
<rect x="132" y="226" clip-path="url(#clipPath88)" fill="white" width="181" rx="2.5" ry="2.5" height="86" stroke="none"/>
<rect x="132" y="226" clip-path="url(#clipPath88)" fill="none" width="180" rx="2.5" ry="2.5" height="85"/>
<image x="141" y="231" clip-path="url(#clipPath89)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmMHsEzceMVhoyDFYVK6EazjRHg4Xh2iAOIcJ2VQWZiawooKF&#13;&#10;x8HsM12RYHEQDeKDxEHyIDYMoBnACFZ0oTcKzAZhmDgIg8QhhjNiN4AVaPKEeEsG&#13;&#10;g+JlYDYr1CYYGyQOkmfF6gJgELMCTfYyUYEqYmTQLlgClgLRID5IHCQPYv+DhgEL&#13;&#10;Qv8/BmYmiNN8zVTB9N2pcSghDxOHqEczAAT8GjaB08F/NBIGECkEyGZkxDRgaYUX&#13;&#10;0ekgpnM7ZiCSA1iwmUq2AUvKPQfQCypKwiR5AaSeKgAABcZdRqE6GaQAAAAASUVO&#13;&#10;RK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="160" y="244" clip-path="url(#clipPath90)" fill="black" stroke="none" xml:space="preserve">IMeshTools_ModelBuilder</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="137" y="259" clip-path="url(#clipPath91)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="266" clip-path="url(#clipPath92)" stroke="none">Perform(TopoDS_Shape : , </text>
<text xml:space="preserve" x="156" y="279" clip-path="url(#clipPath92)" stroke="none">IMeshTools_Parameter : )</text>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath93)" fill="none" x1="133" x2="312" y1="252" y2="252"/>
<rect x="133" y="335" clip-path="url(#clipPath94)" fill="rgb(131,122,133)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="86" stroke="none"/>
<rect x="134" y="336" clip-path="url(#clipPath94)" fill="rgb(131,122,133)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="86" stroke="none"/>
<rect x="132" y="334" clip-path="url(#clipPath95)" fill="white" width="181" rx="2.5" ry="2.5" height="86" stroke="none"/>
<rect x="132" y="334" clip-path="url(#clipPath95)" fill="none" width="180" rx="2.5" ry="2.5" height="85"/>
<image x="149" y="339" clip-path="url(#clipPath96)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmMHsEzceMVhoyDFYVK6EazjRHg4Xh2iAOIcJ2VQWZiawooKF&#13;&#10;x8HsM12RYHEQDeKDxEHyIDYMoBnACFZ0oTcKzAZhmDgIg8QhhjNiN4AVaPKEeEsG&#13;&#10;g+JlYDYr1CYYGyQOkmfF6gJgELMCTfYyUYEqYmTQLlgClgLRID5IHCQPYv+DhgEL&#13;&#10;Qv8/BmYmiNN8zVTB9N2pcSghDxOHqEczAAT8GjaB08F/NBIGECkEyGZkxDRgaYUX&#13;&#10;0ekgpnM7ZiCSA1iwmUq2AUvKPQfQCypKwiR5AaSeKgAABcZdRqE6GaQAAAAASUVO&#13;&#10;RK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="168" y="352" clip-path="url(#clipPath97)" fill="black" stroke="none" xml:space="preserve">IMeshTools_ModelAlgo</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="137" y="367" clip-path="url(#clipPath98)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="374" clip-path="url(#clipPath99)" stroke="none">Perform(IMeshData_Model : , </text>
<text xml:space="preserve" x="156" y="387" clip-path="url(#clipPath99)" stroke="none">IMeshTools_Parameters : )</text>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath100)" fill="none" x1="133" x2="312" y1="360" y2="360"/>
<rect x="133" y="443" clip-path="url(#clipPath101)" fill="rgb(131,122,133)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="141" stroke="none"/>
<rect x="134" y="444" clip-path="url(#clipPath101)" fill="rgb(131,122,133)" width="181" rx="2.5" opacity="0.2549" ry="2.5" height="141" stroke="none"/>
<rect x="132" y="442" clip-path="url(#clipPath102)" fill="white" width="181" rx="2.5" ry="2.5" height="141" stroke="none"/>
<rect x="132" y="442" clip-path="url(#clipPath102)" fill="none" width="180" rx="2.5" ry="2.5" height="140"/>
<image x="163" y="447" clip-path="url(#clipPath103)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmMHsEzceMVhoyDFYVK6EazjRHg4Xh2iAOIcJ2VQWZiawooKF&#13;&#10;x8HsM12RYHEQDeKDxEHyIDYMoBnACFZ0oTcKzAZhmDgIg8QhhjNiN4AVaPKEeEsG&#13;&#10;g+JlYDYr1CYYGyQOkmfF6gJgELMCTfYyUYEqYmTQLlgClgLRID5IHCQPYv+DhgEL&#13;&#10;Qv8/BmYmiNN8zVTB9N2pcSghDxOHqEczAAT8GjaB08F/NBIGECkEyGZkxDRgaYUX&#13;&#10;0ekgpnM7ZiCSA1iwmUq2AUvKPQfQCypKwiR5AaSeKgAABcZdRqE6GaQAAAAASUVO&#13;&#10;RK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="182" y="460" clip-path="url(#clipPath104)" fill="black" stroke="none" xml:space="preserve">IMeshData_Model</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="137" y="470" clip-path="url(#clipPath105)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="483" clip-path="url(#clipPath106)" stroke="none">GetMaxSize()</text>
<image x="137" y="486" clip-path="url(#clipPath107)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="499" clip-path="url(#clipPath108)" stroke="none">FacesNb()</text>
<image x="137" y="502" clip-path="url(#clipPath109)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="515" clip-path="url(#clipPath110)" stroke="none">AddFace()</text>
<image x="137" y="518" clip-path="url(#clipPath111)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="531" clip-path="url(#clipPath112)" stroke="none">GetFace()</text>
<image x="137" y="534" clip-path="url(#clipPath113)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="547" clip-path="url(#clipPath114)" stroke="none">EdgesNb()</text>
<image x="137" y="550" clip-path="url(#clipPath115)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="563" clip-path="url(#clipPath116)" stroke="none">AddEdge()</text>
<image x="137" y="566" clip-path="url(#clipPath117)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="156" y="579" clip-path="url(#clipPath118)" stroke="none">GetEdge()</text>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath119)" fill="none" x1="133" x2="312" y1="468" y2="468"/>
<rect x="853" y="107" clip-path="url(#clipPath120)" fill="rgb(131,122,133)" width="168" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="854" y="108" clip-path="url(#clipPath120)" fill="rgb(131,122,133)" width="168" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="852" y="106" clip-path="url(#clipPath121)" fill="white" width="168" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="852" y="106" clip-path="url(#clipPath121)" fill="none" width="167" rx="2.5" ry="2.5" height="97"/>
<image x="857" y="111" clip-path="url(#clipPath122)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmMHsEzceMVhoyDFYVK6EazjRHg4Xh2iAOIcJ2VQWZiawooKF&#13;&#10;x8HsM12RYHEQDeKDxEHyIDYMoBnACFZ0oTcKzAZhmDgIg8QhhjNiN4AVaPKEeEsG&#13;&#10;g+JlYDYr1CYYGyQOkmfF6gJgELMCTfYyUYEqYmTQLlgClgLRID5IHCQPYv+DhgEL&#13;&#10;Qv8/BmYmiNN8zVTB9N2pcSghDxOHqEczAAT8GjaB08F/NBIGECkEyGZkxDRgaYUX&#13;&#10;0ekgpnM7ZiCSA1iwmUq2AUvKPQfQCypKwiR5AaSeKgAABcZdRqE6GaQAAAAASUVO&#13;&#10;RK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="876" y="124" clip-path="url(#clipPath123)" fill="black" stroke="none" xml:space="preserve">IMeshTools_MeshBuilder</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="857" y="134" clip-path="url(#clipPath124)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="876" y="147" clip-path="url(#clipPath125)" stroke="none">SetContext()</text>
<image x="857" y="150" clip-path="url(#clipPath126)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="876" y="163" clip-path="url(#clipPath127)" stroke="none">GetContext()</text>
<image x="857" y="166" clip-path="url(#clipPath128)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="876" y="179" clip-path="url(#clipPath129)" stroke="none">Perform()</text>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath130)" fill="none" x1="853" x2="1019" y1="132" y2="132"/>
</g>
<g stroke-linecap="butt" font-size="11" fill="rgb(136,136,136)" font-family="'Segoe UI'" stroke-dasharray="5,5" stroke="rgb(136,136,136)" stroke-width="1.1">
<line clip-path="url(#clipPath131)" fill="none" x1="132" x2="84" y1="268" y2="268"/>
<line clip-path="url(#clipPath131)" fill="none" x1="84" x2="84" y1="268" y2="132"/>
<line clip-path="url(#clipPath131)" fill="none" x1="84" x2="132" y1="132" y2="132"/>
<text x="59" y="190" clip-path="url(#clipPath132)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath133)" fill="none" x1="125" x2="132" y1="135" y2="132" stroke-dasharray="none"/>
<line clip-path="url(#clipPath133)" fill="none" x1="132" x2="125" y1="132" y2="129" stroke-dasharray="none"/>
<line clip-path="url(#clipPath131)" fill="none" x1="132" x2="48" y1="370" y2="370"/>
<line clip-path="url(#clipPath131)" fill="none" x1="48" x2="48" y1="370" y2="90"/>
<line clip-path="url(#clipPath131)" fill="none" x1="48" x2="132" y1="90" y2="90"/>
<text x="23" y="224" clip-path="url(#clipPath134)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath135)" fill="none" x1="125" x2="132" y1="93" y2="90" stroke-dasharray="none"/>
<line clip-path="url(#clipPath135)" fill="none" x1="132" x2="125" y1="90" y2="87" stroke-dasharray="none"/>
<line clip-path="url(#clipPath131)" fill="none" x1="132" x2="48" y1="390" y2="390"/>
<line clip-path="url(#clipPath131)" fill="none" x1="48" x2="48" y1="390" y2="514"/>
<line clip-path="url(#clipPath131)" fill="none" x1="48" x2="132" y1="514" y2="514"/>
<text x="23" y="449" clip-path="url(#clipPath136)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath137)" fill="none" x1="125" x2="132" y1="517" y2="514" stroke-dasharray="none"/>
<line clip-path="url(#clipPath137)" fill="none" x1="132" x2="125" y1="514" y2="511" stroke-dasharray="none"/>
<line clip-path="url(#clipPath131)" fill="none" x1="456" x2="313" y1="125" y2="125" stroke-dasharray="none"/>
<text x="364" y="142" clip-path="url(#clipPath138)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">caches</text>
<text x="407" y="118" clip-path="url(#clipPath139)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">context[1]</text>
<text x="312" y="118" clip-path="url(#clipPath140)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">parameters[1]</text>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath141)" points=" 456 125 450 128 444 125 450 122" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath141)" points=" 456 125 450 128 444 125 450 122"/>
<line clip-path="url(#clipPath142)" fill="none" x1="320" x2="313" y1="122" y2="125" stroke-dasharray="none"/>
<line clip-path="url(#clipPath142)" fill="none" x1="313" x2="320" y1="125" y2="128" stroke-dasharray="none"/>
<line clip-path="url(#clipPath131)" fill="none" x1="456" x2="313" y1="268" y2="268" stroke-dasharray="none"/>
<text x="367" y="284" clip-path="url(#clipPath143)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">caches</text>
<text x="410" y="264" clip-path="url(#clipPath144)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">context[1]</text>
<text x="310" y="264" clip-path="url(#clipPath145)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">builder[1]</text>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath146)" points=" 456 268 450 271 444 268 450 265" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath146)" points=" 456 268 450 271 444 268 450 265"/>
<line clip-path="url(#clipPath147)" fill="none" x1="320" x2="313" y1="265" y2="268" stroke-dasharray="none"/>
<line clip-path="url(#clipPath147)" fill="none" x1="313" x2="320" y1="268" y2="271" stroke-dasharray="none"/>
<line clip-path="url(#clipPath131)" fill="none" x1="456" x2="313" y1="501" y2="501" stroke-dasharray="none"/>
<text x="367" y="517" clip-path="url(#clipPath148)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">caches</text>
<text x="410" y="497" clip-path="url(#clipPath149)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">context[1]</text>
<text x="312" y="497" clip-path="url(#clipPath150)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">model[1]</text>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath151)" points=" 456 501 450 504 444 501 450 498" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath151)" points=" 456 501 450 504 444 501 450 498"/>
<line clip-path="url(#clipPath152)" fill="none" x1="320" x2="313" y1="498" y2="501" stroke-dasharray="none"/>
<line clip-path="url(#clipPath152)" fill="none" x1="313" x2="320" y1="501" y2="504" stroke-dasharray="none"/>
<line clip-path="url(#clipPath131)" fill="none" x1="456" x2="313" y1="376" y2="376" stroke-dasharray="none"/>
<text x="367" y="392" clip-path="url(#clipPath153)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">caches</text>
<text x="410" y="372" clip-path="url(#clipPath154)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">context[1]</text>
<text x="318" y="372" clip-path="url(#clipPath155)" fill="black" stroke-dasharray="none" stroke="none" xml:space="preserve">algo[5]</text>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath156)" points=" 456 376 450 379 444 376 450 373" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath156)" points=" 456 376 450 379 444 376 450 373"/>
<line clip-path="url(#clipPath157)" fill="none" x1="320" x2="313" y1="373" y2="376" stroke-dasharray="none"/>
<line clip-path="url(#clipPath157)" fill="none" x1="313" x2="320" y1="376" y2="379" stroke-dasharray="none"/>
<line clip-path="url(#clipPath131)" fill="none" x1="852" x2="742" y1="160" y2="160"/>
<text x="772" y="176" clip-path="url(#clipPath158)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath159)" fill="none" x1="749" x2="742" y1="157" y2="160" stroke-dasharray="none"/>
<line clip-path="url(#clipPath159)" fill="none" x1="742" x2="749" y1="160" y2="163" stroke-dasharray="none"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 93 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 169 KiB

View File

@@ -1,820 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-dasharray="none" shape-rendering="auto" font-family="'Dialog'" width="1514" text-rendering="auto" fill-opacity="1" contentScriptType="text/ecmascript" color-interpolation="auto" color-rendering="auto" preserveAspectRatio="xMidYMid meet" font-size="12" viewBox="0 0 1514 1571" fill="black" stroke="black" image-rendering="auto" stroke-miterlimit="10" zoomAndPan="magnify" version="1.0" stroke-linecap="square" stroke-linejoin="miter" contentStyleType="text/css" font-style="normal" height="1571" stroke-width="1" stroke-dashoffset="0" font-weight="normal" stroke-opacity="1">
<!--Generated by the Batik Graphics2D SVG Generator-->
<defs id="genericDefs"/>
<g>
<defs id="defs1">
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M1296 189 L1505 189 L1505 291 L1296 291 L1296 189 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M1296 189 L1503 189 L1503 289 L1296 289 L1296 189 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
<path d="M1307 194 L1492 194 L1492 212 L1307 212 L1307 194 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
<path d="M1307 194 L1495 194 L1495 212 L1307 212 L1307 194 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
<path d="M1301 217 L1497 217 L1497 245 L1301 245 L1301 217 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
<path d="M1301 217 L1499 217 L1499 245 L1301 245 L1301 217 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath7">
<path d="M1297 215 L1502 215 L1502 288 L1297 288 L1297 215 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath8">
<path d="M1296 345 L1505 345 L1505 434 L1296 434 L1296 345 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath9">
<path d="M1296 345 L1503 345 L1503 432 L1296 432 L1296 345 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath10">
<path d="M1308 350 L1490 350 L1490 368 L1308 368 L1308 350 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath11">
<path d="M1308 350 L1493 350 L1493 368 L1308 368 L1308 350 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath12">
<path d="M1297 371 L1502 371 L1502 431 L1297 431 L1297 371 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath13">
<path d="M12 165 L1168 165 L1168 1562 L12 1562 L12 165 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath14">
<path d="M12 165 L1166 165 L1166 1560 L12 1560 L12 165 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath15">
<path d="M13 170 L135 170 L135 188 L13 188 L13 170 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath16">
<path d="M13 170 L137 170 L137 188 L13 188 L13 170 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath17">
<path d="M291 189 L523 189 L523 291 L291 291 L291 189 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath18">
<path d="M291 189 L521 189 L521 289 L291 289 L291 189 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath19">
<path d="M334 194 L478 194 L478 212 L334 212 L334 194 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath20">
<path d="M334 194 L481 194 L481 212 L334 212 L334 194 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath21">
<path d="M296 217 L458 217 L458 245 L296 245 L296 217 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath22">
<path d="M296 217 L460 217 L460 245 L296 245 L296 217 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath23">
<path d="M292 215 L520 215 L520 288 L292 288 L292 215 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath24">
<path d="M446 465 L739 465 L739 567 L446 567 L446 465 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath25">
<path d="M446 465 L737 465 L737 565 L446 565 L446 465 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath26">
<path d="M482 470 L700 470 L700 488 L482 488 L482 470 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath27">
<path d="M482 470 L703 470 L703 488 L482 488 L482 470 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath28">
<path d="M447 491 L736 491 L736 564 L447 564 L447 491 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath29">
<path d="M444 777 L737 777 L737 879 L444 879 L444 777 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath30">
<path d="M444 777 L735 777 L735 877 L444 877 L444 777 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath31">
<path d="M452 782 L727 782 L727 814 L452 814 L452 782 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath32">
<path d="M452 782 L730 782 L730 814 L452 814 L452 782 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath33">
<path d="M445 817 L734 817 L734 876 L445 876 L445 817 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath34">
<path d="M792 777 L1097 777 L1097 879 L792 879 L792 777 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath35">
<path d="M792 777 L1095 777 L1095 877 L792 877 L792 777 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath36">
<path d="M796 782 L1091 782 L1091 814 L796 814 L796 782 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath37">
<path d="M796 782 L1094 782 L1094 814 L796 814 L796 782 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath38">
<path d="M793 817 L1094 817 L1094 876 L793 876 L793 817 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath39">
<path d="M74 465 L367 465 L367 567 L74 567 L74 465 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath40">
<path d="M74 465 L365 465 L365 565 L74 565 L74 465 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath41">
<path d="M118 470 L320 470 L320 488 L118 488 L118 470 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath42">
<path d="M118 470 L323 470 L323 488 L118 488 L118 470 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath43">
<path d="M75 491 L364 491 L364 564 L75 564 L75 491 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath44">
<path d="M72 777 L365 777 L365 879 L72 879 L72 777 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath45">
<path d="M72 777 L363 777 L363 877 L72 877 L72 777 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath46">
<path d="M75 782 L360 782 L360 814 L75 814 L75 782 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath47">
<path d="M75 782 L363 782 L363 814 L75 814 L75 782 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath48">
<path d="M73 817 L362 817 L362 876 L73 876 L73 817 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath49">
<path d="M36 944 L1145 944 L1145 1538 L36 1538 L36 944 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath50">
<path d="M36 944 L1143 944 L1143 1536 L36 1536 L36 944 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath51">
<path d="M37 949 L135 949 L135 967 L37 967 L37 949 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath52">
<path d="M37 949 L137 949 L137 967 L37 967 L37 949 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath53">
<path d="M492 980 L713 980 L713 1082 L492 1082 L492 980 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath54">
<path d="M492 980 L711 980 L711 1080 L492 1080 L492 980 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath55">
<path d="M499 985 L704 985 L704 1003 L499 1003 L499 985 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath56">
<path d="M499 985 L707 985 L707 1003 L499 1003 L499 985 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath57">
<path d="M493 1006 L710 1006 L710 1079 L493 1079 L493 1006 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath58">
<path d="M60 1124 L281 1124 L281 1226 L60 1226 L60 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath59">
<path d="M60 1124 L279 1124 L279 1224 L60 1224 L60 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath60">
<path d="M74 1129 L265 1129 L265 1147 L74 1147 L74 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath61">
<path d="M74 1129 L268 1129 L268 1147 L74 1147 L74 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath62">
<path d="M61 1150 L278 1150 L278 1223 L61 1223 L61 1150 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath63">
<path d="M300 1124 L521 1124 L521 1226 L300 1226 L300 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath64">
<path d="M300 1124 L519 1124 L519 1224 L300 1224 L300 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath65">
<path d="M305 1129 L513 1129 L513 1147 L305 1147 L305 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath66">
<path d="M305 1129 L516 1129 L516 1147 L305 1147 L305 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath67">
<path d="M301 1150 L518 1150 L518 1223 L301 1223 L301 1150 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath68">
<path d="M535 1124 L756 1124 L756 1226 L535 1226 L535 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath69">
<path d="M535 1124 L754 1124 L754 1224 L535 1224 L535 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath70">
<path d="M543 1129 L746 1129 L746 1147 L543 1147 L543 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath71">
<path d="M543 1129 L749 1129 L749 1147 L543 1147 L543 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath72">
<path d="M536 1150 L753 1150 L753 1223 L536 1223 L536 1150 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath73">
<path d="M775 1124 L995 1124 L995 1226 L775 1226 L775 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath74">
<path d="M775 1124 L993 1124 L993 1224 L775 1224 L775 1124 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath75">
<path d="M776 1129 L991 1129 L991 1147 L776 1147 L776 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath76">
<path d="M776 1129 L994 1129 L994 1147 L776 1147 L776 1129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath77">
<path d="M776 1150 L992 1150 L992 1223 L776 1223 L776 1150 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath78">
<path d="M649 1280 L869 1280 L869 1382 L649 1382 L649 1280 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath79">
<path d="M649 1280 L867 1280 L867 1380 L649 1380 L649 1280 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath80">
<path d="M661 1285 L855 1285 L855 1303 L661 1303 L661 1285 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath81">
<path d="M661 1285 L858 1285 L858 1303 L661 1303 L661 1285 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath82">
<path d="M650 1306 L866 1306 L866 1379 L650 1379 L650 1306 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath83">
<path d="M900 1280 L1119 1280 L1119 1382 L900 1382 L900 1280 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath84">
<path d="M900 1280 L1117 1280 L1117 1380 L900 1380 L900 1280 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath85">
<path d="M906 1285 L1110 1285 L1110 1303 L906 1303 L906 1285 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath86">
<path d="M906 1285 L1113 1285 L1113 1303 L906 1303 L906 1285 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath87">
<path d="M901 1306 L1116 1306 L1116 1379 L901 1379 L901 1306 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath88">
<path d="M852 1413 L1119 1413 L1119 1515 L852 1515 L852 1413 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath89">
<path d="M852 1413 L1117 1413 L1117 1513 L852 1513 L852 1413 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath90">
<path d="M856 1418 L1112 1418 L1112 1436 L856 1436 L856 1418 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath91">
<path d="M856 1418 L1115 1418 L1115 1436 L856 1436 L856 1418 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath92">
<path d="M853 1439 L1116 1439 L1116 1512 L853 1512 L853 1439 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath93">
<path d="M290 321 L523 321 L523 423 L290 423 L290 321 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath94">
<path d="M290 321 L521 321 L521 421 L290 421 L290 321 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath95">
<path d="M322 326 L489 326 L489 344 L322 344 L322 326 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath96">
<path d="M322 326 L492 326 L492 344 L322 344 L322 326 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath97">
<path d="M291 347 L520 347 L520 420 L291 420 L291 347 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath98">
<path d="M822 321 L1067 321 L1067 423 L822 423 L822 321 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath99">
<path d="M822 321 L1065 321 L1065 421 L822 421 L822 321 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath100">
<path d="M834 326 L1053 326 L1053 344 L834 344 L834 326 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath101">
<path d="M834 326 L1056 326 L1056 344 L834 344 L834 326 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath102">
<path d="M823 347 L1064 347 L1064 420 L823 420 L823 347 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath103">
<path d="M276 621 L538 621 L538 723 L276 723 L276 621 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath104">
<path d="M276 621 L536 621 L536 721 L276 721 L276 621 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath105">
<path d="M294 626 L518 626 L518 658 L294 658 L294 626 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath106">
<path d="M294 626 L521 626 L521 658 L294 658 L294 626 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath107">
<path d="M294 626 L520 626 L520 658 L294 658 L294 626 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath108">
<path d="M277 661 L535 661 L535 720 L277 720 L277 661 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath109">
<path d="M792 9 L986 9 L986 111 L792 111 L792 9 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath110">
<path d="M792 9 L984 9 L984 109 L792 109 L792 9 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath111">
<path d="M812 14 L963 14 L963 32 L812 32 L812 14 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath112">
<path d="M812 14 L966 14 L966 32 L812 32 L812 14 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath113">
<path d="M793 35 L983 35 L983 108 L793 108 L793 35 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath114">
<path d="M-1 -1 L1515 -1 L1515 1572 L-1 1572 L-1 -1 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath115">
<path d="M22 597 L365 597 L365 615 L22 615 L22 597 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath116">
<path d="M22 597 L367 597 L367 615 L22 615 L22 597 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath117">
<path d="M366 616 L377 616 L377 624 L366 624 L366 616 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath118">
<path d="M828 908 L1001 908 L1001 926 L828 926 L828 908 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath119">
<path d="M828 908 L1003 908 L1003 926 L828 926 L828 908 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath120">
<path d="M904 875 L915 875 L915 883 L904 883 L904 875 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath121">
<path d="M597 1078 L608 1078 L608 1089 L597 1089 L597 1078 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath122">
<path d="M400 419 L411 419 L411 430 L400 430 L400 419 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath123">
<path d="M880 1222 L891 1222 L891 1233 L880 1233 L880 1222 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath124">
<path d="M127 902 L300 902 L300 920 L127 920 L127 902 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath125">
<path d="M127 902 L302 902 L302 920 L127 920 L127 902 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath126">
<path d="M252 875 L263 875 L263 883 L252 883 L252 875 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath127">
<path d="M434 597 L794 597 L794 615 L434 615 L434 597 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath128">
<path d="M434 597 L796 597 L796 615 L434 615 L434 597 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath129">
<path d="M446 616 L457 616 L457 624 L446 624 L446 616 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath130">
<path d="M1004 1378 L1015 1378 L1015 1389 L1004 1389 L1004 1378 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath131">
<path d="M733 823 L743 823 L743 832 L733 832 L733 823 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath132">
<path d="M402 719 L413 719 L413 730 L402 730 L402 719 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath133">
<path d="M408 896 L581 896 L581 914 L408 914 L408 896 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath134">
<path d="M408 896 L583 896 L583 914 L408 914 L408 896 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath135">
<path d="M586 875 L595 875 L595 885 L586 885 L586 875 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath136">
<path d="M666 359 L721 359 L721 374 L666 374 L666 359 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath137">
<path d="M815 372 L825 372 L825 381 L815 381 L815 372 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath138">
<path d="M401 287 L412 287 L412 298 L401 298 L401 287 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath139">
<path d="M1394 287 L1405 287 L1405 298 L1394 298 L1394 287 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath140">
<path d="M1164 394 L1174 394 L1174 403 L1164 403 L1164 394 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath141">
<path d="M579 123 L634 123 L634 138 L579 138 L579 123 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath142">
<path d="M408 185 L418 185 L418 194 L408 194 L408 185 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath143">
<path d="M1140 129 L1195 129 L1195 144 L1140 144 L1140 129 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath144">
<path d="M1385 185 L1395 185 L1395 194 L1385 194 L1385 185 Z"/>
</clipPath>
</defs>
<g fill="rgb(131,122,133)" font-family="'Segoe UI'" stroke-linejoin="round" stroke="rgb(131,122,133)" font-weight="bold" stroke-width="0" stroke-miterlimit="0">
<rect x="1298" y="191" clip-path="url(#clipPath1)" width="205" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="1299" y="192" clip-path="url(#clipPath1)" width="205" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="1297" y="190" clip-path="url(#clipPath2)" fill="white" width="205" rx="2.5" ry="2.5" height="98" stroke="none"/>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<rect x="1297" y="190" clip-path="url(#clipPath2)" fill="none" width="204" rx="2.5" ry="2.5" height="97"/>
<image x="1308" y="195" clip-path="url(#clipPath3)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmMHsEzceMVhoyDFYVK6EazjRHg4Xh2iAOIcJ2VQWZiawooKF&#13;&#10;x8HsM12RYHEQDeKDxEHyIDYMoBnACFZ0oTcKzAZhmDgIg8QhhjNiN4AVaPKEeEsG&#13;&#10;g+JlYDYr1CYYGyQOkmfF6gJgELMCTfYyUYEqYmTQLlgClgLRID5IHCQPYv+DhgEL&#13;&#10;Qv8/BmYmiNN8zVTB9N2pcSghDxOHqEczAAT8GjaB08F/NBIGECkEyGZkxDRgaYUX&#13;&#10;0ekgpnM7ZiCSA1iwmUq2AUvKPQfQCypKwiR5AaSeKgAABcZdRqE6GaQAAAAASUVO&#13;&#10;RK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="1327" y="208" clip-path="url(#clipPath4)" fill="black" stroke="none" xml:space="preserve">IMeshTools_MeshAlgoFactory</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="1302" y="223" clip-path="url(#clipPath5)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="1321" y="230" clip-path="url(#clipPath6)" stroke="none">GetAlgo(GeomAbs_SurfaceType : , </text>
<text xml:space="preserve" x="1321" y="243" clip-path="url(#clipPath6)" stroke="none">IMeshTools_Parameters : )</text>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath7)" fill="none" x1="1298" x2="1501" y1="216" y2="216"/>
<rect x="1298" y="347" clip-path="url(#clipPath8)" fill="rgb(131,122,133)" width="205" rx="2.5" opacity="0.2549" ry="2.5" height="85" stroke="none"/>
<rect x="1299" y="348" clip-path="url(#clipPath8)" fill="rgb(131,122,133)" width="205" rx="2.5" opacity="0.2549" ry="2.5" height="85" stroke="none"/>
<rect x="1297" y="346" clip-path="url(#clipPath9)" fill="white" width="205" rx="2.5" ry="2.5" height="85" stroke="none"/>
<rect x="1297" y="346" clip-path="url(#clipPath9)" fill="none" width="204" rx="2.5" ry="2.5" height="84" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath10)" preserveAspectRatio="none" height="16" x="1309" y="351" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="1328" y="364" clip-path="url(#clipPath11)" fill="black" stroke="none" xml:space="preserve">BRepMesh_MeshAlgoFactory</text>
<line clip-path="url(#clipPath12)" fill="none" x1="1298" x2="1501" y1="372" y2="372" stroke="rgb(39,76,114)"/>
<rect x="14" y="167" clip-path="url(#clipPath13)" fill="rgb(131,122,133)" width="1152" rx="2.5" opacity="0.2549" ry="2.5" height="1393" stroke="none"/>
<rect x="15" y="168" clip-path="url(#clipPath13)" fill="rgb(131,122,133)" width="1152" rx="2.5" opacity="0.2549" ry="2.5" height="1393" stroke="none"/>
<rect x="13" y="166" clip-path="url(#clipPath14)" fill="white" width="1152" rx="2.5" ry="2.5" height="1393" stroke="none"/>
<rect x="13" y="166" clip-path="url(#clipPath14)" fill="none" width="1151" rx="2.5" ry="2.5" height="1392" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath15)" preserveAspectRatio="none" height="16" x="14" y="171" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWUlEQVR42mNgGPKA&#13;&#10;EUQoZCz4j0vBgxkJjPgMYIEx7k+Px5BUzFxIuQvwAZDr4C7YUBdAkuaApg2oXgAB&#13;&#10;MV5+kl3BRGksoLiAnZlCA5gZKTWAiQIDYKE6AgEAAu0P6M4KKrgAAAAASUVORK5C&#13;&#10;YII=" xlink:actuate="onLoad"/>
<text x="33" y="184" clip-path="url(#clipPath16)" fill="black" stroke="none" xml:space="preserve">Triangulation Algo</text>
<rect x="293" y="191" clip-path="url(#clipPath17)" fill="rgb(131,122,133)" width="228" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="294" y="192" clip-path="url(#clipPath17)" fill="rgb(131,122,133)" width="228" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="292" y="190" clip-path="url(#clipPath18)" fill="white" width="228" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="292" y="190" clip-path="url(#clipPath18)" fill="none" width="227" rx="2.5" ry="2.5" height="97"/>
<image x="335" y="195" clip-path="url(#clipPath19)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmMHsEzceMVhoyDFYVK6EazjRHg4Xh2iAOIcJ2VQWZiawooKF&#13;&#10;x8HsM12RYHEQDeKDxEHyIDYMoBnACFZ0oTcKzAZhmDgIg8QhhjNiN4AVaPKEeEsG&#13;&#10;g+JlYDYr1CYYGyQOkmfF6gJgELMCTfYyUYEqYmTQLlgClgLRID5IHCQPYv+DhgEL&#13;&#10;Qv8/BmYmiNN8zVTB9N2pcSghDxOHqEczAAT8GjaB08F/NBIGECkEyGZkxDRgaYUX&#13;&#10;0ekgpnM7ZiCSA1iwmUq2AUvKPQfQCypKwiR5AaSeKgAABcZdRqE6GaQAAAAASUVO&#13;&#10;RK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="354" y="208" clip-path="url(#clipPath20)" fill="black" stroke="none" xml:space="preserve">IMeshTools_MeshAlgo</text>
</g>
<g stroke-width="1.1" font-size="11" font-family="'Segoe UI'" stroke-linecap="butt">
<image x="297" y="223" clip-path="url(#clipPath21)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42sVTX0hT&#13;&#10;URz+7p3OCIqkaMLq0R6CCIRMaCMyr9ushkT17Fq9RNk/iJBk5z5s+BAhBQYh6Hyp&#13;&#10;B5W0NufcbCuNFcToIQrxz5g0IsVE5u52d+89HScMYw56CPo9nHN+/L7z8fGd7wD/&#13;&#10;u3TlBgIJ0nmlmljb3GQ2OiCWw/FbmyYxQGG+SzfOE+HXePfkNgLhwc3hiZvUSsK0&#13;&#10;rAKLK0gnwq8w+fA6vF950v/gCnZWVaGxoQ4jC3oy+agdnU/7IVzuIvNRb1ERV5Ri&#13;&#10;aqejXTcASsFxKjRaCbaggtfYtAIKVIbWcO5+DzD1mCtRQJMfxBczHGk1NSCfB3yx&#13;&#10;OGYWF/ElkcLBmhrICnCxswd0y+UigcUVonPqHuK+5kClTofI5zhjVNDr/4RjtUbM&#13;&#10;/kjhQLUBx48cRWhpB2l2uslcZNPYgonjzDDP1TZsqFxeyUHTFPSNxRH1nMez8Rh4&#13;&#10;lcP31RwUlcLjdCAYfPnnK9iEs+joHUBiOYOVjASOee04U4dTHUNw2uqh8TqsrctI&#13;&#10;/FpnuD4IFjtKTCwUM9JxoRW8wnjlFGOn0BiE0xug6vTwDg5Bm+7mtg+S+Ra1t7RA&#13;&#10;zgGSKiNHdyPNVbJ9FyRNRUZWcfhQLb7l9xEkY2JJkMwnGzHq92E1l8XImA8/M2ms&#13;&#10;ScCSlMWwP4h0VsJwwI/TTbbtg5R8+1ysv3SPTE9FCk+VpPvJXqMRHyOsf9/NLagG&#13;&#10;Igh2hFwC91efxOp6Q2G6Q5vF0vj+0/oNRdDxkTDUjqQAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text xml:space="preserve" x="316" y="230" clip-path="url(#clipPath22)" stroke="none">Perform(IMeshData_Face : , </text>
<text xml:space="preserve" x="316" y="243" clip-path="url(#clipPath22)" stroke="none">IMeshTools_Parameters : )</text>
</g>
<g stroke-linecap="butt" fill="rgb(173,127,168)" font-family="'Segoe UI'" stroke="rgb(173,127,168)" font-weight="bold" stroke-width="1.1">
<line clip-path="url(#clipPath23)" fill="none" x1="293" x2="519" y1="216" y2="216"/>
<rect x="448" y="467" clip-path="url(#clipPath24)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="449" y="468" clip-path="url(#clipPath24)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="447" y="466" clip-path="url(#clipPath25)" fill="white" width="289" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="447" y="466" clip-path="url(#clipPath25)" fill="none" width="288" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath26)" preserveAspectRatio="none" height="16" x="483" y="471" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="502" y="484" clip-path="url(#clipPath27)" fill="black" stroke="none" xml:space="preserve">BRepMesh_DelaunayBaseMeshAlgo</text>
<line clip-path="url(#clipPath28)" fill="none" x1="448" x2="735" y1="492" y2="492" stroke="rgb(39,76,114)"/>
<rect x="446" y="779" clip-path="url(#clipPath29)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="447" y="780" clip-path="url(#clipPath29)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="445" y="778" clip-path="url(#clipPath30)" fill="white" width="289" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="445" y="778" clip-path="url(#clipPath30)" fill="none" width="288" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath31)" preserveAspectRatio="none" height="16" x="453" y="790" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="472" y="796" clip-path="url(#clipPath32)" fill="black" stroke="none" xml:space="preserve">BRepMesh_DelaunayNodeInsertionMeshAlgo </text>
<text x="472" y="811" clip-path="url(#clipPath32)" fill="black" stroke="none" xml:space="preserve">&lt;RangeSplitter&gt;</text>
<line clip-path="url(#clipPath33)" fill="none" x1="446" x2="733" y1="818" y2="818" stroke="rgb(39,76,114)"/>
<rect x="794" y="779" clip-path="url(#clipPath34)" fill="rgb(131,122,133)" width="301" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="795" y="780" clip-path="url(#clipPath34)" fill="rgb(131,122,133)" width="301" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="793" y="778" clip-path="url(#clipPath35)" fill="white" width="301" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="793" y="778" clip-path="url(#clipPath35)" fill="none" width="300" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath36)" preserveAspectRatio="none" height="16" x="797" y="790" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="816" y="796" clip-path="url(#clipPath37)" fill="black" stroke="none" xml:space="preserve">BRepMesh_DelaunayDeflectionControlMeshAlgo </text>
<text x="816" y="811" clip-path="url(#clipPath37)" fill="black" stroke="none" xml:space="preserve">&lt;RangeSplitter&gt;</text>
<line clip-path="url(#clipPath38)" fill="none" x1="794" x2="1093" y1="818" y2="818" stroke="rgb(39,76,114)"/>
<rect x="76" y="467" clip-path="url(#clipPath39)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="77" y="468" clip-path="url(#clipPath39)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="75" y="466" clip-path="url(#clipPath40)" fill="white" width="289" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="75" y="466" clip-path="url(#clipPath40)" fill="none" width="288" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath41)" preserveAspectRatio="none" height="16" x="119" y="471" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="138" y="484" clip-path="url(#clipPath42)" fill="black" stroke="none" xml:space="preserve">BRepMesh_SweepLineMeshAlgo</text>
<line clip-path="url(#clipPath43)" fill="none" x1="76" x2="363" y1="492" y2="492" stroke="rgb(39,76,114)"/>
<rect x="74" y="779" clip-path="url(#clipPath44)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="75" y="780" clip-path="url(#clipPath44)" fill="rgb(131,122,133)" width="289" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="73" y="778" clip-path="url(#clipPath45)" fill="white" width="289" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="73" y="778" clip-path="url(#clipPath45)" fill="none" width="288" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath46)" preserveAspectRatio="none" height="16" x="76" y="790" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="95" y="796" clip-path="url(#clipPath47)" fill="black" stroke="none" xml:space="preserve">BRepMesh_SweepLineNodeInsertionMeshAlgo </text>
<text x="95" y="811" clip-path="url(#clipPath47)" fill="black" stroke="none" xml:space="preserve">&lt;RangeSplitter&gt;</text>
<line clip-path="url(#clipPath48)" fill="none" x1="74" x2="361" y1="818" y2="818" stroke="rgb(39,76,114)"/>
<rect x="38" y="946" clip-path="url(#clipPath49)" fill="rgb(131,122,133)" width="1105" rx="2.5" opacity="0.2549" ry="2.5" height="590" stroke="none"/>
<rect x="39" y="947" clip-path="url(#clipPath49)" fill="rgb(131,122,133)" width="1105" rx="2.5" opacity="0.2549" ry="2.5" height="590" stroke="none"/>
<rect x="37" y="945" clip-path="url(#clipPath50)" fill="white" width="1105" rx="2.5" ry="2.5" height="590" stroke="none"/>
<rect x="37" y="945" clip-path="url(#clipPath50)" fill="none" width="1104" rx="2.5" ry="2.5" height="589" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath51)" preserveAspectRatio="none" height="16" x="38" y="950" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWUlEQVR42mNgGPKA&#13;&#10;EUQoZCz4j0vBgxkJjPgMYIEx7k+Px5BUzFxIuQvwAZDr4C7YUBdAkuaApg2oXgAB&#13;&#10;MV5+kl3BRGksoLiAnZlCA5gZKTWAiQIDYKE6AgEAAu0P6M4KKrgAAAAASUVORK5C&#13;&#10;YII=" xlink:actuate="onLoad"/>
<text x="57" y="963" clip-path="url(#clipPath52)" fill="black" stroke="none" xml:space="preserve">RangeSplitter</text>
<rect x="494" y="982" clip-path="url(#clipPath53)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="495" y="983" clip-path="url(#clipPath53)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="493" y="981" clip-path="url(#clipPath54)" fill="white" width="217" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="493" y="981" clip-path="url(#clipPath54)" fill="none" width="216" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath55)" preserveAspectRatio="none" height="16" x="500" y="986" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="519" y="999" clip-path="url(#clipPath56)" fill="black" stroke="none" xml:space="preserve">BRepMesh_DefaultRangeSplitter</text>
<line clip-path="url(#clipPath57)" fill="none" x1="494" x2="709" y1="1007" y2="1007" stroke="rgb(39,76,114)"/>
<rect x="62" y="1126" clip-path="url(#clipPath58)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="63" y="1127" clip-path="url(#clipPath58)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="61" y="1125" clip-path="url(#clipPath59)" fill="white" width="217" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="61" y="1125" clip-path="url(#clipPath59)" fill="none" width="216" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath60)" preserveAspectRatio="none" height="16" x="75" y="1130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="94" y="1143" clip-path="url(#clipPath61)" fill="black" stroke="none" xml:space="preserve">BRepMesh_ConeRangeSplitter</text>
<line clip-path="url(#clipPath62)" fill="none" x1="62" x2="277" y1="1151" y2="1151" stroke="rgb(39,76,114)"/>
<rect x="302" y="1126" clip-path="url(#clipPath63)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="303" y="1127" clip-path="url(#clipPath63)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="301" y="1125" clip-path="url(#clipPath64)" fill="white" width="217" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="301" y="1125" clip-path="url(#clipPath64)" fill="none" width="216" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath65)" preserveAspectRatio="none" height="16" x="306" y="1130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="325" y="1143" clip-path="url(#clipPath66)" fill="black" stroke="none" xml:space="preserve">BRepMesh_CylinderRangeSplitter</text>
<line clip-path="url(#clipPath67)" fill="none" x1="302" x2="517" y1="1151" y2="1151" stroke="rgb(39,76,114)"/>
<rect x="537" y="1126" clip-path="url(#clipPath68)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="538" y="1127" clip-path="url(#clipPath68)" fill="rgb(131,122,133)" width="217" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="536" y="1125" clip-path="url(#clipPath69)" fill="white" width="217" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="536" y="1125" clip-path="url(#clipPath69)" fill="none" width="216" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath70)" preserveAspectRatio="none" height="16" x="544" y="1130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="563" y="1143" clip-path="url(#clipPath71)" fill="black" stroke="none" xml:space="preserve">BRepMesh_SphereRangeSplitter</text>
<line clip-path="url(#clipPath72)" fill="none" x1="537" x2="752" y1="1151" y2="1151" stroke="rgb(39,76,114)"/>
<rect x="777" y="1126" clip-path="url(#clipPath73)" fill="rgb(131,122,133)" width="216" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="778" y="1127" clip-path="url(#clipPath73)" fill="rgb(131,122,133)" width="216" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="776" y="1125" clip-path="url(#clipPath74)" fill="white" width="216" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="776" y="1125" clip-path="url(#clipPath74)" fill="none" width="215" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath75)" preserveAspectRatio="none" height="16" x="777" y="1130" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="796" y="1143" clip-path="url(#clipPath76)" fill="black" stroke="none" xml:space="preserve">BRepMesh_UVParamRangeSplitter</text>
<line clip-path="url(#clipPath77)" fill="none" x1="777" x2="991" y1="1151" y2="1151" stroke="rgb(39,76,114)"/>
<rect x="651" y="1282" clip-path="url(#clipPath78)" fill="rgb(131,122,133)" width="216" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="652" y="1283" clip-path="url(#clipPath78)" fill="rgb(131,122,133)" width="216" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="650" y="1281" clip-path="url(#clipPath79)" fill="white" width="216" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="650" y="1281" clip-path="url(#clipPath79)" fill="none" width="215" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath80)" preserveAspectRatio="none" height="16" x="662" y="1286" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="681" y="1299" clip-path="url(#clipPath81)" fill="black" stroke="none" xml:space="preserve">BRepMesh_TorusRangeSplitter</text>
<line clip-path="url(#clipPath82)" fill="none" x1="651" x2="865" y1="1307" y2="1307" stroke="rgb(39,76,114)"/>
<rect x="902" y="1282" clip-path="url(#clipPath83)" fill="rgb(131,122,133)" width="215" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="903" y="1283" clip-path="url(#clipPath83)" fill="rgb(131,122,133)" width="215" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="901" y="1281" clip-path="url(#clipPath84)" fill="white" width="215" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="901" y="1281" clip-path="url(#clipPath84)" fill="none" width="214" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath85)" preserveAspectRatio="none" height="16" x="907" y="1286" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="926" y="1299" clip-path="url(#clipPath86)" fill="black" stroke="none" xml:space="preserve">BRepMesh_NURBSRangeSplitter</text>
<line clip-path="url(#clipPath87)" fill="none" x1="902" x2="1115" y1="1307" y2="1307" stroke="rgb(39,76,114)"/>
<rect x="854" y="1415" clip-path="url(#clipPath88)" fill="rgb(131,122,133)" width="263" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="855" y="1416" clip-path="url(#clipPath88)" fill="rgb(131,122,133)" width="263" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="853" y="1414" clip-path="url(#clipPath89)" fill="white" width="263" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="853" y="1414" clip-path="url(#clipPath89)" fill="none" width="262" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath90)" preserveAspectRatio="none" height="16" x="857" y="1419" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="876" y="1432" clip-path="url(#clipPath91)" fill="black" stroke="none" xml:space="preserve">BRepMesh_BoundaryParamsRangeSplitter</text>
<line clip-path="url(#clipPath92)" fill="none" x1="854" x2="1115" y1="1440" y2="1440" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath49)" fill="none" x1="38" x2="134" y1="971" y2="971" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath49)" fill="none" x1="134" x2="134" y1="971" y2="971" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath49)" fill="none" x1="134" x2="139" y1="971" y2="966" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath49)" fill="none" x1="139" x2="139" y1="966" y2="966" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath49)" fill="none" x1="139" x2="139" y1="966" y2="945" stroke="rgb(39,76,114)"/>
<rect x="292" y="323" clip-path="url(#clipPath93)" fill="rgb(131,122,133)" width="229" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="293" y="324" clip-path="url(#clipPath93)" fill="rgb(131,122,133)" width="229" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="291" y="322" clip-path="url(#clipPath94)" fill="white" width="229" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="291" y="322" clip-path="url(#clipPath94)" fill="none" width="228" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath95)" preserveAspectRatio="none" height="16" x="323" y="327" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="342" y="340" clip-path="url(#clipPath96)" fill="black" stroke="none" xml:space="preserve">BRepMesh_BaseMeshAlgo</text>
<line clip-path="url(#clipPath97)" fill="none" x1="292" x2="519" y1="348" y2="348" stroke="rgb(39,76,114)"/>
<rect x="824" y="323" clip-path="url(#clipPath98)" fill="rgb(131,122,133)" width="241" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="825" y="324" clip-path="url(#clipPath98)" fill="rgb(131,122,133)" width="241" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="823" y="322" clip-path="url(#clipPath99)" fill="white" width="241" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="823" y="322" clip-path="url(#clipPath99)" fill="none" width="240" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath100)" preserveAspectRatio="none" height="16" x="835" y="327" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="854" y="340" clip-path="url(#clipPath101)" fill="black" stroke="none" xml:space="preserve">BRepMesh_DataStructureOfDelaun</text>
<line clip-path="url(#clipPath102)" fill="none" x1="824" x2="1063" y1="348" y2="348" stroke="rgb(39,76,114)"/>
<rect x="278" y="623" clip-path="url(#clipPath103)" fill="rgb(131,122,133)" width="258" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="279" y="624" clip-path="url(#clipPath103)" fill="rgb(131,122,133)" width="258" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="277" y="622" clip-path="url(#clipPath104)" fill="white" width="258" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="277" y="622" clip-path="url(#clipPath104)" fill="none" width="257" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath105)" preserveAspectRatio="none" height="16" x="295" y="634" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="314" y="640" clip-path="url(#clipPath106)" fill="black" stroke="none" xml:space="preserve">BRepMesh_NodeInsertionMeshAlgo </text>
<text x="314" y="655" clip-path="url(#clipPath107)" fill="black" stroke="none" xml:space="preserve">&lt;RangeSplitter, BaseClass&gt;</text>
<line clip-path="url(#clipPath108)" fill="none" x1="278" x2="534" y1="662" y2="662" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath13)" fill="none" x1="14" x2="134" y1="192" y2="192" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath13)" fill="none" x1="134" x2="134" y1="192" y2="192" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath13)" fill="none" x1="134" x2="139" y1="192" y2="187" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath13)" fill="none" x1="139" x2="139" y1="187" y2="187" stroke="rgb(39,76,114)"/>
<line clip-path="url(#clipPath13)" fill="none" x1="139" x2="139" y1="187" y2="166" stroke="rgb(39,76,114)"/>
<rect x="794" y="11" clip-path="url(#clipPath109)" fill="rgb(131,122,133)" width="190" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="795" y="12" clip-path="url(#clipPath109)" fill="rgb(131,122,133)" width="190" rx="2.5" opacity="0.2549" ry="2.5" height="98" stroke="none"/>
<rect x="793" y="10" clip-path="url(#clipPath110)" fill="white" width="190" rx="2.5" ry="2.5" height="98" stroke="none"/>
<rect x="793" y="10" clip-path="url(#clipPath110)" fill="none" width="189" rx="2.5" ry="2.5" height="97" stroke="rgb(39,76,114)"/>
<image stroke="rgb(39,76,114)" width="16" xlink:show="embed" xlink:type="simple" fill="rgb(39,76,114)" clip-path="url(#clipPath111)" preserveAspectRatio="none" height="16" x="813" y="15" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAr0lEQVR42mNkgIKC&#13;&#10;BUf+P3jyCchiBOL/QMgIYTFCREDg/38GOFCU4WWYkGDDyAITuP/4E8OkNDsGYkHu&#13;&#10;rINgGm7Av7//GNjZmIk2gOHff1QDwBxmJgZSAZoBjJQZwEqRC4BBzEqCC/6hh8H/&#13;&#10;//8YmJmIN+D/fyyB6NewCZwO/qORMIBIIUA2IyOmAUsrvIh2QUzndjBNeqjhiwWY&#13;&#10;qWQbsKTccwC9oKIkTJIXQOqpAgBzFjJ6SnHW0gAAAABJRU5ErkJggg==" xlink:actuate="onLoad"/>
<text x="832" y="28" clip-path="url(#clipPath112)" fill="black" stroke="none" xml:space="preserve">BRepMesh_FaceDiscret</text>
<line clip-path="url(#clipPath113)" fill="none" x1="794" x2="982" y1="36" y2="36" stroke="rgb(39,76,114)"/>
</g>
<g stroke-linecap="butt" font-size="11" fill="rgb(69,69,69)" font-family="'Segoe UI'" stroke-dasharray="5,5" stroke="rgb(69,69,69)" stroke-width="1.1">
<line clip-path="url(#clipPath114)" fill="none" x1="219" x2="375" y1="564" y2="622"/>
<image x="23" y="598" clip-path="url(#clipPath115)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="42" y="611" clip-path="url(#clipPath116)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;T, BaseClass-&gt;BRepMesh_SweepLineMeshAlgo</text>
<line clip-path="url(#clipPath117)" fill="none" x1="367" x2="375" y1="622" y2="622" stroke-dasharray="none"/>
<line clip-path="url(#clipPath117)" fill="none" x1="375" x2="369" y1="622" y2="617" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="661" x2="913" y1="981" y2="876"/>
<image x="829" y="909" clip-path="url(#clipPath118)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="848" y="922" clip-path="url(#clipPath119)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;RangeSplitter</text>
<line clip-path="url(#clipPath120)" fill="none" x1="908" x2="913" y1="881" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath120)" fill="none" x1="913" x2="905" y1="876" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="672" x2="672" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="672" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="466" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="405" y1="438" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="405" x2="405" y1="438" y2="420" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="757" x2="757" y1="1281" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="757" x2="885" y1="1241" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="885" x2="885" y1="1241" y2="1223" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="538" x2="253" y1="981" y2="876"/>
<image x="128" y="903" clip-path="url(#clipPath124)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="147" y="916" clip-path="url(#clipPath125)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;RangeSplitter</text>
<line clip-path="url(#clipPath126)" fill="none" x1="261" x2="253" y1="876" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath126)" fill="none" x1="253" x2="259" y1="876" y2="881" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="214" x2="214" y1="466" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="214" x2="405" y1="438" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="405" x2="405" y1="438" y2="420" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="600" x2="447" y1="564" y2="622"/>
<image x="435" y="598" clip-path="url(#clipPath127)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="454" y="611" clip-path="url(#clipPath128)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;T, BaseClass-&gt;BRepMesh_DelaunayBaseMeshAlgo</text>
<line clip-path="url(#clipPath129)" fill="none" x1="452" x2="447" y1="617" y2="622" stroke-dasharray="none"/>
<line clip-path="url(#clipPath129)" fill="none" x1="447" x2="455" y1="622" y2="622" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1009" x2="1009" y1="1414" y2="1397" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1009" x2="1009" y1="1397" y2="1397" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1009" x2="1009" y1="1397" y2="1379" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath130)" points=" 1009 1379 1013 1387 1005 1387" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath130)" points=" 1009 1379 1013 1387 1005 1387" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="428" x2="428" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="428" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1013" x2="1013" y1="1281" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1013" x2="885" y1="1241" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="885" x2="885" y1="1241" y2="1223" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="793" x2="734" y1="827" y2="827" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath131)" fill="none" x1="741" x2="734" y1="824" y2="827" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath131)" fill="none" x1="734" x2="741" y1="827" y2="830" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="218" x2="218" y1="778" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="218" x2="407" y1="738" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="407" x2="407" y1="738" y2="720" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="590" x2="590" y1="981" y2="876"/>
<image x="409" y="897" clip-path="url(#clipPath133)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="428" y="910" clip-path="url(#clipPath134)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;RangeSplitter</text>
<line clip-path="url(#clipPath135)" fill="none" x1="593" x2="590" y1="883" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath135)" fill="none" x1="590" x2="587" y1="876" y2="883" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="520" x2="823" y1="376" y2="376" stroke="rgb(136,136,136)"/>
<text x="667" y="372" clip-path="url(#clipPath136)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath137)" fill="none" x1="816" x2="823" y1="379" y2="376" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath137)" fill="none" x1="823" x2="816" y1="376" y2="373" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="176" x2="176" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="176" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="896" x2="896" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="896" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="601" x2="601" y1="778" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="601" x2="407" y1="738" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="407" x2="407" y1="738" y2="720" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="406" x2="406" y1="322" y2="288" stroke="rgb(136,136,136)"/>
<polygon fill="white" clip-path="url(#clipPath138)" points=" 406 288 410 296 402 296" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath138)" points=" 406 288 410 296 402 296" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1399" x2="1399" y1="346" y2="288" stroke="rgb(136,136,136)"/>
<polygon fill="white" clip-path="url(#clipPath139)" points=" 1399 288 1403 296 1395 296" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath139)" points=" 1399 288 1403 296 1395 296" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="793" x2="734" y1="827" y2="827" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath131)" fill="none" x1="741" x2="734" y1="824" y2="827" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath131)" fill="none" x1="734" x2="741" y1="827" y2="830" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1297" x2="1165" y1="398" y2="398" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath140)" fill="none" x1="1172" x2="1165" y1="395" y2="398" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath140)" fill="none" x1="1165" x2="1172" y1="398" y2="401" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="176" x2="176" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="176" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="428" x2="428" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="428" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="672" x2="672" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="672" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="896" x2="896" y1="1125" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="896" x2="602" y1="1097" y2="1097" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="1097" y2="1079" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath121)" points=" 602 1079 606 1087 598 1087" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="757" x2="757" y1="1281" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="757" x2="885" y1="1241" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="885" x2="885" y1="1241" y2="1223" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1013" x2="1013" y1="1281" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1013" x2="885" y1="1241" y2="1241" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="885" x2="885" y1="1241" y2="1223" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath123)" points=" 885 1223 889 1231 881 1231" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="538" x2="253" y1="981" y2="876"/>
<image x="128" y="903" clip-path="url(#clipPath124)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="147" y="916" clip-path="url(#clipPath125)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;RangeSplitter</text>
<line clip-path="url(#clipPath126)" fill="none" x1="261" x2="253" y1="876" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath126)" fill="none" x1="253" x2="259" y1="876" y2="881" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="590" x2="590" y1="981" y2="876"/>
<image x="409" y="897" clip-path="url(#clipPath133)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="428" y="910" clip-path="url(#clipPath134)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;RangeSplitter</text>
<line clip-path="url(#clipPath135)" fill="none" x1="593" x2="590" y1="883" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath135)" fill="none" x1="590" x2="587" y1="876" y2="883" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="661" x2="913" y1="981" y2="876"/>
<image x="829" y="909" clip-path="url(#clipPath118)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="848" y="922" clip-path="url(#clipPath119)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;RangeSplitter</text>
<line clip-path="url(#clipPath120)" fill="none" x1="908" x2="913" y1="881" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath120)" fill="none" x1="913" x2="905" y1="876" y2="876" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="828" x2="409" y1="108" y2="190" stroke="rgb(136,136,136)"/>
<text x="580" y="136" clip-path="url(#clipPath141)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath142)" fill="none" x1="415" x2="409" y1="186" y2="190" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath142)" fill="none" x1="409" x2="416" y1="190" y2="192" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="966" x2="1393" y1="108" y2="190" stroke="rgb(136,136,136)"/>
<text x="1141" y="142" clip-path="url(#clipPath143)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath144)" fill="none" x1="1386" x2="1393" y1="192" y2="190" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath144)" fill="none" x1="1393" x2="1387" y1="190" y2="186" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="406" x2="406" y1="322" y2="288" stroke="rgb(136,136,136)"/>
<polygon fill="white" clip-path="url(#clipPath138)" points=" 406 288 410 296 402 296" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath138)" points=" 406 288 410 296 402 296" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="214" x2="214" y1="466" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="214" x2="405" y1="438" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="405" x2="405" y1="438" y2="420" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="520" x2="823" y1="376" y2="376" stroke="rgb(136,136,136)"/>
<text x="667" y="372" clip-path="url(#clipPath136)" fill="black" stroke="none" xml:space="preserve">&lt;&lt;use&gt;&gt;</text>
<line clip-path="url(#clipPath137)" fill="none" x1="816" x2="823" y1="379" y2="376" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath137)" fill="none" x1="823" x2="816" y1="376" y2="373" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="602" y1="466" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="602" x2="405" y1="438" y2="438" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="405" x2="405" y1="438" y2="420" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath122)" points=" 405 420 409 428 401 428" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="600" x2="447" y1="564" y2="622"/>
<image x="435" y="598" clip-path="url(#clipPath127)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="454" y="611" clip-path="url(#clipPath128)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;T, BaseClass-&gt;BRepMesh_DelaunayBaseMeshAlgo</text>
<line clip-path="url(#clipPath129)" fill="none" x1="452" x2="447" y1="617" y2="622" stroke-dasharray="none"/>
<line clip-path="url(#clipPath129)" fill="none" x1="447" x2="455" y1="622" y2="622" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="219" x2="375" y1="564" y2="622"/>
<image x="23" y="598" clip-path="url(#clipPath115)" width="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhklEQVR42mNkIALo&#13;&#10;ebX+R+Zf2lbNCGMzEWMASENTbQhWOaIM2HD85v+65jUMCbF2DGSDvuWH/2PzDkGb&#13;&#10;CWlgoouzSQLEOBunF2jmbJCL8LoKl7NB4shRB6Nh4mAv4HI2TBzZFbAkDBJHNgTD&#13;&#10;2eguQncBjI1iCD5vYaPxasYWBsi2E6WZWAAAvauBMFaKJxwAAAAASUVORK5CYII=" xlink:type="simple" xlink:actuate="onLoad" height="16" preserveAspectRatio="none" xlink:show="embed"/>
<text x="42" y="611" clip-path="url(#clipPath116)" fill="black" stroke="none" xml:space="preserve">RangeSplitter-&gt;T, BaseClass-&gt;BRepMesh_SweepLineMeshAlgo</text>
<line clip-path="url(#clipPath117)" fill="none" x1="367" x2="375" y1="622" y2="622" stroke-dasharray="none"/>
<line clip-path="url(#clipPath117)" fill="none" x1="375" x2="369" y1="622" y2="617" stroke-dasharray="none"/>
<line clip-path="url(#clipPath114)" fill="none" x1="218" x2="218" y1="778" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="218" x2="407" y1="738" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="407" x2="407" y1="738" y2="720" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="601" x2="601" y1="778" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="601" x2="407" y1="738" y2="738" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="407" x2="407" y1="738" y2="720" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath132)" points=" 407 720 411 728 403 728" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1009" x2="1009" y1="1414" y2="1397" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1009" x2="1009" y1="1397" y2="1397" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<line clip-path="url(#clipPath114)" fill="none" x1="1009" x2="1009" y1="1397" y2="1379" stroke-dasharray="none" stroke="rgb(136,136,136)"/>
<polygon fill="white" stroke-dasharray="none" clip-path="url(#clipPath130)" points=" 1009 1379 1013 1387 1005 1387" stroke="none"/>
<polygon fill="none" stroke-dasharray="none" clip-path="url(#clipPath130)" points=" 1009 1379 1013 1387 1005 1387" stroke="rgb(136,136,136)"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -1383,7 +1383,7 @@ DRAW History support for the algorithms is provided by three basic commands:
* *modified*;
* *generated*.
For more information on the Draw History mechanism, refer to the corresponding chapter in the Draw users guide - @ref occt_draw_hist "History commands".
For more information on the Draw History mechanism please refer to the corresponding chapter in the Draw users guide - @ref occt_draw_hist "History commands".
@section occt_modalg_3 Standard Topological Objects
@@ -2055,7 +2055,7 @@ TopoDS_Solid R2 = BRepPrimAPI_MakeRevol(F,axis,ang);
@section occt_modalg_5 Boolean Operations
Boolean operations are used to create new shapes from the combinations of two groups of shapes.
Boolean operations are used to create new shapes from the combinations of two shapes.
| Operation | Result |
| :---- | :------ |
@@ -3103,44 +3103,15 @@ Learn more about SALOME platform on http://www.salome-platform.org
The algorithm of shape triangulation is provided by the functionality of *BRepMesh_IncrementalMesh* class, which adds a triangulation of the shape to its topological data structure. This triangulation is used to visualize the shape in shaded mode.
~~~~~
#include <IMeshData_Status.hxx>
#include <IMeshTools_Parameters.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
const Standard_Real aRadius = 10.0;
const Standard_Real aHeight = 25.0;
BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight);
TopoDS_Shape aShape = aCylinder.Shape();
const Standard_Real aLinearDeflection = 0.01;
const Standard_Real anAngularDeflection = 0.5;
Standard_Boolean meshing_explicit_parameters()
{
const Standard_Real aRadius = 10.0;
const Standard_Real aHeight = 25.0;
BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight);
TopoDS_Shape aShape = aCylinder.Shape();
const Standard_Real aLinearDeflection = 0.01;
const Standard_Real anAngularDeflection = 0.5;
BRepMesh_IncrementalMesh aMesher (aShape, aLinearDeflection, Standard_False, anAngularDeflection, Standard_True);
const Standard_Integer aStatus = aMesher.GetStatusFlags();
return !aStatus;
}
Standard_Boolean meshing_imeshtools_parameters()
{
const Standard_Real aRadius = 10.0;
const Standard_Real aHeight = 25.0;
BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight);
TopoDS_Shape aShape = aCylinder.Shape();
IMeshTools_Parameters aMeshParams;
aMeshParams.Deflection = 0.01;
aMeshParams.Angle = 0.5;
aMeshParams.Relative = Standard_False;
aMeshParams.InParallel = Standard_True;
aMeshParams.MinSize = Precision::Confusion();
aMeshParams.InternalVerticesMode = Standard_True;
aMeshParams.ControlSurfaceDeflection = Standard_True;
BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams);
const Standard_Integer aStatus = aMesher.GetStatusFlags();
return !aStatus;
}
BRepMesh_IncrementalMesh aMesh(aShape, aLinearDeflection, Standard_False, anAngularDeflection);
~~~~~
The default meshing algorithm *BRepMesh_IncrementalMesh* has two major options to define triangulation -- linear and angular deflections.
@@ -3151,9 +3122,9 @@ At the second step, the faces are tessellated. Linear deflection limits the dist
@figure{/user_guides/modeling_algos/images/modeling_algos_image056.png,"Deflection parameters of BRepMesh_IncrementalMesh algorithm",420}
There are additional options to control behavior of the meshing of face interior: *DeflectionInterior* and *AngleInterior*. *DeflectionInterior* limits the distance between triangles and the face interior. *AngleInterior* (used for tessellation of B-spline faces only) limits the angle between normals (N1, N2 and N3 in the picture) in the nodes of every link of the triangle. There is an exception for the links along the face boundary edges, "Angular Deflection" is used for them during edges discretization.
Linear deflection limits the distance between triangles and the face interior.
@figure{/user_guides/modeling_algos/images/modeling_algos_image057.png,"Linear and angular interior deflections",420}
@figure{/user_guides/modeling_algos/images/modeling_algos_image057.png,"Linear deflection",420}
Note that if a given value of linear deflection is less than shape tolerance then the algorithm will skip this value and will take into account the shape tolerance.
@@ -3167,100 +3138,6 @@ Meshing covers a shape with a triangular mesh. Other than hidden line removal, y
You can obtain information on the shape by first exploring it. To access triangulation of a face in the shape later, use *BRepTool::Triangulation*. To access a polygon, which is the approximation of an edge of the face, use *BRepTool::PolygonOnTriangulation*.
@subsection occt_modalg_11_3 BRepMesh Architecture
@subsubsection occt_modalg_11_3_1 Goals
The main goals of the chosen architecture are:
* Remove tight connections between data structures, auxiliary tools and algorithms to create an extensible solution, easy for maintenance and improvements;
* Separate the code among several functional units responsible for specific operation for the sake of simplification of debugging and readability;
* Introduce new data structures enabling the possibility to manipulate a discrete model of a particular entity (edge, wire, face) in order to perform computations locally instead of processing the entire model;
* Implement a new triangulation algorithm replacing the existing functionality that contains overcomplicated solutions that need to be moved to the upper level. In addition, provide the possibility to change the algorithm depending on surface type (initially to speed up meshing of planes).
@subsubsection occt_modalg_11_3_2 General workflow
@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_001.svg,"General workflow of BRepMesh component",500}
Generally, the workflow of the component can be divided into six parts:
* **Creation of model data structure**: source *TopoDS_Shape* passed to algorithm is analyzed and exploded into faces and edges. The reflection corresponding to each topological entity is created in the data model. Note that underlying algorithms use the data model as input and access it via a common interface which allows creating a custom data model with necessary dependencies between particular entities (see the paragraph "Data model interface");
* **Discretize edges 3D & 2D curves**: 3D curve as well as an associated set of 2D curves of each model edge is discretized in order to create a coherent skeleton used as a base in face meshing process. If an edge of the source shape already contains polygonal data which suits the specified parameters, it is extracted from the shape and stored in the model as is. Each edge is processed separately, the adjacency is not taken into account;
* **Heal discrete model**: the source *TopoDS_Shape* can contain problems, such as open wires or self-intersections, introduced during design, exchange or modification of model. In addition, some problems like self-intersections can be introduced by roughly discretized edges. This stage is responsible for analysis of a discrete model in order to detect and repair problems or to refuse further processing of a model part in case if a problem cannot be solved;
* **Preprocess discrete model**: defines actions specific to the implemented approach to be performed before meshing of faces. By default, this operation iterates over model faces, checks the consistency of existing triangulations and cleans topological faces and adjacent edges from polygonal data in case of inconsistency or marks a face of the discrete model as not required for the computation;
* **Discretize faces**: represents the core part performing mesh generation for a particular face based on 2D discrete data. This operation caches polygonal data associated with face edges in the data model for further processing and stores the generated mesh to *TopoDS_Face*;
* **Postprocess discrete model**: defines actions specific for the implemented approach to be performed after meshing of faces. By default, this operation stores polygonal data obtained at the previous stage to *TopoDS_Edge* objects of the source model.
@subsubsection occt_modalg_11_3_3 Common interfaces
The component structure contains two units: <i>IMeshData</i> (see Data model interface) and <i>IMeshTools</i>, defining common interfaces for the data model and algorithmic tools correspondingly. Class *IMeshTools_Context* represents a connector between these units. The context class caches the data model as well as the tools corresponding to each of six stages of the workflow mentioned above and provides methods to call the corresponding tool safely (designed similarly to *IntTools_Context* in order to keep consistency with OCCT core tools). All stages, except for the first one, use the data model as input and perform a specific action on the entire structure. Thus, API class *IMeshTools_ModelAlgo* is defined in order to unify the interface of tools manipulating the data model. Each tool supposed to process the data model should inherit this interface enabling the possibility to cache it in context. In contrast to others, the model builder interface is defined by another class *IMeshTools_ModelBuilder* due to a different meaning of the stage. The entry point starting the entire workflow is represented by *IMeshTools_MeshBuilder*.
The default implementation of *IMeshTools_Context* is given in *BRepMesh_Context* class initializing the context by instances of default algorithmic tools.
The factory interface *IMeshTools_MeshAlgoFactory* gives the possibility to change the triangulation algorithm for a specific surface. The factory returns an instance of the triangulation algorithm via *IMeshTools_MeshAlgo* interface depending on the type of surface passed as parameter. It is supposed to be used at the face discretization stage.
The default implementation of AlgoFactory is given in *BRepMesh_MeshAlgoFactory* returning algorithms of different complexity chosen according to the passed surface type. In its turn, it is used as the initializer of *BRepMesh_FaceDiscret* algorithm representing the starter of face discretization stage.
@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_002.svg,"Interface describing entry point to meshing workflow",500}
Remaining interfaces describe auxiliary tools:
* *IMeshTools_CurveTessellator*: provides a common interface to the algorithms responsible for creation of discrete polygons on 3D and 2D curves as well as tools for extraction of existing polygons from *TopoDS_Edge* allowing to obtain discrete points and the corresponding parameters on curve regardless of the implementation details (see examples of usage of derived classes *BRepMesh_CurveTessellator*, *BRepMesh_EdgeTessellationExtractor* in *BRepMesh_EdgeDiscret*);
* *IMeshTools_ShapeExplorer*: the last two interfaces represent visitor design pattern and are intended to separate iteration over elements of topological shape (edges and faces) from the operations performed on a particular element;
* *IMeshTools_ShapeVisitor*: provides a common interface for operations on edges and faces of the target topological shape. It can be used in couple with *IMeshTools_ShapeExplorer*. The default implementation available in *BRepMesh_ShapeVisitor* performs initialization of the data model. The advantage of such approach is that the implementation of *IMeshTools_ShapeVisitor* can be changed according to the specific data model whereas the shape explorer implementation remains the same.
@subsubsection occt_modalg_11_3_4 Create model data structure
The data structures intended to keep discrete and temporary data required by underlying algorithms are created at the first stage of the meshing procedure. Generally, the model represents dependencies between entities of the source topological shape suitable for the target task.
#### Data model interface
Unit <i>IMeshData</i> provides common interfaces specifying the data model API used on different stages of the entire workflow. Dependencies and references of the designed interfaces are given in the figure below. A specific interface implementation depends on the target application which allows the developer to implement different models and use custom low-level data structures, e.g. different collections, either <i>NCollection</i> or STL. *IMeshData_Shape* is used as the base class for all data structures and tools keeping the topological shape in order to avoid possible copy-paste.
The default implementation of interfaces is given in <i>BRepMeshData</i> unit. The main aim of the default data model is to provide features performing discretization of edges in a parallel mode. Thus, curve, pcurve and other classes are based on STL containers and smart-pointers as far as <i>NCollection</i> does not provide thread-safety for some cases (e.g. *NCollection_Sequence*). In addition, it closely reflects topology of the source shape, i.e. the number of edges in the data model is equal to the number of edges in the source model; each edge contains a set of pcurves associated with its adjacent faces which allows creation of discrete polygons for all pcurves or the 3D curve of a particular edge in a separate thread.
**Advantages**:
In case of necessity, the data model (probably with algorithms for its processing) can be easily substituted by another implementation supporting another kind of dependencies between elements.
An additional example of a different data model is the case when it is not required to create a mesh with discrete polygons synchronized between adjacent faces, i.e. in case of necessity to speed up creation of a rough per-face tessellation used for visualization or quick computation only (the approach used in *XDEDRAW_Props*).
@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_003.svg,"Common API of data model",500}
#### Collecting data model
At this stage the data model is filled by entities according to the topological structure of the source shape. A default implementation of the data model is given in <i>BRepMeshData</i> unit and represents the model as two sets: a set of edges and a set of faces. Each face consists of one or several wires, the first of which always represents the outer wire, while others are internal. In its turn, each wire depicts the ordered sequence of oriented edges. Each edge is characterized by a single 3D curve and zero (in case of free edge) or more 2D curves associated with faces adjacent to this edge. Both 3D and 2D curves represent a set of pairs point-parameter defined in 3D and 2D space of the reference face correspondingly. An additional difference between a curve and a pcurve is that the latter has a reference to the face it is defined for.
Model filler algorithm is represented by *BRepMesh_ShapeVisitor* class creating the model as a reflection to topological shape with help of *BRepMesh_ShapeExplorer* performing iteration over edges and faces of the target shape. Note that the algorithm operates on a common interface of the data model and creates a structure without any knowledge about the implementation details and underlying data structures. The entry point to collecting functionality is *BRepMesh_ModelBuilder* class.
@subsubsection occt_modalg_11_3_5 Discretize edges 3D & 2D curves
At this stage only the edges of the data model are considered. Each edge is processed separately (with the possibility to run processing in multiple threads). The edge is checked for existing polygonal data. In case if at least one representation exists and suits the meshing parameters, it is recuperated and used as reference data for tessellation of the whole set of pcurves as well as 3D curve assigned to the edge (see *BRepMesh_EdgeTessellationExtractor*). Otherwise, a new tessellation algorithm is created and used to generate the initial polygon (see *BRepMesh_CurveTessellator*) and the edge is marked as outdated. In addition, the model edge is updated by deflection as well as recomputed same range, same parameter and degeneracy parameters. See *BRepMesh_EdgeDiscret* for implementation details.
<i>IMeshData</i> unit defines interface *IMeshData_ParametersListArrayAdaptor*, which is intended to adapt arbitrary data structures to the *NCollection_Array1* container API. This solution is made to use both *NCollection_Array1* and *IMeshData_Curve* as the source for *BRepMesh_EdgeParameterProvider* tool intended to generate a consistent parametrization taking into account the same parameter property.
@subsubsection occt_modalg_11_3_6 Heal discrete model
In general, this stage represents a set of operations performed on the entire discrete model in order to resolve inconsistencies due to the problems caused by design, translation or rough discretization. A different sequence of operations can be performed depending on the target triangulation algorithm, e.g. there are different approaches to process self-intersections either to amplify edges discretization by decreasing the target precision or to split links at the intersection points. At this stage the whole set of edges is considered in aggregate and their adjacency is taken into account. A default implementation of the model healer is given in *BRepMesh_ModelHealer* which performs the following actions:
* Iterates over model faces and checks their wires for consistency, i.e. whether the wires are closed and do not contain self-intersections. The data structures are designed free of collisions, thus it is possible to run processing in a parallel mode;
* Forcibly connects the ends of adjacent edges in the parametric space, closing gaps between possible disconnected parts. The aim of this operation is to create a correct discrete model defined relatively to the parametric space of the target face taking into account connectivity and tolerances of 3D space only. This means that no specific computations are made to determine U and V tolerance;
* Registers intersections on edges forming the face shape. Two solutions are possible in order to resolve self-intersection:
* Decrease deflection of a particular edge and update its discrete model. After that the workflow "intersection check amplification" is repeated up to 5 times. As the result, target edges contain a finer tessellation and meshing continues or the face is marked by *IMeshData_SelfIntersectingWire* status and refused from further processing;
* Split target edges by intersection point and synchronize the updated polygon with curve and remaining pcurves associated to each edge. This operation presents a more robust solution comparing to the amplification procedure with a guaranteed result, but it is more difficult for implementation from the point of view of synchronization functionality.
@subsubsection occt_modalg_11_3_7 Preprocess discrete model
This stage implements actions to be performed before meshing of faces. Depending on target goals it can be changed or omitted. By default, *BRepMesh_ModelPreProcessor* implements the functionality checking topological faces for consistency of existing triangulation, i.e.: consistency with the target deflection parameter; indices of nodes referenced by triangles do not exceed the number of nodes stored in a triangulation. If the face fails some checks, it is cleaned from triangulation and its adjacent edges are cleaned from existing polygons. This does not affect a discrete model and does not require any recomputation as the model keeps tessellations for the whole set of edges despite consistency of their polygons.
@subsubsection occt_modalg_11_3_8 Discretize faces
Discretization of faces is the general part of meshing algorithm. At this stage edges tessellation data obtained and processed on previous steps is used to form contours of target faces and passed as input to the triangulation algorithm. Default implementation is provided by *BRepMesh_FaceDiscret* class which represents a starter for triangulation algorithm. It iterates over faces available in the data model, creates an instance of the triangulation algorithm according to the type of surface associated with each face via *IMeshTools_MeshAlgoFactory* and executes it. Each face is processed separately, thus it is possible to process faces in a parallel mode. The class diagram of face discretization is given in the figure below.
@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_004.svg,"Class diagram of face discrete stage",300}
In general, face meshing algorithms have the following structure:
* *BRepMesh_BaseMeshAlgo* implements *IMeshTools_MeshAlgo* interface and the base functionality for inherited algorithms. The main goal of this class is to initialize an instance of *BRepMesh_DataStructureOfDelaun* as well as auxiliary data structures suitable for nested algorithms using face model data passed as input parameter. Despite implementation of triangulation algorithm this structure is currently supposed as common for OCCT. However, the user is free to implement a custom algorithm and supporting data structure accessible via *IMeshTools_MeshAlgo* interface, e.g. to connect a 3-rd party meshing tool that does not support *TopoDS_Shape* out of box. For this, such structure provides the possibility to distribute connectors to various algorithms in the form of plugins;
* *BRepMesh_DelaunayBaseMeshAlgo* and *BRepMesh_SweepLineMeshAlgo* classes implement core meshing functionality operating directly on an instance of *BRepMesh_DataStructureOfDelaun*. The algorithms represent mesh generation tools adding new points from the data structure to the final mesh;
* *BRepMesh_NodeInsertionMeshAlgo* class represents a wrapper intended to extend the algorithm inherited from *BRepMesh_BaseMeshAlgo* to enable the functionality generating surface nodes and inserting them into the structure. On this level, an instance of the classification tool is created and can be used to accept-reject internal nodes. In addition, computations necessary for scaling UV coordinates of points relatively to the range specified for the corresponding direction are performed. As far as both triangulation algorithms work on static data provided by the structure, new nodes are added at the initialization stage. Surface nodes are generated by an auxiliary tool called range splitter and passed as template parameter (see Range splitter);
* Classes *BRepMesh_DelaunayNodeInsertionMeshAlgo* and *BRepMesh_SweepLineNodeInsertionMeshAlgo* implement algorithm-specific functionality related to addition of internal nodes supplementing functionality provided by *BRepMesh_NodeInsertionMeshAlgo*;
* *BRepMesh_DelaunayDeflectionControlMeshAlgo* extends functionality of *BRepMesh_DelaunayNodeInsertionMeshAlgo* by additional procedure controlling deflection of generated triangles.
#### Range splitter
Range splitter tools provide functionality to generate internal surface nodes defined within the range computed using discrete model data. The base functionality is provided by *BRepMesh_DefaultRangeSplitter* which can be used without modifications in case of planar surface. The default splitter does not generate any internal node.
*BRepMesh_ConeRangeSplitter*, *BRepMesh_CylinderRangeSplitter* and *BRepMesh_SphereRangeSplitter* are specializations of the default splitter intended for quick generation of internal nodes for the corresponding type of analytical surface.
*BRepMesh_UVParamRangeSplitter* implements base functionality taking discretization points of face border into account for node generation. Its successors BRepMesh_TorusRangeSplitter and *BRepMesh_NURBSRangeSplitter* extend the base functionality for toroidal and NURBS surfaces correspondingly.
@subsubsection occt_modalg_11_3_9 Postprocess discrete model
This stage implements actions to be performed after meshing of faces. Depending on target goals it can be changed or omitted. By default, *BRepMesh_ModelPostProcessor* commits polygonal data stored in the data model to *TopoDS_Edge*.
@section occt_modalg_defeaturing 3D Model Defeaturing
@@ -3295,7 +3172,7 @@ and the options available from base class (*BOPAlgo_Options*):
Note that the other options of the base class are not supported here and will have no effect.
<b>History support</b> allows tracking modification of the input shape in terms of Modified, IsDeleted and Generated. By default, the history is collected, but it is possible to disable it using the method *SetToFillHistory(false)*.
<b>History support</b> allows tracking modification of the input shape in terms of Modified, IsDeleted and Generated. By default, the history is collected, but it is possible to disable it using the method *TrackHistory(false)*.
On the low-level the history information is collected by the history tool *BRepTools_History*, which can be accessed through the method *BOPAlgo_RemoveFeatures::History()*.
<b>Error/Warning reporting system</b> allows obtaining the extended overview of the Errors/Warnings occurred during the operation. As soon as any error appears, the algorithm stops working. The warnings allow continuing the job and informing the user that something went wrong. The algorithm returns the following errors/warnings:
@@ -3304,7 +3181,7 @@ On the low-level the history information is collected by the history tool *BRepT
* *BOPAlgo_AlertUnableToRemoveTheFeature* - the warning alert is given to inform the user the removal of the feature is not possible. The algorithm will still try to remove the other features;
* *BOPAlgo_AlertRemoveFeaturesFailed* - the error alert is given in case if the operation was aborted by the unknown reason.
For more information on the error/warning reporting system, see the chapter @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide.
For more information on the error/warning reporting system please see the chapter @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide.
<b>Parallel processing mode</b> - allows running the algorithm in parallel mode obtaining the result faster.
@@ -3339,7 +3216,7 @@ BRepAlgoAPI_Defeaturing aDF; // Defeaturing algorithm
aDF.SetShape(aSolid); // Set the shape
aDF.AddFacesToRemove(aFaces); // Add faces to remove
aDF.SetRunParallel(bRunParallel); // Define the processing mode (parallel or single)
aDF.SetToFillHistory(isHistoryNeeded); // Define whether to track the shapes modifications
aDF.TrackHistory(isHistoryNeeded); // Define whether to track the shapes modifications
aDF.Build(); // Perform the operation
if (!aDF.IsDone()) // Check for the errors
{
@@ -3438,312 +3315,3 @@ Here are the few examples of defeaturing of the model containing boxes with blen
<td>@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im029.png,"Result",220}</td></td>
</tr>
</table>
@section occt_modalg_makeperiodic 3D Model Periodicity
Open CASCADE Technology provides tools for making an arbitrary 3D model (or just shape) periodic in 3D space in the specified directions.
Periodicity of the shape means that the shape can be repeated in any periodic direction any number of times without creation of the new geometry or splits.
The idea of this algorithm is to make the shape look similarly on the opposite sides or on the period bounds of periodic directions.
It does not mean that the opposite sides of the shape will be mirrored. It just means that the opposite sides of the shape should be split by each other and obtain the same geometry on opposite sides.
Such approach will allow repeating the shape, i.e. translating the copy of a shape on the period, without creation of new geometry because there will be no coinciding parts of different dimension.
For better understanding of what periodicity means lets create a simple prism and make it periodic.
The following draw script creates the L-shape prism with extensions 10x5x10:
~~~~
polyline p 0 0 0 0 0 10 5 0 10 5 0 5 10 0 5 10 0 0 0 0 0
mkplane f p
prism s f 0 5 0
~~~~
@figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im001.png,"Shape to make periodic",220}
Making this shape periodic in X, Y and Z directions with the periods matching the shape's extensions should make the splits of negative X and Z sides of the shape. The shape is already similar on opposite sides of Y directions, thus no new splits is expected.
Here is the shape after making it periodic:
@figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im002.png,"Periodic shape",220}
And here is the repetition of the shape once in X and Z directions:
@figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im003.png,"Repeated shape",220}
The OCCT Shape Periodicity tools also allows making the shape periodic with the period not matching the shape's extensions. Let's make the shape periodic with 11, 6 and 11 for X, Y, Z periods accordingly.
Such values of periods mean that there will be a gap between repeated shapes, and since during repetition the opposite sides do not touch the shape will not be split at all.
Here is the repetition of the shape once in X and Z directions:
@figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im004.png,"Repeated shape",220}
As expected, the shape is not split and the repeated elements do not touch.
If necessary the algorithm will trim the shape to fit into the requested period by splitting it with the planes limiting the shape's requested periods.
E.g. let's make the L-shape periodic only in X direction with the period 2 starting at X parameter 4:
@figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im005.png,"Periodic trimmed shape",220}
@subsection occt_modalg_makeperiodic_how_it_works How the shape is made periodic
For making the shape periodic in certain direction the algorithm performs the following steps:
* Creates the copy of the shape and moves it on the period into negative side of the requested direction;
* Splits the negative side of the shape by the moved copy, ensuring copying of the geometry from positive side to negative;
* Creates the copy of the shape (with already split negative side) and moves it on the period into the positive side of the requested direction;
* Splits the positive side of the shape by the moved copy, ensuring copying of the geometry from negative side to positive.
Repeated copying of the geometry ensures that the corner edges of the periodic shape will have the same geometry on opposite sides of all periodic directions.
Thus, in the periodic shape the geometry from positive side of the shape is always copied on the negative side of periodic directions.
@subsection occt_modalg_makeperiodic_association Opposite shapes association
The algorithm also associates the identical (or twin) shapes located on the opposite sides of the periodic shape. By the construction, the twin shapes should always have the same geometry and distanced from each other on the period.
It is possible that the shape does not have any twins. It means that when repeating this shape will not touch the opposite side of the shape. In the example when the periods of the shape are grater than its extensions, non of the sub-shapes has a twin.
@subsection occt_modalg_makeperiodic_repetition Periodic shape repetition
The algorithm also provides the methods to repeat the periodic shape in periodic directions. To repeat shape the algorithm makes the requested number of copies of the shape and translates them one by one on the time * period value.
After all copies are made and translated they are glued to have valid shape.
The subsequent repetitions are performed on the repeated shape, thus e.g. repeating the shape two times in any periodic direction will create result containing three shapes (original plus two copies).
Single subsequent repetition in any direction will result already in 6 shapes.
The repetitions can be cleared and started over.
@subsection occt_modalg_makeperiodic_history History support
The algorithm supports the history of shapes modifications, thus it is possible to track how the shapes have been changed to make it periodic and what new shapes have been created during repetitions.
Both split history and history of periodic shape repetition are available here. Note, that all repeated shapes are stored as generated into the history.
*BRepTools_History* is used for history support.
@subsection occt_modalg_makeperiodic_errors Errors/Warnings
The algorithm supports the Error/Warning reporting system which allows obtaining the extended overview of the errors and warning occurred during the operation.
As soon as any error appears the algorithm stops working. The warnings allow continuing the job, informing the user that something went wrong.
The algorithm returns the following alerts:
* *BOPAlgo_AlertNoPeriodicityRequired* - Error alert is given if no periodicity has been requested in any direction;
* *BOPAlgo_AlertUnableToTrim* - Error alert is given if the trimming of the shape for fitting it into requested period has failed;
* *BOPAlgo_AlertUnableToMakeIdentical* - Error alert is given if splitting of the shape by its moved copies has failed;
* *BOPAlgo_AlertUnableToRepeat* - Warning alert is given if the gluing of the repeated shapes has failed.
For more information on the error/warning reporting system please see the chapter @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide.
@subsection occt_modalg_makeperiodic_usage Usage
The algorithm is implemented in the class *BOPAlgo_MakePeriodic*.
Here is the example of its usage on the API level:
~~~~
TopoDS_Shape aShape = ...; // The shape to make periodic
Standard_Boolean bMakeXPeriodic = ...; // Flag for making or not the shape periodic in X direction
Standard_Real aXPeriod = ...; // X period for the shape
Standard_Boolean isXTrimmed = ...; // Flag defining whether it is necessary to trimming
// the shape to fit to X period
Standard_Real aXFirst = ...; // Start of the X period
// (really necessary only if the trimming is requested)
Standard_Boolean bRunParallel = ...; // Parallel processing mode or single
BOPAlgo_MakePeriodic aPeriodicityMaker; // Periodicity maker
aPeriodicityMaker.SetShape(aShape); // Set the shape
aPeriodicityMaker.MakeXPeriodic(bMakePeriodic, aXPeriod); // Making the shape periodic in X direction
aPeriodicityMaker.SetTrimmed(isXTrimmed, aXFirst); // Trim the shape to fit X period
aPeriodicityMaker.SetRunParallel(bRunParallel); // Set the parallel processing mode
aPeriodicityMaker.Perform(); // Performing the operation
if (aPeriodicityMaker.HasErrors()) // Check for the errors
{
// errors treatment
Standard_SStream aSStream;
aPeriodicityMaker.DumpErrors(aSStream);
return;
}
if (aPeriodicityMaker.HasWarnings()) // Check for the warnings
{
// warnings treatment
Standard_SStream aSStream;
aPeriodicityMaker.DumpWarnings(aSStream);
}
const TopoDS_Shape& aPeriodicShape = aPeriodicityMaker.Shape(); // Result periodic shape
aPeriodicityMaker.XRepeat(2); // Making repetitions
const TopoDS_Shape& aRepeat = aPeriodicityMaker.RepeatedShape(); // Getting the repeated shape
aPeriodicityMaker.ClearRepetitions(); // Clearing the repetitions
~~~~
Please note, that the class is based on the options class *BOPAlgo_Options*, which provides the following options for the algorithm:
* Error/Warning reporting system;
* Parallel processing mode.
The other options of the base class are not supported here and will have no effect.
All the history information obtained during the operation is stored into *BRepTools_History* object and available through *History()* method:
~~~~
// Get the history object
const Handle(BRepTools_History)& BOPAlgo_MakePeriodic::History();
~~~~
For the usage of the MakePeriodic algorithm on the Draw level the following commands have been implemented:
* **makeperiodic**
* **repeatshape**
* **periodictwins**
* **clearrepetitions**
For more details on the periodicity commands please refer the @ref occt_draw_makeperiodic "Periodicity commands" of the Draw test harness user guide.
To track the history of a shape modification during MakePeriodic operation the @ref occt_draw_hist "standard history commands" can be used.
To have possibility to access the error/warning shapes of the operation use the *bdrawwarnshapes* command before running the algorithm (see command usage in the @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide).
@subsection occt_modalg_makeperiodic_examples Examples
Imagine that you need to make the drills in the plate on the same distance from each other. To model this process it is necessary to make a lot of cylinders (simulating the drills) and cut these cylinders from the plate.
With the periodicity tool, the process looks very simple:
~~~~
# create plate 100 x 100
box plate -50 -50 0 100 100 1
# create a single drill with radius 1
pcylinder drill 1 1
# locate the drill in the left corner
ttranslate drill -48 -48 0
# make the drill periodic with 4 as X and Y periods, so the distance between drills will be 2
makeperiodic drill drill -x 4 -trim -50 -y 4 -trim -50
# repeat the drill to fill the plate, in result we get net of 25 x 25 drills
repeatshape drills -x 24 -y 24
# cut the drills from the plate
bcut result plate drills
~~~~
@figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im006.png,"Plate with drills",220}
@section occt_modalg_makeconnected Making touching shapes connected
Open CASCADE Technology provides tools for making the same-dimensional touching shapes connected (or glued), i.e. for making the coinciding geometries topologically shared among shapes.
To make the shapes connected they are glued by the means of @ref occt_algorithms_7 "General Fuse algorithm". The option BOPAlgo_GlueShift is used, thus if the input shapes have been interfering the algorithm will be unable to recognize this.
Making the group of shapes connected can be useful e.g. before meshing the group. It will allow making the resulting mesh conformal.
The algorithm for making the shapes connected is implemented in the class *BOPAlgo_MakeConnected*.
@subsection occt_modalg_makeconnected_materials Material association
In frames of this tool the input shapes are called materials, and each input shape has a unique material.
After making the shapes connected, the border elements of the input shapes are associated with the shapes to which they belong. At that, the orientation of the border elements in the shape is taken into account.
The associations are made for the following types:
* For input SOLIDS the resulting FACES are associated with the input solids;
* For input FACES the resulting EDGES are associated with the input faces;
* For input EDGES the resulting VERTICES are associated with the input edges.
The association process is called the material association. It allows finding the coinciding elements for the opposite input shapes. These elements will be associated to at least two materials (one on the positive side of the shape, the other - on negative).
For obtaining the material information the following methods should be used
* *MaterialsOnPositiveSide()* - returns the original shapes (materials) located on the positive side of the given shape (i.e. with FORWARD orientation);
* *MaterialsOnNegativeSide()* - returns the original shapes (materials) located on the negative side of the given shape (i.e. with REVERSED orientation);
~~~~
// Returns the original shapes which images contain the given shape with FORWARD orientation.
const TopTools_ListOfShape& BOPAlgo_MakeConnected::MaterialsOnPositiveSide(const TopoDS_Shape& theS)
// Returns the original shapes which images contain the given shape with REVERSED orientation.
const TopTools_ListOfShape& BOPAlgo_MakeConnected::MaterialsOnNegativeSide(const TopoDS_Shape& theS)
~~~~
@subsection occt_modalg_makeconnected_makeperiodic Making connected shape periodic
The tool provides possibility to make the connected shape @ref occt_modalg_makeperiodic "periodic".
Since by making the shape periodic it ensures that the geometry of coinciding shapes on the opposite sides will be the same it allows reusing the mesh of the shape for its periodic twins.
After making the shape periodic the material associations are updated to correspond to the actual state of the result shape. Repetition of the periodic shape is also possible from here. Material associations are not going to be lost.
@subsection occt_modalg_makeconnected_history History support
The algorithm supports history of shapes modifications during the operation. Additionally to standard history method provided by *BRepTools_History* and used here as a history tool, the algorithm also provides the method to track the back connection - from resulting shapes to the input ones.
The method is called *GetOrigins()*:
~~~~
// Returns the list of original shapes from which the current shape has been created.
const TopTools_ListOfShape& BOPAlgo_MakeConnected::GetOrigins(const TopoDS_Shape& theS);
~~~~
Both Gluing history and history of making the shape periodic and periodic shape repetition are available here. Note, that all repeated shapes are stored as generated into the history.
@subsection occt_modalg_makeconnected_errors Errors/Warnings
The algorithm supports the Error/Warning reporting system which allows obtaining the extended overview of the errors and warning occurred during the operation.
As soon as any error appears the algorithm stops working. The warnings allow continuing the job, informing the user that something went wrong.
The algorithm returns the following alerts:
* *BOPAlgo_AlertTooFewArguments* - error alert is given on the attempt to run the algorithm without the arguments;
* *BOPAlgo_AlertMultiDimensionalArguments* - error alert is given on the attempt to run the algorithm on multi-dimensional arguments;
* *BOPAlgo_AlertUnableToGlue* - error alert is given if the gluer algorithm is unable to glue the given arguments;
* *BOPAlgo_AlertUnableToMakePeriodic* - warning alert is given if the periodicity maker is unable to make the connected shape periodic with given options;
* *BOPAlgo_AlertShapeIsNotPeriodic* - warning alert is given on the attempt to repeat the shape before making it periodic.
For more information on the error/warning reporting system please see the chapter @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide.
@subsection occt_modalg_makeconnected_usage Usage
Here is the example of usage of the *BOPAlgo_MakePeriodic* algorithm on the API level:
~~~~
TopTools_ListOfShape anArguments = ...; // Shapes to make connected
Standard_Boolean bRunParallel = ...; // Parallel processing mode
BOPAlgo_MakeConnected aMC; // Tool for making the shapes connected
aMC.SetArguments(anArguments); // Set the shapes
aMC.SetRunParallel(bRunParallel); // Set parallel processing mode
aMC.Perform(); // Perform the operation
if (aMC.HasErrors()) // Check for the errors
{
// errors treatment
Standard_SStream aSStream;
aMC.DumpErrors(aSStream);
return;
}
if (aMC.HasWarnings()) // Check for the warnings
{
// warnings treatment
Standard_SStream aSStream;
aMC.DumpWarnings(aSStream);
}
const TopoDS_Shape& aGluedShape = aMC.Shape(); // Connected shape
// Checking material associations
TopAbs_ShapeEnum anElemType = ...; // Type of border element
TopExp_Explorer anExp(anArguments.First(), anElemType);
for (; anExp.More(); anExp.Next())
{
const TopoDS_Shape& anElement = anExp.Current();
const TopTools_ListOfShape& aNegativeM = aMC.MaterialsOnNegativeSide(anElement);
const TopTools_ListOfShape& aPositiveM = aMC.MaterialsOnPositiveSide(anElement);
}
// Making the connected shape periodic
BOPAlgo_MakePeriodic::PeriodicityParams aParams = ...; // Options for periodicity of the connected shape
aMC.MakePeriodic(aParams);
// Shape repetition after making it periodic
// Check if the shape has been made periodic successfully
if (aMC.PeriodicityTool().HasErrors())
{
// Periodicity maker error treatment
}
// Shape repetition in periodic directions
aMC.RepeatShape(0, 2);
const TopoDS_Shape& aShape = aMC.PeriodicShape(); // Periodic and repeated shape
~~~~
Please note, that the class is based on the options class *BOPAlgo_Options*, which provides the following options for the algorithm:
* Error/Warning reporting system;
* Parallel processing mode.
The other options of the base class are not supported here and will have no effect.
All the history information obtained during the operation is stored into *BRepTools_History* object and available through *History()* method:
~~~~
// Get the history object
const Handle(BRepTools_History)& BOPAlgo_MakeConnected::History();
~~~~
For the usage of the MakeConnected algorithm on the Draw level the following commands have been implemented:
* **makeconnected**
* **cmaterialson**
* **cmakeperiodic**
* **crepeatshape**
* **cperiodictwins**
* **cclearrepetitions**
For more details on the connexity commands please refer the @ref occt_draw_makeconnected "MakeConnected commands" of the Draw test harness user guide.
To track the history of a shape modification during MakeConnected operation the @ref occt_draw_hist "standard history commands" can be used.
To have possibility to access the error/warning shapes of the operation use the *bdrawwarnshapes* command before running the algorithm (see command usage in the @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide).

View File

@@ -1166,7 +1166,7 @@ Thus for a contour of four edges it should count 1 wire + 4 edges +4 vertices wi
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Note** For more details about Maps, refer to the *TCollection* documentation (Foundation Classes Reference Manual).
**Note** For more details about Maps please, refer to the TCollection documentation. (Foundation Classes Reference Manual)
The following example is more ambitious and writes a program which copies a data structure using an *IndexedMap*. The copy is an identical structure but it shares nothing with the original. The principal algorithm is as follows:
- All Shapes in the structure are put into an *IndexedMap*.

View File

@@ -50,7 +50,7 @@ Each sub-domain has its own scope of functionality:
* customization -- modifying shape representation to fit specific needs (shape is not modified, only the form of its representation is modified);
* processing -- mechanism of managing shape modification via a user-editable resource file.
Message management is used for creating messages, filling them with various parameters and storing them in the trace file. This tool provides functionality for attaching messages to the shapes for deferred analysis of various run-time events. In this document only general principles of using Shape Healing will be described. For more detailed information, see the corresponding header files.
Message management is used for creating messages, filling them with various parameters and storing them in the trace file. This tool provides functionality for attaching messages to the shapes for deferred analysis of various run-time events. In this document only general principles of using Shape Healing will be described. For more detailed information please see the corresponding header files.
Tools responsible for analysis, fixing and upgrading of shapes can give the information about how these operations were performed. This information can be obtained by the user with the help of mechanism of status querying.

View File

@@ -62,7 +62,7 @@ To choose a translation mode when exporting to a STEP format, use <i> STEPContro
There is a set of parameters that concern the translation and can be set before the beginning of the translation.
**Note** :
Please, note:
* a STEP model is a STEP file that has been loaded into memory;
* all references to shapes indicate OCCT shapes unless otherwise explicitly stated;
* a root entity is the highest level entity of any given type, i.e. an entity that is not referenced by any other one.
@@ -275,7 +275,7 @@ Default value is File
These two parameters define the name of the resource file and the name of the sequence of operators (defined in that file) for Shape Processing, which is automatically performed by the STEP translator. Shape Processing is a user-configurable step, which is performed after translation and consists in applying a set of operators to a resulting shape. This is a very powerful tool allowing customizing the shape and adapting it to the needs of a receiving application. By default the sequence consists of a single operator ShapeFix -- that is how Shape Healing is called from the STEP translator.
Find an example of the resource file for STEP (which defines parameters corresponding to the sequence applied by default, i.e. if the resource file is not found) in the Open CASCADE Technology sources by the path <i>%CASROOT%/src/XSTEPResource/STEP</i>.
Please find an example of the resource file for STEP (which defines parameters corresponding to the sequence applied by default, i.e. if the resource file is not found) in the Open CASCADE Technology installation, by the path <i>%CASROOT%/src/XSTEPResource/STEP</i>.
In order for the STEP translator to use that file, you have to define the *CSF_STEPDefaults* environment variable, which should point to the directory where the resource file resides. Note that if you change parameter *read.step.resource.name*, you will change the name of the resource file and the environment variable correspondingly.
@@ -543,7 +543,7 @@ Standard_Boolean ok = reader.TransferEntity (ent);
~~~~~
@subsection occt_step_2_4 Mapping STEP entities to Open CASCADE Technology shapes
Tables given in this paragraph show the mapping of STEP entities to OCCT objects. Only topological and geometrical STEP entities and entities defining assembly structures are described in this paragraph. For a full list of STEP entities, refer to Appendix A.
Tables given in this paragraph show the mapping of STEP entities to OCCT objects. Only topological and geometrical STEP entities and entities defining assembly structures are described in this paragraph. For a full list of STEP entities please refer to Appendix A.
@subsubsection occt_step_2_4_1 Assembly structure representation entities
Not all entities defining the assembly structure in the STEP file are translated to OCCT shapes, but they are used to identify the relationships between assemblies and their components. Since the graph of `natural' dependencies of entities based on direct references between them does not include the references from assemblies to their components, these dependencies are introduced in addition to the former ones. This is made basing on the analysis of the following entities describing the structure of the assembly.
@@ -792,7 +792,7 @@ The shapes organized in a structure of nested compounds can be translated either
The assembly structure placed in the produced STEP file corresponds to the structure described in the ProSTEP Agreement Log (item 21) as the second alternative (assembly structure through *representation_relationship* / *item_defined_transformation*). To represent an assembly it uses entities of the *representation_relationship_with_transformation* type. Transformation operators used for locating assembly components are represented by *item_defined_transformation* entities.
If mode *write.step.assembly* is set to the values *ON* or *Auto* then an OCC shape consisting of nested compounds will be written as an assembly, otherwise it will be written as separate solids.
See also @ref occt_step_3_4 "Mapping OCCT shapes to STEP entities".
Please see also @ref occt_step_3_4 "Mapping OCCT shapes to STEP entities".
@subsection occt_step_3_3 Description of the process
@subsubsection occt_step_3_3_1 Initializing the process
@@ -969,7 +969,7 @@ IFSelect_ReturnStatus stat = writer.Write("filename.stp");
to give the file name.
@subsection occt_step_3_4 Mapping Open CASCADE Technology shapes to STEP entities
Only STEP entities that have a corresponding OCCT object and mapping of assembly structures are described in this paragraph. For a full list of STEP entities, refer to Appendix A.
Only STEP entities that have a corresponding OCCT object and mapping of assembly structures are described in this paragraph. For a full list of STEP entities please refer to Appendix A.
@subsubsection occt_step_3_4_1 Assembly structures and product information
The assembly structures are written to the STEP file if parameter *write.step.assembly* is 1 or 2.
@@ -1607,7 +1607,7 @@ Geometric validation properties, such as volume, area and centroid, which are at
### Geometric dimensions and tolerances
All entities, which can be imported from STEP, can be exported too.
See the same item in section @ref occt_step_7_1 "Reading from STEP" to find more information.
Please see the same item in section @ref occt_step_7_1 "Reading from STEP" to find more information.
Note: OCCT use AP214 by default, so for GD&T exporting AP242 should be set manually:
~~~~~

View File

@@ -1079,7 +1079,7 @@ aMesh->AddBuilder (aBuilder, true);
The dynamic selection represents the topological shape, which you want to select, by decomposition of *sensitive primitives* -- the sub-parts of the shape that will be detected and highlighted. The sets of these primitives are handled by the powerful three-level BVH tree selection algorithm.
For more details on the algorithm and examples of usage, refer to @ref occt_visu_2_2 "Selection" chapter.
For more details on the algorithm and examples of usage, please, refer to @ref occt_visu_2_2 "Selection" chapter.
@section occt_visu_4 3D Presentations
@@ -1793,11 +1793,12 @@ Create facet attributes.
Handle(Graphic3d_AspectFillArea3d) aFaceAspect = new Graphic3d_AspectFillArea3d();
Graphic3d_MaterialAspect aBrassMaterial (Graphic3d_NOM_BRASS);
Graphic3d_MaterialAspect aGoldMaterial (Graphic3d_NOM_GOLD);
aFaceAspect->SetInteriorStyle (Aspect_IS_SOLID_WIREFRAME);
aFaceAspect->SetInteriorStyle (Aspect_IS_SOLID);
aFaceAspect->SetInteriorColor (aMyColor);
aFaceAspect->SetDistinguishOn ();
aFaceAspect->SetFrontMaterial (aGoldMaterial);
aFaceAspect->SetBackMaterial (aBrassMaterial);
aFaceAspect->SetEdgeOn();
~~~~~
Create text attributes.

View File

@@ -46,7 +46,6 @@
#pragma comment(lib, "TKSTEP.lib")
#pragma comment(lib, "TKStl.lib")
#pragma comment(lib, "TKVrml.lib")
#pragma comment(lib, "TKLCAF.lib")
//! Auxiliary tool for converting C# string into UTF-8 string.
static TCollection_AsciiString toAsciiString (String^ theString)

View File

@@ -54,7 +54,6 @@
#pragma comment(lib, "TKSTEP.lib")
#pragma comment(lib, "TKStl.lib")
#pragma comment(lib, "TKVrml.lib")
#pragma comment(lib, "TKLCAF.lib")
#pragma comment(lib, "D3D9.lib")

View File

@@ -1,68 +0,0 @@
cmake_minimum_required(VERSION 3.2)
project(glfw-occt-demo)
set(CMAKE_CXX_STANDARD 11)
set(APP_VERSION_MAJOR 1)
set(APP_VERSION_MINOR 0)
set(APP_TARGET glfwocct)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})
file(GLOB SOURCES
*.h
*.cpp
)
source_group ("Headers" FILES
GlfwOcctView.h
GlfwOcctWindow.h)
source_group ("Sources" FILES
GlfwOcctView.cpp
GlfwOcctWindow.cpp
main.cpp)
# OpenGL
find_package(OpenGL REQUIRED)
# Open CASCADE Technology
find_package(OpenCASCADE REQUIRED NO_DEFAULT_PATH)
if (OpenCASCADE_FOUND)
message (STATUS "Using OpenCASCADE from \"${OpenCASCADE_DIR}\"" )
INCLUDE_DIRECTORIES(${OpenCASCADE_INCLUDE_DIR})
LINK_DIRECTORIES(${OpenCASCADE_LIBRARY_DIR})
else()
message (WARNING "Could not find OpenCASCADE, please set OpenCASCADE_DIR variable." )
set (OCCT_LIBRARY_DIR)
set (OCCT_BIN_DIR)
endif()
SET(OpenCASCADE_LIBS
TKernel
TKService
TKV3d
TKOpenGl
TKBRep
TKGeomBase
TKGeomAlgo
TKG3d
TKG2d
TKTopAlgo
TKPrim
)
# glfw
find_package(glfw3 REQUIRED)
if (glfw3_FOUND)
message (STATUS "Using glfw3 ${glfw3_VERSION}" )
INCLUDE_DIRECTORIES(${GLFW_INCLUDE_DIRS})
LINK_DIRECTORIES(${GLFW_LIBRARY_DIRS})
else()
message (STATUS "glfw3 is not found." )
endif()
add_executable(${APP_TARGET} ${SOURCES})
target_link_libraries(
${APP_TARGET}
${OpenCASCADE_LIBS}
glfw
${OPENGL_LIBRARIES}
)

View File

@@ -1,324 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of the examples of the Open CASCADE Technology software library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
#include "GlfwOcctView.h"
#include <AIS_Shape.hxx>
#include <Aspect_Handle.hxx>
#include <Aspect_DisplayConnection.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepPrimAPI_MakeCone.hxx>
#include <Message.hxx>
#include <Message_Messenger.hxx>
#include <OpenGl_GraphicDriver.hxx>
#include <TopAbs_ShapeEnum.hxx>
#include <iostream>
#include <GLFW/glfw3.h>
// ================================================================
// Function : GlfwOcctView
// Purpose :
// ================================================================
GlfwOcctView::GlfwOcctView()
: myCurAction3d (CurAction3d_Nothing),
myToRedraw (true)
{
}
// ================================================================
// Function : ~GlfwOcctView
// Purpose :
// ================================================================
GlfwOcctView::~GlfwOcctView()
{
}
// ================================================================
// Function : toView
// Purpose :
// ================================================================
GlfwOcctView* GlfwOcctView::toView (GLFWwindow* theWin)
{
return static_cast<GlfwOcctView*>(glfwGetWindowUserPointer (theWin));
}
// ================================================================
// Function : errorCallback
// Purpose :
// ================================================================
void GlfwOcctView::errorCallback (int theError, const char* theDescription)
{
Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error") + theError + ": " + theDescription, Message_Fail);
}
// ================================================================
// Function : run
// Purpose :
// ================================================================
void GlfwOcctView::run()
{
initWindow (800, 600, "glfw occt");
initViewer();
initDemoScene();
if (myView.IsNull())
{
return;
}
myView->MustBeResized();
myOcctWindow->Map();
mainloop();
cleanup();
}
// ================================================================
// Function : initWindow
// Purpose :
// ================================================================
void GlfwOcctView::initWindow (int theWidth, int theHeight, const char* theTitle)
{
glfwSetErrorCallback (GlfwOcctView::errorCallback);
glfwInit();
const bool toAskCoreProfile = true;
if (toAskCoreProfile)
{
glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 3);
#if defined (__APPLE__)
glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}
myOcctWindow = new GlfwOcctWindow (theWidth, theHeight, theTitle);
glfwSetWindowUserPointer (myOcctWindow->getGlfwWindow(), this);
// window callback
glfwSetWindowSizeCallback (myOcctWindow->getGlfwWindow(), GlfwOcctView::onResizeCallback);
glfwSetFramebufferSizeCallback (myOcctWindow->getGlfwWindow(), GlfwOcctView::onFBResizeCallback);
// mouse callback
glfwSetScrollCallback (myOcctWindow->getGlfwWindow(), GlfwOcctView::onMouseScrollCallback);
glfwSetMouseButtonCallback (myOcctWindow->getGlfwWindow(), GlfwOcctView::onMouseButtonCallback);
glfwSetCursorPosCallback (myOcctWindow->getGlfwWindow(), GlfwOcctView::onMouseMoveCallback);
}
// ================================================================
// Function : initViewer
// Purpose :
// ================================================================
void GlfwOcctView::initViewer()
{
if (myOcctWindow.IsNull()
|| myOcctWindow->getGlfwWindow() == nullptr)
{
return;
}
Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver (myOcctWindow->GetDisplay(), false);
Handle(V3d_Viewer) aViewer = new V3d_Viewer (aGraphicDriver);
aViewer->SetDefaultLights();
aViewer->SetLightOn();
aViewer->SetDefaultTypeOfView (V3d_PERSPECTIVE);
aViewer->ActivateGrid (Aspect_GT_Rectangular, Aspect_GDM_Lines);
myView = aViewer->CreateView();
myView->SetImmediateUpdate (false);
myView->SetWindow (myOcctWindow, myOcctWindow->NativeGlContext());
myView->ChangeRenderingParams().ToShowStats = true;
myContext = new AIS_InteractiveContext (aViewer);
}
// ================================================================
// Function : initDemoScene
// Purpose :
// ================================================================
void GlfwOcctView::initDemoScene()
{
if (myContext.IsNull())
{
return;
}
myView->TriedronDisplay (Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD, 0.08, V3d_WIREFRAME);
gp_Ax2 anAxis;
anAxis.SetLocation (gp_Pnt (0.0, 0.0, 0.0));
Handle(AIS_Shape) aBox = new AIS_Shape (BRepPrimAPI_MakeBox (anAxis, 50, 50, 50).Shape());
myContext->Display (aBox, AIS_Shaded, 0, false);
anAxis.SetLocation (gp_Pnt (25.0, 125.0, 0.0));
Handle(AIS_Shape) aCone = new AIS_Shape (BRepPrimAPI_MakeCone (anAxis, 25, 0, 50).Shape());
myContext->Display (aCone, AIS_Shaded, 0, false);
TCollection_AsciiString aGlInfo;
{
TColStd_IndexedDataMapOfStringString aRendInfo;
myView->DiagnosticInformation (aRendInfo, Graphic3d_DiagnosticInfo_Basic);
for (TColStd_IndexedDataMapOfStringString::Iterator aValueIter (aRendInfo); aValueIter.More(); aValueIter.Next())
{
if (!aGlInfo.IsEmpty()) { aGlInfo += "\n"; }
aGlInfo += TCollection_AsciiString(" ") + aValueIter.Key() + ": " + aValueIter.Value();
}
}
Message::DefaultMessenger()->Send (TCollection_AsciiString("OpenGL info:\n") + aGlInfo, Message_Info);
}
// ================================================================
// Function : mainloop
// Purpose :
// ================================================================
void GlfwOcctView::mainloop()
{
while (!glfwWindowShouldClose (myOcctWindow->getGlfwWindow()))
{
// glfwPollEvents() for continuous rendering (immediate return if there are no new events)
// and glfwWaitEvents() for rendering on demand (something actually happened in the viewer)
//glfwPollEvents();
glfwWaitEvents();
if (!myView.IsNull())
{
if (myView->IsInvalidated())
{
myView->Redraw();
}
else if (myToRedraw)
{
myView->RedrawImmediate();
}
myToRedraw = false;
}
}
}
// ================================================================
// Function : cleanup
// Purpose :
// ================================================================
void GlfwOcctView::cleanup()
{
if (!myView.IsNull())
{
myView->Remove();
}
if (!myOcctWindow.IsNull())
{
myOcctWindow->Close();
}
glfwTerminate();
}
// ================================================================
// Function : onResize
// Purpose :
// ================================================================
void GlfwOcctView::onResize (int theWidth, int theHeight)
{
if (theWidth != 0
&& theHeight != 0
&& !myView.IsNull())
{
myView->Window()->DoResize();
myView->MustBeResized();
myView->Invalidate();
myView->Redraw();
//myToRedraw = true;
}
}
// ================================================================
// Function : onMouseScroll
// Purpose :
// ================================================================
void GlfwOcctView::onMouseScroll (double theOffsetX, double theOffsetY)
{
if (myView.IsNull()) { return; }
const Graphic3d_Vec2i aPos = myOcctWindow->CursorPosition();
myView->StartZoomAtPoint (aPos.x(), aPos.y());
myView->ZoomAtPoint (0, 0, int(theOffsetY * 4.0), int(theOffsetY * 4.0));
myView->Invalidate();
myToRedraw = true;
}
// ================================================================
// Function : onMouseButton
// Purpose :
// ================================================================
void GlfwOcctView::onMouseButton (int theButton, int theAction, int theMods)
{
if (myView.IsNull()) { return; }
const Graphic3d_Vec2i aPos = myOcctWindow->CursorPosition();
if (theAction != GLFW_PRESS)
{
myCurAction3d = CurAction3d_Nothing;
return;
}
myMouseMin = aPos;
myMouseMax = aPos;
switch (theButton)
{
case GLFW_MOUSE_BUTTON_RIGHT:
{
myCurAction3d = CurAction3d_DynamicRoation;
myView->StartRotation (aPos.x(), aPos.y());
break;
}
case GLFW_MOUSE_BUTTON_MIDDLE:
{
myCurAction3d = CurAction3d_DynamicPanning;
break;
}
}
}
// ================================================================
// Function : onMouseMove
// Purpose :
// ================================================================
void GlfwOcctView::onMouseMove (int thePosX, int thePosY)
{
if (myView.IsNull()) { return; }
switch (myCurAction3d)
{
case CurAction3d_DynamicRoation:
{
myView->Rotation (thePosX, thePosY);
myView->Invalidate();
myToRedraw = true;
break;
}
case CurAction3d_DynamicPanning:
{
myView->Pan (thePosX - myMouseMax.x(), -(thePosY - myMouseMax.y()));
myView->Invalidate();
myToRedraw = true;
myMouseMax.SetValues (thePosX, thePosY);
break;
}
default:
{
myContext->MoveTo (thePosX, thePosY, myView, false);
myToRedraw = true;
break;
}
}
}

View File

@@ -1,125 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of the examples of the Open CASCADE Technology software library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
#ifndef _GlfwOcctView_Header
#define _GlfwOcctView_Header
#include "GlfwOcctWindow.h"
#include <AIS_InteractiveContext.hxx>
#include <V3d_View.hxx>
//! Sample class creating 3D Viewer within GLFW window.
class GlfwOcctView
{
public:
enum CurAction3d
{
CurAction3d_Nothing,
CurAction3d_DynamicZooming,
CurAction3d_DynamicPanning,
CurAction3d_DynamicRoation
};
public:
//! Default constructor.
GlfwOcctView();
//! Destructor.
~GlfwOcctView();
//! Main application entry point.
void run();
private:
//! Create GLFW window.
void initWindow (int theWidth, int theHeight, const char* theTitle);
//! Create 3D Viewer.
void initViewer();
//! Fill 3D Viewer with a DEMO items.
void initDemoScene();
//! Application event loop.
void mainloop();
//! Clean up before .
void cleanup();
//! @name GLWF callbacks
private:
//! Window resize event.
void onResize (int theWidth, int theHeight);
//! Mouse scroll event.
void onMouseScroll (double theOffsetX, double theOffsetY);
//! Mouse click event.
void onMouseButton (int theButton, int theAction, int theMods);
//! Mouse move event.
void onMouseMove (int thePosX, int thePosY);
//! @name GLWF callbacks (static functions)
private:
//! GLFW callback redirecting messages into Message::DefaultMessenger().
static void errorCallback (int theError, const char* theDescription);
//! Wrapper for glfwGetWindowUserPointer() returning this class instance.
static GlfwOcctView* toView (GLFWwindow* theWin);
//! Window resize callback.
static void onResizeCallback (GLFWwindow* theWin, int theWidth, int theHeight)
{ toView(theWin)->onResize (theWidth, theHeight); }
//! Frame-buffer resize callback.
static void onFBResizeCallback (GLFWwindow* theWin, int theWidth, int theHeight)
{ toView(theWin)->onResize (theWidth, theHeight); }
//! Mouse scroll callback.
static void onMouseScrollCallback (GLFWwindow* theWin, double theOffsetX, double theOffsetY)
{ toView(theWin)->onMouseScroll (theOffsetX, theOffsetY); }
//! Mouse click callback.
static void onMouseButtonCallback (GLFWwindow* theWin, int theButton, int theAction, int theMods)
{ toView(theWin)->onMouseButton (theButton, theAction, theMods); }
//! Mouse move callback.
static void onMouseMoveCallback (GLFWwindow* theWin, double thePosX, double thePosY)
{ toView(theWin)->onMouseMove ((int )thePosX, (int )thePosY); }
private:
Handle(GlfwOcctWindow) myOcctWindow;
Handle(V3d_View) myView;
Handle(AIS_InteractiveContext) myContext;
CurAction3d myCurAction3d;
Graphic3d_Vec2i myMouseMin;
Graphic3d_Vec2i myMouseMax;
bool myToRedraw;
};
#endif // _GlfwOcctView_Header

View File

@@ -1,161 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of the examples of the Open CASCADE Technology software library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
#include "GlfwOcctWindow.h"
#if defined (__APPLE__)
#undef Handle // avoid name collisions in macOS headers
#define GLFW_EXPOSE_NATIVE_COCOA
#define GLFW_EXPOSE_NATIVE_NSGL
#elif defined (_WIN32)
#define GLFW_EXPOSE_NATIVE_WIN32
#define GLFW_EXPOSE_NATIVE_WGL
#else
#define GLFW_EXPOSE_NATIVE_X11
#define GLFW_EXPOSE_NATIVE_GLX
#endif
#include <GLFW/glfw3.h>
#include <GLFW/glfw3native.h>
// ================================================================
// Function : GlfwOcctWindow
// Purpose :
// ================================================================
GlfwOcctWindow::GlfwOcctWindow (int theWidth, int theHeight, const TCollection_AsciiString& theTitle)
: myGlfwWindow (glfwCreateWindow (theWidth, theHeight, theTitle.ToCString(), NULL, NULL)),
myXLeft (0),
myYTop (0),
myXRight (0),
myYBottom(0)
{
if (myGlfwWindow != nullptr)
{
int aWidth = 0, aHeight = 0;
glfwGetWindowPos (myGlfwWindow, &myXLeft, &myYTop);
glfwGetWindowSize(myGlfwWindow, &aWidth, &aHeight);
myXRight = myXLeft + aWidth;
myYBottom = myYTop + aHeight;
#if !defined(_WIN32) && !defined(__APPLE__)
myDisplay = new Aspect_DisplayConnection (glfwGetX11Display());
#endif
}
}
// ================================================================
// Function : Close
// Purpose :
// ================================================================
void GlfwOcctWindow::Close()
{
if (myGlfwWindow != nullptr)
{
glfwDestroyWindow (myGlfwWindow);
myGlfwWindow = nullptr;
}
}
// ================================================================
// Function : NativeHandle
// Purpose :
// ================================================================
Aspect_Drawable GlfwOcctWindow::NativeHandle() const
{
#if defined (__APPLE__)
return (Aspect_Drawable)glfwGetCocoaWindow (myGlfwWindow);
#elif defined (_WIN32)
return (Aspect_Drawable)glfwGetWin32Window (myGlfwWindow);
#else
return (Aspect_Drawable)glfwGetX11Window (myGlfwWindow);
#endif
}
// ================================================================
// Function : NativeGlContext
// Purpose :
// ================================================================
Aspect_RenderingContext GlfwOcctWindow::NativeGlContext() const
{
#if defined (__APPLE__)
return (NSOpenGLContext*)glfwGetNSGLContext (myGlfwWindow);
#elif defined (_WIN32)
return glfwGetWGLContext (myGlfwWindow);
#else
return glfwGetGLXContext (myGlfwWindow);
#endif
}
// ================================================================
// Function : IsMapped
// Purpose :
// ================================================================
Standard_Boolean GlfwOcctWindow::IsMapped() const
{
return glfwGetWindowAttrib (myGlfwWindow, GLFW_VISIBLE) != 0;
}
// ================================================================
// Function : Map
// Purpose :
// ================================================================
void GlfwOcctWindow::Map() const
{
glfwShowWindow (myGlfwWindow);
}
// ================================================================
// Function : Unmap
// Purpose :
// ================================================================
void GlfwOcctWindow::Unmap() const
{
glfwHideWindow (myGlfwWindow);
}
// ================================================================
// Function : DoResize
// Purpose :
// ================================================================
Aspect_TypeOfResize GlfwOcctWindow::DoResize() const
{
if (glfwGetWindowAttrib (myGlfwWindow, GLFW_VISIBLE) == 1)
{
int anXPos = 0, anYPos = 0, aWidth = 0, aHeight = 0;
glfwGetWindowPos (myGlfwWindow, &anXPos, &anYPos);
glfwGetWindowSize(myGlfwWindow, &aWidth, &aHeight);
*const_cast<Standard_Integer*>(&myXLeft ) = anXPos;
*const_cast<Standard_Integer*>(&myXRight ) = anXPos + aWidth;
*const_cast<Standard_Integer*>(&myYTop ) = anYPos;
*const_cast<Standard_Integer*>(&myYBottom) = anYPos + aHeight;
}
return Aspect_TOR_UNKNOWN;
}
// ================================================================
// Function : CursorPosition
// Purpose :
// ================================================================
Graphic3d_Vec2i GlfwOcctWindow::CursorPosition() const
{
Graphic3d_Vec2d aPos;
glfwGetCursorPos (myGlfwWindow, &aPos.x(), &aPos.y());
return Graphic3d_Vec2i ((int )aPos.x(), (int )aPos.y());
}

View File

@@ -1,115 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of the examples of the Open CASCADE Technology software library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
#ifndef _GlfwOcctWindow_Header
#define _GlfwOcctWindow_Header
#include <Aspect_DisplayConnection.hxx>
#include <Aspect_RenderingContext.hxx>
#include <Aspect_Window.hxx>
#include <Graphic3d_Vec.hxx>
#include <TCollection_AsciiString.hxx>
struct GLFWwindow;
//! GLFWwindow wrapper implementing Aspect_Window interface.
class GlfwOcctWindow : public Aspect_Window
{
DEFINE_STANDARD_RTTI_INLINE(GlfwOcctWindow, Aspect_Window)
public:
//! Main constructor.
GlfwOcctWindow (int theWidth, int theHeight, const TCollection_AsciiString& theTitle);
//! Close the window.
virtual ~GlfwOcctWindow() { Close(); }
//! Close the window.
void Close();
//! Return X Display connection.
const Handle(Aspect_DisplayConnection)& GetDisplay() const { return myDisplay; }
//! Return GLFW window.
GLFWwindow* getGlfwWindow() { return myGlfwWindow; }
//! Return native OpenGL context.
Aspect_RenderingContext NativeGlContext() const;
//! Return cursor position.
Graphic3d_Vec2i CursorPosition() const;
public:
//! Returns native Window handle
virtual Aspect_Drawable NativeHandle() const Standard_OVERRIDE;
//! Returns parent of native Window handle.
virtual Aspect_Drawable NativeParentHandle() const Standard_OVERRIDE { return 0; }
//! Applies the resizing to the window <me>
virtual Aspect_TypeOfResize DoResize() const Standard_OVERRIDE;
//! Returns True if the window <me> is opened and False if the window is closed.
virtual Standard_Boolean IsMapped() const Standard_OVERRIDE;
//! Apply the mapping change to the window <me> and returns TRUE if the window is mapped at screen.
virtual Standard_Boolean DoMapping() const Standard_OVERRIDE { return Standard_True; }
//! Opens the window <me>.
virtual void Map() const Standard_OVERRIDE;
//! Closes the window <me>.
virtual void Unmap() const Standard_OVERRIDE;
virtual void Position (Standard_Integer& theX1, Standard_Integer& theY1,
Standard_Integer& theX2, Standard_Integer& theY2) const Standard_OVERRIDE
{
theX1 = myXLeft;
theX2 = myXRight;
theY1 = myYTop;
theY2 = myYBottom;
}
//! Returns The Window RATIO equal to the physical WIDTH/HEIGHT dimensions.
virtual Standard_Real Ratio() const Standard_OVERRIDE
{
return Standard_Real (myXRight - myXLeft) / Standard_Real (myYBottom - myYTop);
}
//! Return window size.
virtual void Size (Standard_Integer& theWidth, Standard_Integer& theHeight) const Standard_OVERRIDE
{
theWidth = myXRight - myXLeft;
theHeight = myYBottom - myYTop;
}
virtual Aspect_FBConfig NativeFBConfig() const Standard_OVERRIDE { return NULL; }
protected:
Handle(Aspect_DisplayConnection) myDisplay;
GLFWwindow* myGlfwWindow;
Standard_Integer myXLeft;
Standard_Integer myYTop;
Standard_Integer myXRight;
Standard_Integer myYBottom;
};
#endif // _GlfwOcctWindow_Header

View File

@@ -1,37 +0,0 @@
// Copyright (c) 2019 OPEN CASCADE SAS
//
// This file is part of the examples of the Open CASCADE Technology software library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
#include "GlfwOcctView.h"
int main (int, char**)
{
GlfwOcctView anApp;
try
{
anApp.run();
}
catch (const std::runtime_error& theError)
{
std::cerr << theError.what() << std::endl;
return EXIT_FAILURE;
}
return 0;
}

View File

@@ -1,4 +0,0 @@
A sample demonstrating usage of OCCT 3D Viewer within a window created using GLFW.
Platforms: Windows, macOS, Linux
Required: glfw

View File

@@ -116,7 +116,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win32\$(VCFMT)\bin/ImportExport.exe</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\..\win32\$(VCFMT)\lib;$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -158,7 +158,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win64\$(VCFMT)\bin/ImportExport.exe</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\..\win64\$(VCFMT)\lib;$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -199,7 +199,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win32\$(VCFMT)\bind/ImportExport.exe</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\..\win32\$(VCFMT)\libd;$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -241,7 +241,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKV3d.lib;TKOpenGl.lib;mfcsample.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win64\$(VCFMT)\bind/ImportExport.exe</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>..\..\..\..\win64\$(VCFMT)\libd;$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

View File

@@ -133,8 +133,8 @@ CAnimationDoc::CAnimationDoc()
myAISContext->SetColor(myAisEngineBlock, Quantity_NOC_WHITE, Standard_False);
myAISContext->SetMaterial(myAisEngineBlock,Graphic3d_NOM_PLASTIC, Standard_False);
myAISContext->Display(myAisCylinderHead ,1,-1,Standard_False);
myAISContext->Display(myAisEngineBlock ,1,-1,Standard_False);
myAISContext->Display(myAisCylinderHead ,1,-1,Standard_False,Standard_False);
myAISContext->Display(myAisEngineBlock ,1,-1,Standard_False,Standard_False);
myAisCrankArm = new AIS_Shape (CrankArm);
myAISContext->SetColor (myAisCrankArm, Quantity_NOC_HOTPINK, Standard_False);
@@ -146,9 +146,9 @@ CAnimationDoc::CAnimationDoc()
myAISContext->SetColor (myAisPropeller, Quantity_NOC_RED, Standard_False);
myAISContext->SetMaterial(myAisPropeller, Graphic3d_NOM_PLASTIC, Standard_False);
myAISContext->Display(myAisCrankArm, 1,-1,Standard_False);
myAISContext->Display(myAisPropeller, 1,-1,Standard_False);
myAISContext->Display(myAisPiston, 1,-1,Standard_True);
myAISContext->Display(myAisCrankArm ,1,-1,Standard_False,Standard_False);
myAISContext->Display(myAisPropeller ,1,-1,Standard_False,Standard_False);
myAISContext->Display(myAisPiston ,1,-1,Standard_True,Standard_False);
m_Xmin = -300. ;
m_Ymin = -300. ;

View File

@@ -8,6 +8,7 @@
#include "OCC_3dBaseDoc.h"
#include <res\OCC_Resource.h>
#include <Graphic3d_ExportFormat.hxx>
#include <Graphic3d_Camera.hxx>
#include <OpenGl_GraphicDriver.hxx>

View File

@@ -55,6 +55,7 @@
#include <Graphic3d_HorizontalTextAlignment.hxx>
#include <Graphic3d_VerticalTextAlignment.hxx>
#include <Graphic3d_ArrayOfPolylines.hxx>
#include <Graphic3d_ExportFormat.hxx>
#include <Graphic3d_ArrayOfPolylines.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <Graphic3d_AspectText3d.hxx>

View File

@@ -115,7 +115,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win32\$(VCFMT)\bind/mfcsample.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -158,7 +158,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win64\$(VCFMT)\bind/mfcsample.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -202,7 +202,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win32\$(VCFMT)\bin/mfcsample.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@@ -246,7 +246,7 @@
<ResourceOutputFileName>$(IntDir)%(Filename).res</ResourceOutputFileName>
</ResourceCompile>
<Link>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;TKLCAF.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>TKVCAF.lib;TKVrml.lib;TKStl.lib;TKBrep.lib;TKIGES.lib;TKShHealing.lib;TKStep.lib;TKXSBase.lib;TKBool.lib;TKCAF.lib;TKCDF.lib;TKernel.lib;TKFeat.lib;TKFillet.lib;TKG2d.lib;TKG3d.lib;TKGeomAlgo.lib;TKGeomBase.lib;TKHLR.lib;TKMath.lib;TKOffset.lib;TKPrim.lib;TKService.lib;TKTopAlgo.lib;TKMesh.lib;TKV3d.lib;TKOpenGl.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>../../../../win64\$(VCFMT)\bin/mfcsample.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>$(CSF_OCCTLibPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

View File

@@ -14,9 +14,9 @@ Requirements for building sample:
* Android NDK r9d or newer
* Apache Ant 1.9.4 or higher
* OCCT compiled under Android platform and placed in directories:
* occt/libs/armeabi-v7a/\*.so and occt/inc/\*.hxx (libraries and include files of OCCT install)
* android/assets/opencascade/shared/Shaders/\* (Shaders folder of OCCT install: /share/opencascade/resources/Shaders)
* 3rdparty/include/freetype2/\*, 3rdparty/include/FreeImage.h and 3rdparty/libs/armeabi-v7a/libFreeImage.so and 3rdparty/libs/armeabi-v7a/libfreetype.so
* occt/libs/armeabi-v7a/*.so and occt/inc/*.hxx (libraries and include files of OCCT install)
* android/assets/opencascade/shared/Shaders/* (Shaders folder of OCCT install: /share/opencascade/resources/Shaders)
* 3rdparty/include/freetype2/*, 3rdparty/include/FreeImage.h and 3rdparty/libs/armeabi-v7a/libFreeImage.so and 3rdparty/libs/armeabi-v7a/libfreetype.so
It is also possible to to correct OCCT.pri file an get resources from another tree of directories.

View File

@@ -23,6 +23,7 @@
#include <Standard_WarningsRestore.hxx>
#include <Graphic3d_ExportFormat.hxx>
#include <Graphic3d_GraphicDriver.hxx>
#include <Graphic3d_TextureEnv.hxx>

View File

@@ -44,13 +44,13 @@ unix {
win32 {
CONFIG(debug, debug|release) {
DEFINES += _DEBUG
DESTDIR = ./win$$(ARCH)/$$(VCVER)/bind
OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/objd
DESTDIR = ./win$(ARCH)/$(VCVER)/bind
OBJECTS_DIR = ./win$(ARCH)/$(VCVER)/objd
MOC_DIR = ./src
} else {
DEFINES += NDEBUG
DESTDIR = ./win$$(ARCH)/$$(VCVER)/bin
OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/obj
DESTDIR = ./win$(ARCH)/$(VCVER)/bin
OBJECTS_DIR = ./win$(ARCH)/$(VCVER)/obj
MOC_DIR = ./src
}
LIBS = -L$$(QTDIR)/lib;$$(CSF_OCCTLibPath)

View File

@@ -58,14 +58,14 @@ unix {
win32 {
CONFIG(debug, debug|release) {
DEFINES += _DEBUG
DESTDIR = ./win$$(ARCH)/$$(VCVER)/bind
OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/objd
MOC_DIR = ./win$$(ARCH)/$$(VCVER)/mocd
DESTDIR = ./win$(ARCH)/$(VCVER)/bind
OBJECTS_DIR = ./win$(ARCH)/$(VCVER)/objd
MOC_DIR = ./win$(ARCH)/$(VCVER)/mocd
} else {
DEFINES += NDEBUG
DESTDIR = ./win$$(ARCH)/$$(VCVER)/bin
OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/obj
MOC_DIR = ./win$$(ARCH)/$$(VCVER)/moc
DESTDIR = ./win$(ARCH)/$(VCVER)/bin
OBJECTS_DIR = ./win$(ARCH)/$(VCVER)/obj
MOC_DIR = ./win$(ARCH)/$(VCVER)/moc
}
LIBS = -L$$(QTDIR)/lib;$$(CSF_OCCTLibPath)
DEFINES += NO_COMMONSAMPLE_EXPORTS NO_IESAMPLE_EXPORTS
@@ -75,7 +75,7 @@ LIBS += -lTKernel -lTKMath -lTKService -lTKV3d -lTKOpenGl \
-lTKBRep -lTKIGES -lTKSTL -lTKVRML -lTKSTEP -lTKSTEPAttr -lTKSTEP209 \
-lTKSTEPBase -lTKGeomBase -lTKGeomAlgo -lTKG3d -lTKG2d \
-lTKXSBase -lTKShHealing -lTKHLR -lTKTopAlgo -lTKMesh -lTKPrim \
-lTKCDF -lTKBool -lTKBO -lTKFillet -lTKOffset -lTKLCAF \
-lTKCDF -lTKBool -lTKBO -lTKFillet -lTKOffset \
!exists($${RES_DIR}) {
win32 {

View File

@@ -61,14 +61,14 @@ unix {
win32 {
CONFIG(debug, debug|release) {
DEFINES += _DEBUG
DESTDIR = ./win$$(ARCH)/$$(VCVER)/bind
OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/objd
MOC_DIR = ./win$$(ARCH)/$$(VCVER)/mocd
DESTDIR = ./win$(ARCH)/$(VCVER)/bind
OBJECTS_DIR = ./win$(ARCH)/$(VCVER)/objd
MOC_DIR = ./win$(ARCH)/$(VCVER)/mocd
} else {
DEFINES += NDEBUG
DESTDIR = ./win$$(ARCH)/$$(VCVER)/bin
OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/obj
MOC_DIR = ./win$$(ARCH)/$$(VCVER)/moc
DESTDIR = ./win$(ARCH)/$(VCVER)/bin
OBJECTS_DIR = ./win$(ARCH)/$(VCVER)/obj
MOC_DIR = ./win$(ARCH)/$(VCVER)/moc
}
LIBS = -L$$(QTDIR)/lib;$$(CSF_OCCTLibPath)
DEFINES += NO_COMMONSAMPLE_EXPORTS NO_IESAMPLE_EXPORTS
@@ -78,7 +78,7 @@ LIBS += -lTKernel -lTKMath -lTKService -lTKV3d -lTKOpenGl \
-lTKBRep -lTKIGES -lTKSTL -lTKVRML -lTKSTEP -lTKSTEPAttr -lTKSTEP209 \
-lTKSTEPBase -lTKGeomBase -lTKGeomAlgo -lTKG3d -lTKG2d \
-lTKXSBase -lTKShHealing -lTKHLR -lTKTopAlgo -lTKMesh -lTKPrim \
-lTKCDF -lTKBool -lTKBO -lTKFillet -lTKOffset -lTKLCAF \
-lTKCDF -lTKBool -lTKBO -lTKFillet -lTKOffset \
!exists($${RES_DIR}) {
win32 {

View File

@@ -41,7 +41,7 @@ tcopy bxx b10
# make some boxes hollow
for {set i 1} {$i <= 1} {incr i} {
set dim [bounding b$i -save xmin ymin zmin xmax ymax zmax]
set dim [bounding -s b$i -save xmin ymin zmin xmax ymax zmax]
set dx [dval xmax-xmin]
set x1 [dval xmin+0.1*$dx]
set x2 [dval ymin+0.1*$dx]

View File

@@ -135,7 +135,7 @@ vfit
# add dimension:
# detect vertices extremal in X direction
bounding snowflake -save x1 y1 z1 x2 y2 z2
bounding -s snowflake -save x1 y1 z1 x2 y2 z2
plane f1 x1 0 0 1 0 0
plane f2 x2 0 0 1 0 0
mkface f1 f1

View File

@@ -31,36 +31,11 @@ struct AIS_AnimationProgress
DEFINE_STANDARD_HANDLE(AIS_Animation, Standard_Transient)
//! Class represents a basic animation class.
//! AIS_Animation can be used as:
//!
//! - Animation Implementor
//! Sub-classes should override method AIS_Animation::update() to perform specific animation.
//! AIS package provides limited number of such animation atoms - classes AIS_AnimationObject and AIS_AnimationCamera, which could be enough for defining a simple animation.
//! In general case, application is expected defining own AIS_Animation sub-classes implementing application-specific animation logic
//! (e.g. another interpolation or another kind of transformations - like color transition and others).
//! The basic conception of AIS_Animation::update() is defining an exact scene state for the current presentation timestamp,
//! providing a smooth and continuous animation well defined at any time step and in any direction.
//! So that a time difference between two sequential drawn Viewer frames can vary from frame to frame without visual artifacts,
//! increasing rendering framerate would not lead to animation being executed too fast
//! and low framerate (on slow hardware) would not lead to animation played longer than defined duration.
//! Hence, implementation should avoid usage of incremental step logic or should apply it very carefully.
//!
//! - Animation Container
//! AIS_Animation (no sub-classing) can be used to aggregate a sequence of Animation items (children).
//! Each children should be defined with its own duration and start time (presentation timestamp).
//! It is possible defining collection of nested AIS_Animation items, so that within each container level
//! children define start playback time relative to its holder.
//!
//! - Animation playback Controller
//! It is suggested that application would define a single AIS_Animation instance (optional sub-classing) for controlling animation playback as whole.
//! Such controller should be filled in by other AIS_Animation as children objects,
//! and will be managed by application by calling StartTimer(), UpdateTimer() and IsStopped() methods.
//!
//! Note, that AIS_Animation::StartTimer() defines a timer calculating an elapsed time, not a multimedia timer executing Viewer updates at specific intervals!
//! Application should avoid using implicit and immediate Viewer updates to ensure that AIS_Animation::UpdateTimer() is called before each redrawing of a Viewer content.
//! Redrawing logic should be also managed at application level for managing a smooth animation
//! (by defining a multimedia timer provided by used GUI framework executing updates at desired framerate, or as continuous redraws in loop).
//! Class represents single animation.
//! It is defined with:
//! - Start time on the timeline started from 0, in seconds
//! - Duration, in seconds
//! - virtual method Update() for handling an update
class AIS_Animation : public Standard_Transient
{
DEFINE_STANDARD_RTTIEXT(AIS_Animation, Standard_Transient)
@@ -126,11 +101,6 @@ public:
//! Start animation with internally defined timer instance.
//! Calls ::Start() internally.
//!
//! Note, that this method initializes a timer calculating an elapsed time (presentation timestamps within AIS_Animation::UpdateTimer()),
//! not a multimedia timer executing Viewer updates at specific intervals!
//! Viewer redrawing should be managed at application level, so that AIS_Animation::UpdateTimer() is called once right before each redrawing of a Viewer content.
//!
//! @param theStartPts starting timer position (presentation timestamp)
//! @param thePlaySpeed playback speed (1.0 means normal speed)
//! @param theToUpdate flag to update defined animations to specified start position

View File

@@ -1,285 +0,0 @@
// Created on: 2018-12-12
// Created by: Olga SURYANINOVA
// Copyright (c) 2018 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <AIS_CameraFrustum.hxx>
#include <AIS_DisplayMode.hxx>
#include <Graphic3d_ArrayOfTriangles.hxx>
#include <Graphic3d_ArrayOfSegments.hxx>
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>
#include <Select3D_SensitiveGroup.hxx>
#include <Select3D_SensitivePrimitiveArray.hxx>
#include <Select3D_SensitiveSegment.hxx>
#include <SelectMgr_EntityOwner.hxx>
IMPLEMENT_STANDARD_RTTIEXT(AIS_CameraFrustum, AIS_InteractiveObject)
namespace
{
static const Standard_ShortReal THE_DEFAULT_TRANSPARENCY = 0.7f;
static const Quantity_Color THE_DEFAULT_COLOR = Quantity_NOC_WHITE;
}
//=======================================================================
//function : Constructor
//purpose :
//=======================================================================
AIS_CameraFrustum::AIS_CameraFrustum()
: myPoints (0, Graphic3d_Camera::FrustumVerticesNB)
{
myDrawer->SetLineAspect (new Prs3d_LineAspect (THE_DEFAULT_COLOR, Aspect_TOL_SOLID, 1.0));
Handle(Prs3d_ShadingAspect) aShadingAspect = new Prs3d_ShadingAspect();
aShadingAspect->SetMaterial (Graphic3d_NOM_PLASTIC);
aShadingAspect->Aspect()->SetAlphaMode (Graphic3d_AlphaMode_Blend);
aShadingAspect->SetTransparency (THE_DEFAULT_TRANSPARENCY);
aShadingAspect->SetColor (THE_DEFAULT_COLOR);
myDrawer->SetShadingAspect (aShadingAspect);
myDrawer->SetTransparency (THE_DEFAULT_TRANSPARENCY);
SetDisplayMode (AIS_Shaded);
}
//=======================================================================
//function : AcceptDisplayMode
//purpose :
//=======================================================================
Standard_Boolean AIS_CameraFrustum::AcceptDisplayMode (const Standard_Integer theMode) const
{
return theMode == AIS_Shaded || theMode == AIS_WireFrame;
}
//=======================================================================
//function : SetCameraFrustum
//purpose :
//=======================================================================
void AIS_CameraFrustum::SetCameraFrustum (const Handle(Graphic3d_Camera)& theCamera)
{
if (theCamera.IsNull())
{
return;
}
theCamera->FrustumPoints (myPoints);
fillTriangles();
fillBorders();
SetToUpdate();
}
//=======================================================================
//function : SetColor
//purpose :
//=======================================================================
void AIS_CameraFrustum::SetColor (const Quantity_Color& theColor)
{
AIS_InteractiveObject::SetColor (theColor);
myDrawer->ShadingAspect()->SetColor (theColor);
myDrawer->LineAspect()->SetColor (theColor);
}
//=======================================================================
//function : UnsetColor
//purpose :
//=======================================================================
void AIS_CameraFrustum::UnsetColor()
{
if (!HasColor())
{
return;
}
AIS_InteractiveObject::UnsetColor();
myDrawer->ShadingAspect()->SetColor (THE_DEFAULT_COLOR);
myDrawer->LineAspect()->SetColor (THE_DEFAULT_COLOR);
}
//=======================================================================
//function : UnsetColor
//purpose :
//=======================================================================
void AIS_CameraFrustum::UnsetTransparency()
{
myDrawer->ShadingAspect()->SetTransparency (0.0f);
myDrawer->SetTransparency (0.0f);
}
//=======================================================================
//function : fillTriangles
//purpose :
//=======================================================================
void AIS_CameraFrustum::fillTriangles()
{
if (myTriangles.IsNull())
{
const Standard_Integer aPlaneTriangleVertsNb = 2 * 3;
const Standard_Integer aPlanesNb = 3 * 2;
myTriangles = new Graphic3d_ArrayOfTriangles (Graphic3d_Camera::FrustumVerticesNB, aPlaneTriangleVertsNb * aPlanesNb);
myTriangles->SetVertice (Graphic3d_Camera::FrustumVerticesNB, gp_Pnt (0.0, 0.0, 0.0));
// Triangles go in order (clockwise vertices traversing for correct normal):
// (0, 2, 1), (3, 1, 2)
const Standard_Integer aLookup1_clockwise[] = { 0, 1, 0, 1, 0, 1 };
const Standard_Integer aLookup2_clockwise[] = { 0, 0, 1, 1, 1, 0 };
// Triangles go in order (counterclockwise vertices traversing for correct normal):
// (1, 2, 0), (2, 1, 3)
const Standard_Integer aLookup1_anticlockwise[] = { 0, 1, 0, 1, 0, 1 };
const Standard_Integer aLookup2_anticlockwise[] = { 1, 0, 0, 0, 1, 1 };
Standard_Integer aShifts[] = { 0, 0, 0 };
// Planes go in order:
// LEFT, RIGHT, BOTTOM, TOP, NEAR, FAR
for (Standard_Integer aFaceIdx = 0; aFaceIdx < 3; ++aFaceIdx)
{
for (Standard_Integer i = 0; i < 2; ++i)
{
for (Standard_Integer aPntIter = 0; aPntIter < aPlaneTriangleVertsNb; ++aPntIter)
{
aShifts[aFaceIdx] = i;
if (i == 0)
{
aShifts[(aFaceIdx + 1) % 3] = aLookup1_clockwise[aPntIter];
aShifts[(aFaceIdx + 2) % 3] = aLookup2_clockwise[aPntIter];
}
else
{
aShifts[(aFaceIdx + 1) % 3] = aLookup1_anticlockwise[aPntIter];
aShifts[(aFaceIdx + 2) % 3] = aLookup2_anticlockwise[aPntIter];
}
Standard_Integer anIndex = aShifts[0] * 2 * 2 + aShifts[1] * 2 + aShifts[2];
myTriangles->AddEdge (anIndex + 1);
}
}
}
}
for (Standard_Integer aPointIter = 0; aPointIter < Graphic3d_Camera::FrustumVerticesNB; ++aPointIter)
{
const Graphic3d_Vec3d aPnt = myPoints[aPointIter];
myTriangles->SetVertice (aPointIter + 1, gp_Pnt (aPnt.x(), aPnt.y(), aPnt.z()));
}
}
//=======================================================================
//function : fillBorders
//purpose :
//=======================================================================
void AIS_CameraFrustum::fillBorders()
{
if (myBorders.IsNull())
{
const Standard_Integer aPlaneSegmVertsNb = 2 * 4;
const Standard_Integer aPlanesNb = 3 * 2;
myBorders = new Graphic3d_ArrayOfSegments (Graphic3d_Camera::FrustumVerticesNB, aPlaneSegmVertsNb * aPlanesNb);
myBorders->SetVertice (Graphic3d_Camera::FrustumVerticesNB, gp_Pnt (0.0, 0.0, 0.0));
// Segments go in order:
// (0, 2), (2, 3), (3, 1), (1, 0)
const Standard_Integer aLookup1[] = { 0, 1, 1, 1, 1, 0, 0, 0 };
const Standard_Integer aLookup2[] = { 0, 0, 0, 1, 1, 1, 1, 0 };
Standard_Integer aShifts[] = { 0, 0, 0 };
// Planes go in order:
// LEFT, RIGHT, BOTTOM, TOP, NEAR, FAR
for (Standard_Integer aFaceIdx = 0; aFaceIdx < 3; ++aFaceIdx)
{
for (Standard_Integer i = 0; i < 2; ++i)
{
for (Standard_Integer aSegmVertIter = 0; aSegmVertIter < aPlaneSegmVertsNb; ++aSegmVertIter)
{
aShifts[aFaceIdx] = i;
aShifts[(aFaceIdx + 1) % 3] = aLookup1[aSegmVertIter];
aShifts[(aFaceIdx + 2) % 3] = aLookup2[aSegmVertIter];
Standard_Integer anIndex = aShifts[0] * 2 * 2 + aShifts[1] * 2 + aShifts[2];
myBorders->AddEdge (anIndex + 1);
}
}
}
}
for (Standard_Integer aPointIter = 0; aPointIter < Graphic3d_Camera::FrustumVerticesNB; ++aPointIter)
{
const Graphic3d_Vec3d aPnt = myPoints[aPointIter];
myBorders->SetVertice (aPointIter + 1, gp_Pnt (aPnt.x(), aPnt.y(), aPnt.z()));
}
}
//=======================================================================
//function : Compute
//purpose :
//=======================================================================
void AIS_CameraFrustum::Compute (const Handle(PrsMgr_PresentationManager3d)& ,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode)
{
thePrs->SetInfiniteState (true);
if (myTriangles.IsNull())
{
return;
}
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
switch (theMode)
{
case AIS_Shaded:
{
aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
aGroup->AddPrimitiveArray (myTriangles);
}
Standard_FALLTHROUGH
case AIS_WireFrame:
{
aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect());
aGroup->AddPrimitiveArray (myBorders);
break;
}
}
}
//=======================================================================
//function : ComputeSelection
//purpose :
//=======================================================================
void AIS_CameraFrustum::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
const Standard_Integer theMode)
{
Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this);
switch (theMode)
{
case SelectionMode_Edges:
{
Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (anOwner);
for (Standard_Integer anIter = 1; anIter <= myBorders->EdgeNumber(); anIter += 2)
{
aSensitiveEntity->Add (new Select3D_SensitiveSegment (anOwner, myBorders->Vertice (myBorders->Edge (anIter)), myBorders->Vertice(myBorders->Edge (anIter + 1))));
}
theSelection->Add (aSensitiveEntity);
break;
}
case SelectionMode_Volume:
{
Handle(Select3D_SensitivePrimitiveArray) aSelArray = new Select3D_SensitivePrimitiveArray (anOwner);
aSelArray->InitTriangulation (myTriangles->Attributes(), myTriangles->Indices(), TopLoc_Location());
theSelection->Add (aSelArray);
break;
}
}
}

View File

@@ -1,85 +0,0 @@
// Created on: 2018-12-12
// Created by: Olga SURYANINOVA
// Copyright (c) 2018 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _AIS_CameraFrustum_HeaderFile
#define _AIS_CameraFrustum_HeaderFile
#include <AIS_InteractiveObject.hxx>
class Graphic3d_ArrayOfSegments;
class Graphic3d_ArrayOfTriangles;
//! Presentation for drawing camera frustum.
//! Default configuration is built with filling and some transparency.
class AIS_CameraFrustum : public AIS_InteractiveObject
{
DEFINE_STANDARD_RTTIEXT(AIS_CameraFrustum, AIS_InteractiveObject)
public:
//! Selection modes supported by this object
enum SelectionMode
{
SelectionMode_Edges = 0, //!< detect by edges (default)
SelectionMode_Volume = 1, //!< detect by volume
};
public:
//! Constructs camera frustum with default configuration.
Standard_EXPORT AIS_CameraFrustum();
//! Sets camera frustum.
Standard_EXPORT void SetCameraFrustum (const Handle(Graphic3d_Camera)& theCamera);
//! Setup custom color.
Standard_EXPORT virtual void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE;
//! Restore default color.
Standard_EXPORT virtual void UnsetColor() Standard_OVERRIDE;
//! Restore transparency setting.
Standard_EXPORT virtual void UnsetTransparency() Standard_OVERRIDE;
//! Return true if specified display mode is supported.
Standard_EXPORT virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE;
protected:
//! Computes presentation of camera frustum.
Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
const Handle(Prs3d_Presentation)& thePrs,
const Standard_Integer theMode) Standard_OVERRIDE;
//! Compute selection.
Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
const Standard_Integer theMode) Standard_OVERRIDE;
private:
//! Fills triangles primitive array for camera frustum filling.
void fillTriangles();
//! Fills polylines primitive array for camera frustum borders.
void fillBorders();
protected:
NCollection_Array1<Graphic3d_Vec3d> myPoints; //!< Array of points
Handle(Graphic3d_ArrayOfTriangles) myTriangles; //!< Triangles for camera frustum filling
Handle(Graphic3d_ArrayOfSegments) myBorders; //!< Segments for camera frustum borders
};
#endif // _AIS_CameraFrustum_HeaderFile

View File

@@ -55,8 +55,12 @@ namespace
theTris->AddVertex (gp_Pnt (theXLeft + theSizeX, theYBottom, 0.0), theColorBottom);
theTris->AddVertex (gp_Pnt (theXLeft, theYBottom + theSizeY, 0.0), theColorTop);
theTris->AddVertex (gp_Pnt (theXLeft + theSizeX, theYBottom + theSizeY, 0.0), theColorTop);
theTris->AddEdges (aVertIndex, aVertIndex + 1, aVertIndex + 2);
theTris->AddEdges (aVertIndex + 1, aVertIndex + 2, aVertIndex + 3);
theTris->AddEdge (aVertIndex);
theTris->AddEdge (aVertIndex + 1);
theTris->AddEdge (aVertIndex + 2);
theTris->AddEdge (aVertIndex + 1);
theTris->AddEdge (aVertIndex + 2);
theTris->AddEdge (aVertIndex + 3);
}
//! Compute hue angle from specified value.
@@ -107,10 +111,6 @@ AIS_ColorScale::AIS_ColorScale()
myTextHeight (20)
{
SetDisplayMode (0);
myDrawer->SetupOwnShadingAspect();
myDrawer->ShadingAspect()->Aspect()->SetShadingModel (Graphic3d_TOSM_UNLIT);
myDrawer->ShadingAspect()->Aspect()->SetAlphaMode (Graphic3d_AlphaMode_Opaque);
myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (Quantity_NOC_WHITE);
}
//=======================================================================
@@ -462,6 +462,15 @@ void AIS_ColorScale::Compute (const Handle(PrsMgr_PresentationManager3d)& ,
const Standard_Integer aBarTop = myYPos + myHeight - aTitleOffset - aBarYOffset;
const Standard_Integer aBarHeight = aBarTop - aBarBottom;
// draw title
if (!myTitle.IsEmpty())
{
drawText (Prs3d_Root::CurrentGroup (thePrs), myTitle,
myXPos + mySpacing,
aBarTop + aBarYOffset,
Graphic3d_VTA_BOTTOM);
}
TColStd_SequenceOfExtendedString aLabels;
if (myLabelType == Aspect_TOCSD_USER)
{
@@ -491,27 +500,11 @@ void AIS_ColorScale::Compute (const Handle(PrsMgr_PresentationManager3d)& ,
aColorBreadth += aTextWidth;
}
// draw title
Handle(Graphic3d_Group) aLabelsGroup;
if (!myTitle.IsEmpty()
|| !aLabels.IsEmpty())
{
aLabelsGroup = thePrs->NewGroup();
aLabelsGroup->SetGroupPrimitivesAspect (myDrawer->TextAspect()->Aspect());
}
if (!myTitle.IsEmpty())
{
drawText (aLabelsGroup, myTitle,
myXPos + mySpacing,
aBarTop + aBarYOffset,
Graphic3d_VTA_BOTTOM);
}
// draw colors
drawColorBar (thePrs, aBarBottom, aBarHeight, aTextWidth, aColorBreadth);
// draw Labels
drawLabels (aLabelsGroup, aLabels, aBarBottom, aBarHeight, aTextWidth, aColorBreadth);
drawLabels (thePrs, aLabels, aBarBottom, aBarHeight, aTextWidth, aColorBreadth);
}
//=======================================================================
@@ -638,8 +631,7 @@ void AIS_ColorScale::drawColorBar (const Handle(Prs3d_Presentation)& thePrs,
}
}
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePrs);
aGroup->AddPrimitiveArray (aTriangles);
const Quantity_Color aFgColor (hasOwnColor ? myDrawer->Color() : Quantity_NOC_WHITE);
@@ -654,7 +646,7 @@ void AIS_ColorScale::drawColorBar (const Handle(Prs3d_Presentation)& thePrs,
//function : drawLabels
//purpose :
//=======================================================================
void AIS_ColorScale::drawLabels (const Handle(Graphic3d_Group)& theGroup,
void AIS_ColorScale::drawLabels (const Handle(Prs3d_Presentation)& thePrs,
const TColStd_SequenceOfExtendedString& theLabels,
const Standard_Integer theBarBottom,
const Standard_Integer theBarHeight,
@@ -728,14 +720,14 @@ void AIS_ColorScale::drawLabels (const Handle(Graphic3d_Group)& theGroup,
Standard_Integer aPos2 = aNbLabels - 1 - i2;
if (aFilter && !(aPos1 % aFilter))
{
drawText (theGroup, theLabels.Value (i1 + 1),
drawText (Prs3d_Root::CurrentGroup (thePrs), theLabels.Value (i1 + 1),
anXLeft, anYBottom + Standard_Integer(i1 * aStepY + anAscent),
Graphic3d_VTA_CENTER);
aLast1 = i1;
}
if (aFilter && !(aPos2 % aFilter))
{
drawText (theGroup, theLabels.Value (i2 + 1),
drawText (Prs3d_Root::CurrentGroup (thePrs), theLabels.Value (i2 + 1),
anXLeft, anYBottom + Standard_Integer(i2 * aStepY + anAscent),
Graphic3d_VTA_CENTER);
aLast2 = i2;
@@ -758,7 +750,7 @@ void AIS_ColorScale::drawLabels (const Handle(Graphic3d_Group)& theGroup,
if (i0 != -1)
{
drawText (theGroup, theLabels.Value (i0 + 1),
drawText (Prs3d_Root::CurrentGroup (thePrs), theLabels.Value (i0 + 1),
anXLeft, anYBottom + Standard_Integer(i0 * aStepY + anAscent),
Graphic3d_VTA_CENTER);
}
@@ -781,8 +773,8 @@ void AIS_ColorScale::drawFrame (const Handle(Prs3d_Presentation)& thePrs,
aPrim->AddVertex (theX, theY, 0.0);
Handle(Graphic3d_AspectLine3d) anAspect = new Graphic3d_AspectLine3d (theColor, Aspect_TOL_SOLID, 1.0);
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
aGroup->SetGroupPrimitivesAspect (anAspect);
Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePrs);
aGroup->SetPrimitivesAspect (anAspect);
aGroup->AddPrimitiveArray (aPrim);
}
@@ -796,6 +788,7 @@ void AIS_ColorScale::drawText (const Handle(Graphic3d_Group)& theGroup,
const Graphic3d_VerticalTextAlignment theVertAlignment)
{
const Handle(Prs3d_TextAspect)& anAspect = myDrawer->TextAspect();
theGroup->SetPrimitivesAspect (anAspect->Aspect());
theGroup->Text (theText,
gp_Ax2 (gp_Pnt (theX, theY, 0.0), gp::DZ()),
anAspect->Height(),

View File

@@ -133,7 +133,7 @@ public:
Quantity_Color& theMaxColor) const
{
theMinColor.SetValues (hueToValidRange (myColorHlsMin[0]), myColorHlsMin[1], myColorHlsMin[2], Quantity_TOC_HLS);
theMaxColor.SetValues (hueToValidRange (myColorHlsMax[0]), myColorHlsMax[1], myColorHlsMax[2], Quantity_TOC_HLS);
theMaxColor.SetValues (hueToValidRange (myColorHlsMin[0]), myColorHlsMin[1], myColorHlsMin[2], Quantity_TOC_HLS);
}
//! Sets color range corresponding to minimum and maximum values.
@@ -406,7 +406,7 @@ private:
Standard_Integer computeMaxLabelWidth (const TColStd_SequenceOfExtendedString& theLabels) const;
//! Draw labels.
void drawLabels (const Handle(Graphic3d_Group)& theGroup,
void drawLabels (const Handle(Prs3d_Presentation)& thePrs,
const TColStd_SequenceOfExtendedString& theLabels,
const Standard_Integer theBarBottom,
const Standard_Integer theBarHeight,

View File

@@ -27,7 +27,6 @@ public:
AIS_ColoredDrawer (const Handle(Prs3d_Drawer)& theLink)
: myIsHidden (false),
myHasOwnColor (false),
myHasOwnTransp(false),
myHasOwnWidth (false)
{
Link (theLink);
@@ -35,15 +34,9 @@ public:
bool IsHidden() const { return myIsHidden; }
void SetHidden (const bool theToHide) { myIsHidden = theToHide;}
bool HasOwnColor() const { return myHasOwnColor; }
void UnsetOwnColor() { myHasOwnColor = false; }
void SetOwnColor (const Quantity_Color& /*theColor*/) { myHasOwnColor = true; }
bool HasOwnTransparency() const { return myHasOwnTransp; }
void UnsetOwnTransparency() { myHasOwnTransp = false; }
void SetOwnTransparency (Standard_Real /*theTransp*/) { myHasOwnTransp = true; }
bool HasOwnWidth() const { return myHasOwnWidth; }
void UnsetOwnWidth() { myHasOwnWidth = false; }
void SetOwnWidth (const Standard_Real /*theWidth*/) { myHasOwnWidth = true; }
@@ -52,7 +45,6 @@ public: //! @name list of overridden properties
bool myIsHidden;
bool myHasOwnColor;
bool myHasOwnTransp;
bool myHasOwnWidth;
};

View File

@@ -77,7 +77,6 @@ AIS_ColoredShape::AIS_ColoredShape (const TopoDS_Shape& theShape)
myDrawer->SetFreeBoundaryAspect (myDrawer->LineAspect());
myDrawer->SetUnFreeBoundaryAspect(myDrawer->LineAspect());
myDrawer->SetSeenLineAspect (myDrawer->LineAspect());
myDrawer->SetFaceBoundaryAspect (myDrawer->LineAspect());
}
//=======================================================================
@@ -91,7 +90,6 @@ AIS_ColoredShape::AIS_ColoredShape (const Handle(AIS_Shape)& theShape)
myDrawer->SetFreeBoundaryAspect (myDrawer->LineAspect());
myDrawer->SetUnFreeBoundaryAspect(myDrawer->LineAspect());
myDrawer->SetSeenLineAspect (myDrawer->LineAspect());
myDrawer->SetFaceBoundaryAspect (myDrawer->LineAspect());
if (theShape->HasMaterial())
{
SetMaterial (theShape->Material());
@@ -187,25 +185,6 @@ void AIS_ColoredShape::SetCustomColor (const TopoDS_Shape& theShape,
LoadRecomputable (AIS_Shaded);
}
//=======================================================================
//function : SetCustomTransparency
//purpose :
//=======================================================================
void AIS_ColoredShape::SetCustomTransparency (const TopoDS_Shape& theShape,
Standard_Real theTransparency)
{
if (theShape.IsNull())
{
return;
}
const Handle(AIS_ColoredDrawer)& aDrawer = CustomAspects (theShape);
setTransparency (aDrawer, theTransparency);
aDrawer->SetOwnTransparency (theTransparency);
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
}
//=======================================================================
//function : SetCustomWidth
//purpose :
@@ -219,7 +198,7 @@ void AIS_ColoredShape::SetCustomWidth (const TopoDS_Shape& theShape,
}
const Handle(AIS_ColoredDrawer)& aDrawer = CustomAspects (theShape);
setWidth (aDrawer, theLineWidth);
setWidth (CustomAspects (theShape), theLineWidth);
aDrawer->SetOwnWidth (theLineWidth);
LoadRecomputable (AIS_WireFrame);
LoadRecomputable (AIS_Shaded);
@@ -257,10 +236,6 @@ void AIS_ColoredShape::SetColor (const Quantity_Color& theColor)
{
aDrawer->WireAspect()->SetColor (theColor);
}
if (aDrawer->HasOwnFaceBoundaryAspect())
{
aDrawer->FaceBoundaryAspect()->SetColor (theColor);
}
}
}
@@ -291,10 +266,6 @@ void AIS_ColoredShape::SetWidth (const Standard_Real theLineWidth)
{
aDrawer->WireAspect()->SetWidth (theLineWidth);
}
if (aDrawer->HasOwnFaceBoundaryAspect())
{
aDrawer->FaceBoundaryAspect()->SetWidth (theLineWidth);
}
}
}
@@ -311,12 +282,7 @@ void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
LoadRecomputable (AIS_Shaded);
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
if (aDrawer->HasOwnTransparency())
{
continue;
}
const Handle(Prs3d_Drawer)& aDrawer = anIter.Value();
if (aDrawer->HasOwnShadingAspect())
{
aDrawer->ShadingAspect()->SetTransparency (theValue, myCurrentFacingModel);
@@ -370,7 +336,7 @@ void AIS_ColoredShape::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
//if (aDrawer->HasOwnMaterial()) continue;
if (aDrawer->HasOwnShadingAspect())
{
setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), aDrawer->HasOwnTransparency());
setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), Standard_False); // aDrawer->IsTransparent()
}
}
}
@@ -739,29 +705,13 @@ Standard_Boolean AIS_ColoredShape::dispatchColors (const Handle(AIS_ColoredDrawe
{
const TopoDS_Shape& aFace = aFaceIter.Value();
Handle(AIS_ColoredDrawer) aFaceDrawer;
if (aFace.ShapeType() != TopAbs_FACE
|| !theShapeDrawerMap.Find (aFace, aFaceDrawer))
{
continue;
}
if (aFaceDrawer->IsHidden())
if (aFace.ShapeType() == TopAbs_FACE
&& theShapeDrawerMap.Find (aFace, aFaceDrawer)
&& aFaceDrawer->IsHidden())
{
isClosedShell = Standard_False;
break;
}
else if (aFaceDrawer->HasOwnShadingAspect()
&& aFaceDrawer->ShadingAspect()->Aspect()->AlphaMode() != Graphic3d_AlphaMode_Opaque)
{
if (aFaceDrawer->ShadingAspect()->Aspect()->AlphaMode() != Graphic3d_AlphaMode_BlendAuto
|| aFaceDrawer->ShadingAspect()->Aspect()->FrontMaterial().Alpha() < 1.0f
|| (aFaceDrawer->ShadingAspect()->Aspect()->Distinguish()
&& aFaceDrawer->ShadingAspect()->Aspect()->BackMaterial().Alpha() < 1.0f))
{
isClosedShell = Standard_False;
break;
}
}
}
}

View File

@@ -56,10 +56,6 @@ public: //! @name sub-shape aspects
Standard_EXPORT void SetCustomColor (const TopoDS_Shape& theShape,
const Quantity_Color& theColor);
//! Customize transparency of specified sub-shape
Standard_EXPORT void SetCustomTransparency (const TopoDS_Shape& theShape,
Standard_Real theTransparency);
//! Customize line width of specified sub-shape
Standard_EXPORT void SetCustomWidth (const TopoDS_Shape& theShape,
const Standard_Real theLineWidth);

View File

@@ -1,4 +1,3 @@
// Created by: Julia GERASIMOVA
// Copyright (c) 2015 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
@@ -12,12 +11,10 @@
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef _BRepBlend_ConstThroat_HeaderFile
#define _BRepBlend_ConstThroat_HeaderFile
#include <BlendFunc_ConstThroat.hxx>
#ifndef AIS_DataMapIteratorOfDataMapOfILC_HeaderFile
#define AIS_DataMapIteratorOfDataMapOfILC_HeaderFile
typedef BlendFunc_ConstThroat BRepBlend_ConstThroat;
#include <AIS_DataMapOfILC.hxx>
#endif // _BRepBlend_ConstThroat_HeaderFile
#endif

View File

@@ -0,0 +1,29 @@
// Created on: 1996-12-11
// Created by: Robert COUBLANC
// Copyright (c) 1996-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef AIS_DataMapOfILC_HeaderFile
#define AIS_DataMapOfILC_HeaderFile
#include <Standard_Integer.hxx>
#include <AIS_LocalContext.hxx>
#include <TColStd_MapIntegerHasher.hxx>
#include <NCollection_DataMap.hxx>
typedef NCollection_DataMap<Standard_Integer,Handle(AIS_LocalContext),TColStd_MapIntegerHasher> AIS_DataMapOfILC;
typedef NCollection_DataMap<Standard_Integer,Handle(AIS_LocalContext),TColStd_MapIntegerHasher>::Iterator AIS_DataMapIteratorOfDataMapOfILC;
#endif

View File

@@ -17,12 +17,20 @@
#ifndef _AIS_DisplayStatus_HeaderFile
#define _AIS_DisplayStatus_HeaderFile
//! To give the display status of an Interactive Object.
//! This will be one of the following:
//! - DS_Displayed: the Interactive Object is
//! displayed in the main viewer;
//! - DS_Erased: the Interactive Object is hidden in main viewer;
//! - DS_Temporary: the Interactive Object is temporarily displayed;
//! - DS_None: the Interactive Object is nowhere displayed.
enum AIS_DisplayStatus
{
AIS_DS_Displayed, //!< the Interactive Object is displayed in the main viewer
AIS_DS_Erased, //!< the Interactive Object is hidden in main viewer
AIS_DS_None //!< the Interactive Object is nowhere displayed
AIS_DS_Displayed,
AIS_DS_Erased,
AIS_DS_Temporary,
AIS_DS_None
};
#endif // _AIS_DisplayStatus_HeaderFile

View File

@@ -31,34 +31,43 @@
static Handle(Prs3d_LineAspect) GetLineAspect(const Handle(Prs3d_Drawer)& Dr,
const AIS_TypeOfAttribute Att)
{
switch(Att)
{
switch(Att){
case AIS_TOA_Line:
return Dr->LineAspect();
break;
case AIS_TOA_Dimension:
return Dr->DimensionAspect()->LineAspect();
break;
case AIS_TOA_Wire:
return Dr->WireAspect();
break;
case AIS_TOA_Plane:
return Dr->PlaneAspect()->EdgesAspect();
break;
case AIS_TOA_Vector:
return Dr->VectorAspect();
break;
case AIS_TOA_UIso:
return Handle(Prs3d_LineAspect) (Dr->UIsoAspect());
break;
case AIS_TOA_VIso:
return Handle(Prs3d_LineAspect) (Dr->VIsoAspect());
break;
case AIS_TOA_Free:
return Dr->FreeBoundaryAspect();
break;
case AIS_TOA_UnFree:
return Dr->UnFreeBoundaryAspect();
break;
case AIS_TOA_Section:
return Dr->SectionAspect();
break;
case AIS_TOA_Hidden:
return Dr->HiddenLineAspect();
break;
case AIS_TOA_Seen:
return Dr->SeenLineAspect();
case AIS_TOA_FaceBoundary:
return Dr->FaceBoundaryAspect();
break;
case AIS_TOA_FirstAxis:
return Dr->DatumAspect()->LineAspect(Prs3d_DP_XAxis);
case AIS_TOA_SecondAxis:

View File

@@ -16,11 +16,14 @@
#include <AIS_InteractiveContext.hxx>
#include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
#include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
#include <AIS_ConnectedInteractive.hxx>
#include <AIS_GlobalStatus.hxx>
#include <AIS_InteractiveObject.hxx>
#include <AIS_ListIteratorOfListOfInteractive.hxx>
#include <AIS_LocalContext.hxx>
#include <AIS_LocalStatus.hxx>
#include <AIS_MapIteratorOfMapOfInteractive.hxx>
#include <AIS_MultipleConnectedInteractive.hxx>
#include <AIS_Shape.hxx>
@@ -104,6 +107,7 @@ namespace
//=======================================================================
AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
mgrSelector(new SelectMgr_SelectionManager()),
myMainPM(new PrsMgr_PresentationManager3d(MainViewer->StructureManager())),
myMainVwr(MainViewer),
myMainSel(new StdSelect_ViewerSelector3d()),
@@ -112,14 +116,13 @@ myToHilightSelected(Standard_True),
mySelection(new AIS_Selection()),
myFilters(new SelectMgr_OrFilter()),
myDefaultDrawer(new Prs3d_Drawer()),
myCurLocalIndex(0),
myCurDetected(0),
myCurHighlighted(0),
myPickingStrategy (SelectMgr_PickingStrategy_FirstAcceptable),
myAutoHilight(Standard_True),
myIsAutoActivateSelMode(Standard_True)
{
mgrSelector = new SelectMgr_SelectionManager (myMainSel);
mgrSelector->Add (myMainSel);
myStyles[Prs3d_TypeOfHighlight_None] = myDefaultDrawer;
myStyles[Prs3d_TypeOfHighlight_Selected] = new Prs3d_Drawer();
myStyles[Prs3d_TypeOfHighlight_Dynamic] = new Prs3d_Drawer();
@@ -175,7 +178,11 @@ AIS_InteractiveContext::~AIS_InteractiveContext()
{
// clear the current selection
mySelection->Clear();
mgrSelector.Nullify();
// let's remove one reference explicitly. this operation's supposed to
// be performed when mgrSelector will be destroyed but anyway...
const Handle(SelectMgr_ViewerSelector)& aSelector = myMainSel; // to avoid ambiguity
mgrSelector->Remove (aSelector);
Handle(AIS_InteractiveContext) aNullContext;
for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
@@ -204,15 +211,46 @@ void AIS_InteractiveContext::UpdateCurrentViewer()
//function : DisplayedObjects
//purpose :
//=======================================================================
void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfIO) const
void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfIO,
const Standard_Boolean theOnlyFromNeutral) const
{
if (!HasOpenedContext()
|| theOnlyFromNeutral)
{
for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
{
if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
{
theListOfIO.Append (anObjIter.Key());
}
}
return;
}
// neutral point
TColStd_MapOfTransient aDispMap;
for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
{
if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
{
theListOfIO.Append (anObjIter.Key());
aDispMap.Add (anObjIter.Key());
}
}
// parse all local contexts...
for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
{
const Handle(AIS_LocalContext)& aLocCtx = aCtxIter.Value();
aLocCtx->DisplayedObjects (aDispMap);
}
Handle(AIS_InteractiveObject) anObj;
for (TColStd_MapIteratorOfMapOfTransient aDispMapIter (aDispMap); aDispMapIter.More(); aDispMapIter.Next())
{
const Handle(Standard_Transient)& aTransient = aDispMapIter.Key();
anObj = Handle(AIS_InteractiveObject)::DownCast (aTransient);
theListOfIO.Append (anObj);
}
}
//=======================================================================
@@ -221,7 +259,8 @@ void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfI
//=======================================================================
void AIS_InteractiveContext::DisplayedObjects (const AIS_KindOfInteractive theKind,
const Standard_Integer theSign,
AIS_ListOfInteractive& theListOfIO) const
AIS_ListOfInteractive& theListOfIO,
const Standard_Boolean /*OnlyFromNeutral*/) const
{
ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Displayed, theListOfIO);
}
@@ -367,7 +406,9 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
Standard_Integer aDispMode = 0, aHiMod = -1, aSelMode = -1;
GetDefModes (theIObj, aDispMode, aHiMod, aSelMode);
Display (theIObj, aDispMode, myIsAutoActivateSelMode ? aSelMode : -1, theToUpdateViewer);
Display (theIObj, aDispMode, myIsAutoActivateSelMode ? aSelMode : -1,
theToUpdateViewer, theIObj->AcceptShapeDecomposition());
}
//=======================================================================
@@ -405,6 +446,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
const Standard_Integer theDispMode,
const Standard_Integer theSelectionMode,
const Standard_Boolean theToUpdateViewer,
const Standard_Boolean theToAllowDecomposition,
const AIS_DisplayStatus theDispStatus)
{
if (theIObj.IsNull())
@@ -415,7 +457,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
if (theDispStatus == AIS_DS_Erased)
{
Erase (theIObj, theToUpdateViewer);
Load (theIObj, theSelectionMode);
Load (theIObj, theSelectionMode, theToAllowDecomposition);
if (Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (theIObj))
{
(*aStatusPtr)->SetDisplayMode (theDispMode);
@@ -424,6 +466,25 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
}
setContextToObject (theIObj);
if (theDispStatus == AIS_DS_Temporary
&& !HasOpenedContext())
{
return;
}
else if (HasOpenedContext())
{
if (theDispStatus == AIS_DS_None
|| theDispStatus == AIS_DS_Temporary)
{
myLocalContexts (myCurLocalIndex)->Display (theIObj, theDispMode, theToAllowDecomposition, theSelectionMode);
if (theToUpdateViewer)
{
myMainVwr->Update();
}
return;
}
}
if (!myObjects.IsBound (theIObj))
{
Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
@@ -437,12 +498,16 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
{
mgrSelector->Load (theIObj);
}
mgrSelector->Activate (theIObj, theSelectionMode);
mgrSelector->Activate (theIObj, theSelectionMode, myMainSel);
}
}
else
{
Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
if (aStatus->GraphicStatus() == AIS_DS_Temporary)
{
return;
}
// Mark the presentation modes hidden of interactive object different from aDispMode.
// Then make sure aDispMode is displayed and maybe highlighted.
@@ -476,7 +541,7 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
{
if (!aStatus->IsSModeIn (theSelectionMode))
aStatus->AddSelectionMode (theSelectionMode);
mgrSelector->Activate (theIObj, theSelectionMode);
mgrSelector->Activate (theIObj, theSelectionMode, myMainSel);
}
}
}
@@ -492,7 +557,8 @@ void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIO
//purpose :
//=======================================================================
void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Integer theSelMode)
const Standard_Integer theSelMode,
const Standard_Boolean theToAllowDecomposition)
{
if (theIObj.IsNull())
{
@@ -500,6 +566,12 @@ void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
}
setContextToObject (theIObj);
if (HasOpenedContext())
{
myLocalContexts (myCurLocalIndex)->Load (theIObj, theToAllowDecomposition, theSelMode);
return;
}
if (!myObjects.IsBound (theIObj))
{
Standard_Integer aDispMode, aHiMod, aSelModeDef;
@@ -534,7 +606,26 @@ void AIS_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& theIObj
theIObj->ClearSelected();
}
EraseGlobal (theIObj, Standard_False);
Standard_Boolean wasInCtx = Standard_False;
if (HasOpenedContext())
{
// First it is checked if it is possible to remove in the current local context
// then one tries to remove in other local contexts, if they allow it...
wasInCtx = myLocalContexts (myCurLocalIndex)->Erase (theIObj);
for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
{
if (aCtxIter.Value()->AcceptErase())
{
wasInCtx = aCtxIter.Value()->Erase (theIObj) || wasInCtx;
}
}
}
if (!wasInCtx)
{
EraseGlobal (theIObj, Standard_False);
}
if (theToUpdateViewer)
{
myMainVwr->Update();
@@ -547,6 +638,11 @@ void AIS_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& theIObj
//=======================================================================
void AIS_InteractiveContext::EraseAll (const Standard_Boolean theToUpdateViewer)
{
if (HasOpenedContext())
{
return;
}
for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
{
if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
@@ -567,6 +663,11 @@ void AIS_InteractiveContext::EraseAll (const Standard_Boolean theToUpdateViewer)
//=======================================================================
void AIS_InteractiveContext::DisplayAll (const Standard_Boolean theToUpdateViewer)
{
if (HasOpenedContext())
{
return;
}
for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
{
const AIS_DisplayStatus aStatus = anObjIter.Value()->GraphicStatus();
@@ -588,6 +689,11 @@ void AIS_InteractiveContext::DisplayAll (const Standard_Boolean theToUpdateViewe
//=======================================================================
void AIS_InteractiveContext::DisplaySelected (const Standard_Boolean theToUpdateViewer)
{
if (HasOpenedContext())
{
return;
}
for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
{
Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
@@ -606,6 +712,11 @@ void AIS_InteractiveContext::DisplaySelected (const Standard_Boolean theToUpdate
//=======================================================================
void AIS_InteractiveContext::EraseSelected (const Standard_Boolean theToUpdateViewer)
{
if (HasOpenedContext())
{
return;
}
Standard_Boolean isFound = Standard_False;
for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Init (mySelection->Objects()))
{
@@ -620,6 +731,71 @@ void AIS_InteractiveContext::EraseSelected (const Standard_Boolean theToUpdateVi
}
}
//=======================================================================
//function :
//purpose :
//=======================================================================
Standard_Boolean AIS_InteractiveContext::KeepTemporary(const Handle(AIS_InteractiveObject)& anIObj,
const Standard_Integer WhichContext)
{
if(anIObj.IsNull()) return Standard_False;
if(!HasOpenedContext()) return Standard_False;
if(myObjects.IsBound(anIObj)) return Standard_False;
if(WhichContext!=-1 && !myLocalContexts.IsBound(WhichContext)) return Standard_False;
// Protection : if one tries to preserve a temporary object
// which is not in the local active context... rob 11-06-97
Standard_Integer IsItInLocal = myCurLocalIndex;
Standard_Boolean Found(Standard_False);
while(IsItInLocal>0 && !Found){
if(!myLocalContexts.IsBound(IsItInLocal))
IsItInLocal--;
else if(myLocalContexts(IsItInLocal)->IsIn(anIObj))
Found = Standard_True;
else
IsItInLocal--;
}
if(!Found) return Standard_False;
// const Handle(AIS_LocalStatus)& LS = (WhichContext== -1) ?
// myLocalContexts(IsItInLocal)->Status(anIObj):myLocalContexts(WhichContext)->Status(anIObj);
// CLE
// const Handle(AIS_LocalStatus)& LS = myLocalContexts(IsItInLocal)->Status(anIObj);
Handle(AIS_LocalStatus) LS = myLocalContexts(IsItInLocal)->Status(anIObj);
// ENDCLE
if(LS->IsTemporary()){
Standard_Integer DM,HM,SM;
GetDefModes(anIObj,DM,HM,SM);
SM = LS->SelectionModes().IsEmpty() ? SM : LS->SelectionModes().First();
if(LS->DisplayMode()!= DM ){
Standard_Integer LSM = LS->SelectionModes().IsEmpty() ? -1 : LS->SelectionModes().First();
myLocalContexts(IsItInLocal)->Display(anIObj,DM,LS->Decomposed(),LSM);
}
Handle (AIS_GlobalStatus) GS = new AIS_GlobalStatus(AIS_DS_Displayed,
DM,
SM,
Standard_False);
// GS->SubIntensityOn();
myObjects.Bind(anIObj,GS);
myMainVwr->StructureManager()->RegisterObject (anIObj);
mgrSelector->Load(anIObj);
mgrSelector->Activate(anIObj,SM,myMainSel);
LS->SetTemporary(Standard_False);
}
return Standard_True;
}
//=======================================================================
//function : DisplayStatus
//purpose :
@@ -630,8 +806,19 @@ AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus (const Handle(AIS_Intera
{
return AIS_DS_None;
}
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
return aStatus != NULL ? (*aStatus)->GraphicStatus() : AIS_DS_None;
else if (myObjects.IsBound (theIObj))
{
return myObjects (theIObj)->GraphicStatus();
}
for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
{
if (aCtxIter.Value()->IsIn (theIObj))
{
return AIS_DS_Temporary;
}
}
return AIS_DS_None;
}
//=======================================================================
@@ -654,6 +841,19 @@ void AIS_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& theIOb
}
theIObj->SetContext (Handle(AIS_InteractiveContext)());
}
if (HasOpenedContext())
{
myLocalContexts (myCurLocalIndex)->Remove (theIObj);
for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
{
if (aCtxIter.Value()->AcceptErase())
{
aCtxIter.Value()->Remove (theIObj);
}
}
}
ClearGlobal (theIObj, theToUpdateViewer);
}
@@ -676,6 +876,43 @@ void AIS_InteractiveContext::RemoveAll (const Standard_Boolean theToUpdateViewer
}
}
//=======================================================================
//function : ClearPrs
//purpose :
//=======================================================================
void AIS_InteractiveContext::ClearPrs (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Integer theMode,
const Standard_Boolean theToUpdateViewer)
{
if (theIObj.IsNull())
{
return;
}
if (!HasOpenedContext())
{
ClearGlobalPrs (theIObj, theMode, theToUpdateViewer);
return;
}
Standard_Boolean wasInCtx = myLocalContexts (myCurLocalIndex)->ClearPrs (theIObj, theMode);
for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
{
if (aCtxIter.Value()->AcceptErase())
{
wasInCtx = aCtxIter.Value()->ClearPrs (theIObj, theMode) || wasInCtx;
}
}
if (!wasInCtx)
{
ClearGlobalPrs (theIObj, theMode, theToUpdateViewer);
}
else if (theToUpdateViewer)
{
myMainVwr->Update();
}
}
//=======================================================================
//function : HilightWithColor
//purpose :
@@ -688,16 +925,23 @@ void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject
return;
setContextToObject (theObj);
if (!myObjects.IsBound (theObj))
return;
const Handle(AIS_GlobalStatus)& aStatus = myObjects (theObj);
aStatus->SetHilightStatus (Standard_True);
if (aStatus->GraphicStatus() == AIS_DS_Displayed)
if (!HasOpenedContext())
{
highlightGlobal (theObj, theStyle, aStatus->DisplayMode());
aStatus->SetHilightStyle (theStyle);
if (!myObjects.IsBound (theObj))
return;
const Handle(AIS_GlobalStatus)& aStatus = myObjects (theObj);
aStatus->SetHilightStatus (Standard_True);
if (aStatus->GraphicStatus() == AIS_DS_Displayed)
{
highlightGlobal (theObj, theStyle, aStatus->DisplayMode());
aStatus->SetHilightStyle (theStyle);
}
}
else
{
myLocalContexts (myCurLocalIndex)->Hilight (theObj, theStyle);
}
if (theIsToUpdate)
@@ -711,17 +955,24 @@ void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject
void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
{
if(anIObj.IsNull()) return;
if(!myObjects.IsBound(anIObj)) return;
const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
aStatus->SetHilightStatus (Standard_False);
aStatus->SetHilightStyle (Handle(Prs3d_Drawer)());
if (aStatus->GraphicStatus() == AIS_DS_Displayed)
if (!HasOpenedContext())
{
unhighlightGlobal (anIObj);
}
if(!myObjects.IsBound(anIObj)) return;
const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
aStatus->SetHilightStatus (Standard_False);
aStatus->SetHilightStyle (Handle(Prs3d_Drawer)());
if (aStatus->GraphicStatus() == AIS_DS_Displayed)
{
unhighlightGlobal (anIObj);
}
}
else
{
myLocalContexts(myCurLocalIndex)->Unhilight(anIObj);
}
if(updateviewer) myMainVwr->Update();
}
@@ -731,9 +982,27 @@ void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIO
//=======================================================================
Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(AIS_InteractiveObject)& theObj) const
{
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
return aStatus != NULL
&& (*aStatus)->IsHilighted();
if (!HasOpenedContext())
{
if (!myObjects.IsBound (theObj))
return Standard_False;
return myObjects (theObj)->IsHilighted();
}
Standard_DISABLE_DEPRECATION_WARNINGS
Standard_Integer aCtxIdx = HighestIndex();
Standard_ENABLE_DEPRECATION_WARNINGS
for (; aCtxIdx >= 1; aCtxIdx--)
{
if (myLocalContexts.IsBound (aCtxIdx))
{
if (myLocalContexts (aCtxIdx)->IsHilighted (theObj))
return Standard_True;
}
}
return Standard_False;
}
//=======================================================================
@@ -766,16 +1035,19 @@ Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(SelectMgr_Ent
Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(AIS_InteractiveObject)& theObj,
Handle(Prs3d_Drawer)& theStyle) const
{
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
if (aStatus != NULL
&& (*aStatus)->IsHilighted())
if (HasOpenedContext())
myLocalContexts (myCurLocalIndex)->HighlightStyle (theObj, theStyle);
if (IsHilighted (theObj))
{
theStyle = (*aStatus)->HilightStyle();
theStyle = myObjects (theObj)->HilightStyle();
return Standard_True;
}
theStyle.Nullify();
return Standard_False;
else
{
theStyle.Nullify();
return Standard_False;
}
}
//=======================================================================
@@ -818,13 +1090,22 @@ Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(SelectMgr_
//purpose :
//=======================================================================
Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& theObj) const
Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anIObj) const
{
if(theObj.IsNull()) return Standard_False;
if(anIObj.IsNull()) return Standard_False;
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
return aStatus != NULL
&& (*aStatus)->GraphicStatus() == AIS_DS_Displayed;
if(myObjects.IsBound(anIObj))
if(myObjects(anIObj)->GraphicStatus()==AIS_DS_Displayed)
return Standard_True;
AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
for(;ItM.More();ItM.Next()){
if(ItM.Value()->IsDisplayed(anIObj))
return Standard_True;
}
return Standard_False;
}
//=======================================================================
@@ -839,10 +1120,24 @@ Standard_Boolean AIS_InteractiveContext::IsDisplayed (const Handle(AIS_Interacti
return Standard_False;
}
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
return aStatus != NULL
&& (*aStatus)->GraphicStatus() == AIS_DS_Displayed
&& (*aStatus)->DisplayMode() == theMode;
if (myObjects.IsBound (theIObj))
{
Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
if (aStatus->GraphicStatus() == AIS_DS_Displayed
&& aStatus->DisplayMode() == theMode)
{
return Standard_True;
}
}
for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
{
if (aCtxIter.Value()->IsDisplayed (theIObj, theMode))
{
return Standard_True;
}
}
return Standard_False;
}
//=======================================================================
@@ -855,11 +1150,14 @@ Standard_Integer AIS_InteractiveContext::DisplayPriority (const Handle(AIS_Inter
{
return -1;
}
else if (!myObjects.IsBound (theIObj))
{
return 0;
}
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
if (aStatus != NULL
&& ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
|| (*aStatus)->GraphicStatus() == AIS_DS_Erased))
Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
if (aStatus->GraphicStatus() == AIS_DS_Displayed
|| aStatus->GraphicStatus() == AIS_DS_Erased)
{
Standard_Integer aDispMode = theIObj->HasDisplayMode()
? theIObj->DisplayMode()
@@ -884,17 +1182,23 @@ void AIS_InteractiveContext::SetDisplayPriority (const Handle(AIS_InteractiveObj
}
setContextToObject (theIObj);
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
if (aStatus != NULL
&& ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
|| (*aStatus)->GraphicStatus() == AIS_DS_Erased))
if (myObjects.IsBound (theIObj))
{
Standard_Integer aDisplayMode = theIObj->HasDisplayMode()
? theIObj->DisplayMode()
: (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
? myDefaultDrawer->DisplayMode()
: 0);
myMainPM->SetDisplayPriority (theIObj, aDisplayMode, thePriority);
Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
if (aStatus->GraphicStatus() == AIS_DS_Displayed
|| aStatus->GraphicStatus() == AIS_DS_Erased)
{
Standard_Integer aDisplayMode = theIObj->HasDisplayMode()
? theIObj->DisplayMode()
: (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
? myDefaultDrawer->DisplayMode()
: 0);
myMainPM->SetDisplayPriority (theIObj, aDisplayMode, thePriority);
}
}
else if (HasOpenedContext())
{
myLocalContexts (myCurLocalIndex)->SetDisplayPriority (theIObj, thePriority);
}
}
@@ -958,9 +1262,9 @@ void AIS_InteractiveContext::RecomputePrsOnly (const Handle(AIS_InteractiveObjec
return;
}
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
if (aStatus != NULL
&& (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
if (HasOpenedContext()
|| (myObjects.IsBound (theIObj)
&& myObjects (theIObj)->GraphicStatus() == AIS_DS_Displayed))
{
myMainVwr->Update();
}
@@ -978,9 +1282,17 @@ void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_Interactiv
mgrSelector->RecomputeSelection (theIO);
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIO);
if (aStatus == NULL
|| (*aStatus)->GraphicStatus() != AIS_DS_Displayed)
if (HasOpenedContext())
{
for (Standard_Integer aContextIdx = 1; aContextIdx <= myLocalContexts.Extent(); aContextIdx++)
{
myLocalContexts (aContextIdx)->ClearOutdatedSelection (theIO, Standard_False);
}
return;
}
if (!myObjects.IsBound (theIO) ||
myObjects (theIO)->GraphicStatus() != AIS_DS_Displayed)
{
return;
}
@@ -990,7 +1302,7 @@ void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_Interactiv
TColStd_ListIteratorOfListOfInteger aModesIter (aModes);
for (; aModesIter.More(); aModesIter.Next())
{
mgrSelector->Activate (theIO, aModesIter.Value());
mgrSelector->Activate (theIO, aModesIter.Value(), myMainSel);
}
}
@@ -1015,13 +1327,26 @@ void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIOb
mgrSelector->Update(theIObj);
for (Standard_Integer aContextIdx = 1; aContextIdx <= myLocalContexts.Extent(); aContextIdx++)
{
myLocalContexts (aContextIdx)->ClearOutdatedSelection (theIObj, Standard_False);
}
if (theUpdateViewer)
{
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
if (aStatus != NULL
&& (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
if (!myObjects.IsBound (theIObj))
{
myMainVwr->Update();
return;
}
switch (myObjects (theIObj)->GraphicStatus())
{
case AIS_DS_Displayed:
case AIS_DS_Temporary:
myMainVwr->Update();
break;
default:
break;
}
}
}
@@ -1058,7 +1383,15 @@ void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& t
theIObj->SetLocalTransformation (theLoc.Transformation());
mgrSelector->Update (theIObj, Standard_False);
if (!HasOpenedContext())
{
mgrSelector->Update (theIObj, Standard_False);
}
else
{
Handle(StdSelect_ViewerSelector3d) aTempSel = myLocalContexts (myCurLocalIndex)->MainSelector();
mgrSelector->Update (theIObj, aTempSel, Standard_False);
}
// if the object or its part is highlighted dynamically, it is necessary to apply location transformation
// to its highlight structure immediately
@@ -1822,6 +2155,11 @@ void AIS_InteractiveContext::UnsetTransparency (const Handle(AIS_InteractiveObje
void AIS_InteractiveContext::SetSelectedAspect (const Handle(Prs3d_BasicAspect)& theAspect,
const Standard_Boolean theToUpdateViewer)
{
if (HasOpenedContext())
{
return;
}
Standard_Boolean isFound = Standard_False;
for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
{
@@ -1960,7 +2298,8 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t
Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
if (aStatus->GraphicStatus() == AIS_DS_Erased)
if (aStatus->GraphicStatus() == AIS_DS_Temporary
|| aStatus->GraphicStatus() == AIS_DS_Erased)
{
return;
}
@@ -2004,7 +2343,7 @@ void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& t
for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
{
mgrSelector->Deactivate (theIObj, aSelModeIter.Value());
mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel);
}
aStatus->ClearSelectionModes();
aStatus->SetGraphicStatus (AIS_DS_Erased);
@@ -2305,7 +2644,14 @@ Standard_Boolean AIS_InteractiveContext::IsoOnTriangulation() const
//=======================================================================
void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecision)
{
myMainSel->SetPixelTolerance (thePrecision);
if (HasOpenedContext())
{
myLocalContexts (myCurLocalIndex)->SetPixelTolerance (thePrecision);
}
else
{
myMainSel->SetPixelTolerance (thePrecision);
}
}
//=======================================================================
@@ -2314,7 +2660,9 @@ void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecis
//=======================================================================
Standard_Integer AIS_InteractiveContext::PixelTolerance() const
{
return myMainSel->PixelTolerance();
return HasOpenedContext()
? myLocalContexts (myCurLocalIndex)->PixelTolerance()
: myMainSel->PixelTolerance();
}
//=======================================================================
@@ -2325,15 +2673,56 @@ void AIS_InteractiveContext::SetSelectionSensitivity (const Handle(AIS_Interacti
const Standard_Integer theMode,
const Standard_Integer theNewSensitivity)
{
if (HasOpenedContext())
{
myLocalContexts (myCurLocalIndex)->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
return;
}
mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
}
//=======================================================================
//function : IsInLocal
//purpose :
//=======================================================================
Standard_Boolean AIS_InteractiveContext::IsInLocal (const Handle(AIS_InteractiveObject)& theIObj,
Standard_Integer& theIndex) const
{
if (theIObj.IsNull())
{
return Standard_False;
}
// if it exists at neutral point 0 index is returned
if (myObjects.IsBound (theIObj))
{
theIndex = 0;
return Standard_False;
}
for (Standard_Integer aCtxIter = 1; aCtxIter <= myLocalContexts.Extent(); ++aCtxIter)
{
if (myLocalContexts.IsBound (aCtxIter))
{
if(myLocalContexts (aCtxIter)->IsIn (theIObj))
{
theIndex = aCtxIter;
return Standard_True;
}
}
}
theIndex = -1;
return Standard_False;
}
//=======================================================================
//function : InitAttributes
//purpose :
//=======================================================================
void AIS_InteractiveContext::InitAttributes()
{
Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS);
myDefaultDrawer->ShadingAspect()->SetMaterial (aMat);
@@ -2491,9 +2880,12 @@ void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView,
const Standard_Real theMargin,
const Standard_Boolean theToUpdate)
{
const Handle(AIS_Selection)& aSelection = HasOpenedContext()
? myLocalContexts(myCurLocalIndex)->Selection()
: mySelection;
Bnd_Box aBndSelected;
AIS_MapOfObjectOwners anObjectOwnerMap;
for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
for (AIS_NListOfEntityOwner::Iterator aSelIter (aSelection->Objects()); aSelIter.More(); aSelIter.Next())
{
const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value();
Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());

View File

@@ -17,6 +17,7 @@
#ifndef _AIS_InteractiveContext_HeaderFile
#define _AIS_InteractiveContext_HeaderFile
#include <AIS_DataMapOfILC.hxx>
#include <AIS_DataMapOfIOStatus.hxx>
#include <AIS_DisplayMode.hxx>
#include <AIS_DisplayStatus.hxx>
@@ -46,13 +47,14 @@
class SelectMgr_SelectionManager;
class V3d_Viewer;
class AIS_InteractiveObject;
class SelectMgr_OrFilter;
class V3d_View;
class AIS_LocalContext;
class TopLoc_Location;
class TCollection_ExtendedString;
class Prs3d_LineAspect;
class Prs3d_BasicAspect;
class TopoDS_Shape;
class SelectMgr_EntityOwner;
class SelectMgr_Filter;
@@ -67,6 +69,7 @@ class SelectMgr_Filter;
//! By default, global selection mode is equal to 0, but it might be redefined if needed.
class AIS_InteractiveContext : public Standard_Transient
{
friend class AIS_LocalContext;
DEFINE_STANDARD_RTTIEXT(AIS_InteractiveContext, Standard_Transient)
public: //! @name object display management
@@ -110,27 +113,15 @@ public: //! @name object display management
const Standard_Integer theDispMode,
const Standard_Integer theSelectionMode,
const Standard_Boolean theToUpdateViewer,
const Standard_Boolean theToAllowDecomposition = Standard_True,
const AIS_DisplayStatus theDispStatus = AIS_DS_None);
//! Allows you to load the Interactive Object with a given selection mode,
//! and/or with the desired decomposition option, whether the object is visualized or not.
//! If AllowDecomp = Standard_True and, if the interactive object is of the "Shape" type,
//! these "standard" selection modes will be automatically activated as a function of the modes present in the Local Context.
//! The loaded objects will be selectable but displayable in highlighting only when detected by the Selector.
Standard_EXPORT void Load (const Handle(AIS_InteractiveObject)& theObj, const Standard_Integer theSelectionMode = -1);
Standard_DEPRECATED("Deprecated method Display() with obsolete argument theToAllowDecomposition")
void Display (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Integer theDispMode,
const Standard_Integer theSelectionMode,
const Standard_Boolean theToUpdateViewer,
const Standard_Boolean theToAllowDecomposition,
const AIS_DisplayStatus theDispStatus = AIS_DS_None)
{
(void )theToAllowDecomposition;
Display (theIObj, theDispMode, theSelectionMode, theToUpdateViewer, theDispStatus);
}
Standard_DEPRECATED("Deprecated method Load() with obsolete last argument theToAllowDecomposition")
void Load (const Handle(AIS_InteractiveObject)& theObj, Standard_Integer theSelectionMode, Standard_Boolean ) { Load (theObj, theSelectionMode); }
Standard_EXPORT void Load (const Handle(AIS_InteractiveObject)& aniobj, const Standard_Integer SelectionMode = -1, const Standard_Boolean AllowDecomp = Standard_False);
//! Hides the object. The object's presentations are simply flagged as invisible and therefore excluded from redrawing.
//! To show hidden objects, use Display().
@@ -153,9 +144,9 @@ public: //! @name object display management
//! Empties the graphic presentation of the mode indexed by aMode.
//! Warning! Removes theIObj. theIObj is still active if it was previously activated.
void ClearPrs (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Integer theMode,
const Standard_Boolean theToUpdateViewer) { ClearGlobalPrs (theIObj, theMode, theToUpdateViewer); }
Standard_EXPORT void ClearPrs (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Integer theMode,
const Standard_Boolean theToUpdateViewer);
//! Removes Object from every viewer.
Standard_EXPORT void Remove (const Handle(AIS_InteractiveObject)& theIObj,
@@ -363,17 +354,17 @@ public: //! @name mouse picking logic (detection and dynamic highlighting of ent
//! Returns true if there is a mouse-detected entity in context.
//! @sa DetectedOwner()/HasNextDetected()/HilightPreviousDetected()/HilightNextDetected().
Standard_Boolean HasDetected() const { return !myLastPicked.IsNull(); }
Standard_EXPORT Standard_Boolean HasDetected() const;
//! Returns the owner of the detected sensitive primitive which is currently dynamically highlighted.
//! WARNING! This method is irrelevant to InitDetected()/MoreDetected()/NextDetected().
//! @sa HasDetected()/HasNextDetected()/HilightPreviousDetected()/HilightNextDetected().
const Handle(SelectMgr_EntityOwner)& DetectedOwner() const { return myLastPicked; }
Standard_EXPORT Handle(SelectMgr_EntityOwner) DetectedOwner() const;
//! Returns the interactive objects last detected in context.
//! In general this is just a wrapper for Handle(AIS_InteractiveObject)::DownCast(DetectedOwner()->Selectable()).
//! @sa DetectedOwner()
Handle(AIS_InteractiveObject) DetectedInteractive() const { return Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable()); }
Standard_EXPORT Handle(AIS_InteractiveObject) DetectedInteractive() const;
//! Returns true if there is a detected shape in local context.
//! @sa HasDetected()/DetectedShape()
@@ -387,7 +378,7 @@ public: //! @name mouse picking logic (detection and dynamic highlighting of ent
//! returns True if other entities were detected in the last mouse detection
//! @sa HilightPreviousDetected()/HilightNextDetected().
Standard_Boolean HasNextDetected() const { return !myDetectedSeq.IsEmpty() && myCurHighlighted <= myDetectedSeq.Upper(); }
Standard_EXPORT Standard_Boolean HasNextDetected() const;
//! If more than 1 object is detected by the selector, only the "best" owner is hilighted at the mouse position.
//! This Method allows the user to hilight one after another the other detected entities.
@@ -406,22 +397,16 @@ public: //! @name iteration through detected entities
//! Initialization for iteration through mouse-detected objects in
//! interactive context or in local context if it is opened.
//! @sa DetectedCurrentOwner()/MoreDetected()/NextDetected().
void InitDetected()
{
if (!myDetectedSeq.IsEmpty())
{
myCurDetected = myDetectedSeq.Lower();
}
}
Standard_EXPORT void InitDetected();
//! Return TRUE if there is more mouse-detected objects after the current one
//! during iteration through mouse-detected interactive objects.
//! @sa DetectedCurrentOwner()/InitDetected()/NextDetected().
Standard_Boolean MoreDetected() const { return myCurDetected >= myDetectedSeq.Lower() && myCurDetected <= myDetectedSeq.Upper(); }
Standard_EXPORT Standard_Boolean MoreDetected() const;
//! Gets next current object during iteration through mouse-detected interactive objects.
//! @sa DetectedCurrentOwner()/InitDetected()/MoreDetected().
void NextDetected() { ++myCurDetected; }
Standard_EXPORT void NextDetected();
//! Returns the owner from detected list pointed by current iterator position.
//! WARNING! This method is irrelevant to DetectedOwner() which returns last picked Owner regardless of iterator position!
@@ -491,32 +476,12 @@ public: //! @name Selection management
//! Infinite objects are ignored if infinite state of AIS_InteractiveObject is set to true.
Standard_EXPORT void FitSelected (const Handle(V3d_View)& theView);
//! Return value specified whether selected object must be hilighted when mouse cursor is moved above it
//! @sa MoveTo()
Standard_Boolean ToHilightSelected() const { return myToHilightSelected; }
//! Specify whether selected object must be hilighted when mouse cursor is moved above it (in MoveTo method).
//! By default this value is false and selected object is not hilighted in this case.
//! @sa MoveTo()
void SetToHilightSelected (const Standard_Boolean toHilight) { myToHilightSelected = toHilight; }
//! Returns true if the automatic highlight mode is active; TRUE by default.
//! @sa MoveTo(), Select(), HilightWithColor(), Unhilight()
Standard_Boolean AutomaticHilight() const { return myAutoHilight; }
//! Sets the highlighting status of detected and selected entities.
//! This function allows you to disconnect the automatic mode.
//!
//! MoveTo() will fill the list of detected entities
//! and Select() will set selected state to detected objects regardless of this flag,
//! but with disabled AutomaticHiligh() their highlighting state will be left unaffected,
//! so that application will be able performing custom highlighting in a different way, if needed.
//!
//! This API should be distinguished from SelectMgr_SelectableObject::SetAutoHilight()
//! that is used to implement custom highlighting logic for a specific interactive object class.
//!
//! @sa MoveTo(), Select(), HilightWithColor(), Unhilight()
void SetAutomaticHilight (Standard_Boolean theStatus) { myAutoHilight = theStatus; }
//! Return value specified whether selected object must be hilighted when mouse cursor is moved above it
Standard_Boolean ToHilightSelected() const { return myToHilightSelected; }
//! Unhighlights previously selected owners and marks them as not selected.
//! Marks owner given as selected and highlights it.
@@ -542,57 +507,53 @@ public: //! @name Selection management
//! Updates the list of selected objects:
//! i.e. highlights the newly selected ones and unhighlights previously selected objects.
//! @sa HilightSelected().
void UpdateSelected (Standard_Boolean theToUpdateViewer) { HilightSelected (theToUpdateViewer); }
Standard_EXPORT void UpdateSelected (const Standard_Boolean theToUpdateViewer);
//! Empties previous selected objects in order to get the selected objects detected by the selector using UpdateSelected.
Standard_EXPORT void ClearSelected (const Standard_Boolean theToUpdateViewer);
//! No right to Add a selected Shape (Internal Management of shape Selection).
//! A Previous selected shape may only be removed.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void AddOrRemoveSelected (const TopoDS_Shape& theShape,
const Standard_Boolean theToUpdateViewer);
//! Allows to highlight or unhighlight the owner given depending on its selection status
Standard_EXPORT void AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
const Standard_Boolean theToUpdateViewer);
//! Returns true is the owner given is selected
Standard_Boolean IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const { return !theOwner.IsNull() && theOwner->IsSelected(); }
Standard_EXPORT Standard_Boolean IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const;
//! Returns true is the object given is selected
Standard_EXPORT Standard_Boolean IsSelected (const Handle(AIS_InteractiveObject)& theObj) const;
//! Returns the first selected object in the list of current selected.
Standard_EXPORT Handle(AIS_InteractiveObject) FirstSelectedObject() const;
Standard_EXPORT Handle(AIS_InteractiveObject) FirstSelectedObject();
//! Count a number of selected entities using InitSelected()+MoreSelected()+NextSelected() iterator.
//! @sa SelectedOwner()/InitSelected()/MoreSelected()/NextSelected().
Standard_Integer NbSelected() { return mySelection->Extent(); }
Standard_EXPORT Standard_Integer NbSelected();
//! Initializes a scan of the selected objects.
//! @sa SelectedOwner()/MoreSelected()/NextSelected().
void InitSelected() { mySelection->Init(); }
Standard_EXPORT void InitSelected();
//! Returns true if there is another object found by the scan of the list of selected objects.
//! @sa SelectedOwner()/InitSelected()/NextSelected().
Standard_Boolean MoreSelected() const { return mySelection->More(); }
Standard_EXPORT Standard_Boolean MoreSelected() const;
//! Continues the scan to the next object in the list of selected objects.
//! @sa SelectedOwner()/InitSelected()/MoreSelected().
void NextSelected() { mySelection->Next(); }
Standard_EXPORT void NextSelected();
//! Returns the owner of the selected entity.
//! @sa InitSelected()/MoreSelected()/NextSelected().
Handle(SelectMgr_EntityOwner) SelectedOwner() const
{
return !mySelection->More()
? Handle(SelectMgr_EntityOwner)()
: mySelection->Value();
}
Standard_EXPORT Handle(SelectMgr_EntityOwner) SelectedOwner() const;
//! Return Handle(AIS_InteractiveObject)::DownCast (SelectedOwner()->Selectable()).
//! @sa SelectedOwner().
Handle(AIS_InteractiveObject) SelectedInteractive() const
{
return !mySelection->More()
? Handle(AIS_InteractiveObject)()
: Handle(AIS_InteractiveObject)::DownCast (mySelection->Value()->Selectable());
}
Standard_EXPORT Handle(AIS_InteractiveObject) SelectedInteractive() const;
//! Returns TRUE if the interactive context has a shape selected.
//! @sa SelectedShape().
@@ -610,11 +571,11 @@ public: //! @name Selection management
//! Returns SelectedInteractive()->HasOwner().
//! @sa SelectedOwner().
Standard_Boolean HasApplicative() const { return SelectedInteractive()->HasOwner(); }
Standard_EXPORT Standard_Boolean HasApplicative() const;
//! Returns SelectedInteractive()->GetOwner().
//! @sa SelectedOwner().
Handle(Standard_Transient) Applicative() const { return SelectedInteractive()->GetOwner(); }
Standard_EXPORT Handle(Standard_Transient) Applicative() const;
public: //! @name immediate mode rendering
@@ -635,7 +596,7 @@ public: //! @name immediate mode rendering
Standard_EXPORT Standard_Boolean IsImmediateModeOn() const;
//! Redraws immediate structures in all views of the viewer given taking into account its visibility.
void RedrawImmediate (const Handle(V3d_Viewer)& theViewer) { myMainPM->RedrawImmediate (theViewer); }
Standard_EXPORT void RedrawImmediate (const Handle(V3d_Viewer)& theViewer);
public: //! @name management of active Selection Modes
@@ -751,11 +712,11 @@ public: //! @name common properties
//! Returns the list of displayed objects of a particular Type WhichKind and Signature WhichSignature.
//! By Default, WhichSignature equals -1. This means that there is a check on type only.
Standard_EXPORT void DisplayedObjects (AIS_ListOfInteractive& aListOfIO) const;
Standard_EXPORT void DisplayedObjects (AIS_ListOfInteractive& aListOfIO, const Standard_Boolean OnlyFromNeutral = Standard_False) const;
//! gives the list of displayed objects of a particular Type and signature.
//! by Default, <WhichSignature> = -1 means control only on <WhichKind>.
Standard_EXPORT void DisplayedObjects (const AIS_KindOfInteractive theWhichKind, const Standard_Integer theWhichSignature, AIS_ListOfInteractive& theListOfIO) const;
Standard_EXPORT void DisplayedObjects (const AIS_KindOfInteractive WhichKind, const Standard_Integer WhichSignature, AIS_ListOfInteractive& aListOfIO, const Standard_Boolean OnlyFromNeutral = Standard_False) const;
//! Returns the list theListOfIO of erased objects (hidden objects) particular Type WhichKind and Signature WhichSignature.
//! By Default, WhichSignature equals 1. This means that there is a check on type only.
@@ -763,7 +724,7 @@ public: //! @name common properties
//! gives the list of erased objects (hidden objects)
//! Type and signature by Default, <WhichSignature> = -1 means control only on <WhichKind>.
Standard_EXPORT void ErasedObjects (const AIS_KindOfInteractive theWhichKind, const Standard_Integer theWhichSignature, AIS_ListOfInteractive& theListOfIO) const;
Standard_EXPORT void ErasedObjects (const AIS_KindOfInteractive WhichKind, const Standard_Integer WhichSignature, AIS_ListOfInteractive& theListOfIO) const;
//! Returns the list theListOfIO of objects with indicated display status particular Type WhichKind and Signature WhichSignature.
//! By Default, WhichSignature equals 1. This means that there is a check on type only.
@@ -1059,70 +1020,198 @@ public: //! @name iso-line display attributes
//! Returns true if drawing isolines on triangulation algorithm is enabled.
Standard_EXPORT Standard_Boolean IsoOnTriangulation() const;
public: //! @name Local Context management (deprecated)
//! Returns true if there is an open context.
Standard_Boolean HasOpenedContext() const { return myCurLocalIndex != 0; }
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT Standard_Integer HighestIndex() const;
//! For advanced usage! You should use other (non-internal) methods of class AIS_InteractiveContext without trying to obtain an instance of AIS_LocalContext.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Handle(AIS_LocalContext) LocalContext() const { return myCurLocalIndex > 0 ? myLocalContexts (myCurLocalIndex) : Handle(AIS_LocalContext)(); }
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT Handle(StdSelect_ViewerSelector3d) LocalSelector() const;
//! Opens local contexts and specifies how this is to be done.
//! The options listed above function in the following manner:
//! - UseDisplayedObjects - allows you to load or not load the interactive objects visualized at Neutral Point in the local context which you open.
//! If false, the local context is empty after being opened. If true, the objects at Neutral Point are loaded by their default selection mode.
//! - AllowShapeDecomposition - AIS_Shape allows or prevents decomposition in standard shape location mode of objects at Neutral Point which are type-"privileged".
//! This Flag is only taken into account when UseDisplayedObjects is true.
//! - AcceptEraseOfObjects - authorises other local contexts to erase the interactive objects present in this context. This option is rarely used.
//! - BothViewers - Has no use currently defined.
//! This method returns the index of the created local context.
//! It should be kept and used to close the context.
//! Opening a local context allows you to prepare an environment for temporary presentations and selections which will disappear once the local context is closed.
//! You can open several local contexts, but only the last one will be active.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT Standard_Integer OpenLocalContext (const Standard_Boolean UseDisplayedObjects = Standard_True, const Standard_Boolean AllowShapeDecomposition = Standard_True, const Standard_Boolean AcceptEraseOfObjects = Standard_False, const Standard_Boolean BothViewers = Standard_False);
//! Allows you to close local contexts. For greater security, you should close the context with the index Index given on opening.
//! When you close a local context, the one before, which is still on the stack, reactivates.
//! If none is left, you return to Neutral Point.
//! If a local context is open and if updateviewer equals Standard_False, the presentation of the Interactive Object activates the selection mode;
//! the object is displayed but no viewer will be updated.
//! Warning
//! When the index isn't specified, the current context is closed.
//! This option can be dangerous, as other Interactive Functions can open local contexts without necessarily warning the user.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void CloseLocalContext (const Standard_Integer theIndex = -1,
const Standard_Boolean theToUpdateViewer = Standard_True);
//! returns -1 if no opened local context.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT Standard_Integer IndexOfCurrentLocal() const;
//! Allows you to close all local contexts at one go and return to Neutral Point.
//! If a local context is open and if updateviewer equals Standard_False, the presentation of the Interactive Object activates the selection mode;
//! the object is displayed but no viewer will be updated.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void CloseAllContexts (const Standard_Boolean theToUpdateViewer);
//! to be used only with no opened local context..
//! displays and activates objects in their original state before local contexts were opened...
Standard_EXPORT void ResetOriginalState (const Standard_Boolean theToUpdateViewer);
//! clears Objects/Filters/Activated Modes list in the current opened local context.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void ClearLocalContext (const AIS_ClearMode TheMode = AIS_CM_All);
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void UseDisplayedObjects();
//! when a local Context is opened, one is able to use/not use the displayed objects at neutral point at anytime.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void NotUseDisplayedObjects();
//! to be Used only with opened local context and
//! if <anIobj> is of type shape...
//! if <aStatus> = True <anIobj> will be sensitive to
//! shape selection modes activation.
//! = False, <anIobj> will not be sensitive any more.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void SetShapeDecomposition (const Handle(AIS_InteractiveObject)& anIobj, const Standard_Boolean aStatus);
//! Sets the temporary graphic attributes of the entity anObj.
//! These are provided by the attribute manager aDrawer and are valid for a particular local context only.
//! If a local context is open and if updateviewer equals Standard_False, the presentation of the Interactive Object activates the selection mode;
//! the object is displayed but no viewer will be updated.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT void SetTemporaryAttributes (const Handle(AIS_InteractiveObject)& theIObj,
const Handle(Prs3d_Drawer)& theDrawer,
const Standard_Boolean theToUpdateViewer);
//! Provides an alternative to the Display methods when activating specific selection modes.
//! This has the effect of activating the corresponding selection mode aStandardActivation for all objects
//! in Local Context which accept decomposition into sub-shapes.
//! Every new Object which has been loaded into the interactive context and which answers these decomposition criteria
//! is automatically activated according to these modes.
//! Warning
//! If you have opened a local context by loading an object with the default options (<AllowShapeDecomposition >= Standard_True),
//! all objects of the "Shape" type are also activated with the same modes.
//! You can act on the state of these "Standard" objects by using SetShapeDecomposition(Status).
Standard_DEPRECATED ("Local Context is deprecated - ::Activate() and AIS_Shape::SelectionMode() should be used instead")
Standard_EXPORT void ActivateStandardMode (const TopAbs_ShapeEnum aStandardActivation);
//! Provides an alternative to the Display methods when deactivating specific selection modes.
//! This has the effect of deactivating the corresponding selection mode aStandardActivation for all objects
//! in Local Context which accept decomposition into sub-shapes.
Standard_DEPRECATED ("Local Context is deprecated - ::Deactivate() should be used instead")
Standard_EXPORT void DeactivateStandardMode (const TopAbs_ShapeEnum aStandardActivation);
//! Returns the list of activated standard selection modes available in a local context.
Standard_DEPRECATED ("Local Context is deprecated - list of activated Selection Modes should be tracked on application side; see also ::ActivatedModes()")
Standard_EXPORT const TColStd_ListOfInteger& ActivatedStandardModes() const;
//! returns if possible, the first local context where the object is seen
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT Standard_Boolean IsInLocal (const Handle(AIS_InteractiveObject)& anObject, Standard_Integer& TheIndex) const;
//! Sets the highlighting status aStatus of detected and selected entities.
//! Whether you are in Neutral Point or local context, this is automatically managed by the Interactive Context.
//! This function allows you to disconnect the automatic mode.
Standard_EXPORT void SetAutomaticHilight (const Standard_Boolean aStatus);
//! Returns true if the automatic highlight mode is active in an open context.
Standard_EXPORT Standard_Boolean AutomaticHilight() const;
//! Changes the status of a temporary object.
//! It will be kept at the neutral point, i.e. put in the list of displayed objects along with its temporary attributes.
//! These include display mode and selection mode, for example.
//! Returns true if done.
//! inWhichLocal gives the local context in which anIObj is displayed.
//! By default, the index -1 refers to the last Local Context opened.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_EXPORT Standard_Boolean KeepTemporary (const Handle(AIS_InteractiveObject)& anIObj, const Standard_Integer InWhichLocal = -1);
public:
//! Updates the view of the current object in open context.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void SetCurrentObject (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Boolean theToUpdateViewer) { SetSelected (theIObj, theToUpdateViewer); }
Standard_EXPORT void SetCurrentObject (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Boolean theToUpdateViewer);
//! Allows to add or remove the object given to the list of current and highlight/unhighlight it correspondingly.
//! Is valid for global context only; for local context use method AddOrRemoveSelected.
//! Since this method makes sence only for neutral point selection of a whole object,
//! if 0 selection of the object is empty this method simply does nothing.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj,
const Standard_Boolean theIsToUpdateViewer) { AddOrRemoveSelected (theObj, theIsToUpdateViewer); }
Standard_EXPORT void AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj,
const Standard_Boolean theIsToUpdateViewer);
//! Updates the list of current objects, i.e. hilights new current objects, removes hilighting from former current objects.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void UpdateCurrent() { UpdateSelected (Standard_True); }
Standard_EXPORT void UpdateCurrent();
//! Returns true if there is a non-null interactive object in Neutral Point.
//! Objects selected when there is no open local context are called current objects;
//! those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_Boolean IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const { return IsSelected (theObject); }
Standard_EXPORT Standard_Boolean IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const;
//! Initializes a scan of the current selected objects in Neutral Point.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void InitCurrent() { InitSelected(); }
Standard_DEPRECATED ("Local Context is deprecated - ::InitSelected() should be called instead")
Standard_EXPORT void InitCurrent();
//! Returns true if there is another object found by the scan of the list of current objects.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_Boolean MoreCurrent() const { return MoreSelected(); }
Standard_DEPRECATED ("Local Context is deprecated - ::MoreSelected() should be called instead")
Standard_EXPORT Standard_Boolean MoreCurrent() const;
//! Continues the scan to the next object in the list of current objects.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void NextCurrent() { NextSelected(); }
Standard_DEPRECATED ("Local Context is deprecated - ::NextSelected() should be called instead")
Standard_EXPORT void NextCurrent();
//! Returns the current interactive object.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Handle(AIS_InteractiveObject) Current() const { return SelectedInteractive(); }
Standard_DEPRECATED ("Local Context is deprecated - ::SelectedInteractive() should be called instead")
Standard_EXPORT Handle(AIS_InteractiveObject) Current() const;
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
Standard_Integer NbCurrents() { return NbSelected(); }
Standard_DEPRECATED ("Local Context is deprecated - ::NbSelected() should be called instead")
Standard_EXPORT Standard_Integer NbCurrents();
//! Highlights current objects.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void HilightCurrents (const Standard_Boolean theToUpdateViewer) { HilightSelected (theToUpdateViewer); }
Standard_DEPRECATED ("Local Context is deprecated - ::HilightSelected() should be called instead")
Standard_EXPORT void HilightCurrents (const Standard_Boolean theToUpdateViewer);
//! Removes highlighting from current objects.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void UnhilightCurrents (const Standard_Boolean theToUpdateViewer) { UnhilightSelected (theToUpdateViewer); }
Standard_DEPRECATED ("Local Context is deprecated - ::UnhilightSelected() should be called instead")
Standard_EXPORT void UnhilightCurrents (const Standard_Boolean theToUpdateViewer);
//! Empties previous current objects in order to get the current objects detected by the selector using UpdateCurrent.
//! Objects selected when there is no open local context are called current objects; those selected in open local context, selected objects.
Standard_DEPRECATED ("Local Context is deprecated - local selection should be used without Local Context")
void ClearCurrents (const Standard_Boolean theToUpdateViewer) { ClearSelected (theToUpdateViewer); }
Standard_DEPRECATED ("Local Context is deprecated - ::ClearSelected() should be called instead")
Standard_EXPORT void ClearCurrents (const Standard_Boolean theToUpdateViewer);
//! @return current mouse-detected shape or empty (null) shape, if current interactive object
//! is not a shape (AIS_Shape) or there is no current mouse-detected interactive object at all.
@@ -1167,6 +1256,14 @@ public: //! @name sub-intensity management (deprecated)
Standard_EXPORT void SubIntensityOff (const Handle(AIS_InteractiveObject)& theIObj,
const Standard_Boolean theToUpdateViewer);
//! hilights/unhilights displayed objects which are displayed at neutral state with subintensity color.
//! Available only for active local context.
//! No effect if no local context.
Standard_EXPORT void SubIntensityOn (const Standard_Boolean theToUpdateViewer);
//! Removes subintensity option for all objects.
Standard_EXPORT void SubIntensityOff (const Standard_Boolean theToUpdateViewer);
protected: //! @name internal methods
Standard_EXPORT void GetDefModes (const Handle(AIS_InteractiveObject)& anIobj, Standard_Integer& Dmode, Standard_Integer& HiMod, Standard_Integer& SelMode) const;
@@ -1347,11 +1444,12 @@ protected: //! @name internal fields
Handle(SelectMgr_OrFilter) myFilters;
Handle(Prs3d_Drawer) myDefaultDrawer;
Handle(Prs3d_Drawer) myStyles[Prs3d_TypeOfHighlight_NB];
AIS_DataMapOfILC myLocalContexts;
Standard_Integer myCurLocalIndex;
TColStd_SequenceOfInteger myDetectedSeq;
Standard_Integer myCurDetected;
Standard_Integer myCurHighlighted;
SelectMgr_PickingStrategy myPickingStrategy; //!< picking strategy to be applied within MoveTo()
Standard_Boolean myAutoHilight;
Standard_Boolean myIsAutoActivateSelMode;
};

File diff suppressed because it is too large Load Diff

View File

@@ -15,10 +15,12 @@
// commercial license or contractual agreement.
#include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
#include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
#include <AIS_GlobalStatus.hxx>
#include <AIS_InteractiveContext.hxx>
#include <AIS_InteractiveObject.hxx>
#include <AIS_LocalContext.hxx>
#include <AIS_Selection.hxx>
#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
#include <Graphic3d_MapOfStructure.hxx>
@@ -41,6 +43,179 @@
#include <V3d_View.hxx>
#include <V3d_Viewer.hxx>
//=======================================================================
//function : OpenLocalContext
//purpose :
//=======================================================================
Standard_Integer AIS_InteractiveContext::
OpenLocalContext(const Standard_Boolean UseDisplayedObjects,
const Standard_Boolean AllowShapeDecomposition,
const Standard_Boolean AcceptEraseOfTemporary,
const Standard_Boolean /*BothViewers*/)
{
// the entities eventually detected just before the context was opened are unhighlighted...
if(!IsSelected(myLastPicked)){
if(!myLastPicked.IsNull()){
const Handle(AIS_InteractiveObject) aLastPickedAIS = Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
unhighlightGlobal (aLastPickedAIS);
}}
if (myCurLocalIndex > 0)
{
myLocalContexts (myCurLocalIndex)->UnhilightLastDetected (myMainVwr);
}
// entities connected to dynamic selection at neutral point are set to 0.
myLastinMain.Nullify();
myLastPicked.Nullify();
myWasLastMain = Standard_True;
Standard_DISABLE_DEPRECATION_WARNINGS
myCurLocalIndex = HighestIndex() + 1;
Standard_ENABLE_DEPRECATION_WARNINGS
Handle(AIS_LocalContext) NewLocal= new AIS_LocalContext(this,myCurLocalIndex,
UseDisplayedObjects,
AllowShapeDecomposition,
AcceptEraseOfTemporary);
// the AIS_LocalContext bind itself to myLocalContexts
// because procedures performed in AIS_LocalContext constructor
// already may access myLocalContexts(myCurLocalIndex) (like methods AIS_LocalContext::IsSelected()).
#ifdef OCCT_DEBUG
cout<<"\tOpen Local Context No "<<myCurLocalIndex<<endl;
if(UseDisplayedObjects){
cout<<"\t\tObjects from Neutral Point loaded"<<endl;
if(AllowShapeDecomposition)
cout<<"\t\tDecomposition Authorized for Loaded Shapes"<<endl;
else
cout<<"\t\tNo Decomposition Authorized for Loaded Shapes"<<endl;
}
else
cout<<"\t\tNo Objects Were Loaded "<<endl;
#endif
return myCurLocalIndex;
}
//=======================================================================
//function : CloseLocalContext
//purpose :
//=======================================================================
void AIS_InteractiveContext::CloseLocalContext(const Standard_Integer Index,
const Standard_Boolean updateviewer)
{
Standard_Boolean debugmode(Standard_False);
#ifdef OCCT_DEBUG
debugmode = Standard_True;
#endif
Standard_Integer GoodIndex = (Index ==-1) ? myCurLocalIndex : Index;
if(debugmode) cout<<"Call to CloseLocalContext - Index "<<GoodIndex<<endl;
if(!HasOpenedContext()){
if(debugmode) cout<<"\t But No Local Context is opened"<<endl;
return;
}
if(!myLocalContexts.IsBound(GoodIndex)) {
if(debugmode) cout<<" Attempt to Close a non-existent Local Context"<<endl;
return;
}
// the only open local context is closed...
if(myLocalContexts.Extent()==1 && GoodIndex == myCurLocalIndex){
myLocalContexts(myCurLocalIndex)->Terminate( updateviewer );
myLocalContexts.UnBind(myCurLocalIndex);
myCurLocalIndex = 0;
ResetOriginalState(Standard_False);
if(debugmode)
cout<<"No More Opened Local Context "<<endl;
}
// Otherwise the local context will be still open after the current is closed
else{
Handle(StdSelect_ViewerSelector3d) VS = myLocalContexts(GoodIndex)->MainSelector();
myLocalContexts(GoodIndex)->Terminate();
myLocalContexts.UnBind(GoodIndex);
// the current is closed...
if(GoodIndex==myCurLocalIndex){
Standard_DISABLE_DEPRECATION_WARNINGS
myCurLocalIndex = HighestIndex();
Standard_ENABLE_DEPRECATION_WARNINGS
}
else if(debugmode)
cout<<"a No Current Local Context WasClosed"<<endl;
// restore activated selections of current local context
myLocalContexts (myCurLocalIndex)->RestoreActivatedModes();
if(debugmode) cout<<"Index Of CurrentLocalContext:"<<myCurLocalIndex<<endl;
}
if(updateviewer) myMainVwr->Update();
}
//=======================================================================
//function : CloseAllContexts
//purpose :
//=======================================================================
Standard_DISABLE_DEPRECATION_WARNINGS
void AIS_InteractiveContext::CloseAllContexts(const Standard_Boolean updateviewer)
{
while(!myLocalContexts.IsEmpty()){
CloseLocalContext(myCurLocalIndex,Standard_False);
}
ResetOriginalState(Standard_False);
if(updateviewer) myMainVwr->Update();
}
Standard_ENABLE_DEPRECATION_WARNINGS
//=======================================================================
//function : IndexOfCurrentLocal
//purpose :
//=======================================================================
Standard_Integer AIS_InteractiveContext::IndexOfCurrentLocal() const
{
return myCurLocalIndex;
}
//=======================================================================
//function : ClearLocalContext
//purpose :
//=======================================================================
void AIS_InteractiveContext::ClearLocalContext(const AIS_ClearMode aMode)
{
if (!HasOpenedContext()) return;
myLocalContexts(myCurLocalIndex)->Clear(aMode);
}
//=======================================================================
//function : HighestIndex
//purpose :
//=======================================================================
Standard_Integer AIS_InteractiveContext::HighestIndex() const
{
AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
Standard_Integer HiInd = 0;
for(;It.More();It.Next())
HiInd = (It.Key()>HiInd) ? It.Key() : HiInd;
return HiInd;
}
//=======================================================================
//function : SetSelectionModeActive
//purpose :
@@ -55,6 +230,11 @@ void AIS_InteractiveContext::SetSelectionModeActive (const Handle(AIS_Interactiv
{
return;
}
else if (HasOpenedContext())
{
myLocalContexts (myCurLocalIndex)->SetSelectionModeActive (theObj, theMode, theIsActive, theActiveFilter);
return;
}
const Handle(AIS_GlobalStatus)* aStat = myObjects.Seek (theObj);
if (aStat == NULL)
@@ -73,12 +253,12 @@ void AIS_InteractiveContext::SetSelectionModeActive (const Handle(AIS_Interactiv
{
for (TColStd_ListIteratorOfListOfInteger aModeIter ((*aStat)->SelectionModes()); aModeIter.More(); aModeIter.Next())
{
mgrSelector->Deactivate (theObj, aModeIter.Value());
mgrSelector->Deactivate (theObj, aModeIter.Value(), myMainSel);
}
}
else
{
mgrSelector->Deactivate (theObj, theMode);
mgrSelector->Deactivate (theObj, theMode, myMainSel);
}
}
@@ -112,7 +292,7 @@ void AIS_InteractiveContext::SetSelectionModeActive (const Handle(AIS_Interactiv
{
for (TColStd_ListIteratorOfListOfInteger aModeIter ((*aStat)->SelectionModes()); aModeIter.More(); aModeIter.Next())
{
mgrSelector->Deactivate (theObj, aModeIter.Value());
mgrSelector->Deactivate (theObj, aModeIter.Value(), myMainSel);
}
(*aStat)->ClearSelectionModes();
break;
@@ -126,7 +306,7 @@ void AIS_InteractiveContext::SetSelectionModeActive (const Handle(AIS_Interactiv
if ((theMode == aGlobSelMode && aModeIter.Value() != aGlobSelMode)
|| (theMode != aGlobSelMode && aModeIter.Value() == aGlobSelMode))
{
mgrSelector->Deactivate (theObj, aModeIter.Value());
mgrSelector->Deactivate (theObj, aModeIter.Value(), myMainSel);
aRemovedModes.Append (aModeIter.Value());
}
}
@@ -148,7 +328,7 @@ void AIS_InteractiveContext::SetSelectionModeActive (const Handle(AIS_Interactiv
break;
}
}
mgrSelector->Activate (theObj, theMode);
mgrSelector->Activate (theObj, theMode, myMainSel);
}
(*aStat)->AddSelectionMode (theMode);
}
@@ -165,12 +345,24 @@ void AIS_InteractiveContext::Activate (const Standard_Integer theMode,
for (AIS_ListIteratorOfListOfInteractive anIter (aDisplayedObjects); anIter.More(); anIter.Next())
{
Load (anIter.Value(), -1);
Load (anIter.Value(), -1, Standard_True);
Activate (anIter.Value(), theMode, theIsForce);
}
}
//=======================================================================
//function : LocalSelector
//purpose :
//=======================================================================
Handle( StdSelect_ViewerSelector3d ) AIS_InteractiveContext::LocalSelector() const
{
if( !HasOpenedContext() )
return Handle( StdSelect_ViewerSelector3d )();
else
return myLocalContexts( myCurLocalIndex )->MainSelector();
}
// ============================================================================
// function : Deactivate
// purpose :
@@ -203,19 +395,55 @@ void AIS_InteractiveContext::Deactivate()
//=======================================================================
//function : ActivatedModes
//purpose :
//purpose :
//=======================================================================
void AIS_InteractiveContext::ActivatedModes (const Handle(AIS_InteractiveObject)& theObj,
TColStd_ListOfInteger& theList) const
void AIS_InteractiveContext::
ActivatedModes(const Handle(AIS_InteractiveObject)& anIObj,
TColStd_ListOfInteger& theList) const
{
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
if (aStatus != NULL)
{
for (TColStd_ListIteratorOfListOfInteger aModeIter ((*aStatus)->SelectionModes()); aModeIter.More(); aModeIter.Next())
{
theList.Append (aModeIter.Value());
TColStd_ListIteratorOfListOfInteger ItL;
if(!HasOpenedContext()){
if(myObjects.IsBound(anIObj)){
for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
ItL.More();
ItL.Next())
theList.Append(ItL.Value());
}
}
else{
if(myLocalContexts(myCurLocalIndex)->IsIn(anIObj)){
for(ItL.Initialize(myLocalContexts(myCurLocalIndex)->SelectionModes(anIObj));
ItL.More();
ItL.Next())
theList.Append(ItL.Value());
}
}
}
//=======================================================================
//function : SetShapeDecomposition
//purpose :
//=======================================================================
void AIS_InteractiveContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& anIObj,
const Standard_Boolean StdModeSensitive)
{
if(!HasOpenedContext()) return;
myLocalContexts(myCurLocalIndex)->SetShapeDecomposition(anIObj,StdModeSensitive);
}
//=======================================================================
//function : SetTemporaryAttributes
//purpose :
//=======================================================================
void AIS_InteractiveContext::
SetTemporaryAttributes(const Handle(AIS_InteractiveObject)& /*anObj*/,
const Handle(Prs3d_Drawer)& /*aDrawer*/,
const Standard_Boolean /*updateviewer*/)
{
}
//=======================================================================
@@ -226,7 +454,16 @@ void AIS_InteractiveContext::
SubIntensityOn(const Handle(AIS_InteractiveObject)& anIObj,
const Standard_Boolean updateviewer)
{
turnOnSubintensity (anIObj);
if(!HasOpenedContext())
{
turnOnSubintensity (anIObj);
}
else
{
turnOnSubintensity (anIObj, -1, Standard_False);
myLocalContexts(myCurLocalIndex)->SubIntensityOn (anIObj);
}
if (updateviewer)
myMainVwr->Update();
}
@@ -235,33 +472,83 @@ SubIntensityOn(const Handle(AIS_InteractiveObject)& anIObj,
//purpose :
//=======================================================================
void AIS_InteractiveContext::SubIntensityOff (const Handle(AIS_InteractiveObject)& theObj,
const Standard_Boolean theToUpdateViewer)
void AIS_InteractiveContext::
SubIntensityOff(const Handle(AIS_InteractiveObject)& anIObj,
const Standard_Boolean updateviewer)
{
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
if (aStatus == NULL
|| !(*aStatus)->IsSubIntensityOn())
{
return;
}
(*aStatus)->SubIntensityOff();
Standard_Boolean toUpdateMain = Standard_False;
if ((*aStatus)->GraphicStatus() == AIS_DS_Displayed)
{
myMainPM->Unhighlight (theObj);
toUpdateMain = Standard_True;
}
if(!HasOpenedContext()){
if(!myObjects.IsBound(anIObj))
return;
const Handle(AIS_GlobalStatus)& GB=myObjects(anIObj);
if(!GB->IsSubIntensityOn())
return;
GB->SubIntensityOff();
Standard_Boolean UpdMain(Standard_False);
if (IsSelected (theObj))
{
highlightSelected (theObj->GlobalSelOwner());
if(GB->GraphicStatus() == AIS_DS_Displayed)
{
myMainPM->Unhighlight (anIObj);
UpdMain = Standard_True;
}
if(IsSelected(anIObj))
highlightSelected (anIObj->GlobalSelOwner());
if(updateviewer){
if(UpdMain)
myMainVwr->Update();
}
}
else {
const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anIObj, anIObj->GlobalSelOwner());
if(myObjects.IsBound(anIObj)){
const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
STAT->SubIntensityOff();
myMainPM->Unhighlight (anIObj);
if (STAT->IsHilighted())
HilightWithColor (anIObj, anObjSelStyle, Standard_False);
}
else
myLocalContexts(myCurLocalIndex)->SubIntensityOff(anIObj);
if (IsSelected(anIObj))
HilightWithColor (anIObj, anObjSelStyle, Standard_False);
if(updateviewer) myMainVwr->Update();
}
}
//=======================================================================
//function : SubIntensityOn
//purpose : ALL THE DISPLAYED OBJECTS HAVE SUBINTENSITY...
//=======================================================================
void AIS_InteractiveContext::SubIntensityOn (const Standard_Boolean theIsToUpdateViewer)
{
if (!HasOpenedContext())
return;
turnOnSubintensity();
if (theIsToUpdateViewer)
myMainVwr->Update();
}
//=======================================================================
//function : SubIntensityOff
//purpose :
//=======================================================================
void AIS_InteractiveContext::SubIntensityOff(const Standard_Boolean updateviewer)
{
if(!HasOpenedContext()) return;
AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
for(;It.More();It.Next()){
const Handle(AIS_GlobalStatus)& STAT = It.Value();
if(STAT->IsSubIntensityOn())
STAT->SubIntensityOff();
myMainPM->Unhighlight (It.Key());
}
if (theToUpdateViewer && toUpdateMain)
{
myMainVwr->Update();
}
if(updateviewer) myMainVwr->Update();
}
//=======================================================================
@@ -270,7 +557,30 @@ void AIS_InteractiveContext::SubIntensityOff (const Handle(AIS_InteractiveObject
//=======================================================================
void AIS_InteractiveContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
{
myFilters->Add(aFilter);
if(HasOpenedContext())
myLocalContexts(myCurLocalIndex)->AddFilter(aFilter);
else
myFilters->Add(aFilter);
}
//=======================================================================
//function : ActivateStandardMode
//purpose :
//=======================================================================
void AIS_InteractiveContext::ActivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
{
if(!HasOpenedContext()) return;
myLocalContexts(myCurLocalIndex)->ActivateStandardMode (aStandardActivation);
}
//=======================================================================
//function : DeActivateStandardMode
//purpose :
//=======================================================================
void AIS_InteractiveContext::DeactivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
{
if(!HasOpenedContext()) return;
myLocalContexts(myCurLocalIndex)->DeactivateStandardMode (aStandardActivation);
}
//=======================================================================
@@ -279,7 +589,10 @@ void AIS_InteractiveContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
//=======================================================================
void AIS_InteractiveContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
{
myFilters->Remove(aFilter);
if(HasOpenedContext())
myLocalContexts(myCurLocalIndex)->RemoveFilter (aFilter);
else
myFilters->Remove(aFilter);
}
//=======================================================================
@@ -289,7 +602,19 @@ void AIS_InteractiveContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilte
void AIS_InteractiveContext::RemoveFilters()
{
myFilters->Clear();
if(!HasOpenedContext())
myFilters->Clear();
else
myLocalContexts(myCurLocalIndex)->Clear(AIS_CM_Filters);
}
//=======================================================================
//function : ActivatedStandardModes
//purpose :
//=======================================================================
const TColStd_ListOfInteger& AIS_InteractiveContext::ActivatedStandardModes() const
{
return myLocalContexts(myCurLocalIndex)->StandardModes();
}
//=======================================================================
@@ -298,6 +623,8 @@ void AIS_InteractiveContext::RemoveFilters()
//=======================================================================
const SelectMgr_ListOfFilter& AIS_InteractiveContext::Filters() const
{
if(HasOpenedContext())
return myLocalContexts(myCurLocalIndex)->ListOfFilter();
return myFilters->StoredFilters();
}
@@ -307,38 +634,101 @@ const SelectMgr_ListOfFilter& AIS_InteractiveContext::Filters() const
//=======================================================================
void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(V3d_View)& aviou)
{
myMainSel->DisplaySensitive(aviou);
if(HasOpenedContext())
myLocalContexts(myCurLocalIndex)->DisplaySensitive(aviou);
else
myMainSel->DisplaySensitive(aviou);
}
//=======================================================================
//function : DisplayActiveSensitive
//purpose :
//=======================================================================
void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(AIS_InteractiveObject)& theObj,
const Handle(V3d_View)& theView)
void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(AIS_InteractiveObject)& anIObj,
const Handle(V3d_View)& aviou)
{
const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
if (aStatus == NULL)
{
return;
TColStd_ListIteratorOfListOfInteger It;
Handle(StdSelect_ViewerSelector3d) VS;
if(HasOpenedContext()){
const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
if(!LC->IsIn(anIObj)) return;
It.Initialize(LC->SelectionModes(anIObj));
VS = LC->MainSelector();
}
for (TColStd_ListIteratorOfListOfInteger aModeIter ((*aStatus)->SelectionModes()); aModeIter.More(); aModeIter.Next())
{
const Handle(SelectMgr_Selection)& aSel = theObj->Selection (aModeIter.Value());
myMainSel->DisplaySensitive (aSel, theObj->Transformation(), theView, Standard_False);
else{
if(!myObjects.IsBound(anIObj)) return;
It.Initialize(myObjects(anIObj)->SelectionModes());
VS = myMainSel;
}
for(;It.More();It.Next()){
const Handle(SelectMgr_Selection)& Sel = anIObj->Selection(It.Value());
VS->DisplaySensitive(Sel,anIObj->Transformation(), aviou,Standard_False);
}
}
//=======================================================================
//function : ClearActiveSensitive
//purpose :
//=======================================================================
void AIS_InteractiveContext::ClearActiveSensitive (const Handle(V3d_View)& theView)
void AIS_InteractiveContext::ClearActiveSensitive(const Handle(V3d_View)& aviou)
{
myMainSel->ClearSensitive (theView);
if(HasOpenedContext())
myLocalContexts(myCurLocalIndex)->ClearSensitive(aviou);
else
myMainSel->ClearSensitive(aviou);
}
//=======================================================================
//function : SetAutomaticHilight
//purpose :
//=======================================================================
void AIS_InteractiveContext::SetAutomaticHilight(const Standard_Boolean aStatus)
{
if(HasOpenedContext())
myLocalContexts(myCurLocalIndex)->SetAutomaticHilight(aStatus);
}
//=======================================================================
//function : AutomaticHilight
//purpose :
//=======================================================================
Standard_Boolean AIS_InteractiveContext::AutomaticHilight() const
{
if(HasOpenedContext())
return myLocalContexts(myCurLocalIndex)->AutomaticHilight();
return Standard_True;
}
//=======================================================================
//function : UseDisplayedObjects
//purpose :
//=======================================================================
void AIS_InteractiveContext::UseDisplayedObjects()
{
if(HasOpenedContext())
myLocalContexts(myCurLocalIndex)->LoadContextObjects();
}
//=======================================================================
//function : NotUseDisplayedObjects
//purpose :
//=======================================================================
void AIS_InteractiveContext::NotUseDisplayedObjects()
{
if(HasOpenedContext())
myLocalContexts(myCurLocalIndex)->UnloadContextObjects();
}
//=======================================================================
//function : PurgeDisplay
//purpose :
@@ -346,9 +736,12 @@ void AIS_InteractiveContext::ClearActiveSensitive (const Handle(V3d_View)& theVi
Standard_Integer AIS_InteractiveContext::PurgeDisplay()
{
if(HasOpenedContext()) return 0;
Standard_Integer NbStr = PurgeViewer(myMainVwr);
myMainVwr->Update();
return NbStr;
}
@@ -388,6 +781,10 @@ Standard_Integer AIS_InteractiveContext::PurgeViewer(const Handle(V3d_Viewer)& V
Standard_Boolean AIS_InteractiveContext::IsImmediateModeOn() const
{
if (HasOpenedContext())
{
return myLocalContexts(myCurLocalIndex)->IsImmediateModeOn();
}
return myMainPM->IsImmediateModeOn();
}
@@ -398,6 +795,11 @@ Standard_Boolean AIS_InteractiveContext::IsImmediateModeOn() const
Standard_Boolean AIS_InteractiveContext::BeginImmediateDraw()
{
if (HasOpenedContext())
{
return myLocalContexts(myCurLocalIndex)->BeginImmediateDraw();
}
if (myMainPM->IsImmediateModeOn())
{
myMainPM->BeginImmediateDraw();
@@ -414,6 +816,11 @@ Standard_Boolean AIS_InteractiveContext::BeginImmediateDraw()
Standard_Boolean AIS_InteractiveContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
const Standard_Integer theMode)
{
if (HasOpenedContext())
{
return myLocalContexts(myCurLocalIndex)->ImmediateAdd (theObj, theMode);
}
if (!myMainPM->IsImmediateModeOn())
{
return Standard_False;
@@ -430,6 +837,11 @@ Standard_Boolean AIS_InteractiveContext::ImmediateAdd (const Handle(AIS_Interact
Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView)
{
if (HasOpenedContext())
{
return myLocalContexts(myCurLocalIndex)->EndImmediateDraw (theView->Viewer());
}
if (!myMainPM->IsImmediateModeOn())
{
return Standard_False;
@@ -446,6 +858,11 @@ Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View
Standard_Boolean AIS_InteractiveContext::EndImmediateDraw()
{
if (HasOpenedContext())
{
return myLocalContexts(myCurLocalIndex)->EndImmediateDraw (myMainVwr);
}
if (!myMainPM->IsImmediateModeOn())
{
return Standard_False;
@@ -454,3 +871,51 @@ Standard_Boolean AIS_InteractiveContext::EndImmediateDraw()
myMainPM->EndImmediateDraw (myMainVwr);
return Standard_True;
}
//=======================================================================
//function : ResetOriginalState
//purpose :
//=======================================================================
void AIS_InteractiveContext::ResetOriginalState(const Standard_Boolean updateviewer)
{
Standard_Boolean upd_main(Standard_False);
TColStd_ListIteratorOfListOfInteger itl;
myMainSel->ResetSelectionActivationStatus();
for (AIS_DataMapIteratorOfDataMapOfIOStatus it(myObjects);it.More();it.Next()){
const Handle(AIS_InteractiveObject)& iobj = it.Key();
const Handle(AIS_GlobalStatus)& STAT = it.Value();
switch(STAT->GraphicStatus()){
case AIS_DS_Displayed:{
upd_main = Standard_True;
// part display...
myMainPM->Display (iobj, STAT->DisplayMode());
if(STAT->IsHilighted())
{
const Handle(Prs3d_Drawer)& aStyle = STAT->HilightStyle();
if (!aStyle.IsNull() && getSelStyle (iobj, iobj->GlobalSelOwner()) != aStyle)
HilightWithColor(iobj,aStyle,Standard_False);
}
//part selection
for(itl.Initialize(STAT->SelectionModes());itl.More();itl.Next()){
if(itl.Value()!=-1)
mgrSelector->Activate(iobj,itl.Value(),myMainSel);
}
break;
}
case AIS_DS_Erased:{
EraseGlobal(iobj,Standard_False);
break;
}
default:
break;
}
}
if(updateviewer){
if(upd_main)
myMainVwr->Update();
}
}

Some files were not shown because too many files have changed in this diff Show More