Compare commits
194 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2c9d55a1aa | ||
|
566851816b | ||
|
b380b06c5d | ||
|
c64efd9e30 | ||
|
cd43c08f2b | ||
|
28b13b31aa | ||
|
10ac040338 | ||
|
7e1c1e4869 | ||
|
a2803f37e7 | ||
|
18348b382e | ||
|
64e68ea690 | ||
|
bee13ef1cf | ||
|
e73ef9d219 | ||
|
8b3fbdef34 | ||
|
e2550e48f1 | ||
|
62beabff7c | ||
|
5e06dfcb32 | ||
|
35befde2ad | ||
|
bc73b00672 | ||
|
00ea7f2676 | ||
|
fe758dbe2c | ||
|
8811d6f2aa | ||
|
1939cfd9cb | ||
|
7860770232 | ||
|
6216ed573e | ||
|
973f7d55bd | ||
|
0c74168c42 | ||
|
3eba1c72ef | ||
|
e83d440f92 | ||
|
6558400123 | ||
|
389f5b59dd | ||
|
08353e37cf | ||
|
c8bead4752 | ||
|
9df71488b3 | ||
|
ef59b5e064 | ||
|
0c061f3d9d | ||
|
88b312d3a4 | ||
|
0858125fd4 | ||
|
89d855ba58 | ||
|
d415125a68 | ||
|
0da2ecac41 | ||
|
bdd09cfaf4 | ||
|
9504a30d15 | ||
|
9a1701fbcb | ||
|
c68c346d2b | ||
|
e2447a80ea | ||
|
936ce1f273 | ||
|
6ef7a1f9e5 | ||
|
23c2ae55c7 | ||
|
8bfae263c1 | ||
|
1c2ddf5612 | ||
|
5a8d30b87b | ||
|
b7b22996bb | ||
|
552a74d829 | ||
|
c37bd936c3 | ||
|
4e8c1d8666 | ||
|
72f6dc612c | ||
|
f051908edc | ||
|
420b38fde9 | ||
|
34e7ac6817 | ||
|
2b5a58a33c | ||
|
e513a6c538 | ||
|
8c2d331426 | ||
|
caee80f39f | ||
|
01b2f506d6 | ||
|
df8c7e3e18 | ||
|
3f1675c941 | ||
|
6a56fe9240 | ||
|
51ee6a7dbb | ||
|
14a356b178 | ||
|
4eff0c0480 | ||
|
8f00325d73 | ||
|
9a90a4524e | ||
|
31a5a359bb | ||
|
bf97419a18 | ||
|
4c26106f76 | ||
|
15e4e6a23e | ||
|
6b467e52bb | ||
|
08b438b076 | ||
|
a14f2b4722 | ||
|
a1a9b24952 | ||
|
f979709590 | ||
|
e9d05765c2 | ||
|
7756fc599d | ||
|
b31fbc832d | ||
|
1bd04b5a02 | ||
|
6466cc9eb1 | ||
|
f7fc0c03be | ||
|
67312b7991 | ||
|
f4a7308f61 | ||
|
53d770b3a2 | ||
|
7ed6e985e2 | ||
|
da6b95a075 | ||
|
565baee64b | ||
|
36e28f96f6 | ||
|
215dd33149 | ||
|
5646c90e87 | ||
|
97e0059b05 | ||
|
8445efca81 | ||
|
a6a66c3a21 | ||
|
cc99be369e | ||
|
1a5007a920 | ||
|
3818aacaa5 | ||
|
e1d039d56d | ||
|
a4815d5509 | ||
|
ba00aab7a0 | ||
|
aaf8d6a98d | ||
|
b008226203 | ||
|
eff3eff916 | ||
|
bf327822d6 | ||
|
63da0df9c2 | ||
|
13a44c4b7f | ||
|
f04de1335c | ||
|
c08fd12706 | ||
|
d7992a77f6 | ||
|
8c787b5fa9 | ||
|
44fafc477f | ||
|
780fbc2897 | ||
|
620a6baa59 | ||
|
89073268fd | ||
|
6ed44b1ca9 | ||
|
746cb7c328 | ||
|
8ba3d978db | ||
|
c275673dbf | ||
|
9e3045dae1 | ||
|
c2bcd98369 | ||
|
683b72c3c1 | ||
|
3358ed643b | ||
|
2724a0b3cc | ||
|
0deeff45a0 | ||
|
fd47711d68 | ||
|
c61c864f73 | ||
|
d9619512e1 | ||
|
7863dabb54 | ||
|
cf97685735 | ||
|
92686513a2 | ||
|
8c186dad9b | ||
|
3de0f78449 | ||
|
8aafd5f9e3 | ||
|
cc50812d6f | ||
|
467e864adf | ||
|
0a5ec5f380 | ||
|
27bd52b540 | ||
|
9196ea9d5a | ||
|
d537c5e67d | ||
|
e774a5534c | ||
|
258a844b63 | ||
|
cbaac5de6d | ||
|
1f99e08822 | ||
|
eb62cbc494 | ||
|
1e0a1fc9cb | ||
|
25093c3f54 | ||
|
0904aa6395 | ||
|
c42ef16585 | ||
|
1f44d29a0f | ||
|
05ed7ed8e0 | ||
|
f4b0c77247 | ||
|
487942b562 | ||
|
8b037fe4ea | ||
|
cd58de63de | ||
|
5859be3886 | ||
|
d45b7860a5 | ||
|
0cdaa8a4a5 | ||
|
3b80dc166a | ||
|
fdae2107d9 | ||
|
44b80414d3 | ||
|
b1492cb30f | ||
|
5c225e8e07 | ||
|
3068c3bb65 | ||
|
ac293bde7f | ||
|
a53d3975c9 | ||
|
94beb42a68 | ||
|
5a7808160e | ||
|
9063f1e089 | ||
|
fa68c1e116 | ||
|
ba165db3d3 | ||
|
f2c862db07 | ||
|
a90dd15e6b | ||
|
f9c58d7c4e | ||
|
ce64c9ad5e | ||
|
dec7af167b | ||
|
14c7f553a9 | ||
|
7a74087601 | ||
|
9eefb360a7 | ||
|
3f50e94e33 | ||
|
bbd8ce1008 | ||
|
30870f51f4 | ||
|
741c4f3ecc | ||
|
611684187d | ||
|
c8428cb3e4 | ||
|
1202160b57 | ||
|
59ee34efc0 | ||
|
7185019ae6 | ||
|
090ef04012 |
@@ -708,6 +708,18 @@ else()
|
||||
OCCT_CHECK_AND_UNSET ("3RDPARTY_FLEX_EXECUTABLE")
|
||||
endif()
|
||||
|
||||
# qt for inspector and samples
|
||||
if (BUILD_Inspector OR BUILD_SAMPLES_QT)
|
||||
# check qt 3rdparty path
|
||||
add_definitions (-DHAVE_QT)
|
||||
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt")
|
||||
message (STATUS "Info: Qt is used by OCCT")
|
||||
else()
|
||||
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_QT")
|
||||
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TQTMALLOC")
|
||||
OCCT_CHECK_AND_UNSET ("INSTALL_QT")
|
||||
endif()
|
||||
|
||||
# check all 3rdparty include paths
|
||||
string (REGEX REPLACE ";" " " 3RDPARTY_NOT_INCLUDED "${3RDPARTY_NOT_INCLUDED}")
|
||||
if (3RDPARTY_NOT_INCLUDED)
|
||||
@@ -795,17 +807,6 @@ else()
|
||||
set (SCRIPT_EXT sh)
|
||||
endif()
|
||||
|
||||
if (BUILD_Inspector OR BUILD_SAMPLES_QT)
|
||||
# check qt 3rdparty path
|
||||
add_definitions (-DHAVE_QT)
|
||||
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt")
|
||||
message (STATUS "Info: Qt is used by OCCT")
|
||||
else()
|
||||
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_QT")
|
||||
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TQTMALLOC")
|
||||
OCCT_CHECK_AND_UNSET ("INSTALL_QT")
|
||||
endif()
|
||||
|
||||
# OCCT tools
|
||||
# include the patched or original list of tools
|
||||
# list <TOOLNAME>_TOOLKITS is created foreach tool and contains its toolkits
|
||||
|
@@ -108,6 +108,7 @@ n BRepMesh
|
||||
n BRepMeshData
|
||||
n BRepOffset
|
||||
n BRepOffsetAPI
|
||||
n BRepPreviewAPI
|
||||
n BRepPrim
|
||||
n BRepPrimAPI
|
||||
n BRepProj
|
||||
|
@@ -108,6 +108,7 @@ else()
|
||||
elseif (ANDROID)
|
||||
set (CSF_ThreadLibs "c")
|
||||
set (CSF_OpenGlLibs "EGL GLESv2")
|
||||
set (CSF_androidlog "log")
|
||||
elseif (UNIX)
|
||||
set (CSF_ThreadLibs "pthread rt stdc++")
|
||||
if (USE_GLES2)
|
||||
|
@@ -130,7 +130,9 @@ elseif ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
|
||||
if (APPLE)
|
||||
# CLang can be used with both libstdc++ and libc++, however on OS X libstdc++ is outdated.
|
||||
set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ ${CMAKE_CXX_FLAGS}")
|
||||
else()
|
||||
elseif(NOT WIN32)
|
||||
# CLang for Windows (at least CLang 8.0 distributed with VS 2019)
|
||||
# does not support option "-std=c++0x"
|
||||
set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
|
||||
endif()
|
||||
elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
@@ -12,18 +12,12 @@ macro (OCCT_CHECK_AND_UNSET VARNAME)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro (OCCT_CHECK_AND_UNSET_GROUP VARNAME)
|
||||
OCCT_CHECK_AND_UNSET ("${VARNAME}_DIR")
|
||||
|
||||
OCCT_CHECK_AND_UNSET ("${VARNAME}_INCLUDE_DIR")
|
||||
|
||||
OCCT_CHECK_AND_UNSET ("${VARNAME}_LIBRARY")
|
||||
OCCT_CHECK_AND_UNSET ("${VARNAME}_LIBRARY_DIR")
|
||||
|
||||
if (WIN32)
|
||||
OCCT_CHECK_AND_UNSET ("${VARNAME}_DLL")
|
||||
OCCT_CHECK_AND_UNSET ("${VARNAME}_DLL_DIR")
|
||||
endif()
|
||||
macro (OCCT_CHECK_AND_UNSET_GROUP GROUPNAME)
|
||||
get_cmake_property(VARS VARIABLES)
|
||||
string (REGEX MATCHALL "(^|;)${GROUPNAME}[A-Za-z0-9_]*" GROUPNAME_VARS "${VARS}")
|
||||
foreach(GROUPNAME_VAR ${GROUPNAME_VARS})
|
||||
OCCT_CHECK_AND_UNSET(${GROUPNAME_VAR})
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
macro (OCCT_CHECK_AND_UNSET_INSTALL_DIR_SUBDIRS)
|
||||
@@ -274,7 +268,7 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
|
||||
list (LENGTH OCCT_ALL_FILE_NAMES ALL_FILES_NB)
|
||||
math (EXPR ALL_FILES_NB "${ALL_FILES_NB} - 1" )
|
||||
|
||||
# emit warnings if there is unprocessed headers
|
||||
# emit warnings if there are unprocessed headers
|
||||
file (GLOB OCCT_ALL_FILES_IN_DIR "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/*.*")
|
||||
file (GLOB OCCT_ALL_FILES_IN_PATCH_DIR "${BUILD_PATCH}/src/${OCCT_PACKAGE}/*.*")
|
||||
|
||||
@@ -307,8 +301,8 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
|
||||
list (APPEND OCCT_HEADER_FILES_COMPLETE ${OCCT_FILE_IN_DIR})
|
||||
|
||||
# collect header files with name that does not contain its package one
|
||||
string (FIND "${OCCT_FILE_NAME}" "${OCCT_PACKAGE}_" FOUND_INDEX)
|
||||
if (NOT ${FOUND_INDEX} EQUAL 0)
|
||||
string (REGEX MATCH "^${OCCT_PACKAGE}[_.]" IS_HEADER_MATHCING_PACKAGE "${OCCT_FILE_NAME}")
|
||||
if (NOT IS_HEADER_MATHCING_PACKAGE)
|
||||
list (APPEND OCCT_HEADER_FILE_WITH_PROPER_NAMES "${OCCT_FILE_NAME}")
|
||||
endif()
|
||||
endif()
|
||||
@@ -355,12 +349,12 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
|
||||
list (FIND OCCT_USED_PACKAGES ${PACKAGE_NAME} IS_HEADER_FOUND)
|
||||
if (NOT ${IS_HEADER_FOUND} EQUAL -1)
|
||||
if (NOT EXISTS "${OCCT_COLLECT_SOURCE_DIR}/${PACKAGE_NAME}/${HEADER_FILE_NAME}")
|
||||
message (STATUS "Warning. ${OCCT_HEADER_FILE_OLD} is not presented in the sources and will be removed from ${ROOT_TARGET_OCCT_DIR}/inc")
|
||||
message (STATUS "Warning. ${OCCT_HEADER_FILE_OLD} is not present in the sources and will be removed from ${ROOT_TARGET_OCCT_DIR}/inc")
|
||||
file (REMOVE "${OCCT_HEADER_FILE_OLD}")
|
||||
else()
|
||||
list (FIND OCCT_HEADER_FILE_NAMES_NOT_IN_FILES ${PACKAGE_NAME} IS_HEADER_FOUND)
|
||||
if (NOT ${IS_HEADER_FOUND} EQUAL -1)
|
||||
message (STATUS "Warning. ${OCCT_HEADER_FILE_OLD} is presented in the sources but not involved in FILES and will be removed from ${ROOT_TARGET_OCCT_DIR}/inc")
|
||||
message (STATUS "Warning. ${OCCT_HEADER_FILE_OLD} is present in the sources but not involved in FILES and will be removed from ${ROOT_TARGET_OCCT_DIR}/inc")
|
||||
file (REMOVE "${OCCT_HEADER_FILE_OLD}")
|
||||
endif()
|
||||
endif()
|
||||
|
@@ -1,23 +1,22 @@
|
||||
#qt
|
||||
|
||||
#looking for 3RDPARTY_QT_DIR variable used later in qt_macro.cmake
|
||||
SET(CSF_QtCore "QtCore")
|
||||
THIRDPARTY_PRODUCT("QT" "" "CSF_QtCore" "d")
|
||||
# Qt is searched manually first (just determine root)
|
||||
message (STATUS "Processing Qt 3-rd party")
|
||||
|
||||
list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_QT_DIR}/bin")
|
||||
if (NOT DEFINED ${3RDPARTY_QT_DIR} AND ${3RDPARTY_QT_DIR} STREQUAL "")
|
||||
FIND_PRODUCT_DIR ("${3RDPARTY_DIR}" Qt 3RDPARTY_QT_DIR_NAME)
|
||||
|
||||
list (REMOVE_ITEM 3RDPARTY_NOT_INCLUDED "3RDPARTY_QT_INCLUDE_DIR")
|
||||
list (REMOVE_ITEM 3RDPARTY_NO_LIBS "3RDPARTY_QT_LIBRARY_DIR")
|
||||
list (REMOVE_ITEM 3RDPARTY_NO_DLLS "3RDPARTY_QT_DLL_DIR")
|
||||
if (NOT DEFINED ${3RDPARTY_QT_DIR_NAME} AND ${3RDPARTY_QT_DIR_NAME} STREQUAL "")
|
||||
set (3RDPARTY_QT_DIR "" CACHE PATH "The directory containing qt")
|
||||
message (FATAL_ERROR "Could not find used third-party product: 3RDPARTY_QT_DIR")
|
||||
endif()
|
||||
|
||||
UNSET (${3RDPARTY_QT_DLL} CACHE)
|
||||
UNSET (${3RDPARTY_QT_DLL_DIR} CACHE)
|
||||
UNSET (${3RDPARTY_QT_INCLUDE_DIR} CACHE)
|
||||
UNSET (${3RDPARTY_QT_LIBRARY} CACHE)
|
||||
UNSET (${3RDPARTY_QT_LIBRARY_DIR} CACHE)
|
||||
# Combine directory name with absolute path and show in GUI
|
||||
set (3RDPARTY_QT_DIR "${3RDPARTY_DIR}/${3RDPARTY_QT_DIR_NAME}" CACHE PATH "The directory containing Qt" FORCE)
|
||||
message (STATUS "Info: Qt is used from folder: ${3RDPARTY_QT_DIR}")
|
||||
endif()
|
||||
|
||||
set (USED_3RDPARTY_QT_DIR "${3RDPARTY_QT_DIR}")
|
||||
message (STATUS "Info: Qt is used from folder: ${3RDPARTY_QT_DIR}")
|
||||
|
||||
# Now set CMAKE_PREFIX_PATH to point to local Qt installation.
|
||||
# Without this setting find_package() will not work
|
||||
@@ -34,3 +33,9 @@ if (NOT ${Qt5_FOUND})
|
||||
else()
|
||||
#message (STATUS "Qt5 cmake configuration")
|
||||
endif()
|
||||
|
||||
if (3RDPARTY_QT_DIR OR EXISTS "${3RDPARTY_QT_DIR}")
|
||||
list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_QT_DIR}/bin")
|
||||
else()
|
||||
list (APPEND 3RDPARTY_NO_DLLS 3RDPARTY_QT_DLL_DIR)
|
||||
endif()
|
||||
|
@@ -24,6 +24,9 @@
|
||||
# load tools
|
||||
source [file join [file dirname [info script]] genconfdeps.tcl]
|
||||
|
||||
# proxy variable for implicit file path normalization
|
||||
set PRODUCTS_PATH_INPUT "$::PRODUCTS_PATH"
|
||||
|
||||
package require Tk
|
||||
|
||||
set aRowIter 0
|
||||
@@ -58,7 +61,7 @@ set SYS_VS_LIST {}
|
||||
set SYS_VC_LIST {}
|
||||
set SYS_VCVARS_LIST {}
|
||||
|
||||
# detect installed Visual Studio 2017 instances by running vswhere.exe
|
||||
# detect installed Visual Studio 2017+ instances by running vswhere.exe
|
||||
if { ! [catch {exec vswhere.exe -version "\[15.0,15.99\]" -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -property installationPath} res] } {
|
||||
lappend ::SYS_VS_LIST "Visual Studio 2017 (15, toolset v141)"
|
||||
lappend ::SYS_VC_LIST "vc141"
|
||||
@@ -69,6 +72,21 @@ if { ! [catch {exec vswhere.exe -version "\[15.0,15.99\]" -latest -requires Micr
|
||||
lappend ::SYS_VC_LIST "vc141-uwp"
|
||||
lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat"
|
||||
}
|
||||
if { ! [catch {exec vswhere.exe -version "\[16.0,16.99\]" -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -property installationPath} res] } {
|
||||
lappend ::SYS_VS_LIST "Visual Studio 2019 (16, toolset v142)"
|
||||
lappend ::SYS_VC_LIST "vc142"
|
||||
lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat"
|
||||
}
|
||||
if { ! [catch {exec vswhere.exe -version "\[16.0,16.99\]" -latest -requires Microsoft.VisualStudio.Workload.Universal -property installationPath} res] } {
|
||||
lappend ::SYS_VS_LIST "Visual Studio 2019 (16, toolset v142) UWP"
|
||||
lappend ::SYS_VC_LIST "vc142-uwp"
|
||||
lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat"
|
||||
}
|
||||
if { ! [catch {exec vswhere.exe -version "\[16.0,16.99\]" -latest -requires Microsoft.VisualStudio.Component.VC.ClangCL -property installationPath} res] } {
|
||||
lappend ::SYS_VS_LIST "Visual Studio 2019 (16, toolset ClangCL)"
|
||||
lappend ::SYS_VC_LIST "vclang"
|
||||
lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat"
|
||||
}
|
||||
|
||||
# detect installed Visual Studio instances from global environment
|
||||
if { [info exists ::env(VS140COMNTOOLS)] } {
|
||||
@@ -180,7 +198,11 @@ proc wokdep:gui:UpdateList {} {
|
||||
}
|
||||
|
||||
if { "$::HAVE_ZLIB" == "true" } {
|
||||
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "zlib" "zlib.h" "zlib" {"zlib"}
|
||||
set aCheckLib "z"
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
set aCheckLib "zlib"
|
||||
}
|
||||
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "zlib" "zlib.h" "$aCheckLib" {"zlib"}
|
||||
}
|
||||
if { "$::HAVE_LIBLZMA" == "true" } {
|
||||
set aCheckLib "lzma"
|
||||
@@ -189,6 +211,14 @@ proc wokdep:gui:UpdateList {} {
|
||||
}
|
||||
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "liblzma" "lzma.h" "$aCheckLib" {"lzma" "xz"}
|
||||
}
|
||||
if { "$::HAVE_E57" == "true" } {
|
||||
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "e57" "e57/E57Foundation.h" "E57RefImpl" {"e57"}
|
||||
set aCheckLib "xerces-c"
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
set aCheckLib "xerces-c_3"
|
||||
}
|
||||
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "xerces-c" "xercesc/sax2/XMLReaderFactory.hpp" "$aCheckLib" {"xerces"}
|
||||
}
|
||||
if { "$::HAVE_RAPIDJSON" == "true" } {
|
||||
wokdep:SearchRapidJson anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
@@ -215,9 +245,9 @@ proc wokdep:gui:BrowseVcVars {} {
|
||||
}
|
||||
|
||||
proc wokdep:gui:BrowsePartiesRoot {} {
|
||||
set aResult [tk_chooseDirectory -initialdir $::PRODUCTS_PATH -title "Choose a directory"]
|
||||
set aResult [tk_chooseDirectory -initialdir $::PRODUCTS_PATH_INPUT -title "Choose a directory"]
|
||||
if { "$aResult" != "" } {
|
||||
set ::PRODUCTS_PATH $aResult
|
||||
set ::PRODUCTS_PATH_INPUT $aResult
|
||||
wokdep:gui:UpdateList
|
||||
}
|
||||
}
|
||||
@@ -431,7 +461,7 @@ ttk::label .myFrame.myHxxChecks.myScutsLbl -text "Strategy for filling he
|
||||
|
||||
#
|
||||
ttk::label .myFrame.mySrchLbl -text "3rd-parties search path:" -padding {5 5 80 5}
|
||||
entry .myFrame.mySrchEntry -textvariable PRODUCTS_PATH -width 80
|
||||
entry .myFrame.mySrchEntry -textvariable PRODUCTS_PATH_INPUT -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"
|
||||
@@ -449,6 +479,9 @@ checkbutton .myFrame.myChecks.myFFmpegCheck -offvalue "false" -onvalue "true
|
||||
ttk::label .myFrame.myChecks.myFFmpegLbl -text "Use FFmpeg"
|
||||
#checkbutton .myFrame.myChecks.myOpenClCheck -offvalue "false" -onvalue "true" -variable HAVE_OPENCL -command wokdep:gui:UpdateList
|
||||
#ttk::label .myFrame.myChecks.myOpenClLbl -text "Use OpenCL"
|
||||
checkbutton .myFrame.myChecks.myRapidJsonCheck -offvalue "false" -onvalue "true" -variable HAVE_RAPIDJSON -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myRapidJsonLbl -text "Use RapidJSON"
|
||||
|
||||
checkbutton .myFrame.myChecks.myMacGLXCheck -offvalue "false" -onvalue "true" -variable MACOSX_USE_GLX
|
||||
ttk::label .myFrame.myChecks.myMacGLXLbl -text "Use X11 for windows drawing"
|
||||
ttk::label .myFrame.myChecks.myVtkLbl -text "Use VTK"
|
||||
@@ -458,9 +491,8 @@ checkbutton .myFrame.myChecks.myZLibCheck -offvalue "false" -onvalue "true
|
||||
ttk::label .myFrame.myChecks.myZLibLbl -text "Use zlib"
|
||||
checkbutton .myFrame.myChecks.myLzmaCheck -offvalue "false" -onvalue "true" -variable HAVE_LIBLZMA -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myLzmaLbl -text "Use liblzma"
|
||||
|
||||
checkbutton .myFrame.myChecks.myRapidJsonCheck -offvalue "false" -onvalue "true" -variable HAVE_RAPIDJSON -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myRapidJsonLbl -text "Use RapidJSON"
|
||||
checkbutton .myFrame.myChecks.myE57Check -offvalue "false" -onvalue "true" -variable HAVE_E57 -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myE57Lbl -text "Use E57"
|
||||
|
||||
checkbutton .myFrame.myChecks.myQt4Check -offvalue "false" -onvalue "true" -variable CHECK_QT4 -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myQt4Lbl -text "Search Qt4"
|
||||
@@ -581,6 +613,9 @@ grid .myFrame.myChecks.myVtkLbl -row $aCheckRowIter -column 3 -sticky w
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
grid .myFrame.myChecks.myD3dCheck -row $aCheckRowIter -column 4 -sticky e
|
||||
grid .myFrame.myChecks.myD3dLbl -row $aCheckRowIter -column 5 -sticky w
|
||||
} elseif { "$::tcl_platform(os)" == "Darwin" } {
|
||||
grid .myFrame.myChecks.myMacGLXCheck -row $aCheckRowIter -column 4 -sticky e
|
||||
grid .myFrame.myChecks.myMacGLXLbl -row $aCheckRowIter -column 5 -sticky w
|
||||
}
|
||||
grid .myFrame.myChecks.myLzmaCheck -row $aCheckRowIter -column 6 -sticky e
|
||||
grid .myFrame.myChecks.myLzmaLbl -row $aCheckRowIter -column 7 -sticky w
|
||||
@@ -588,14 +623,11 @@ grid .myFrame.myChecks.myJDKCheck -row $aCheckRowIter -column 12 -sticky e
|
||||
grid .myFrame.myChecks.myJDKLbl -row $aCheckRowIter -column 13 -sticky w
|
||||
|
||||
incr aCheckRowIter
|
||||
if { "$::tcl_platform(os)" == "Darwin" } {
|
||||
grid .myFrame.myChecks.myMacGLXCheck -row $aCheckRowIter -column 0 -sticky e
|
||||
grid .myFrame.myChecks.myMacGLXLbl -row $aCheckRowIter -column 1 -sticky w
|
||||
incr aCheckRowIter
|
||||
}
|
||||
grid .myFrame.myChecks.myRapidJsonCheck -row $aCheckRowIter -column 0 -sticky e
|
||||
grid .myFrame.myChecks.myRapidJsonLbl -row $aCheckRowIter -column 1 -sticky w
|
||||
grid .myFrame.myChecks.myE57Check -row $aCheckRowIter -column 6 -sticky e
|
||||
grid .myFrame.myChecks.myE57Lbl -row $aCheckRowIter -column 7 -sticky w
|
||||
|
||||
grid .myFrame.myChecks.myRapidJsonCheck -row $aCheckRowIter -column 6 -sticky e
|
||||
grid .myFrame.myChecks.myRapidJsonLbl -row $aCheckRowIter -column 7 -sticky w
|
||||
incr aCheckRowIter
|
||||
|
||||
# Additional headers search paths
|
||||
@@ -640,6 +672,7 @@ bind .myFrame.myVsFrame.myArchCombo <<ComboboxSelected>> {
|
||||
}
|
||||
|
||||
.myFrame.mySrchEntry configure -validate all -validatecommand {
|
||||
set ::PRODUCTS_PATH [file normalize "$::PRODUCTS_PATH_INPUT"]
|
||||
#return [file exists "$::PRODUCTS_PATH"]
|
||||
wokdep:gui:UpdateList
|
||||
return 1
|
||||
|
@@ -68,7 +68,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_RAPIDJSON 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_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo}
|
||||
foreach anEnvIter $THE_ENV_VARIABLES {
|
||||
set ${anEnvIter} "false"
|
||||
if { [info exists ::env(${anEnvIter})] } {
|
||||
@@ -85,11 +85,14 @@ if { "$tcl_platform(platform)" != "windows" } {
|
||||
set HAVE_D3D ""
|
||||
set HAVE_RelWithDebInfo ""
|
||||
}
|
||||
foreach anEnvIter {ARCH VCVER VCVARS PRJFMT PRODUCTS_PATH} {
|
||||
foreach anEnvIter {ARCH VCVER VCVARS PRJFMT } {
|
||||
if { [info exists ::env(${anEnvIter})] } {
|
||||
set ${anEnvIter} "$::env(${anEnvIter})"
|
||||
}
|
||||
}
|
||||
if { [info exists ::env(PRODUCTS_PATH)] } {
|
||||
set PRODUCTS_PATH [file normalize "$::env(PRODUCTS_PATH)"]
|
||||
}
|
||||
|
||||
if { [info exists ::env(CSF_OPT_INC)] } {
|
||||
set CSF_OPT_INC [split "$::env(CSF_OPT_INC)" $::SYS_PATH_SPLITTER]
|
||||
@@ -143,9 +146,12 @@ proc wokdep:SearchHeader {theHeader} {
|
||||
# Search library file in $::CSF_OPT_LIB* and standard paths
|
||||
proc wokdep:SearchLib {theLib theBitness {theSearchPath ""}} {
|
||||
if { "$theSearchPath" != "" } {
|
||||
set aPath "${theSearchPath}/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}"
|
||||
set aPath "${theSearchPath}/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}"
|
||||
set aPath2 "${theSearchPath}/${::SYS_LIB_PREFIX}${theLib}.a"
|
||||
if { [file exists "$aPath"] } {
|
||||
return "$aPath"
|
||||
} elseif { "$::tcl_platform(platform)" != "windows" && [file exists "$aPath2"] } {
|
||||
return "$aPath2"
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
@@ -153,31 +159,42 @@ proc wokdep:SearchLib {theLib theBitness {theSearchPath ""}} {
|
||||
|
||||
# search in custom paths
|
||||
foreach aLibPath [set ::CSF_OPT_LIB$theBitness] {
|
||||
set aPath "${aLibPath}/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}"
|
||||
set aPath "${aLibPath}/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}"
|
||||
set aPath2 "${aLibPath}/${::SYS_LIB_PREFIX}${theLib}.a"
|
||||
if { [file exists "$aPath"] } {
|
||||
return "$aPath"
|
||||
} elseif { "$::tcl_platform(platform)" != "windows" && [file exists "$aPath2"] } {
|
||||
return "$aPath2"
|
||||
}
|
||||
}
|
||||
|
||||
# search in system
|
||||
if { "$::ARCH" == "$theBitness"} {
|
||||
set aPath "/usr/lib/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}"
|
||||
set aPath "/usr/lib/${::SYS_LIB_PREFIX}${theLib}.${::SYS_LIB_SUFFIX}"
|
||||
set aPath2 "/usr/lib/${::SYS_LIB_PREFIX}${theLib}.a"
|
||||
if { [file exists "$aPath"] } {
|
||||
return "$aPath"
|
||||
} elseif { [file exists "$aPath2"] } {
|
||||
return "$aPath2"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if { "$::tcl_platform(os)" == "Linux" } {
|
||||
if { "$theBitness" == "64" } {
|
||||
set aPath "/usr/lib/x86_64-linux-gnu/lib${theLib}.so"
|
||||
set aPath "/usr/lib/x86_64-linux-gnu/lib${theLib}.so"
|
||||
set aPath2 "/usr/lib/x86_64-linux-gnu/lib${theLib}.a"
|
||||
if { [file exists "$aPath"] } {
|
||||
return "$aPath"
|
||||
} elseif { [file exists "$aPath2"] } {
|
||||
return "$aPath2"
|
||||
}
|
||||
} else {
|
||||
set aPath "/usr/lib/i386-linux-gnu/lib${theLib}.so"
|
||||
set aPath "/usr/lib/i386-linux-gnu/lib${theLib}.so"
|
||||
set aPath2 "/usr/lib/i386-linux-gnu/lib${theLib}.a"
|
||||
if { [file exists "$aPath"] } {
|
||||
return "$aPath"
|
||||
} elseif { [file exists "$aPath2"] } {
|
||||
return "$aPath2"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -224,7 +241,11 @@ proc wokdep:Preferred {theList theCmpl theArch} {
|
||||
|
||||
# keep only two first digits in "vc141"
|
||||
if { ! [regexp {^vc[0-9][0-9]} $theCmpl aCmpl] } {
|
||||
set aCmpl $theCmpl
|
||||
if { [regexp {^vclang} $theCmpl] } {
|
||||
set aCmpl vc14
|
||||
} else {
|
||||
set aCmpl $theCmpl
|
||||
}
|
||||
}
|
||||
|
||||
set aShortList {}
|
||||
@@ -614,7 +635,11 @@ proc wokdep:SearchTBB {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64
|
||||
|
||||
# keep only two first digits in "vc141"
|
||||
if { ! [regexp {^vc[0-9][0-9]} ${::VCVER} aVcLib] } {
|
||||
set aVcLib ${::VCVER}
|
||||
if { [regexp {^vclang} ${::VCVER}] } {
|
||||
set aVcLib vc14
|
||||
} else {
|
||||
set aVcLib ${::VCVER}
|
||||
}
|
||||
}
|
||||
|
||||
set isFound "true"
|
||||
|
@@ -256,7 +256,7 @@ proc genAllResources {} {
|
||||
|
||||
# Wrapper-function to generate VS project files
|
||||
proc genproj {theFormat args} {
|
||||
set aSupportedFormats { "vc7" "vc8" "vc9" "vc10" "vc11" "vc12" "vc14" "vc141" "cbp" "xcd" "pro"}
|
||||
set aSupportedFormats { "vc7" "vc8" "vc9" "vc10" "vc11" "vc12" "vc14" "vc141" "vc142" "vclang" "cbp" "xcd" "pro"}
|
||||
set aSupportedPlatforms { "wnt" "uwp" "lin" "mac" "ios" "qnx" }
|
||||
set isHelpRequire false
|
||||
|
||||
@@ -284,8 +284,12 @@ proc genproj {theFormat args} {
|
||||
|
||||
# Check optional arguments
|
||||
set aLibType "dynamic"
|
||||
foreach arg $args {
|
||||
if { $arg == "-h" || $arg == "-help" || $arg == "--help" } {
|
||||
set aSolution "OCCT"
|
||||
for {set anArgIter 0} {$anArgIter < [llength args]} {incr anArgIter} {
|
||||
set arg [lindex $args $anArgIter]
|
||||
if { $arg == "" } {
|
||||
continue
|
||||
} elseif { $arg == "-h" || $arg == "-help" || $arg == "--help" } {
|
||||
set isHelpRequire true
|
||||
} elseif { [lsearch -exact $aSupportedPlatforms $arg] >= 0 } {
|
||||
set aPlatform $arg
|
||||
@@ -295,6 +299,9 @@ proc genproj {theFormat args} {
|
||||
} elseif { $arg == "-dynamic" } {
|
||||
set aLibType "dynamic"
|
||||
puts "Dynamic build has been selected"
|
||||
} elseif { $arg == "-solution" } {
|
||||
incr anArgIter
|
||||
set aSolution [lindex $args $anArgIter]
|
||||
} else {
|
||||
puts "Error: genproj: unrecognized option \"$arg\""
|
||||
set isHelpRequire true
|
||||
@@ -312,6 +319,8 @@ proc genproj {theFormat args} {
|
||||
vc12 - Visual Studio 2013
|
||||
vc14 - Visual Studio 2015
|
||||
vc141 - Visual Studio 2017
|
||||
vc142 - Visual Studio 2019
|
||||
vclang - Visual Studio with ClangCL toolset
|
||||
cbp - CodeBlocks
|
||||
xcd - XCode
|
||||
pro - Qt Creator
|
||||
@@ -339,9 +348,9 @@ proc genproj {theFormat args} {
|
||||
# base path to where to generate projects, hardcoded from current dir
|
||||
set anAdmPath [file normalize "${::path}/adm"]
|
||||
|
||||
OS:MKPRC "$anAdmPath" "$theFormat" "$aLibType" "$aPlatform" "$aCmpl"
|
||||
OS:MKPRC "$anAdmPath" "$theFormat" "$aLibType" "$aPlatform" "$aCmpl" "$aSolution"
|
||||
|
||||
genprojbat "$theFormat" "$aPlatform"
|
||||
genprojbat "$theFormat" "$aPlatform" "$aSolution"
|
||||
genAllResources
|
||||
}
|
||||
|
||||
@@ -361,7 +370,8 @@ proc copy_with_warning {from to} {
|
||||
file copy -force -- "$from" "$to"
|
||||
}
|
||||
|
||||
proc genprojbat {theFormat thePlatform} {
|
||||
# Generate auxiliary scripts for launching IDE.
|
||||
proc genprojbat {theFormat thePlatform theSolution} {
|
||||
set aTargetPlatformExt sh
|
||||
if { $thePlatform == "wnt" || $thePlatform == "uwp" } {
|
||||
set aTargetPlatformExt bat
|
||||
@@ -389,14 +399,13 @@ proc genprojbat {theFormat thePlatform} {
|
||||
copy_with_warning "$::THE_CASROOT/adm/templates/draw.${aTargetPlatformExt}" "$::path/draw.${aTargetPlatformExt}"
|
||||
}
|
||||
|
||||
set aSolShList ""
|
||||
if { [regexp {^vc} $theFormat] } {
|
||||
copy_with_warning "$::THE_CASROOT/adm/templates/msvc.bat" "$::path/msvc.bat"
|
||||
set aSolShList "msvc.bat"
|
||||
} else {
|
||||
switch -exact -- "$theFormat" {
|
||||
"cbp" {
|
||||
file copy -force -- "$::THE_CASROOT/adm/templates/codeblocks.sh" "$::path/codeblocks.sh"
|
||||
file copy -force -- "$::THE_CASROOT/adm/templates/codeblocks.bat" "$::path/codeblocks.bat"
|
||||
|
||||
"cbp" {
|
||||
set aSolShList { "codeblocks.sh" "codeblocks.bat" }
|
||||
# Code::Blocks 16.01 does not create directory for import libs, help him
|
||||
set aPlatformAndCompiler "${thePlatform}/gcc"
|
||||
if { "$thePlatform" == "mac" || "$thePlatform" == "ios" } {
|
||||
@@ -405,9 +414,21 @@ proc genprojbat {theFormat thePlatform} {
|
||||
file mkdir "$::path/${aPlatformAndCompiler}/lib"
|
||||
file mkdir "$::path/${aPlatformAndCompiler}/libd"
|
||||
}
|
||||
"xcd" { file copy -force -- "$::THE_CASROOT/adm/templates/xcode.sh" "$::path/xcode.sh" }
|
||||
"xcd" { set aSolShList "xcode.sh" }
|
||||
}
|
||||
}
|
||||
|
||||
foreach aSolSh $aSolShList {
|
||||
set anShFile [open "$::THE_CASROOT/adm/templates/${aSolSh}" "r"]
|
||||
set anShTmpl [read $anShFile]
|
||||
close $anShFile
|
||||
|
||||
regsub -all -- {__SOLUTION__} $anShTmpl "$theSolution" anShTmpl
|
||||
|
||||
set anShFile [open "$::path/${aSolSh}" "w"]
|
||||
puts $anShFile $anShTmpl
|
||||
close $anShFile
|
||||
}
|
||||
}
|
||||
|
||||
###### MSVC #############################################################33
|
||||
@@ -428,7 +449,8 @@ set THE_GUIDS_LIST($aTKNullKey) "{00000000-0000-0000-0000-000000000000}"
|
||||
# @param theLibType Library type - dynamic or static
|
||||
# @param thePlatform Optional target platform for cross-compiling, e.g. ios for iOS
|
||||
# @param theCmpl Compiler option (msvc or gcc)
|
||||
proc OS:MKPRC { theOutDir theFormat theLibType thePlatform theCmpl } {
|
||||
# @param theSolution Solution name
|
||||
proc OS:MKPRC { theOutDir theFormat theLibType thePlatform theCmpl theSolution } {
|
||||
global path
|
||||
set anOutRoot $theOutDir
|
||||
if { $anOutRoot == "" } {
|
||||
@@ -492,9 +514,6 @@ proc OS:MKPRC { theOutDir theFormat theLibType thePlatform theCmpl } {
|
||||
return
|
||||
}
|
||||
|
||||
# generate one solution for all projects if complete OS or VAS is processed
|
||||
set anAllSolution "OCCT"
|
||||
|
||||
wokUtils:FILES:mkdir $anOutDir
|
||||
if { ![file exists $anOutDir] } {
|
||||
puts stderr "Error: Could not create output directory \"$anOutDir\""
|
||||
@@ -510,11 +529,13 @@ proc OS:MKPRC { theOutDir theFormat theLibType thePlatform theCmpl } {
|
||||
"vc11" -
|
||||
"vc12" -
|
||||
"vc14" -
|
||||
"vc141" { OS:MKVC $anOutDir $aModules $anAllSolution $theFormat $isUWP}
|
||||
"cbp" { OS:MKCBP $anOutDir $aModules $anAllSolution $thePlatform $theCmpl }
|
||||
"vc141" -
|
||||
"vc142" -
|
||||
"vclang" { OS:MKVC $anOutDir $aModules $theSolution $theFormat $isUWP}
|
||||
"cbp" { OS:MKCBP $anOutDir $aModules $theSolution $thePlatform $theCmpl }
|
||||
"xcd" {
|
||||
set ::THE_GUIDS_LIST($::aTKNullKey) "000000000000000000000000"
|
||||
OS:MKXCD $anOutDir $aModules $anAllSolution $theLibType $thePlatform
|
||||
OS:MKXCD $anOutDir $aModules $theSolution $theLibType $thePlatform
|
||||
}
|
||||
}
|
||||
|
||||
@@ -934,7 +955,7 @@ proc osutils:collectinc {theModules theIncPath} {
|
||||
set anIncFiles [glob -tails -nocomplain -dir ${anIncPath} "*"]
|
||||
foreach anIncFile ${anIncFiles} {
|
||||
if { [lsearch -exact ${allHeaderFiles} ${anIncFile}] == -1 } {
|
||||
puts "Warning: file ${anIncPath}/${anIncFile} is not presented in the sources and will be removed from ${theIncPath}!"
|
||||
puts "Warning: file ${anIncPath}/${anIncFile} is not present in the sources and will be removed from ${theIncPath}"
|
||||
file delete -force "${theIncPath}/${anIncFile}"
|
||||
}
|
||||
}
|
||||
@@ -965,7 +986,8 @@ proc osutils:vcsolution:header { vcversion } {
|
||||
append var \
|
||||
"Microsoft Visual Studio Solution File, Format Version 12.00\n" \
|
||||
"# Visual Studio 2013\n"
|
||||
} elseif { "$vcversion" == "vc14" || "$vcversion" == "vc141"} {
|
||||
} elseif { "$vcversion" == "vc14" || "$vcversion" == "vc141" ||
|
||||
"$vcversion" == "vc142" || "$vcversion" == "vclang" } {
|
||||
append var \
|
||||
"Microsoft Visual Studio Solution File, Format Version 12.00\n" \
|
||||
"# Visual Studio 14\n"
|
||||
@@ -1203,6 +1225,12 @@ proc osutils:vcproj:readtemplate {theVcVer isUWP isExec} {
|
||||
if { $theVcVer == "vc141" } {
|
||||
set aVCRTVer "vc14"
|
||||
set aToolset "v141"
|
||||
} elseif { $theVcVer == "vc142" } {
|
||||
set aVCRTVer "vc14"
|
||||
set aToolset "v142"
|
||||
} elseif { $theVcVer == "vclang" } {
|
||||
set aVCRTVer "vc14"
|
||||
set aToolset "ClangCL"
|
||||
}
|
||||
|
||||
set what "$theVcVer"
|
||||
@@ -1343,11 +1371,16 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } {
|
||||
}
|
||||
}
|
||||
if { "$::HAVE_ZLIB" == "true" } {
|
||||
set aLibsMap(CSF_ZLIB) "zlib"
|
||||
set aLibsMap(CSF_ZLIB) "z"
|
||||
}
|
||||
if { "$::HAVE_LIBLZMA" == "true" } {
|
||||
set aLibsMap(CSF_LIBLZMA) "liblzma"
|
||||
}
|
||||
if { "$::HAVE_E57" == "true" && "$theOS" != "wnt" } {
|
||||
# exclude wnt, as there are different pragma lib depending on debug/release
|
||||
set aLibsMap(CSF_E57) "E57RefImpl"
|
||||
set aLibsMap(CSF_xerces) "xerces-c"
|
||||
}
|
||||
|
||||
if { "$theOS" == "wnt" } {
|
||||
# WinAPI libraries
|
||||
@@ -1375,6 +1408,10 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } {
|
||||
|
||||
# tbb headers define different pragma lib depending on debug/release
|
||||
set aLibsMap(CSF_TBB) ""
|
||||
|
||||
if { "$::HAVE_ZLIB" == "true" } {
|
||||
set aLibsMap(CSF_ZLIB) "zlib"
|
||||
}
|
||||
} else {
|
||||
set aLibsMap(CSF_dl) "dl"
|
||||
if { "$theOS" == "mac" || "$theOS" == "ios" } {
|
||||
@@ -1392,6 +1429,9 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } {
|
||||
set aFrmsMap(CSF_TclTkLibs) "Tk"
|
||||
set aLibsMap(CSF_TclTkLibs) ""
|
||||
set aLibsMap(CSF_QT) "QtCore QtGui"
|
||||
} elseif { "$theOS" == "android" } {
|
||||
set aLibsMap(CSF_OpenGlLibs) "EGL GLESv2"
|
||||
set aLibsMap(CSF_androidlog) "log"
|
||||
} else {
|
||||
set aLibsMap(CSF_fontconfig) "fontconfig"
|
||||
if { "$theOS" == "qnx" } {
|
||||
|
@@ -1,11 +1,12 @@
|
||||
#!/bin/bash
|
||||
# This file has been generated by genproj.tcl script from CASROOT/adm/templates/codeblocks.sh
|
||||
|
||||
export TARGET="cbp"
|
||||
|
||||
source ./env.sh "$1" "$TARGET"
|
||||
|
||||
if [ -e "/Applications/CodeBlocks.app/Contents/MacOS/CodeBlocks" ]; then
|
||||
/Applications/CodeBlocks.app/Contents/MacOS/CodeBlocks ./adm/$WOKSTATION/cbp/OCCT.workspace
|
||||
/Applications/CodeBlocks.app/Contents/MacOS/CodeBlocks ./adm/$WOKSTATION/cbp/__SOLUTION__.workspace
|
||||
else
|
||||
codeblocks ./adm/$WOKSTATION/cbp/OCCT.workspace
|
||||
codeblocks ./adm/$WOKSTATION/cbp/__SOLUTION__.workspace
|
||||
fi
|
||||
|
@@ -25,6 +25,7 @@ set "HAVE_D3D=false"
|
||||
set "HAVE_ZLIB=false"
|
||||
set "HAVE_LIBLZMA=false"
|
||||
set "HAVE_RAPIDJSON=false"
|
||||
set "HAVE_E57=false"
|
||||
set "CSF_OPT_INC="
|
||||
set "CSF_OPT_LIB32="
|
||||
set "CSF_OPT_LIB64="
|
||||
@@ -76,6 +77,9 @@ if "%VCVER:~-4%" == "-uwp" (
|
||||
set VCLIB=%VCLIB%-uwp
|
||||
set VCPROP=Universal
|
||||
)
|
||||
if "%VCFMT%" == "vclang" (
|
||||
set VCLIB=vc14
|
||||
)
|
||||
rem echo VCVER=%VCVER% VCFMT=%VCFMT% VCLIB=%VCLIB% VCPROP=%VCPROP%
|
||||
|
||||
rem ----- Parsing of Visual Studio platform -----
|
||||
@@ -101,6 +105,14 @@ if not "%DevEnvDir%" == "" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[15.0,15.99]" -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "DevEnvDir=%%i\Common7\IDE\"
|
||||
)
|
||||
) else if /I "%VCFMT%" == "vc142" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "DevEnvDir=%%i\Common7\IDE\"
|
||||
)
|
||||
) else if /I "%VCFMT%" == "vclang" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "DevEnvDir=%%i\Common7\IDE\"
|
||||
)
|
||||
) else if /I "%VCFMT%" == "gcc" (
|
||||
rem MinGW
|
||||
) else (
|
||||
@@ -112,6 +124,8 @@ if not "%DevEnvDir%" == "" (
|
||||
echo vc12 = VS 2013 ^(SP3^)
|
||||
echo vc14 = VS 2015
|
||||
echo vc141 = VS 2017
|
||||
echo vc142 = VS 2019
|
||||
echo vclang = VS 2019 with ClangCL toolset
|
||||
exit /B
|
||||
)
|
||||
|
||||
@@ -136,6 +150,16 @@ if /I "%VCFMT%" == "vc9" (
|
||||
set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
)
|
||||
set "VCPlatformToolSet=v141"
|
||||
) else if /I "%VCFMT%" == "vc142" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
)
|
||||
set "VCPlatformToolSet=v142"
|
||||
) else if /I "%VCFMT%" == "vclang" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
)
|
||||
set "VCPlatformToolSet=ClangCL"
|
||||
) else if /I "%VCFMT%" == "gcc" (
|
||||
rem MinGW
|
||||
) else (
|
||||
@@ -165,6 +189,7 @@ if ["%HAVE_D3D%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DH
|
||||
if ["%HAVE_ZLIB%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_ZLIB" & set "CSF_DEFINES=HAVE_ZLIB;%CSF_DEFINES%"
|
||||
if ["%HAVE_LIBLZMA%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_LIBLZMA" & set "CSF_DEFINES=HAVE_LIBLZMA;%CSF_DEFINES%"
|
||||
if ["%HAVE_RAPIDJSON%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_RAPIDJSON" & set "CSF_DEFINES=HAVE_RAPIDJSON;%CSF_DEFINES%"
|
||||
if ["%HAVE_E57%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_E57" & set "CSF_DEFINES=HAVE_E57;%CSF_DEFINES%"
|
||||
|
||||
rem Eliminate VS warning
|
||||
if ["%CSF_DEFINES%"] == [""] set "CSF_DEFINES=;"
|
||||
|
@@ -70,6 +70,10 @@ if not "%DevEnvDir%" == "" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[15.0,15.99]" -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "DevEnvDir=%%i\Common7\IDE\"
|
||||
)
|
||||
) else if /I "%VCFMT%" == "vc142" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "DevEnvDir=%%i\Common7\IDE\"
|
||||
)
|
||||
) else if /I "%VCFMT%" == "gcc" (
|
||||
rem MinGW
|
||||
) else (
|
||||
@@ -98,6 +102,11 @@ if /I "%VCFMT%" == "vc9" (
|
||||
set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
)
|
||||
set "VCPlatformToolSet=v141"
|
||||
) else if /I "%VCFMT%" == "vc142" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
)
|
||||
set "VCPlatformToolSet=v142"
|
||||
) else if /I "%VCFMT%" == "gcc" (
|
||||
rem MinGW
|
||||
) else (
|
||||
|
@@ -15,6 +15,8 @@ export HAVE_VTK="false";
|
||||
export HAVE_GLES2="false";
|
||||
export HAVE_ZLIB="false";
|
||||
export HAVE_LIBLZMA="false";
|
||||
export HAVE_RAPIDJSON="false";
|
||||
export HAVE_E57="false";
|
||||
export MACOSX_USE_GLX="false";
|
||||
export CSF_OPT_INC=""
|
||||
export CSF_OPT_LIB32=""
|
||||
@@ -103,6 +105,8 @@ if [ "$HAVE_GLES2" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -D
|
||||
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
|
||||
if [ "$HAVE_LIBLZMA" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_LIBLZMA"; fi
|
||||
if [ "$HAVE_RAPIDJSON" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_RAPIDJSON"; fi
|
||||
if [ "$HAVE_E57" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_E57"; fi
|
||||
# Option to compile OCCT with X11 libs on Mac OS X
|
||||
if [ "$MACOSX_USE_GLX" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DMACOSX_USE_GLX"; fi
|
||||
|
||||
|
@@ -1,10 +1,11 @@
|
||||
@echo off
|
||||
rem This file has been generated by genproj.tcl script from CASROOT/adm/templates/msvc.bat
|
||||
|
||||
rem Setup environment
|
||||
call "%~dp0env.bat" %1 %2 %3
|
||||
|
||||
rem Define path to project file
|
||||
set "PRJFILE=%~dp0\adm\msvc\%VCVER%\OCCT.sln"
|
||||
set "PRJFILE=%~dp0\adm\msvc\%VCVER%\__SOLUTION__.sln"
|
||||
if not exist "%PRJFILE%" set "PRJFILE=%~dp0\adm\msvc\%VCVER%\Products.sln"
|
||||
if not "%4" == "" (
|
||||
set "PRJFILE=%4"
|
||||
|
@@ -1,7 +1,8 @@
|
||||
#!/bin/bash
|
||||
# This file has been generated by genproj.tcl script from CASROOT/adm/templates/xcode.sh
|
||||
|
||||
export TARGET="xcd"
|
||||
|
||||
source ./env.sh "$1" "$TARGET"
|
||||
|
||||
open -a Xcode ./adm/mac/xcd/OCCT.xcworkspace
|
||||
open -a Xcode ./adm/mac/xcd/__SOLUTION__.xcworkspace
|
||||
|
@@ -14,6 +14,7 @@ overview/overview.md
|
||||
../samples/qt/AndroidQt/ReadMe.md
|
||||
../samples/java/jniviewer/ReadMe.md
|
||||
../samples/ios/UIKitSample/ReadMe.md
|
||||
../samples/webgl/ReadMe.md
|
||||
|
||||
tutorial/tutorial.md
|
||||
|
||||
|
@@ -10,7 +10,7 @@ products used by Open CASCADE Technology and samples on Linux platform.
|
||||
|
||||
The links for downloading the third-party products are available on the web site
|
||||
of OPEN CASCADE SAS at
|
||||
http://www.opencascade.com/content/3rd-party-components.
|
||||
https://www.opencascade.com/content/3rd-party-components.
|
||||
|
||||
There are two types of third-party products, which are necessary to build OCCT:
|
||||
|
||||
@@ -30,7 +30,7 @@ Tcl/Tk is required for DRAW test harness.
|
||||
|
||||
@subsubsection dev_guides__building_3rdparty_linux_2_1_2 Installation from sources: Tcl
|
||||
|
||||
Download the necessary archive from http://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
|
||||
1. Enter the unix sub-directory of the directory where the Tcl source files are located <i>(TCL_SRC_DIR)</i>.
|
||||
|
||||
@@ -53,7 +53,7 @@ Download the necessary archive from http://www.tcl.tk/software/tcltk/download.ht
|
||||
|
||||
@subsubsection dev_guides__building_3rdparty_linux_2_1_3 Installation from sources: Tk
|
||||
|
||||
Download the necessary archive from http://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
|
||||
1. Enter the unix sub-directory of the directory where the Tk source files are located <i>(TK_SRC_DIR)</i>
|
||||
|
||||
@@ -78,7 +78,7 @@ Download the necessary archive from http://www.tcl.tk/software/tcltk/download.ht
|
||||
@subsection dev_guides__building_3rdparty_linux_2_2 FreeType
|
||||
|
||||
FreeType is required for text display in the 3D viewer.
|
||||
Download the necessary archive from http://sourceforge.net/projects/freetype/files/ and unpack it.
|
||||
Download the necessary archive from https://sourceforge.net/projects/freetype/files/ and unpack it.
|
||||
|
||||
1. Enter the directory where the source files of FreeType are located <i>(FREETYPE_SRC_DIR)</i>.
|
||||
|
||||
@@ -103,13 +103,13 @@ Download the necessary archive from http://sourceforge.net/projects/freetype/fil
|
||||
|
||||
@subsection dev_guides__building_3rdparty_linux_3_1 TBB
|
||||
|
||||
This third-party product is installed with binaries from the archive that can be downloaded from http://threadingbuildingblocks.org.
|
||||
This third-party product is installed with binaries from the archive that can be downloaded from https://github.com/intel/tbb.
|
||||
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_3 FreeImage
|
||||
|
||||
Download the necessary archive from http://sourceforge.net/projects/freeimage/files/Source%20Distribution/
|
||||
Download the necessary archive from https://sourceforge.net/projects/freeimage/files/Source%20Distribution/
|
||||
and unpack it. The directory with unpacked sources is further referred to as *FREEIMAGE_SRC_DIR*.
|
||||
|
||||
1. Modify *FREEIMAGE_SRC_DIR/Source/OpenEXR/Imath/ImathMatrix.h*:
|
||||
@@ -174,11 +174,11 @@ and unpack it. The directory with unpacked sources is further referred to as *F
|
||||
|
||||
@subsection dev_guides__building_3rdparty_linux_3_4 VTK
|
||||
|
||||
You can download VTK sources from http://www.vtk.org/VTK/resources/software.html
|
||||
You can download VTK sources from https://www.vtk.org/VTK/resources/software.html
|
||||
|
||||
### The building procedure:
|
||||
|
||||
Download the necessary archive from http://www.vtk.org/VTK/resources/software.html and unpack it.
|
||||
Download the necessary archive from https://www.vtk.org/VTK/resources/software.html 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 *VTK* are located:
|
||||
|
14
dox/dev_guides/building/3rdparty/3rdparty_osx.md
vendored
@@ -8,7 +8,7 @@ This document presents additional guidelines for building third-party products
|
||||
used by Open CASCADE Technology and samples on Mac OS X platform (10.6.4 and later).
|
||||
|
||||
The links for downloading the third-party products are available
|
||||
on the web site of OPEN CASCADE SAS at http://www.opencascade.com/content/3rd-party-components.
|
||||
on the web site of OPEN CASCADE SAS at https://www.opencascade.com/content/3rd-party-components.
|
||||
|
||||
There are two types of third-party products, which are necessary to build OCCT:
|
||||
|
||||
@@ -27,7 +27,7 @@ Tcl/Tk is required for DRAW test harness. Version 8.5 or 8.6 can be used with O
|
||||
|
||||
@subsubsection dev_guides__building_3rdparty_osx_2_1_2 Installation from sources: Tcl 8.5
|
||||
|
||||
Download the necessary archive from http://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
|
||||
1. Enter the *macosx* sub-directory of the directory where the Tcl source files are located <i>(TCL_SRC_DIR)</i>.
|
||||
|
||||
@@ -50,7 +50,7 @@ Download the necessary archive from http://www.tcl.tk/software/tcltk/download.ht
|
||||
|
||||
@subsubsection dev_guides__building_3rdparty_osx_2_1_3 Installation from sources: Tk 8.5
|
||||
|
||||
Download the necessary archive from http://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
|
||||
1. Enter the *macosx* sub-directory of the directory where the source files of Tk are located <i>(TK_SRC_DIR)</i>.
|
||||
|
||||
@@ -74,7 +74,7 @@ Download the necessary archive from http://www.tcl.tk/software/tcltk/download.ht
|
||||
|
||||
FreeType is required for text display in the 3D viewer.
|
||||
|
||||
Download the necessary archive from http://sourceforge.net/projects/freetype/files/ and unpack it.
|
||||
Download the necessary archive from https://sourceforge.net/projects/freetype/files/ and unpack it.
|
||||
|
||||
1. Enter the directory where the source files of FreeType are located <i>(FREETYPE_SRC_DIR)</i>.
|
||||
|
||||
@@ -100,7 +100,7 @@ Download the necessary archive from http://sourceforge.net/projects/freetype/fil
|
||||
@subsection dev_guides__building_3rdparty_osx_3_1 TBB 3.x or 4.x
|
||||
|
||||
This third-party product is installed with binaries from the archive
|
||||
that can be downloaded from http://threadingbuildingblocks.org/.
|
||||
that can be downloaded from https://github.com/intel/tbb.
|
||||
Go to the **Download** page, find the release version you need (e.g. *tbb30_018oss*)
|
||||
and pick the archive for Mac OS X platform.
|
||||
To install, unpack the downloaded archive of TBB 3.0 product (*tbb30_018oss_osx.tgz*).
|
||||
@@ -108,12 +108,12 @@ To install, unpack the downloaded archive of TBB 3.0 product (*tbb30_018oss_osx.
|
||||
@subsection dev_guides__building_3rdparty_osx_3_3 FreeImage 3.14.1 or 3.15.x
|
||||
|
||||
Download the necessary archive from
|
||||
http://sourceforge.net/projects/freeimage/files/Source%20Distribution/
|
||||
https://sourceforge.net/projects/freeimage/files/Source%20Distribution/
|
||||
and unpack it. The directory with unpacked sources is further referred to as *FREEIMAGE_SRC_DIR*.
|
||||
|
||||
Note that for building FreeImage on Mac OS X 10.7 you should replace *Makefile.osx*
|
||||
in *FREEIMAGE_SRC_DIR* by the corrected file, which you can find in attachment to issue #22811 in OCCT Mantis bug tracker
|
||||
(http://tracker.dev.opencascade.org/file_download.php?file_id=6937&type=bug).
|
||||
(https://tracker.dev.opencascade.org/file_download.php?file_id=6937&type=bug).
|
||||
|
||||
1. If you build FreeImage 3.15.x you can skip this step.
|
||||
Modify <i>FREEIMAGE_SRC_DIR/Source/OpenEXR/Imath/ImathMatrix.h:</i>
|
||||
|
@@ -8,7 +8,7 @@ This document presents guidelines for building third-party products used by Open
|
||||
|
||||
You need to use the same version of MS Visual Studio for building all third-party products and OCCT itself, in order to receive a consistent set of run-time binaries.
|
||||
|
||||
The links for downloading the third-party products are available on the web site of OPEN CASCADE SAS at http://www.opencascade.com/content/3rd-party-components.
|
||||
The links for downloading the third-party products are available on the web site of OPEN CASCADE SAS at https://www.opencascade.com/content/3rd-party-components.
|
||||
|
||||
There are two types of third-party products used by OCCT:
|
||||
|
||||
@@ -32,7 +32,7 @@ Tcl/Tk is required for DRAW test harness.
|
||||
|
||||
@subsubsection dev_guides__building_3rdparty_win_2_1_1 Installation from sources: Tcl
|
||||
|
||||
Download the necessary archive from http://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
|
||||
1. In the *win* sub-directory, edit file *buildall.vc.bat*:
|
||||
|
||||
@@ -85,7 +85,7 @@ Download the necessary archive from http://www.tcl.tk/software/tcltk/download.ht
|
||||
|
||||
@subsubsection dev_guides__building_3rdparty_win_2_1_2 Installation from sources: Tk
|
||||
|
||||
Download the necessary archive from http://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it.
|
||||
|
||||
Apply the same steps as described for building Tcl above, with the same INSTALLDIR.
|
||||
Note that Tk produces its own executable, called *wish*.
|
||||
@@ -94,7 +94,7 @@ You might need to edit default value of *TCLDIR* variable defined in *buildall.v
|
||||
|
||||
@subsection dev_guides__building_3rdparty_win_2_2 FreeType
|
||||
|
||||
FreeType is required for text display in a 3D viewer. You can download its sources from http://sourceforge.net/projects/freetype/files/
|
||||
FreeType is required for text display in a 3D viewer. You can download its sources from https://sourceforge.net/projects/freetype/files/
|
||||
|
||||
### The building procedure
|
||||
|
||||
@@ -148,7 +148,7 @@ FreeType is required for text display in a 3D viewer. You can download its sourc
|
||||
@subsection dev_guides__building_3rdparty_win_3_1 TBB
|
||||
|
||||
This third-party product is installed with binaries
|
||||
from the archive that can be downloaded from http://threadingbuildingblocks.org/.
|
||||
from the archive that can be downloaded from https://github.com/intel/tbb.
|
||||
Go to the **Download** page, find the release version you need (e.g. *tbb30_018oss*) and pick the archive for Windows platform.
|
||||
|
||||
Unpack the downloaded archive of TBB product into the *3rdparty* folder.
|
||||
@@ -159,7 +159,7 @@ Further in this document, this folder is referred to as *tbb*.
|
||||
|
||||
This third-party product should be built as a dynamically loadable library (.dll file).
|
||||
You can download its sources from
|
||||
http://sourceforge.net/projects/freeimage/files/Source%20Distribution/
|
||||
https://sourceforge.net/projects/freeimage/files/Source%20Distribution/
|
||||
|
||||
### The building procedure:
|
||||
|
||||
@@ -232,7 +232,7 @@ VTK is an open-source, freely available software system for 3D computer graphics
|
||||
|
||||
### The building procedure:
|
||||
|
||||
1. Download the necessary archive from http://www.vtk.org/VTK/resources/software.html and unpack it into *3rdparty* folder.
|
||||
1. Download the necessary archive from https://www.vtk.org/VTK/resources/software.html and unpack it into *3rdparty* folder.
|
||||
|
||||
As a result, you will get a folder named, for example, <i>3rdparty\VTK-6.1.0.</i>
|
||||
|
||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 37 KiB |
@@ -10,9 +10,9 @@ The steps on Windows and Ubuntu are similar. There is the only one difference: m
|
||||
on Windows and native GNU make on Ubuntu.
|
||||
|
||||
Required tools (download and install if it is required):
|
||||
- CMake v3.7+ http://www.cmake.org/cmake/resources/software.html
|
||||
- CMake v3.7+ https://www.cmake.org/cmake/resources/software.html
|
||||
- Android NDK rev.10+ https://developer.android.com/tools/sdk/ndk/index.html
|
||||
- GNU Make: MinGW v4.82+ for Windows (http://sourceforge.net/projects/mingw/files/), GNU Make 4.0 for Ubuntu.
|
||||
- GNU Make: MinGW v4.82+ for Windows (https://sourceforge.net/projects/mingw/files/), GNU Make 4.0 for Ubuntu.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
@@ -64,7 +64,7 @@ Then makefiles will appear in the build folder (e.g. <i> D:/occt/build-android <
|
||||
|
||||
Alternatively one may specify the values without a toolchain file:
|
||||
|
||||
> cmake -G "MinGW Makefiles" -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=D:/DevTools/android-ndk-r13b -DCMAKE_ANDROID_STL_TYPE=gnustl_shared -DCMAKE_SYSTEM_VERSION=15 -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_MAKE_PROGRAM=D:/DevTools/MinGW/bin/mingw32-make.exe -D3RDPARTY_DIR=D:/occt-3rdparty D:/occt
|
||||
> cmake -G "MinGW Makefiles" -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=D:/DevTools/android-ndk-r13b -DCMAKE_ANDROID_STL_TYPE=gnustl_shared -DCMAKE_SYSTEM_VERSION=21 -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_MAKE_PROGRAM=D:/DevTools/MinGW/bin/mingw32-make.exe -D3RDPARTY_DIR=D:/occt-3rdparty D:/occt
|
||||
|
||||
@figure{/dev_guides/building/android/images/android_image006.png}
|
||||
|
||||
|
@@ -6,7 +6,7 @@ The list of required libraries depends on what OCCT modules will be used, and yo
|
||||
The typical minimum is **Freetype** (necessary for Visualization) and **Tcl/Tk** (for DRAW Test Harness).
|
||||
See "Third-party libraries" section in \ref OCCT_OVW_SECTION_5 "Overview" for a full list.
|
||||
|
||||
On Windows, the easiest way to install third-party libraries is to download archive with pre-built binaries from http://www.opencascade.com/content/3rd-party-components.
|
||||
On Windows, the easiest way to install third-party libraries is to download archive with pre-built binaries from https://www.opencascade.com/content/3rd-party-components.
|
||||
On Linux and OS X, it is recommended to use the version installed in the system natively.
|
||||
|
||||
You can also build third-party libraries from their sources:
|
||||
|
@@ -82,6 +82,7 @@ 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_RAPIDJSON | Boolean flag | Indicates whether RapidJSON product should be used in OCCT Data Exchange module for support of glTF mesh file format |
|
||||
| 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|
|
||||
|
@@ -18,7 +18,7 @@ If you have official distribution with project files included, you can use them
|
||||
|
||||
Before building OCCT, make sure to have all the required third-party libraries installed.
|
||||
|
||||
The easiest way to install third-party libraries is to download archive with pre-built binaries, corresponding to version of Visual Studio you are using, from http://www.opencascade.com/content/3rd-party-components.
|
||||
The easiest way to install third-party libraries is to download archive with pre-built binaries, corresponding to version of Visual Studio you are using, from https://www.opencascade.com/content/3rd-party-components.
|
||||
|
||||
You can also build third-party libraries from their sources, see @ref occt_dev_guides__building_3rdparty_windows for instructions.
|
||||
|
||||
@@ -37,6 +37,8 @@ If you have Visual Studio projects already available (pre-installed or generated
|
||||
| vc14-uwp | 2015 (14) | UWP (Universal Windows Platform) | vc14-uwp |
|
||||
| vc141 | 2017 (15) | Desktop (Windows API) | vc14 |
|
||||
| vc141-uwp | 2017 (15) | UWP (Universal Windows Platform) | vc14-uwp |
|
||||
| vc142 | 2019 (16) | Desktop (Windows API) | vc14 |
|
||||
| vc142-uwp | 2019 (16) | UWP (Universal Windows Platform) | vc14-uwp |
|
||||
|
||||
* *ARCH* -- architecture (32 or 64), affects only *PATH* variable for execution
|
||||
* <i>HAVE_*</i> -- flags to enable or disable use of optional third-party products
|
||||
|
@@ -82,7 +82,7 @@ To start *DRAWEXE*, which has been built with Xcode on Mac OS X, perform the fol
|
||||
|
||||
3.Run the script
|
||||
~~~~~
|
||||
./draw_cbp.sh xcd [d]
|
||||
./draw.sh xcd [d]
|
||||
~~~~~
|
||||
|
||||
Option *d* is used if OCCT has been built in **Debug** mode.
|
||||
|
@@ -10,7 +10,7 @@ The purpose of this document is to describe standard workflow for processing con
|
||||
|
||||
Each contribution should have corresponding issue (bug, or feature, or integration request)
|
||||
registered in the MantisBT issue tracker system accessible by URL
|
||||
http://tracker.dev.opencascade.org.
|
||||
https://tracker.dev.opencascade.org.
|
||||
The issue is processed according to the described workflow.
|
||||
|
||||
@subsection occt_contribution_intro_access Access levels
|
||||
|
@@ -136,11 +136,70 @@ const char* GeomTools_Dump (void* theHandlePtr)
|
||||
Dump geometric object to cout.
|
||||
- *theHandlePtr* -- a pointer to the geometric variable (<i>Handle</i> to *Geom_Geometry* or *Geom2d_Curve* or descendant) to be set.
|
||||
|
||||
|
||||
@section occt_debug_dump_json Dump OCCT objects into Json
|
||||
|
||||
Many OCCT classes may dump the current state into the stream. This stream contains the information about the class field into the field value/s.
|
||||
It is possible to prepare recursive dump using corresponded macro for class fields. The depth of this recursion is defined by parameter of the dump.
|
||||
The object defines What parameters should be presented in the Dump. The usual way is to dump all object fields.
|
||||
|
||||
@subsection occt_debug_dump_json_object Implementation in object
|
||||
|
||||
Steps to prepare dump of the object into json:
|
||||
|
||||
1. Create method <b>DumpJson</b>. The method should accept the output stream and the depth for the fields dump.
|
||||
Depth, equal to zero means that only fields of this class should be dumped. Default value -1 means that whole tree of dump will be built recursively calling dump of all fields.
|
||||
|
||||
2. Put into the first row of the method <b>OCCT_DUMP_CLASS_BEGIN</b> or <b>OCCT_DUMP_TRANSIENT_CLASS_BEGIN</b> (for Standard_Transient objects).
|
||||
This macro appends class name into output stream.
|
||||
|
||||
3. Add several macro to store field values.
|
||||
|
||||
The following macro are defined to cover the object parameters into json format:
|
||||
|
||||
| Name | Result in json |
|
||||
| :-------------------------- | :--------|
|
||||
| OCCT_DUMP_FIELD_VALUE_NUMERICAL | "field": value |
|
||||
| OCCT_DUMP_FIELD_VALUE_STRING | "field": "value" |
|
||||
| OCCT_DUMP_FIELD_VALUE_POINTER | "field": "pointer address" |
|
||||
| OCCT_DUMP_FIELD_VALUES_DUMPED | "field": { result of field->DumpJson(...) } |
|
||||
| OCCT_DUMP_FIELD_VALUES_NUMERICAL | "field": [value_1, ..., value_n]
|
||||
| OCCT_DUMP_FIELD_VALUES_STRING | "field": ["value_1", ..., "value_n"]
|
||||
| OCCT_DUMP_BASE_CLASS | "kind": { result of kind::DumpJson(...) } |
|
||||
|
||||
@subsection occt_debug_dump_json_draw Using in DRAW
|
||||
|
||||
In DRAW, key '-dumpJson' is used to dump an object.
|
||||
It is implemented in 'vaspect' and 'boundingbox' commands.
|
||||
|
||||
Json output for Bnd_OBB (using command 'bounding v -obb -dumpJson'):
|
||||
|
||||
~~~~~
|
||||
"Bnd_OBB": {
|
||||
"Center": {
|
||||
"gp_XYZ": [1, 2, 3]
|
||||
},
|
||||
"Axes[0]": {
|
||||
"gp_XYZ:" [1, 0, 0]
|
||||
},
|
||||
"Axes[1]": {
|
||||
"gp_XYZ:" [0, 1, 0]
|
||||
},
|
||||
"Axes[2]": {
|
||||
"gp_XYZ:" [0, 0, 1]
|
||||
},
|
||||
"HDims[0]": 0,
|
||||
"HDims[1]": 0,
|
||||
"HDims[2]": 0,
|
||||
"IsAABox": 1,
|
||||
}
|
||||
~~~~~
|
||||
|
||||
@section occt_debug_vstudio Using Visual Studio debugger
|
||||
|
||||
@subsection occt_debug_vstudio_command Command window
|
||||
|
||||
Visual Studio debugger provides the Command Window (can be activated from menu <b>View / Other Windows / Command Window</b>), which can be used to evaluate variables and expressions interactively in a debug session (see http://msdn.microsoft.com/en-us/library/c785s0kz.aspx). Note that the Immediate Window can also be used but it has some limitations, e.g. does not support aliases.
|
||||
Visual Studio debugger provides the Command Window (can be activated from menu <b>View / Other Windows / Command Window</b>), which can be used to evaluate variables and expressions interactively in a debug session (see https://msdn.microsoft.com/en-us/library/c785s0kz.aspx). Note that the Immediate Window can also be used but it has some limitations, e.g. does not support aliases.
|
||||
|
||||
When the execution is interrupted by a breakpoint, you can use this window to call the above described functions in context of the currently debugged function. Note that in most cases you will need to specify explicitly context of the function by indicating the name of the DLL where it is defined.
|
||||
|
||||
@@ -310,3 +369,53 @@ Each counter has its name shown when the collected statistics are printed.
|
||||
In DRAW, use command *dperf* to print all performance statistics.
|
||||
|
||||
Note that performance counters are not thread-safe.
|
||||
|
||||
@section occt_debug_sanitizers Use of compiler sanitizers
|
||||
|
||||
GCC and Clang compilers provide options for instrumenting the code with the tools intended for detection of run-time errors, called sanitizers.
|
||||
This section provides some hints for using sanitizers for detecting possible errors in OCCT code.
|
||||
|
||||
@subsection occt_debug_sanitizers_linux Linux
|
||||
|
||||
Example of configuration steps for Ubuntu:
|
||||
|
||||
1. In CMake configuration:
|
||||
|
||||
- Use up-to-date version of the GCC or CLang compiler; make sure that if CMAKE_CXX_COMPILER is set to C++ compiler (e.g. "clang++-6.0") and CMAKE_C_COMPILER is set to C compiler (e.g. "clang-6.0")
|
||||
- Ensure that CMAKE_LINKER is set to the C++ linker bundled with compiler (e.g. clang++-6.0); this is important to avoid linking problems
|
||||
- For building with Address sanitizer, set CMAKE_CXX_FLAGS and CMAKE_C_FLAGS to "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls"
|
||||
- For building with Undefined Behavior sanitizer, set CMAKE_CXX_FLAGS and CMAKE_C_FLAGS to "-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls"
|
||||
- Set CMAKE_BUILD_TYPE to RelWithDebInfo to get more informative stack traces on errors
|
||||
|
||||
2. Build as usual (make)
|
||||
|
||||
Be prepared that it works much slower than normal build and consumes more disk space.
|
||||
|
||||
3. Before running executable, make sure that "llvm-symbolizer" is in PATH; this is necessary to get human-readable stack traces. The tool must have exactly that name.
|
||||
|
||||
If it is installed in common folder (/usr/bin or similar) with different name, one option is to create a symlink, for instance:
|
||||
> sudo ln -s /usr/bin/llvm-symbolizer-6.0 /usr/bin/llvm-symbolizer
|
||||
|
||||
Alternatively, add directory where actual llvm-symbolizer is located (such as /usr/lib/llvm-6.0/bin) to the PATH variable.
|
||||
|
||||
4. Set environment variable to disable memory leaks detection (they seem to be reported for every global variable at exit, not much useful):
|
||||
> export ASAN_OPTIONS=detect_leaks=0
|
||||
|
||||
5. Set environment variable CSF_CPULIMIT_FACTOR to reasonably large number to increase the time limits for program execution (used by OCCT tests) to compensate the performance penalty introduced by sanitizers:
|
||||
> export CSF_CPULIMIT_FACTOR=20
|
||||
|
||||
6. When using UBSan, set environment variable UBSAN_OPTIONS to get stack traces:
|
||||
> export UBSAN_OPTIONS=print_stacktrace=1
|
||||
|
||||
7. Run DRAW and perform tests as usual, keeping in mind that running with sanitizer is much heavier than normal build:
|
||||
> ./draw.sh relwithdeb <br>
|
||||
> Draw[]> testgrid -parallel 0
|
||||
|
||||
Note that when running tests under sanitizers, behavior may be different.
|
||||
Known problems (as of CLang 6.0) are:
|
||||
- Software signals (access violation etc.) are not handled
|
||||
- Heap memory usage always reports zero
|
||||
|
||||
@subsection occt_debug_sanitizers_windows Windows
|
||||
|
||||
Though CLang toolset is available in Visual Studio 2015 and newer, sanitizer do not seem to be available out of the box (last tested with VS 2019 16.2.3).
|
||||
|
@@ -12,15 +12,15 @@ This document provides practical guidelines for generation and editing of OCCT u
|
||||
You need to have the following software installed to generate the documentation.
|
||||
|
||||
**Tcl/Tk**
|
||||
Version 8.5 or 8.6: http://www.tcl.tk/software/tcltk/download.html
|
||||
Version 8.5 or 8.6: https://www.tcl.tk/software/tcltk/download.html
|
||||
|
||||
**Doxygen**
|
||||
Version 1.8.4 or above: http://www.stack.nl/~dimitri/doxygen/download.html
|
||||
Version 1.8.4 or above: http://www.doxygen.nl/download.html
|
||||
|
||||
**Dot**
|
||||
Part of Graphviz software, used by Doxygen for generation of class diagrams in Reference Manual: http://www.graphviz.org/Download..php
|
||||
Part of Graphviz software, used by Doxygen for generation of class diagrams in Reference Manual: https://www.graphviz.org/download/
|
||||
|
||||
**MiKTeX** or other package providing **pdflatex** command (only needed for generation of PDF documents): http://miktex.org/download
|
||||
**MiKTeX** or other package providing **pdflatex** command (only needed for generation of PDF documents): https://miktex.org/download
|
||||
|
||||
**Inkscape** (only needed for generation of PDF documents containing SVG images): http://www.inkscape.org/download
|
||||
|
||||
|
@@ -12,7 +12,7 @@ Guide to installing and using Git for OCCT development {#occt_dev_guides__git_gu
|
||||
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.
|
||||
Many good books on Git can be found at http://git-scm.com/documentation
|
||||
Many good books on Git can be found at https://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.
|
||||
@@ -21,7 +21,7 @@ Guide to installing and using Git for OCCT development {#occt_dev_guides__git_gu
|
||||
that describes how Git is used for processing contributions to OCCT.
|
||||
|
||||
This and related documents are available at the Resources page
|
||||
of the OCCT development portal at http://dev.opencascade.org/index.php?q=home/resources.
|
||||
of the OCCT development portal at https://dev.opencascade.org/index.php?q=home/resources.
|
||||
|
||||
@subsection occt_gitguide_1_2 Git URL
|
||||
|
||||
@@ -113,7 +113,7 @@ The official repository contains:
|
||||
|
||||
@subsubsection occt_gitguide_2_1_2 Installation and configuration of TortoiseGit
|
||||
|
||||
Download TortoiseGit distributive from http://code.google.com/p/tortoisegit/downloads/list.
|
||||
Download TortoiseGit distributive from https://tortoisegit.org/download/.
|
||||
Launch the installation.
|
||||
|
||||
* Select your SSH client. Choose option
|
||||
@@ -238,7 +238,7 @@ The official repository contains:
|
||||
|
||||
@subsection occt_gitguide_3_3 Adding public key in your account
|
||||
|
||||
Log in on the portal http://dev.opencascade.org and click on **My account** link to the right. If you have a Contributor status, you will see **SSH keys** tab to the right.
|
||||
Log in on the portal https://dev.opencascade.org and click on **My account** link to the right. If you have a Contributor status, you will see **SSH keys** tab to the right.
|
||||
|
||||
Click on that tab, then click **Add a public key**, and paste the text of the public key (see above sections on how to generate the key) into the text box.
|
||||
|
||||
@@ -496,7 +496,7 @@ To rebase your branch into a single commit, you need to do the following:
|
||||
|
||||
The changes made in the branch can be reviewed without direct access to Git, using GitWeb interface:
|
||||
|
||||
* Open GitWeb in your web browser: http://git.dev.opencascade.org/gitweb/?p=occt.git
|
||||
* Open GitWeb in your web browser: https://git.dev.opencascade.org/gitweb/?p=occt.git
|
||||
* Locate the branch you want to review among **heads** (click ‘…’ at the bottom of the page to see the full list).
|
||||
* Click **log** (or **shortlog**) to see the history of the branch.
|
||||
|
||||
|
@@ -347,7 +347,7 @@ The test group may contain *parse.rules* file. This file defines patterns used f
|
||||
|
||||
Each line in the file should specify a status (single word), followed by a regular expression delimited by slashes (*/*) that will be matched against lines in the test output log to check if it corresponds to this status.
|
||||
|
||||
The regular expressions should follow <a href="http://www.tcl.tk/man/tcl/TclCmd/re_syntax.htm">Tcl syntax</a>, with a special exception that "\b" is considered as word limit (Perl-style), in addition to "\y" used in Tcl.
|
||||
The regular expressions should follow <a href="https://www.tcl.tk/man/tcl/TclCmd/re_syntax.htm">Tcl syntax</a>, with a special exception that "\b" is considered as word limit (Perl-style), in addition to "\y" used in Tcl.
|
||||
|
||||
The rest of the line can contain a comment message, which will be added to the test report when this status is detected.
|
||||
|
||||
@@ -622,7 +622,7 @@ The new test created for an unsolved problem should return BAD. The new test cre
|
||||
|
||||
@subsection testmanual_3_6 Marking BAD cases
|
||||
|
||||
If the test produces an invalid result at a certain moment then the corresponding bug should be created in the OCCT issue tracker located at http://tracker.dev.opencascade.org, and the problem should be marked as TODO in the test script.
|
||||
If the test produces an invalid result at a certain moment then the corresponding bug should be created in the OCCT issue tracker located at https://tracker.dev.opencascade.org, and the problem should be marked as TODO in the test script.
|
||||
|
||||
The following statement should be added to such a test script:
|
||||
~~~~~
|
||||
|
@@ -439,7 +439,7 @@ class TColStd_Array1OfReal; -> #include <TColStd_Array1OfReal.hxx>
|
||||
~~~~~
|
||||
Handle_Class -> Handle(Class)
|
||||
~~~~~
|
||||
This change is not applied if the source or header file is recognized as containing the definition of Qt class with signals or slots, to avoid possible compilation errors of MOC files caused by inability of MOC to recognize macros (see http://doc.qt.io/qt-4.8/signalsandslots.html).
|
||||
This change is not applied if the source or header file is recognized as containing the definition of Qt class with signals or slots, to avoid possible compilation errors of MOC files caused by inability of MOC to recognize macros (see https://doc.qt.io/qt-4.8/signalsandslots.html).
|
||||
The file is considered as defining a Qt object if it contains strings *Q_OBJECT* and either *slots:* or *signals:*.
|
||||
|
||||
4. Removes forward declarations of classes with names <i>Handle(C)</i> or *Handle_C*, replacing them either by forward declaration of its argument class, or (for files defining Qt objects) <i>\#include</i> statement for a header with the name of the argument class and extension .hxx:
|
||||
@@ -736,9 +736,9 @@ If you like to preserve the compatibility of your application code with OCCT ver
|
||||
If your application is essentially based on CDL, and you need to upgrade it to OCCT 7.0, you will very likely need to convert your application code to non-CDL form.
|
||||
This is a non-trivial effort; the required actions would depend strongly on the structure of the code and used CDL features.
|
||||
|
||||
The upgrade script and sources of a specialized WOK version used for OCCT code upgrade can be found in WOK Git repository in branch [CR0_700_2](http://git.dev.opencascade.org/gitweb/?p=occt-wok.git;a=log;h=refs/heads/CR0_700_2).
|
||||
The upgrade script and sources of a specialized WOK version used for OCCT code upgrade can be found in WOK Git repository in branch [CR0_700_2](https://git.dev.opencascade.org/gitweb/?p=occt-wok.git;a=log;h=refs/heads/CR0_700_2).
|
||||
|
||||
[Contact us](http://www.opencascade.com/contact/) if you need more help.
|
||||
[Contact us](https://www.opencascade.com/contact/) if you need more help.
|
||||
|
||||
@subsection upgrade_occt700_bspline Separation of BSpline cache
|
||||
|
||||
@@ -1584,10 +1584,6 @@ To use the custom printer in OCAF, it can be either added to default messenger o
|
||||
@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.
|
||||
@@ -1716,6 +1712,40 @@ aGroup->SetPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< next array
|
||||
aGroup->AddPrimitiveArray (aLines);
|
||||
~~~~
|
||||
|
||||
@subsection upgrade_740_materials Material definition
|
||||
|
||||
Decomposition of Ambient, Diffuse, Specular and Emissive properties has been eliminated within *Graphic3d_MaterialAspect* definition.
|
||||
As result, the following methods of *Graphic3d_MaterialAspect* class have been removed: SetReflectionMode(), SetReflectionModeOn(), Ambient(), Diffuse(), Emissive(), Specular(), SetAmbient(), SetDiffuse(), SetSpecular(), SetEmissive().
|
||||
|
||||
Previously, computation of final value required the following code:
|
||||
~~~~
|
||||
Graphic3d_MaterialAspect theMaterial; Quantity_Color theInteriorColor;
|
||||
Graphic3d_Vec3 anAmbient (0.0f);
|
||||
if (theMaterial.ReflectionMode (Graphic3d_TOR_AMBIENT))
|
||||
{
|
||||
anAmbient = theMaterial.MaterialType (Graphic3d_MATERIAL_ASPECT)
|
||||
? (Graphic3d_Vec3 )theInteriorColor * theMaterial.Ambient()
|
||||
: (Graphic3d_Vec3 )theMaterial.AmbientColor() * theMaterial.Ambient();
|
||||
}
|
||||
~~~~
|
||||
|
||||
New code looks like this:
|
||||
~~~~
|
||||
Graphic3d_MaterialAspect theMaterial; Quantity_Color theInteriorColor;
|
||||
Graphic3d_Vec3 anAmbient = theMaterial.AmbientColor();
|
||||
if (theMaterial.MaterialType (Graphic3d_MATERIAL_ASPECT)) { anAmbient *= (Graphic3d_Vec3 )theInteriorColor; }
|
||||
~~~~
|
||||
|
||||
Existing code should be updated to:
|
||||
- Replace Graphic3d_MaterialAspect::SetReflectionModeOff() with setting black color; SetReflectionModeOn() calls can be simply removed.
|
||||
R.g. theMaterial.SetAmbientColor(Quantity_NOC_BLACK).
|
||||
- Replace Graphic3d_MaterialAspect::Ambient(), SetAmbient(), Diffuse(), SetDiffuse(), Specular(), SetSpecular(), Emissive(), SetEmissive() with methods working with pre-multiplied color.
|
||||
E.g. theMaterial.SetAmbientColor(Graphic3d_Vec3 (1.0f, 0.0f, 0.0f) * 0.2f).
|
||||
- Avoid using Graphic3d_MaterialAspect::Color() and SetColor() with non-physical materials (Graphic3d_MATERIAL_ASPECT).
|
||||
These materials do not include color definition, because it is taken from Graphic3d_Aspects::InteriorColor() - this has not been changed.
|
||||
However, previously it was possible storing the color with SetColor() call and then fetching it with Color() by application code (the rendering ignored this value);
|
||||
now SetColor() explicitly ignores call for Graphic3d_MATERIAL_ASPECT materials and Color() returns DiffuseColor() multiplication coefficients.
|
||||
|
||||
@subsection upgrade_740_text Changes in Graphic3d_Text and OpenGl_Text API
|
||||
|
||||
Parameters of *Text* in *Graphic3d_Group* are moved into a new *Graphic3d_Text* class. *AddText* of *Graphic3d_Group* should be used instead of the previous *Text*.
|
||||
@@ -1781,6 +1811,34 @@ Forward declarations of *Prs3d_Presentation* should be corrected, since it is no
|
||||
|
||||
Proxy classes *SelectBasics_SensitiveEntity* and *SelectBasics_EntityOwner* have been removed - *Select3D_SensitiveEntity* and *SelectMgr_EntityOwner* should be now used directly instead.
|
||||
|
||||
@subsection upgrade_740_offset Polygon offset defaults
|
||||
|
||||
*Graphic3d_PolygonOffset* default constructor has been corrected to define Units=1 instead of Units=0.
|
||||
Default polygon offset settings Mode=Aspect_POM_Fill + Factor=1 + Units=1 are intended to push triangulation
|
||||
(Shaded presentation) a little bit behind of lines (Wireframe and Face Edges)
|
||||
for reducing z-fighting effect of Shaded+Wireframe combination.
|
||||
The change in defaults (Units changed from 0 to 1) is intended to cover scenario when camera direction is perpendicular to model plane (like 2D view).
|
||||
|
||||
Application observing unexpected visual difference on this change should consider customizing this property within AIS_InteractiveContext default attributes
|
||||
or on per-presentation basis via *Graphic3d_Aspects::SetPolygonOffset()* methods.
|
||||
|
||||
@subsection upgrade_740_zlayer Adding ZLayers in given position
|
||||
|
||||
Interface of insertion ZLayer in the viewer has been improved with ability to insert new layer before or after existing one.
|
||||
Previously undocumented behavior of *V3d_Viewer::AddZlayer()* method has been corrected to insert new layer before *Graphic3d_ZLayerId_Top*.
|
||||
Applications might need revising their custom layers creation code and specify precisely their order with new methods *V3d_Viewer::InsertLayerBefore()* and *V3d_Viewer::InsertLayerAfter()*.
|
||||
|
||||
@subsection upgrade_740_enum_changed Modified enumerations
|
||||
|
||||
Applications using integer values of the following enumerations in persistence
|
||||
should be corrected as these enumerations have been modified:
|
||||
|
||||
| Name |
|
||||
| :----- |
|
||||
| AIS_TypeOfAttribute |
|
||||
| Aspect_InteriorStyle |
|
||||
| Font_FontAspect |
|
||||
|
||||
@subsection upgrade_740_geproj Custom defines within env.bat
|
||||
|
||||
*env.bat* produced by Visual Studio project generator *genproj.bat* has been modified so that *%CSF_DEFINES%* variable is reset to initial state.
|
||||
@@ -1799,3 +1857,38 @@ The following API changes have been made:
|
||||
@subsection upgrade_740_stdnamespace Standard_Stream.hxx no more has "using std::" statements
|
||||
*Standard_Stream.hxx* header, commonly included by other OCCT header files, does no more add entities from *std namespace* related to streams (like *std::cout*, *std::istream* and others) into global namespace.
|
||||
The application code relying on this matter should be updated to either specify std namespace explicitly (like std::cout) or add "using std::" statements locally.
|
||||
|
||||
@section upgrade_occt750 Upgrade to OCCT 7.5.0
|
||||
|
||||
@subsection upgrade_750_srgb_color RGB color definition
|
||||
|
||||
OCCT 3D Viewer has been improved to properly perform lighting using in linear RGB color space and then convert result into non-linear gamma-shifted sRGB color space before displaying on display.
|
||||
This change affects texture mapping, material definition and color definition.
|
||||
|
||||
Previously *Quantity_Color* definition was provided with unspecified RGB color space.
|
||||
In practice, mixed color spaces have been actually used, with non-linear sRGB prevailing in general.
|
||||
Since OCCT 7.5.0, *Quantity_Color* now specifies that components are defined in linear RGB color space.
|
||||
|
||||
This change affects following parts:
|
||||
* Standard colors defined by *Quantity_NameOfColor* enumeration have been converted into linear RGB values within Quantity_Color construction.
|
||||
* Application may use new enumeration value *Quantity_TOC_sRGB* for passing/fetching colors in sRGB color space,
|
||||
which can be useful for interoperation with color picking widgets (returning 8-bit integer values within [0..255] range)
|
||||
or for porting colors constants within old application code without manual conversion.
|
||||
* *Graphic3d_MaterialAspect* color components are now expected in linear RGB color space,
|
||||
and standard OCCT materials within *Graphic3d_NameOfMaterial* enumeration have been updated accordingly.
|
||||
* Texture mapping now handles new *Graphic3d_TextureRoot::IsColorMap()* for interpreting content in linear RGB or sRGB color space.
|
||||
It is responsibility of user specifying this flag correctly. The flag value is TRUE by default.
|
||||
* Method *Image_PixMap::PixelColor()* has been extended with a new Boolean flag for performing linearization of non-linear sRGB.
|
||||
This flag is FALSE by default; application should consider passing TRUE instead for further handling *Quantity_Color* properly as linear RGB values.
|
||||
|
||||
@subsection upgrade_750_aspectwindow Aspect_Window interface change
|
||||
|
||||
Unexpected const-ness of Aspect_Window::DoResize() method has been removed, so that application classes implementing this interface should be updated accordingly.
|
||||
|
||||
@subsection upgrade_750_rename Renaming of types
|
||||
|
||||
Enumeration BRepOffset_Type is renamed to ChFiDS_TypeOfConcavity.
|
||||
|
||||
@subsection upgrade_750_sensitiveEntity Select3D_SensitiveEntity interface change
|
||||
|
||||
The method Select3D_SensitiveEntity::NbSubElements() has been changed to be constant. Select3D_SensitiveEntity subclasses at application level should be updated accordingly.
|
||||
|
BIN
dox/overview/images/sample_webgl.png
Normal file
After Width: | Height: | Size: 74 KiB |
@@ -109,7 +109,7 @@ 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, refer to VTK Homepage https://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
|
||||
@@ -120,7 +120,7 @@ If you need further information on Doxygen, refer to https://www.stack.nl/~dimit
|
||||
Graph visualization is representiation of structured information as diagrams of abstract graphs and networks.
|
||||
This product is used together with Doxygen in Open CASCADE Technology for automatic creation of Technical Documentation
|
||||
(generation of dependency graphs). Current versions of Graphviz are licensed on an open source
|
||||
basis under The Eclipse Public License (EPL) (http://www.graphviz.org/License.php).
|
||||
basis under The Eclipse Public License (EPL) (https://www.graphviz.org/license/).
|
||||
|
||||
**Inno Setup** is a free script-driven installation system created in CodeGear Delphi by Jordan Russell.
|
||||
In OCCT Inno Setup is used to create Installation Wizard on Windows.
|
||||
@@ -130,10 +130,10 @@ It is licensed under Inno Setup License (http://www.jrsoftware.org/files/is/lice
|
||||
and others used by multimedia applications. This library is developed by Hervé Drolon and Floris van den Berg.
|
||||
FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit or 64-bit versions of Windows,
|
||||
and cross-platform (works both with Linux and Mac OS X). FreeImage is optionally used by OCCT to work
|
||||
with images, on conditions of the FreeImage Public License (FIPL) (http://freeimage.sourceforge.net/freeimage-license.txt).
|
||||
with images, on conditions of the FreeImage Public License (FIPL) (https://freeimage.sourceforge.net/freeimage-license.txt).
|
||||
|
||||
**David M. Gay's floating point routines** (dtoa.c) are used for fast reading of floating point values from text strings.
|
||||
These routines are available under MIT-like license (see http://www.netlib.org/fp/).
|
||||
These routines are available under MIT-like license (see https://www.netlib.org/fp/).
|
||||
|
||||
**CMake** is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice.
|
||||
OCCT uses CMake as a build system. CMake is available under BSD 3-Clause license. See more at https://cmake.org/
|
||||
@@ -150,6 +150,12 @@ FFmpeg is optionally used by OCCT for video recording, on LGPL conditions (https
|
||||
for generation of User and Developer Guides in PDF format. See https://miktex.org for information
|
||||
on this tool.
|
||||
|
||||
**RapidJSON** is an Open Source JSON parser and generator for C++.
|
||||
RapidJSON is optionally used by OCCT for reading glTF files (https://rapidjson.org/).
|
||||
|
||||
**DejaVu** fonts are a font family based on the Vera Fonts under a permissive license (MIT-like, https://dejavu-fonts.github.io/License.html).
|
||||
DejaVu Sans (basic Latin sub-set) is used by OCCT as fallback font when no system font is available.
|
||||
|
||||
Adobe Systems, Inc. provides **Adobe Reader**, which can be used to view files in Portable Document Format (PDF).
|
||||
|
||||
@section OCCT_OVW_SECTION_3 Documentation
|
||||
@@ -204,13 +210,13 @@ for which OCCT is certified to work.
|
||||
|
||||
| OS | Compiler |
|
||||
| --------- | ----------- |
|
||||
| Windows | Microsoft Visual Studio: 2008 SP1, 2010 SP1<sup>1</sup>, 2012 Update 4, 2013 Update 5, 2015, 2017 <br> GCC 4.3+ (Mingw-w64)|
|
||||
| Windows | Microsoft Visual Studio: 2008 SP1, 2010 SP1, 2012 Update 4, 2013 Update 5, 2015 Update 3, 2017 <sup>1</sup>, 2019 <br>, LLVM (ClangCL), GCC 4.3+ (Mingw-w64)|
|
||||
| Linux | GNU gcc 4.3+ <br> LLVM CLang 3.6+ |
|
||||
| OS X / macOS | XCode 6 or newer |
|
||||
| Android | NDK r10, GNU gcc 4.8 or newer |
|
||||
| Web | Emscripten SDK 1.39 or newer (CLang) |
|
||||
|
||||
1) VC++ 10 64-bit is used for regular testing and for building
|
||||
binary package of official release of OCCT on Windows.
|
||||
1) VC++ 141 64-bit is used for regular testing and for building binary package of official release of OCCT on Windows.
|
||||
|
||||
@subsection overview_req_libs Third-party libraries
|
||||
|
||||
@@ -222,9 +228,9 @@ 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 |
|
||||
| RapidJSON (optional, for reading glTF) | RapidJSON 1.1+ http://rapidjson.org/ |
|
||||
| RapidJSON (optional, for reading glTF) | RapidJSON 1.1+ https://rapidjson.org/ |
|
||||
| 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/ |
|
||||
| VTK (for VTK Integration Services | VTK 6.1+ https://www.vtk.org/download/ |
|
||||
| Doxygen (optional for building documentation) | Doxygen 1.8.5+ https://www.stack.nl/~dimitri/doxygen/download.html |
|
||||
|
||||
@subsection overview_req_hw Hardware
|
||||
@@ -282,13 +288,13 @@ When the installation is complete, you will find the directories for 3rd party p
|
||||
|
||||
@figure{/overview/images/overview_3rdparty.png}
|
||||
|
||||
The contents of the OCCT-7.3.0 directory (called further "OCCT root", or $CASROOT) are as follows:
|
||||
The contents of the OCCT-7.4.0 directory (called further "OCCT root", or $CASROOT) are as follows:
|
||||
|
||||
@figure{/overview/images/overview_installation.png, "The directory tree"}
|
||||
|
||||
* **adm** This folder contains administration files, which allow rebuilding OCCT;
|
||||
* **adm/cmake** This folder contains files of CMake building procedure;
|
||||
* **adm/msvc** This folder contains Visual Studio projects for Visual C++ 2010, 2012, 2013, 2015 and 2017 which allow rebuilding OCCT under Windows platform in 32 and 64-bit mode;
|
||||
* **adm/msvc** This folder contains Visual Studio projects for Visual C++ 2010, 2012, 2013, 2015, 2017 and 2019 which allow rebuilding OCCT under Windows platform in 32 and 64-bit mode;
|
||||
* **data** This folder contains CAD files in different formats, which can be used to test the OCCT functionality;
|
||||
* **doc** This folder contains OCCT documentation in HTML and PDF format;
|
||||
* **dox** This folder contains sources of OCCT documentation in plain text (MarkDown) format;
|
||||
@@ -307,7 +313,7 @@ To run any Open CASCADE Technology application you need to set the environment v
|
||||
|
||||
You can define the environment variables with env.bat script located in the
|
||||
$CASROOT folder. This script accepts two arguments to be used:
|
||||
the version of Visual Studio (vc10 -- vc141) and the architecture (win32 or win64).
|
||||
the version of Visual Studio (vc10 -- vc142) and the architecture (win32 or win64).
|
||||
|
||||
The additional environment settings necessary for compiling OCCT libraries and samples
|
||||
by Microsoft Visual Studio can be set using script custom.bat located in the same folder.
|
||||
@@ -330,7 +336,7 @@ The scripts are located in the OCCT root folder.
|
||||
|
||||
* **CASROOT** is used to define the root directory of Open CASCADE Technology;
|
||||
* **PATH** is required to define the path to OCCT binaries and 3rdparty folder;
|
||||
* **LD_LIBRARY_PATH** is required to define the path to OCCT libraries (on UNIX platforms only);
|
||||
* **LD_LIBRARY_PATH** is required to define the path to OCCT libraries (on UNIX platforms only; **DYLD_LIBRARY_PATH** variable in case of macOS);
|
||||
* **MMGT_OPT** (optional) if set to 1, the memory manager performs optimizations as described below; if set to 2,
|
||||
Intel (R) TBB optimized memory manager is used; if 0 (default), every memory block is allocated
|
||||
in C memory heap directly (via malloc() and free() functions).
|
||||
@@ -411,8 +417,7 @@ Remarks:
|
||||
|
||||
**On Linux:**
|
||||
|
||||
1. If OCCT was built by Code::Blocks use <i>$CASROOT/draw_cbp.sh</i> file to launch *DRAWEXE* executable;
|
||||
2. If OCCT was built by Automake use <i>$CASROOT/draw_amk.sh</i> file to launch *DRAWEXE* executable;
|
||||
* If OCCT was built by Code::Blocks use <i>$CASROOT/draw.sh</i> file to launch *DRAWEXE* executable.
|
||||
|
||||
Draw[1]> prompt appears in the command window
|
||||
|
||||
@@ -568,3 +573,11 @@ There is a sample demonstrating usage of OCCT on iOS with Apple UIKit framework.
|
||||
@figure{/overview/images/sample_ios_uikit.png}
|
||||
|
||||
See \subpage occt_samples_ios_uikit "iOS sample Readme" for details.
|
||||
|
||||
@subsubsection OCCT_OVW_SECTION_7_3_6 Web
|
||||
|
||||
WebGL Viewer sample demonstrating usage of OCCT 3D Viewer in Web browser with Emscripten SDK can be found in `samples/webgl`.
|
||||
|
||||
@figure{/overview/images/sample_webgl.png}
|
||||
|
||||
See \subpage occt_samples_webgl "WebGL sample Readme" for details.
|
||||
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 7.4 KiB |
@@ -48,6 +48,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"
|
||||
|
@@ -58,7 +58,7 @@ This module also provides a variety of general-purpose services, such as:
|
||||
|
||||
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.
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@section OCCT_TOVW_SECTION_3 Modeling Data
|
||||
|
||||
@@ -90,7 +90,7 @@ See the details in @ref occt_user_guides__modeling_data "Modeling Data User's Gu
|
||||
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.
|
||||
|
||||
See also: our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@section OCCT_TOVW_SECTION_4 Modeling Algorithms
|
||||
|
||||
@@ -149,7 +149,7 @@ See @ref occt_user_guides__boolean_operations "Boolean Operations" User's Guide
|
||||
|
||||
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.
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@section OCCT_TOVW_SECTION_4a Mesh
|
||||
|
||||
@@ -163,8 +163,8 @@ Open CASCADE Technology includes two mesh converters:
|
||||
- STL converter translates Open CASCADE shapes to STL files. STL (STtereoLithography) format is widely used for rapid prototyping (3D printing).
|
||||
|
||||
Open CASCADE SAS also offers Advanced Mesh Products:
|
||||
- <a href="http://www.opencascade.com/content/mesh-framework">Open CASCADE Mesh Framework (OMF)</a>
|
||||
- <a href="http://www.opencascade.com/content/express-mesh">Express Mesh</a>
|
||||
- <a href="https://www.opencascade.com/content/mesh-framework">Open CASCADE Mesh Framework (OMF)</a>
|
||||
- <a href="https://www.opencascade.com/content/express-mesh">Express Mesh</a>
|
||||
|
||||
@figure{/technical_overview/images/0003.png}
|
||||
|
||||
@@ -208,7 +208,7 @@ For more details, see @ref occt_user_guides__visualization "Visualization User's
|
||||
|
||||
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.
|
||||
|
||||
See also: our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
|
||||
@section OCCT_TOVW_SECTION_6 Data Exchange
|
||||
@@ -222,12 +222,14 @@ See also: our <a href="http://www.opencascade.com/content/tutorial-learning">E-l
|
||||
* **Standardized Data Exchange** interfaces allow querying and examining the input file, converting its contents to a CAD model and running validity checks on a fully translated shape. The following formats are currently supported.
|
||||
* @ref occt_user_guides__step "STEP" (AP203 : Mechanical Design, this covers General 3D CAD; AP214: Automotive Design)
|
||||
* @ref occt_user_guides__iges "IGES" (up to 5.3)
|
||||
* VRML and STL meshes.
|
||||
* glTF, OBJ, VRML and STL meshes.
|
||||
* @ref occt_user_guides__xde "Extended data exchange" (XDE) allows translating additional attributes attached to geometric data (colors, layers, names, materials etc).
|
||||
* <a href="http://www.opencascade.com/content/advanced-data-exchange-components">Advanced Data Exchange Components</a> are available in addition to standard Data Exchange interfaces to support interoperability and data adaptation (also using @ref OCCT_TOVW_SECTION_6a "Shape Healing") with CAD software using the following proprietary formats:
|
||||
* <a href="http://www.opencascade.com/content/acis-sat-import-export">ACIS SAT</a>
|
||||
* <a href="http://www.opencascade.com/content/parasolid-import">Parasolid</a>
|
||||
* <a href="http://www.opencascade.com/content/dxf-import-export">DXF</a>
|
||||
* <a href="https://www.opencascade.com/content/advanced-data-exchange-components">Advanced Data Exchange Components</a> are available in addition to standard Data Exchange interfaces to support interoperability and data adaptation (also using @ref OCCT_TOVW_SECTION_6a "Shape Healing") with CAD software using the following proprietary formats:
|
||||
* <a href="https://www.opencascade.com/content/acis-sat-import-export">ACIS SAT</a>
|
||||
* <a href="https://www.opencascade.com/content/parasolid-import">Parasolid</a>
|
||||
* <a href="https://www.opencascade.com/content/dxf-import-export">DXF</a>
|
||||
* <a href="https://www.opencascade.com/content/ifc-import">IFC</a>
|
||||
* <a href="https://www.opencascade.com/content/jt-import-export">JT</a>
|
||||
|
||||
These components are based on the same architecture as interfaces with STEP and IGES.
|
||||
|
||||
@@ -265,7 +267,7 @@ Each sub-domain of Shape Healing has its own scope of functionality:
|
||||
|
||||
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.
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
|
||||
@section OCCT_TOVW_SECTION_7 Application Framework
|
||||
@@ -287,7 +289,7 @@ OCAF organizes and embeds these attributes in a document. OCAF documents, in the
|
||||
|
||||
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.
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
|
||||
@section OCCT_TOVW_SECTION_8 Draw Test Harness
|
||||
|
@@ -701,7 +701,7 @@ Congratulations! Your bottle is complete. Here is the result snapshot of the Tut
|
||||
@figure{/tutorial/images/tutorial_image019.png,"",320}
|
||||
|
||||
We hope that this tutorial has provided you with a feel for the industrial strength power of Open CASCADE Technology.
|
||||
If you want to know more and develop major projects using Open CASCADE Technology, we invite you to study our training, support, and consulting services on our site at http://www.opencascade.com/content/technology-support. Our professional services can maximize the power of your Open CASCADE Technology applications.
|
||||
If you want to know more and develop major projects using Open CASCADE Technology, we invite you to study our training, support, and consulting services on our site at https://www.opencascade.com/content/technology-support. Our professional services can maximize the power of your Open CASCADE Technology applications.
|
||||
|
||||
|
||||
@section sec6 Appendix
|
||||
|
@@ -5,7 +5,7 @@ Foundation Classes {#occt_user_guides__foundation_classes}
|
||||
|
||||
@section occt_fcug_1 Introduction
|
||||
|
||||
This manual explains how to use Open CASCADE Technology (**OCCT**) Foundation Classes. It provides basic documentation on foundation classes. For advanced information on foundation classes and their applications, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
This manual explains how to use Open CASCADE Technology (**OCCT**) Foundation Classes. It provides basic documentation on foundation classes. For advanced information on foundation classes and their applications, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
Foundation Classes provide a variety of general-purpose services such as automated dynamic memory management (manipulation of objects by handle), collections, exception handling, genericity by down-casting and plug-in creation.
|
||||
|
||||
@@ -183,12 +183,12 @@ The table below presents the equivalence existing between C++ fundamental types
|
||||
| int | Standard_Integer |
|
||||
| double | Standard_Real |
|
||||
| float | Standard_ShortReal |
|
||||
| unsigned int | Standard_Boolean |
|
||||
| bool | Standard_Boolean |
|
||||
| char | Standard_Character |
|
||||
| short | Standard_ExtCharacter |
|
||||
| char16_t | Standard_ExtCharacter |
|
||||
| char\* | Standard_CString |
|
||||
| void\* | Standard_Address |
|
||||
| short\* | Standard_ExtString |
|
||||
| char16_t\* | Standard_ExtString |
|
||||
|
||||
\* The types with asterisk are pointers.
|
||||
|
||||
@@ -197,12 +197,12 @@ The table below presents the equivalence existing between C++ fundamental types
|
||||
* **Standard_Integer** : fundamental type representing 32-bit integers yielding negative, positive or null values. *Integer* is implemented as a *typedef* of the C++ *int* fundamental type. As such, the algebraic operations +, -, *, / as well as the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on it.
|
||||
* **Standard_Real** : fundamental type representing real numbers with finite precision and finite size. **Real** is implemented as a *typedef* of the C++ *double* (double precision) fundamental type. As such, the algebraic operations +, -, *, /, unary- and the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on reals.
|
||||
* **Standard_ShortReal** : fundamental type representing real numbers with finite precision and finite size. *ShortReal* is implemented as a *typedef* of the C++ *float* (simple precision) fundamental type. As such, the algebraic operations +, -, *, /, unary- and the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on reals.
|
||||
* **Standard_Boolean** : fundamental type representing logical expressions. It has two values: *false* and *true*. *Boolean* is implemented as a *typedef* of the C++ *unsigned int* fundamental type. As such, the algebraic operations *and, or, xor* and *not* as well as equivalence relations == and != are defined on Booleans.
|
||||
* **Standard_Boolean** : fundamental type representing logical expressions. It has two values: *false* and *true*. *Boolean* is implemented as a *typedef* of the C++ *bool* fundamental type. As such, the algebraic operations *and, or, xor* and *not* as well as equivalence relations == and != are defined on Booleans.
|
||||
* **Standard_Character** : fundamental type representing the normalized ASCII character set. It may be assigned the values of the 128 ASCII characters. *Character* is implemented as a *typedef* of the C++ *char* fundamental type. As such, the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on characters using the order of the ASCII chart (ex: A B).
|
||||
* **Standard_ExtCharacter** : fundamental type representing the Unicode character set. It is a 16-bit character type. *ExtCharacter* is implemented as a *typedef* of the C++ *short* fundamental type. As such, the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on extended characters using the order of the UNICODE chart (ex: A B).
|
||||
* **Standard_CString** : fundamental type representing string literals. A string literal is a sequence of ASCII (8 bits) characters enclosed in double quotes. *CString* is implemented as a *typedef* of the C++ *char* fundamental type.
|
||||
* **Standard_ExtCharacter** : fundamental type representing the Unicode character set. It is a 16-bit character type. *ExtCharacter* is implemented as a *typedef* of the C++ *char16_t* fundamental type. As such, the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on extended characters using the order of the UNICODE chart (ex: A B).
|
||||
* **Standard_CString** : fundamental type representing string literals. A string literal is a sequence of UTF-8 (8 bits) code points enclosed in double quotes. *CString* is implemented as a *typedef* of the C++ *char* fundamental type.
|
||||
* **Standard_Address** : fundamental type representing a generic pointer. *Address* is implemented as a *typedef* of the C++ *void* fundamental type.
|
||||
* **Standard_ExtString** is a fundamental type representing string literals as sequences of Unicode (16 bits) characters. *ExtString* is implemented as a *typedef* of the C++ *short* fundamental type.
|
||||
* **Standard_ExtString** is a fundamental type representing string literals as sequences of Unicode (16 bits) characters. *ExtString* is implemented as a *typedef* of the C++ *char16_t* fundamental type.
|
||||
|
||||
@subsubsection occt_fcug_2_1_2 Types manipulated by value
|
||||
There are three categories of types which are manipulated by value:
|
||||
@@ -254,13 +254,13 @@ Objects of classes derived (directly or indirectly) from *Transient*, are normal
|
||||
Handle is defined as template class *opencascade::handle<>*.
|
||||
Open CASCADE Technology provides preprocessor macro *Handle()* that is historically used throughout OCCT code to name a handle:
|
||||
~~~~~{.cpp}
|
||||
Handle(Geom_Line) aLine; // "Handle(Geom_Line)" is expanded to "opencascade::handleL<Geom_Line>"
|
||||
Handle(Geom_Line) aLine; // "Handle(Geom_Line)" is expanded to "opencascade::handle<Geom_Line>"
|
||||
~~~~~
|
||||
|
||||
In addition, for standard OCCT classes additional *typedef* is defined for a handle, as the name of a class prefixed by *Handle_*.
|
||||
For instance, the above example can be also coded as:
|
||||
~~~~~{.cpp}
|
||||
Handle_Geom_Line aLine; // "Handle_Geom_Line" is typedef to "opencascade::handleL<Geom_Line>"
|
||||
Handle_Geom_Line aLine; // "Handle_Geom_Line" is typedef to "opencascade::handle<Geom_Line>"
|
||||
~~~~~
|
||||
|
||||
#### Using a Handle
|
||||
@@ -593,16 +593,16 @@ The following paragraphs describe recommended approaches for using exceptions w
|
||||
|
||||
To raise an exception of a definite type method Raise() of the appropriate exception class shall be used.
|
||||
~~~~~
|
||||
DomainError::Raise(“Cannot cope with this condition”);
|
||||
Standard_DomainError::Raise(“Cannot cope with this condition”);
|
||||
~~~~~
|
||||
raises an exception of *DomainError* type with the associated message “Cannot cope with this condition”, the message being optional. This exception may be caught by a handler of a *DomainError* type as follows:
|
||||
raises an exception of *Standard_DomainError* type with the associated message “Cannot cope with this condition”, the message being optional. This exception may be caught by a handler of a *Standard_DomainError* type as follows:
|
||||
~~~~~
|
||||
try {
|
||||
OCC_CATCH_SIGNALS
|
||||
// try block
|
||||
}
|
||||
catch(DomainError) {
|
||||
// handle DomainError exceptions here
|
||||
catch(const Standard_DomainError& ) {
|
||||
// handle Standard_DomainError exceptions here
|
||||
}
|
||||
~~~~~
|
||||
|
||||
@@ -652,8 +652,7 @@ Using this syntax, the *Value* function becomes:
|
||||
~~~~~
|
||||
Item TCollection_Array1::Value (const Standard_Integer&index) const
|
||||
{
|
||||
OutOfRange_Raise_if(index < r1 || index > r2,
|
||||
“index out of range in Array1::Value”);
|
||||
Standard_OutOfRange_Raise_if(index < r1 || index > r2, “index out of range in Array1::Value”);
|
||||
return contents[index];
|
||||
}
|
||||
~~~~~
|
||||
|
@@ -15,7 +15,7 @@ Other kinds of data such as colors and names can be read or written with the hel
|
||||
* an IGES entity is an entity in the IGES normal sense.
|
||||
* a root entity is the highest level entity of any given type, e.g. type 144 for surfaces and type 186 for solids. Roots are not referenced by other entities.
|
||||
|
||||
This manual mainly explains how to convert an IGES file to an Open CASCADE Technology (**OCCT**) shape and vice versa. It provides basic documentation on conversion. For advanced information on conversion, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
This manual mainly explains how to convert an IGES file to an Open CASCADE Technology (**OCCT**) shape and vice versa. It provides basic documentation on conversion. For advanced information on conversion, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
IGES files produced in accordance with IGES standard versions up to and including version 5.3 can be read. IGES files that are produced by this interface conform to IGES version 5.3 (Initial Graphics Exchange Specification, IGES 5.3. ANS US PRO/IPO-100-1996).
|
||||
|
||||
|
@@ -5,7 +5,7 @@ Modeling Algorithms {#occt_user_guides__modeling_algos}
|
||||
|
||||
@section occt_modalg_1 Introduction
|
||||
|
||||
This manual explains how to use the Modeling Algorithms. It provides basic documentation on modeling algorithms. For advanced information on Modeling Algorithms, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
This manual explains how to use the Modeling Algorithms. It provides basic documentation on modeling algorithms. For advanced information on Modeling Algorithms, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
The Modeling Algorithms module brings together a wide range of topological algorithms used in modeling. Along with these tools, you will find the geometric algorithms, which they call.
|
||||
|
||||
@@ -475,7 +475,7 @@ The Curves and Surfaces from Constraints component groups together high level fu
|
||||
* construction of plate surfaces
|
||||
* extension of a 3D curve or surface beyond its original bounds.
|
||||
|
||||
OPEN CASCADE company also provides a product known as <a href="http://www.opencascade.com/content/surfaces-scattered-points">Surfaces from Scattered Points</a>, which allows constructing surfaces from scattered points. This algorithm accepts or constructs an initial B-Spline surface and looks for its deformation (finite elements method) which would satisfy the constraints. Using optimized computation methods, this algorithm is able to construct a surface from more than 500 000 points.
|
||||
OPEN CASCADE company also provides a product known as <a href="https://www.opencascade.com/content/surfaces-scattered-points">Surfaces from Scattered Points</a>, which allows constructing surfaces from scattered points. This algorithm accepts or constructs an initial B-Spline surface and looks for its deformation (finite elements method) which would satisfy the constraints. Using optimized computation methods, this algorithm is able to construct a surface from more than 500 000 points.
|
||||
|
||||
SSP product is not supplied with Open CASCADE Technology, but can be purchased separately.
|
||||
|
||||
@@ -3089,14 +3089,14 @@ Open CASCADE Technology includes two mesh converters:
|
||||
- STL converter translates Open CASCADE shapes to STL files. STL (STtereoLithography) format is widely used for rapid prototyping.
|
||||
|
||||
Open CASCADE SAS also offers Advanced Mesh Products:
|
||||
- <a href="http://www.opencascade.com/content/mesh-framework">Open CASCADE Mesh Framework (OMF)</a>
|
||||
- <a href="http://www.opencascade.com/content/express-mesh">Express Mesh</a>
|
||||
- <a href="https://www.opencascade.com/content/mesh-framework">Open CASCADE Mesh Framework (OMF)</a>
|
||||
- <a href="https://www.opencascade.com/content/express-mesh">Express Mesh</a>
|
||||
|
||||
Besides, we can efficiently help you in the fields of surface and volume meshing algorithms, mesh optimization algorithms etc. If you require a qualified advice about meshing algorithms, do not hesitate to benefit from the expertise of our team in that domain.
|
||||
|
||||
The projects dealing with numerical simulation can benefit from using SALOME - an Open Source Framework for CAE with CAD data interfaces, generic Pre- and Post- F.E. processors and API for integrating F.E. solvers.
|
||||
|
||||
Learn more about SALOME platform on http://www.salome-platform.org
|
||||
Learn more about SALOME platform on https://www.salome-platform.org
|
||||
|
||||
@subsection occt_modalg_11_2 Meshing algorithm
|
||||
|
||||
|
@@ -7,7 +7,7 @@ Modeling Data {#occt_user_guides__modeling_data}
|
||||
|
||||
Modeling Data supplies data structures to represent 2D and 3D geometric models.
|
||||
|
||||
This manual explains how to use Modeling Data. For advanced information on modeling data, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
This manual explains how to use Modeling Data. For advanced information on modeling data, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@section occt_modat_1 Geometry Utilities
|
||||
|
||||
@@ -1324,7 +1324,7 @@ BRepBndLib class contains methods for creation of bounding boxes (both AABB and
|
||||
|
||||
@subsubsection occt_modat_6_1_1 Creation of OBB from set of points
|
||||
|
||||
The algorithm is described in <a href="http://www.idt.mdh.se/~tla/publ/FastOBBs.pdf">"Fast Computation of Tight Fitting Oriented Bounding Boxes" by Thomas Larsson and Linus Källberg</a>. It includes the following steps:
|
||||
The algorithm is described in "Fast Computation of Tight Fitting Oriented Bounding Boxes" by Thomas Larsson and Linus Källberg (FastOBBs.pdf). It includes the following steps:
|
||||
|
||||
<span>1.</span> Choose \f$ N_{a} (N_{a} \geq 3) \f$ initial axes.<br>
|
||||
<span>2.</span> Project every given point to the every chosen (in item 1) axis. At that, "minimal" and "maximal" points of every axis (i.e. point having minimal and maximal parameter (correspondingly) of the projection to this axis) are chosen. I.e. \f$ 2*N_{a} \f$ points will be held and this set can contain equal points. Later (unless otherwise specified) in this algorithm we will work with these \f$ 2*N_{a} \f$ points only.<br>
|
||||
@@ -1379,7 +1379,7 @@ The algorithm contains the following steps:
|
||||
|
||||
@subsubsection occt_modat_6_1_4 Method IsOut for another OBB
|
||||
|
||||
According to the <a href="http://www.jkh.me/files/tutorials/Separating%20Axis%20Theorem%20for%20Oriented%20Bounding%20Boxes.pdf">"Separating Axis Theorem for Oriented Bounding Boxes"</a>, it is necessary to check the 15 separating axes: 6 axes of the boxes and 9 are their cross products.<br>
|
||||
According to the <a href="https://www.jkh.me/files/tutorials/Separating%20Axis%20Theorem%20for%20Oriented%20Bounding%20Boxes.pdf">"Separating Axis Theorem for Oriented Bounding Boxes"</a>, it is necessary to check the 15 separating axes: 6 axes of the boxes and 9 are their cross products.<br>
|
||||
The algorithm of analyzing axis \f$ \mathbf{l} \f$ is following:
|
||||
1. Compute the "length" according to the formula: \f$ L_{j}=\sum_{i=0}^{2}{H_{i}\cdot \left | \overrightarrow{\mathbf{a_{i}}} \cdot \overrightarrow{\mathbf{l}} \right |} \f$. Here, \f$ \mathbf{a_{i}} \f$ is an i-th axis (X-axis, Y-axis, Z-axis) of j-th BndBox (j=1...2). \f$ H_{i} \f$ is a half-dimension along i-th axis.
|
||||
2. If \f$ \left |\overrightarrow{C_{1}C_{2}} \cdot \overrightarrow{\mathbf{l}} \right | > L_{1}+L_{2} \f$ (where \f$ C_{j} \f$ is the center of j-th OBB) then the considered OBBs are not interfered in terms of the axis \f$ \mathbf{l} \f$.
|
||||
|
@@ -7,7 +7,7 @@ OCAF {#occt_user_guides__ocaf}
|
||||
|
||||
This manual explains how to use the Open CASCADE Application Framework (OCAF).
|
||||
It provides basic documentation on using OCAF. For advanced information on OCAF
|
||||
and its applications, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
and its applications, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@subsection occt_ocaf_1_1 Purpose of OCAF
|
||||
|
||||
|
@@ -7,7 +7,7 @@ Shape Healing {#occt_user_guides__shape_healing}
|
||||
|
||||
@subsection occt_shg_1_1 Introduction
|
||||
|
||||
This manual explains how to use Shape Healing. It provides basic documentation on its operation. For advanced information on Shape Healing and its applications, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
This manual explains how to use Shape Healing. It provides basic documentation on its operation. For advanced information on Shape Healing and its applications, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
The **Shape Healing** toolkit provides a set of tools to work on the geometry and topology of Open CASCADE Technology (**OCCT**) shapes. Shape Healing adapts shapes so as to make them as appropriate for use by Open CASCADE Technology as possible.
|
||||
|
||||
|
@@ -24,7 +24,7 @@ File translation is performed in the programming mode, via C++ calls.
|
||||
|
||||
For testing the STEP component in DRAW Test Harness, a set of commands for reading and writing STEP files and analysis of relevant data are provided by the *TKXSDRAW* plugin.
|
||||
|
||||
See also our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
See also our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@subsection occt_step_1_1 STEP Exchanges in Open Cascade technology
|
||||
|
||||
@@ -123,7 +123,7 @@ For further information see 2.4 Mapping STEP entities to Open CASCADE Technology
|
||||
Before performing any other operation you have to load the file with:
|
||||
~~~~~
|
||||
STEPControl_Reader reader;
|
||||
IFSelect_ReturnStatus stat = reader.ReadFile(;filename.stp;);
|
||||
IFSelect_ReturnStatus stat = reader.ReadFile("filename.stp");
|
||||
~~~~~
|
||||
Loading the file only memorizes the data, it does not translate it.
|
||||
|
||||
@@ -602,21 +602,21 @@ Not all entities defining the assembly structure in the STEP file are translated
|
||||
| Placements | axis1_placement | Geom_Axis1Placement | |
|
||||
| | axis2_placement_2d | Geom2d_AxisPlacement | |
|
||||
| | axis2_placement_3d | Geom_Axis2Placement | |
|
||||
| Curves | circle | Geom_Circle, Geom2d_Circle, Geom2d_BsplineCurve | Circle is translated into *Geom2d_BSplineCurve* when it references the surface of revolution (spherical surface, conical surface, etc.) |
|
||||
| | ellipse | Geom_Ellipse, Geom2d_Ellipse, Geom2d_BsplineCurve | Ellipse is translated into *Geom2d_BSplineCurve* when it references the surface of revolution (spherical surface, conical surface, etc.) |
|
||||
| Curves | circle | Geom_Circle, Geom2d_Circle, Geom2d_BSplineCurve | Circle is translated into *Geom2d_BSplineCurve* when it references the surface of revolution (spherical surface, conical surface, etc.) |
|
||||
| | ellipse | Geom_Ellipse, Geom2d_Ellipse, Geom2d_BSplineCurve | Ellipse is translated into *Geom2d_BSplineCurve* when it references the surface of revolution (spherical surface, conical surface, etc.) |
|
||||
| | hyperbola | Geom_Hyperbola, Geom2d_Hyperbola | |
|
||||
| | line | Geom_Line, Geom2d_Line | |
|
||||
| | parabola | Geom_Parabola, Geom2d_Parabola | |
|
||||
| | pcurve | Geom2d_Curve | Pcurve in edge |
|
||||
| | curve_replica | Geom_Curve or Geom2d_Curve | Depending on the type of the base curve |
|
||||
| | offset_curve_3d | Geom_OffsetCurve | |
|
||||
| | trimmed_curve | Geom_TrimmedCurve or Geom2d_BsplineCurve | Only trimmed_curves trimmed by parameters are translated. All *trimmed_curves* are converted to *Geom2d_BSplineCurve*. |
|
||||
| | b_spline_curve | Geom_BsplineCurve or Geom2d_BsplineCurve | |
|
||||
| | b_spline_curve_with_knots | Geom_BsplineCurve or Geom2d_BsplineCurve | |
|
||||
| | bezier_curve | Geom_BsplineCurve or Geom2d_BsplineCurve | |
|
||||
| | rational_b_spline_curve | Geom_BsplineCurve or Geom2d_BsplineCurve | |
|
||||
| | uniform_curve | Geom_BsplineCurve or Geom2d_BsplineCurve | |
|
||||
| | quasi_ uniform_curve | Geom_BsplineCurve or Geom2d_BsplineCurve | |
|
||||
| | trimmed_curve | Geom_TrimmedCurve or Geom2d_BSplineCurve | Only trimmed_curves trimmed by parameters are translated. All *trimmed_curves* are converted to *Geom2d_BSplineCurve*. |
|
||||
| | b_spline_curve | Geom_BSplineCurve or Geom2d_BSplineCurve | |
|
||||
| | b_spline_curve_with_knots | Geom_BSplineCurve or Geom2d_BSplineCurve | |
|
||||
| | bezier_curve | Geom_BSplineCurve or Geom2d_BSplineCurve | |
|
||||
| | rational_b_spline_curve | Geom_BSplineCurve or Geom2d_BSplineCurve | |
|
||||
| | uniform_curve | Geom_BSplineCurve or Geom2d_BSplineCurve | |
|
||||
| | quasi_ uniform_curve | Geom_BSplineCurve or Geom2d_BSplineCurve | |
|
||||
| | surface_curve | TopoDS_Edge | *surface_curve* defines geometrical support of an edge and its pcurves. |
|
||||
| | seam_curve | TopoDS_Edge | The same as *surface_curve* |
|
||||
| | composite_curve_segment | TopoDS_Edge | as a segment of *composite_curve* |
|
||||
@@ -746,7 +746,7 @@ The following diagram illustrates the structure of calls in reading STEP. The hi
|
||||
Standard_Integer main()
|
||||
{
|
||||
STEPControl_Reader reader;
|
||||
reader.ReadFile(;MyFile.stp;);
|
||||
reader.ReadFile("MyFile.stp");
|
||||
|
||||
// Loads file MyFile.stp
|
||||
Standard_Integer NbRoots = reader.NbRootsForTransfer();
|
||||
@@ -1037,8 +1037,8 @@ The table below describes STEP entities, which are created when the assembly str
|
||||
| | Geom2d_Ellipse | Ellipse, rational_b_spline_curve | |
|
||||
| | Geom_Hyperbola, Geom2d_Hyperbola | Hyperbola | |
|
||||
| | Geom_Parabola, Geom2d_Parabola | Parabola | |
|
||||
| | Geom_BSplineCurve | b_spline_curve_with_knots or rational_b_spline_curve | *rational_b_spline_curve* is produced if *Geom_BsplineCurve* is a rational BSpline |
|
||||
| | Geom2d_BSplineCurve | b_spline_curve_with_knots or rational_b_spline_curve | *rational_b_spline_curve* is produced if *Geom2d_BsplineCurve* is a rational BSpline |
|
||||
| | Geom_BSplineCurve | b_spline_curve_with_knots or rational_b_spline_curve | *rational_b_spline_curve* is produced if *Geom_BSplineCurve* is a rational BSpline |
|
||||
| | Geom2d_BSplineCurve | b_spline_curve_with_knots or rational_b_spline_curve | *rational_b_spline_curve* is produced if *Geom2d_BSplineCurve* is a rational BSpline |
|
||||
| | Geom_BezierCurve | b_spline_curve_with_knots | |
|
||||
| | Geom_Line or Geom2d_Line | Line | |
|
||||
| Surfaces | Geom_Plane | Plane | |
|
||||
@@ -1439,7 +1439,7 @@ where *doc* is a variable which contains a handle to the output document and sho
|
||||
@subsection occt_step_7_2 Attributes read from STEP
|
||||
|
||||
### Colors
|
||||
Colors are implemented in accordance with <a href="http://www.cax-if.org/documents/rec_prac_styling_org_v15.pdf">Recommended practices for model styling and organization</a> sections 4 and 5.
|
||||
Colors are implemented in accordance with <a href="https://www.cax-if.org/documents/rec_prac_styling_org_v15.pdf">Recommended practices for model styling and organization</a> sections 4 and 5.
|
||||
|
||||
The following attributes are imported from STEP file:
|
||||
* colors linked to assemblies, solids, shells, faces/surfaces, wireframes, edges/curves and vertices/points;
|
||||
@@ -1452,15 +1452,15 @@ The following attributes are mentioned in the Recommended Practices, but not han
|
||||
* point markers.
|
||||
|
||||
### Layers
|
||||
Layers are implemented in accordance with <a href="http://www.cax-if.org/documents/rec_prac_styling_org_v15.pdf">Recommended practices for model styling and organization</a> section 6.
|
||||
Layers are implemented in accordance with <a href="https://www.cax-if.org/documents/rec_prac_styling_org_v15.pdf">Recommended practices for model styling and organization</a> section 6.
|
||||
All layers are imported, but invisibility styles are skipped.
|
||||
|
||||
### Materials
|
||||
Materials are implemented in accordance with <a href="http://www.cax-if.org/documents/RecPrac_MaterialDensity_v21.pdf">Recommended practices for material identification and density</a> section 4.
|
||||
Materials are implemented in accordance with <a href="https://www.cax-if.org/documents/RecPrac_MaterialDensity_v21.pdf">Recommended practices for material identification and density</a> section 4.
|
||||
OCCT translator processes materials attached to solids in shape representations. The name, description and density (name and value) are imported for each material.
|
||||
|
||||
### Validation properties
|
||||
Validation properties are implemented in accordance with <a href="http://www.cax-if.org/documents/rec_prac_gvp_v44.pdf">Recommended practices for geometric and assembly validation properties</a> section 4 for AP214.
|
||||
Validation properties are implemented in accordance with <a href="https://www.cax-if.org/documents/rec_prac_gvp_v44.pdf">Recommended practices for geometric and assembly validation properties</a> section 4 for AP214.
|
||||
OCCT processes several types of geometric validation properties for solids, shells and geometric sets:
|
||||
* area;
|
||||
* volume;
|
||||
@@ -1530,7 +1530,7 @@ OCCT STEP Reader also handles Annotations, linked directly to shapes (section 9.
|
||||
Simple types of GD&T (Dimensions, Tolerances and Datums without presentations or any types of modifiers) are also handled in AP214. However, according to the Recommended Practices for the Representation and Presentation of Product Manufacturing, this implementation is obsolete.
|
||||
|
||||
### Saved views
|
||||
Saved views are implemented in accordance with <a href="http://www.cax-if.org/documents/rec_pracs_pmi_v40.pdf">Recommended practices for the Representation and Presentation of Product Manufacturing</a> section 9.4.1-9.4.4.
|
||||
Saved views are implemented in accordance with <a href="https://www.cax-if.org/documents/rec_pracs_pmi_v40.pdf">Recommended practices for the Representation and Presentation of Product Manufacturing</a> section 9.4.1-9.4.4.
|
||||
For each Saved View OCCT STEP Reader will retrieve the following attributes:
|
||||
- set of displayed shape representations;
|
||||
- set of displayed PMI presentations;
|
||||
|
@@ -35,7 +35,7 @@ To answer different needs of CASCADE users, this User's Guide offers the followi
|
||||
* If the 3D services proposed in AIS meet your requirements, you need only read chapter 3 @ref occt_visu_3 "AIS: Application Interactive Services".
|
||||
* If you need more detail, for example, a selection filter on another type of entity -- you should read chapter 2 @ref occt_visu_2 "Fundamental Concepts", chapter 3 @ref occt_visu_3 "AIS: Application Interactive Services", and 4 @ref occt_visu_4 "3D Presentations". You may want to begin with the chapter presenting AIS.
|
||||
|
||||
For advanced information on visualization algorithms, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
For advanced information on visualization algorithms, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@section occt_visu_2 Fundamental Concepts
|
||||
|
||||
@@ -88,7 +88,7 @@ Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext (theViewer)
|
||||
BRepPrimAPI_MakeWedge aWedgeMaker (theWedgeDX, theWedgeDY, theWedgeDZ, theWedgeLtx);
|
||||
TopoDS_Solid aShape = aWedgeMaker.Solid();
|
||||
Handle(AIS_Shape) aShapePrs = new AIS_Shape (aShape); // creation of the presentable object
|
||||
aContext->Display (aShapePrs); // display the presentable object in the 3d viewer
|
||||
aContext->Display (aShapePrs, AIS_Shaded, 0, true); // display the presentable object and redraw 3d viewer
|
||||
~~~~~
|
||||
|
||||
The shape is created using the *BRepPrimAPI_MakeWedge* command. An *AIS_Shape* is then created from the shape. When calling the *Display* command, the interactive context calls the Compute method of the presentable object to calculate the presentation data and transfer it to the viewer. See figure below.
|
||||
@@ -137,14 +137,14 @@ Selectable object stores information about all created selection modes and sensi
|
||||
|
||||
All successors of a selectable object must implement the method that splits its presentation into sensitive entities according to the given mode. The computed entities are arranged in one selection and added to the list of all selections of this object. No selection will be removed from the list until the object is deleted permanently.
|
||||
|
||||
For all standard OCCT shapes, zero mode is supposed to select the whole object (but it may be redefined easily in the custom object). For example, the standard OCCT selection mechanism and *AIS_Shape* determine the following modes:
|
||||
For all standard OCCT shapes, zero mode is supposed to select the whole object (but it may be redefined easily in the custom object). For example, the standard OCCT selection mechanism and *AIS_Shape* determine the following modes (see AIS_Shape::SelectionMode()):
|
||||
- 0 -- selection of the entire object *(AIS_Shape)*;
|
||||
- 1 -- selection of the vertices;
|
||||
- 2 -- selection of the edges;
|
||||
- 3 -- selection of the wires;
|
||||
- 4 -- selection of the faces;
|
||||
- 5 -- selection of the shells;
|
||||
- 6 -- selection of the constituent solids.
|
||||
- 1 -- selection of the vertices (TopAbs_VERTEX);
|
||||
- 2 -- selection of the edges (TopAbs_EDGE);
|
||||
- 3 -- selection of the wires (TopAbs_WIRE);
|
||||
- 4 -- selection of the faces (TopAbs_FACE);
|
||||
- 5 -- selection of the shells (TopAbs_SHELL);
|
||||
- 6 -- selection of the constituent solids (TopAbs_SOLID).
|
||||
|
||||
@figure{visualization_image006.png,"Hierarchy of references from sensitive entity to selectable object",400}
|
||||
|
||||
@@ -263,7 +263,7 @@ The package also contains two auxiliary classes, *Select3D_SensitivePoly* and *S
|
||||
- keeping selection BVH data up-to-date.
|
||||
|
||||
A brief description of the main classes:
|
||||
- *SelectMgr_FrustumBase*, *SelectMgr_Frustum*, *SelectMgr_RectangularFrustum*, *SelectMgr_TriangluarFrustum* and *SelectMgr_TriangularFrustumSet* -- interfaces and implementations of selecting frustums, these classes implement different SAT tests for overlap and inclusion detection. They also contain methods to measure characteristics of detected entities (depth, distance to center of geometry);
|
||||
- *SelectMgr_BaseFrustum*, *SelectMgr_Frustum*, *SelectMgr_RectangularFrustum*, *SelectMgr_TriangularFrustum* and *SelectMgr_TriangularFrustumSet* -- interfaces and implementations of selecting frustums, these classes implement different SAT tests for overlap and inclusion detection. They also contain methods to measure characteristics of detected entities (depth, distance to center of geometry);
|
||||
- *SelectMgr_SensitiveEntity*, *SelectMgr_Selection* and *SelectMgr_SensitiveEntitySet* -- store and handle sensitive entities; *SelectMgr_SensitiveEntitySet* implements a primitive set for the second level BVH tree;
|
||||
- *SelectMgr_SelectableObject* and *SelectMgr_SelectableObjectSet* -- describe selectable objects. They also manage storage, calculation and removal of selections. *SelectMgr_SelectableObjectSet* implements a primitive set for the first level BVH tree;
|
||||
- *SelectMgr_ViewerSelector* -- encapsulates all logics of the selection algorithm and implements the third level BVH tree traverse;
|
||||
@@ -274,7 +274,7 @@ A brief description of the main classes:
|
||||
*StdSelect* package contains the implementation of some *SelectMgr* classes and tools for creation of selection structures. For example,
|
||||
- *StdSelect_BRepOwner* -- defines an entity owner with a link to its topological shape and methods for highlighting;
|
||||
- *StdSelect_BRepSelectionTool* -- contains algorithms for splitting standard AIS shapes into sensitive primitives;
|
||||
- *StdSelect_ViewerSelector3d* -- an example of *SelectMgr_ViewerSelecor* implementation, which is used in a default OCCT selection mechanism;
|
||||
- *StdSelect_ViewerSelector3d* -- an example of *SelectMgr_ViewerSelector* implementation, which is used in a default OCCT selection mechanism;
|
||||
- *StdSelect_FaceFilter*, *StdSelect_EdgeFilter* -- implementation of selection filters.
|
||||
|
||||
@subsubsection occt_visu_2_2_4 Examples of usage
|
||||
@@ -315,7 +315,7 @@ void InteractiveBox::ComputeSelection (const Handle(SelectMgr_Selection)& theSel
|
||||
~~~~
|
||||
|
||||
The algorithms for creating selection structures store sensitive primitives in *SelectMgr_Selection* instance. Each *SelectMgr_Selection* sequence in the list of selections of the object must correspond to a particular selection mode.
|
||||
To describe the decomposition of the object into selectable primitives, a set of ready-made sensitive entities is supplied in *Select3D* package. Custom sensitive primitives can be defined through inheritance from *SelectBasics_SensitiveEntity*.
|
||||
To describe the decomposition of the object into selectable primitives, a set of ready-made sensitive entities is supplied in *Select3D* package. Custom sensitive primitives can be defined through inheritance from *Select3D_SensitiveEntity*.
|
||||
To make custom interactive objects selectable or customize selection modes of existing objects, the entity owners must be defined. They must inherit *SelectMgr_EntityOwner* interface.
|
||||
|
||||
Selection structures for any interactive object are created in *SelectMgr_SelectableObject::ComputeSelection()* method.
|
||||
@@ -340,7 +340,7 @@ The *StdSelect_BRepSelectionTool* class provides a high level API for computing
|
||||
|
||||
The traditional way of highlighting selected entity owners adopted by Open CASCADE Technology assumes that each entity owner highlights itself on its own. This approach has two drawbacks:
|
||||
|
||||
- each entity owner has to maintain its own *Prs3d_Presentation* object, that results in a considerable memory overhead;
|
||||
- each entity owner has to maintain its own *Graphic3d_Structure* object, that results in a considerable memory overhead;
|
||||
- drawing selected owners one by one is not efficient from the visualization point of view.
|
||||
|
||||
Therefore, to overcome these limitations, OCCT has an alternative way to implement the highlighting of a selected presentation. Using this approach, the interactive object itself will be responsible for the highlighting, not the entity owner.
|
||||
@@ -348,7 +348,6 @@ Therefore, to overcome these limitations, OCCT has an alternative way to impleme
|
||||
On the basis of *SelectMgr_EntityOwner::IsAutoHilight()* return value, *AIS_InteractiveContext* object either uses the traditional way of highlighting (in case if *IsAutoHilight()* returns TRUE) or groups such owners according to their selectable objects and finally calls *SelectMgr_SelectableObject::HilightSelected()* or *SelectMgr_SelectableObject::ClearSelected()*, passing a group of owners as an argument.
|
||||
|
||||
Hence, an application can derive its own interactive object and redefine virtual methods *HilightSelected()*, *ClearSelected()* and *HilightOwnerWithColor()* from *SelectMgr_SelectableObject*. *SelectMgr_SelectableObject::GetHilightPresentation* and *SelectMgr_SelectableObject::GetSelectPresentation* methods can be used to optimize filling of selection and highlight presentations according to the user's needs.
|
||||
The *AIS_InteractiveContext::HighlightSelected()* method can be used for efficient redrawing of the selection presentation for a given interactive object from an application code.
|
||||
|
||||
After all the necessary sensitive entities are computed and packed in *SelectMgr_Selection* instance with the corresponding owners in a redefinition of *SelectMgr_SelectableObject::ComputeSelection()* method, it is necessary to register the prepared selection in *SelectMgr_SelectionManager* through the following steps:
|
||||
- if there was no *AIS_InteractiveContext* opened, create an interactive context and display the selectable object in it;
|
||||
@@ -376,7 +375,7 @@ theContext->Activate (theBox, 1);
|
||||
|
||||
// Run the detection mechanism for activated entities in the current mouse coordinates and in the current view.
|
||||
// Detected owners will be highlighted with context highlight color
|
||||
theContext->MoveTo (aXMousePos, aYMousePos, myView);
|
||||
theContext->MoveTo (aXMousePos, aYMousePos, myView, false);
|
||||
// Select the detected owners
|
||||
theContext->Select();
|
||||
// Iterate through the selected owners
|
||||
@@ -449,6 +448,7 @@ void PackageName_ClassName::Compute (const Handle(PrsMgr_PresentationManager3d)&
|
||||
~~~~~
|
||||
|
||||
#### For hidden line removal (HLR) mode in 3D:
|
||||
|
||||
~~~~~
|
||||
void PackageName_ClassName::Compute (const Handle(Prs3d_Projector)& theProjector,
|
||||
const Handle(Prs3d_Presentation)& thePresentation);
|
||||
@@ -460,7 +460,7 @@ The view can have two states: the normal mode or the computed mode (Hidden Line
|
||||
|
||||
By convention, the Interactive Object accepts or rejects the representation of HLR mode. It is possible to make this declaration in one of two ways:
|
||||
|
||||
* Initially by using one of the values of the enumeration *PrsMgr_TypeOfPresentation*:
|
||||
* Initially by using one of the values of the enumeration *PrsMgr_TypeOfPresentation3d*:
|
||||
* *PrsMgr_TOP_AllView*,
|
||||
* *PrsMgr_TOP_ProjectorDependant*
|
||||
|
||||
@@ -475,7 +475,7 @@ The type of the HLR algorithm is stored in *Prs3d_Drawer* of the shape. It is a
|
||||
The type of the HLR algorithm used for *AIS_Shape* can be changed by calling the *AIS_Shape::SetTypeOfHLR()* method.
|
||||
The current HLR algorithm type can be obtained using *AIS_Shape::TypeOfHLR()* method is to be used.
|
||||
|
||||
These methods get the value from the drawer of *AIS_Shape*. If the HLR algorithm type in the *AIS_Drawer* is set to *Prs3d_TOH_NotSet*, the *AIS_Drawer* gets the value from the default drawer of *AIS_InteractiveContext*.
|
||||
These methods get the value from the drawer of *AIS_Shape*. If the HLR algorithm type in the *Prs3d_Drawer* is set to *Prs3d_TOH_NotSet*, the *Prs3d_Drawer* gets the value from the default drawer of *AIS_InteractiveContext*.
|
||||
So it is possible to change the default HLR algorithm used by all newly displayed interactive objects. The value of the HLR algorithm type stored in the context drawer can be *Prs3d_TOH_Algo* or *Prs3d_TOH_PolyAlgo*. The polygonal algorithm is the default one.
|
||||
|
||||
@subsubsection occt_visu_3_2_3 Presentation modes
|
||||
@@ -503,7 +503,7 @@ The functions *AIS_InteractiveContext::SetDisplayMode* and *AIS_InteractiveConte
|
||||
|
||||
At dynamic detection, the presentation echoed by the Interactive Context, is by default the presentation already on the screen.
|
||||
|
||||
The functions *AIS_InteractiveObject::SetHilightMode* and *AIS_InteractiveObject::UnSetHilightMode* allow specifying the display mode used for highlighting (so called highlight mode), which is valid independently from the active representation of the object. It makes no difference whether this choice is temporary or definitive.
|
||||
The functions *AIS_InteractiveObject::SetHilightMode* and *AIS_InteractiveObject::UnsetHilightMode* allow specifying the display mode used for highlighting (so called highlight mode), which is valid independently from the active representation of the object. It makes no difference whether this choice is temporary or definitive.
|
||||
|
||||
Note that the same presentation (and consequently the same highlight mode) is used for highlighting *detected* objects and for highlighting *selected* objects, the latter being drawn with a special *selection color* (refer to the section related to *Interactive Context* services).
|
||||
|
||||
@@ -516,9 +516,14 @@ If you do not want an object to be affected by a *FitAll* view, you must declare
|
||||
Let us take for example the class called *IShape* representing an interactive object:
|
||||
|
||||
~~~~~
|
||||
myPk_IShape::myPK_IShape (const TopoDS_Shape& theShape, PrsMgr_TypeOfPresentation theType)
|
||||
myPk_IShape::myPk_IShape (const TopoDS_Shape& theShape, PrsMgr_TypeOfPresentation theType)
|
||||
: AIS_InteractiveObject (theType), myShape (theShape) { SetHilightMode (0); }
|
||||
|
||||
Standard_Boolean myPk_IShape::AcceptDisplayMode (const Standard_Integer theMode) const
|
||||
{
|
||||
return theMode == 0 || theMode == 1;
|
||||
}
|
||||
|
||||
void myPk_IShape::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
|
||||
const Handle(Prs3d_Presentation)& thePrs,
|
||||
const Standard_Integer theMode)
|
||||
@@ -598,14 +603,14 @@ The following functions allow "moving" the representation and selection of Inter
|
||||
|
||||
#### Connect an interactive object to an applicative entity
|
||||
|
||||
Each Interactive Object has functions that allow attributing it an *Owner* in form of a *Transient*.
|
||||
Each Interactive Object has functions that allow attributing it an *GetOwner* in form of a *Transient*.
|
||||
* *AIS_InteractiveObject::SetOwner*
|
||||
* *AIS_InteractiveObject::HasOwner*
|
||||
* *AIS_InteractiveObject::Owner*
|
||||
* *AIS_InteractiveObject::GetOwner*
|
||||
|
||||
An interactive object can therefore be associated or not with an applicative entity, without affecting its behavior.
|
||||
|
||||
**NOTE:** Don't be confused by owners of another kind - *SelectBasics_EntityOwner* used for identifying selectable parts of the object or object itself.
|
||||
**NOTE:** Don't be confused by owners of another kind - *SelectMgr_EntityOwner* used for identifying selectable parts of the object or object itself.
|
||||
|
||||
#### Resolving coincident topology
|
||||
|
||||
@@ -758,6 +763,9 @@ theCtx->SetDisplayMode (2, true);
|
||||
|
||||
*PresentationManager* and *Selector3D*, which manage the presentation and selection of present interactive objects, are associated to the main Viewer.
|
||||
|
||||
*WARNING!* Do NOT use integer values (like in sample above) in real code - use appropriate enumerations instead!
|
||||
Each presentable object has independent list of supported display and selection modes; for instance, *AIS_DisplayMode* enumeration is applicable only to *AIS_Shape* presentations.
|
||||
|
||||
@subsection occt_visu_3_4 Local Selection
|
||||
|
||||
@subsubsection occt_visu_3_4_1 Selection Modes
|
||||
@@ -767,7 +775,7 @@ See, for example, *MeshVS_SelectionModeFlags* for *MeshVS_Mesh* object.
|
||||
|
||||
*AIS_Shape* is the most used interactive object. It provides API to manage selection operations on the constituent elements of shapes (selection of vertices, edges, faces, etc.). The Selection Mode for a specific shape type (*TopAbs_ShapeEnum*) is returned by method *AIS_Shape::SelectionMode()*.
|
||||
|
||||
The method *AIS_InteractiveObject::Display()* without a Selection Mode argument activates the default Selection Mode of the object.
|
||||
The method *AIS_InteractiveContext::Display()* without a Selection Mode argument activates the default Selection Mode of the object.
|
||||
The methods *AIS_InteractiveContext::Activate()* and *AIS_InteractiveContext::Deactivate()* activate and deactivate a specific Selection Mode.
|
||||
|
||||
More than one Selection Mode can be activated at the same time (but default 0 mode for selecting entire object is exclusive - it cannot be combined with others).
|
||||
@@ -815,7 +823,7 @@ myContext->AddFilter (aFil1);
|
||||
myContext->AddFilter (aFil2);
|
||||
|
||||
// only faces of revolution or planar faces will be selected
|
||||
myContext->MoveTo (thePixelX, thePixelY, myView);
|
||||
myContext->MoveTo (thePixelX, thePixelY, myView, true);
|
||||
~~~~~
|
||||
|
||||
@subsubsection occt_visu_3_4_6 Selection
|
||||
@@ -848,6 +856,7 @@ The Interactive Object itself can be retrieved by method *SelectMgr_EntityOwner:
|
||||
In case of *AIS_Shape*, the (sub)shape is returned by method *StdSelect_BRepOwner::Shape*.
|
||||
|
||||
#### Example
|
||||
|
||||
~~~~~
|
||||
for (myAISCtx->InitSelected(); myAISCtx->MoreSelected(); myAISCtx->NextSelected())
|
||||
{
|
||||
@@ -879,12 +888,12 @@ If you want to give a particular type and signature to your interactive object,
|
||||
The **Datum** groups together the construction elements such as lines, circles, points, trihedrons, plane trihedrons, planes and axes.
|
||||
|
||||
*AIS_Point, AIS_Axis, AIS_Line, AIS_Circle, AIS_Plane* and *AIS_Trihedron* have four selection modes:
|
||||
* mode 0 : selection of a trihedron;
|
||||
* mode 1 : selection of the origin of the trihedron;
|
||||
* mode 2 : selection of the axes;
|
||||
* mode 3 : selection of the planes XOY, YOZ, XOZ.
|
||||
* mode AIS_TrihedronSelectionMode_EntireObject : selection of a trihedron;
|
||||
* mode AIS_TrihedronSelectionMode_Origin : selection of the origin of the trihedron;
|
||||
* mode AIS_TrihedronSelectionMode_Axes : selection of the axes;
|
||||
* mode AIS_TrihedronSelectionMode_MainPlanes : selection of the planes XOY, YOZ, XOZ.
|
||||
|
||||
when you activate one of modes: 1 2 3 4, you pick AIS objects of type:
|
||||
when you activate one of modes, you pick AIS objects of type:
|
||||
* *AIS_Point*;
|
||||
* *AIS_Axis* (and information on the type of axis);
|
||||
* *AIS_Plane* (and information on the type of plane).
|
||||
@@ -901,8 +910,8 @@ For the presentation of planes and trihedra, the default length unit is millimet
|
||||
The **Object** type includes topological shapes, and connections between shapes.
|
||||
|
||||
*AIS_Shape* has two visualization modes:
|
||||
* mode 0 : Line (default mode)
|
||||
* mode 1 : Shading (depending on the type of shape)
|
||||
* mode AIS_WireFrame : Line (default mode)
|
||||
* mode AIS_Shaded : Shading (depending on the type of shape)
|
||||
|
||||
*AIS_ConnectedInteractive* is an Interactive Object connecting to another interactive object reference, and located elsewhere in the viewer makes it possible not to calculate presentation and selection, but to deduce them from your object reference.
|
||||
*AIS_MultipleConnectedInteractive* is an object connected to a list of interactive objects (which can also be Connected objects. It does not require memory-hungry presentation calculations).
|
||||
@@ -1196,7 +1205,7 @@ aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
|
||||
|
||||
@subsubsection occt_visu_4_2_5 Text primitive
|
||||
|
||||
*TKOpenGL* toolkit renders text labels using texture fonts. *Graphic3d* text primitives have the following features:
|
||||
*TKOpenGl* toolkit renders text labels using texture fonts. *Graphic3d* text primitives have the following features:
|
||||
* fixed size (non-zoomable) or zoomable,
|
||||
* can be rotated to any angle in the view plane,
|
||||
* support unicode charset.
|
||||
@@ -1204,46 +1213,13 @@ aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
|
||||
The text attributes for the group could be defined with the *Graphic3d_AspectText3d* attributes group.
|
||||
To add any text to the graphic structure you can use the following methods:
|
||||
~~~~~
|
||||
void Graphic3d_Group::Text (const Standard_CString theText,
|
||||
const Graphic3d_Vertex& thePoint,
|
||||
const Standard_Real theHeight,
|
||||
const Quantity_PlaneAngle theAngle,
|
||||
const Graphic3d_TextPath theTp,
|
||||
const Graphic3d_HorizontalTextAlignment theHta,
|
||||
const Graphic3d_VerticalTextAlignment theVta,
|
||||
const Standard_Boolean theToEvalMinMax);
|
||||
void Graphic3d_Group::AddText (const Handle(Graphic3d_Text)& theTextParams,
|
||||
const Standard_Boolean theToEvalMinMax);
|
||||
~~~~~
|
||||
|
||||
The meaning of these parameters is as follows:
|
||||
* *theText* - the text string,
|
||||
* *thePoint* - the three-dimensional position of the text,
|
||||
* *theHeight* - the text height,
|
||||
* *theAngle* - the text orientation (at the moment, this parameter has no effect, but you can specify the text orientation through the *Graphic3d_AspectText3d* attributes).
|
||||
* *theTp* defines the text path,
|
||||
* *theHta* - the horizontal alignment of the text,
|
||||
* *theVta* - the vertical alignment of the text.
|
||||
|
||||
You can pass FALSE as *theToEvalMinMax* if you do not want the graphic3d structure boundaries to be affected by the text position.
|
||||
|
||||
**Note** that the text orientation angle can be defined by *Graphic3d_AspectText3d* attributes.
|
||||
~~~~~
|
||||
void Graphic3d_Group::Text (const Standard_CString theText,
|
||||
const Graphic3d_Vertex& thePoint,
|
||||
const Standard_Real theHeight,
|
||||
const Standard_Boolean theToEvalMinMax);
|
||||
void Graphic3d_Group::Text (const TCcollection_ExtendedString& theText,
|
||||
const Graphic3d_Vertex& thePoint,
|
||||
const Standard_Real theHeight,
|
||||
const Quantity_PlaneAngle theAngle,
|
||||
const Graphic3d_TextPath theTp,
|
||||
const Graphic3d_HorizontalTextAlignment theHta,
|
||||
const Graphic3d_VerticalTextAlignment theVta,
|
||||
const Standard_Boolean theToEvalMinMax);
|
||||
void Graphic3d_Group::Text (const TCcollection_ExtendedString& theText,
|
||||
const Graphic3d_Vertex& thePoint,
|
||||
const Standard_Real theHeight,
|
||||
const Standard_Boolean theToEvalMinMax);
|
||||
~~~~~
|
||||
|
||||
See the example:
|
||||
~~~~~
|
||||
@@ -1257,8 +1233,10 @@ aTextAspect->SetTextAngle (45.0);
|
||||
aGroup->SetPrimitivesAspect (aTextAspect);
|
||||
|
||||
// add a text primitive to the structure
|
||||
Graphic3d_Vertex aPoint (1, 1, 1);
|
||||
aGroup->Text (Standard_CString ("Text"), aPoint, 16.0);
|
||||
Handle(Graphic3d_Text) aText = new Graphic3d_Text (16.0f);
|
||||
aText->SetText ("Text");
|
||||
aText->SetPosition (gp_Pnt (1, 1, 1));
|
||||
aGroup->AddText (aText);
|
||||
~~~~~
|
||||
|
||||
@subsubsection occt_visu_4_2_6 Materials
|
||||
@@ -1451,8 +1429,8 @@ aView->Update();
|
||||
**IOD** -- defines the intraocular distance (in world space units).
|
||||
|
||||
There are two types of IOD:
|
||||
* _IODType_Absolute_ : Intraocular distance is defined as an absolute value.
|
||||
* _IODType_Relative_ : Intraocular distance is defined relative to the camera focal length (as its coefficient).
|
||||
* _Graphic3d_Camera::IODType_Absolute_ : Intraocular distance is defined as an absolute value.
|
||||
* _Graphic3d_Camera::IODType_Relative_ : Intraocular distance is defined relative to the camera focal length (as its coefficient).
|
||||
|
||||
**Field of view (FOV)** -- defines the field of camera view by y axis in degrees (45<34> is default).
|
||||
|
||||
@@ -1468,7 +1446,7 @@ To enable stereo projection, your workstation should meet the following requirem
|
||||
|
||||
In stereographic projection mode the camera prepares two projection matrices to display different stereo-pictures for the left and for the right eye. In a non-stereo camera this effect is not visible because only the same projection is used for both eyes.
|
||||
|
||||
To enable quad buffering support you should provide the following settings to the graphic driver *opengl_caps*:
|
||||
To enable quad buffering support you should provide the following settings to the graphic driver *OpenGl_Caps*:
|
||||
|
||||
~~~~~
|
||||
Handle(OpenGl_GraphicDriver) aDriver = new OpenGl_GraphicDriver();
|
||||
@@ -1493,7 +1471,7 @@ aView->Update();
|
||||
The algorithm of frustum culling on CPU-side is activated by default for 3D viewer. This algorithm allows skipping the presentation outside camera at the rendering stage, providing better performance. The following features support this method:
|
||||
* *Graphic3d_Structure::CalculateBoundBox()* is used to calculate axis-aligned bounding box of a presentation considering its transformation.
|
||||
* *V3d_View::SetFrustumCulling* enables or disables frustum culling for the specified view.
|
||||
* Classes *OpenGl_BVHClipPrimitiveSet* and *OpenGl_BVHTreeSelector* handle the detection of outer objects and usage of acceleration structure for frustum culling.
|
||||
* Classes *Graphic3d_BvhCStructureSet* and *Graphic3d_CullingTool* handle the detection of outer objects and usage of acceleration structure for frustum culling.
|
||||
* *BVH_BinnedBuilder* class splits several objects with null bounding box.
|
||||
|
||||
@subsubsection occt_visu_4_4_9 View background styles
|
||||
@@ -1537,7 +1515,7 @@ Standard_Boolean V3d_View::Dump (const Standard_CString theFile,
|
||||
~~~~
|
||||
Dumps the scene into an image file with the view dimensions.
|
||||
The raster image data handling algorithm is based on the *Image_AlienPixMap* class. The supported extensions are ".png", ".bmp", ".jpg" and others supported by **FreeImage** library.
|
||||
The value passed as *theBufferType* argument defines the type of the buffer for an output image *(RGB, RGBA, floating-point, RGBF, RGBAF)*. Method returns TRUE if the scene has been successfully dumped.
|
||||
The value passed as *theBufferType* argument defines the type of the buffer for an output image (RGB, RGBA, floating-point, RGBF, RGBAF). Method returns TRUE if the scene has been successfully dumped.
|
||||
|
||||
~~~~
|
||||
Standard_Boolean V3d_View::ToPixMap (Image_PixMap& theImage,
|
||||
@@ -1728,7 +1706,7 @@ aView->Update();
|
||||
|
||||
Back face culling reduces the rendered number of triangles (which improves the performance) and eliminates artifacts at shape boundaries. However, this option can be used only for solid objects, where the interior is actually invisible from any point of view. Automatic back-face culling mechanism is turned on by default, which is controlled by *V3d_View::SetBackFacingModel()*.
|
||||
|
||||
The following features are applied in *StdPrs_ToolShadedShape::IsClosed()*, which is used for definition of back face culling in *ShadingAspect*:
|
||||
The following features are applied in *StdPrs_ToolTriangulatedShape::IsClosed()*, which is used for definition of back face culling in *ShadingAspect*:
|
||||
* disable culling for free closed Shells (not inside the Solid) since reversed orientation of a free Shell is a valid case;
|
||||
* enable culling for Solids packed into a compound;
|
||||
* ignore Solids with incomplete triangulation.
|
||||
@@ -1856,7 +1834,7 @@ myAISContext->Display (anAISShape);
|
||||
Follow the procedure below to compute the presentable object:
|
||||
|
||||
1. Build a presentable object inheriting from *AIS_InteractiveObject* (refer to the Chapter on @ref occt_visu_2_1 "Presentable Objects").
|
||||
2. Reuse the *Prs3d_Presentation* provided as an argument of the compute methods.
|
||||
2. Reuse the *Graphic3d_Structure* provided as an argument of the compute methods.
|
||||
|
||||
**Note** that there are two compute methods: one for a standard representation, and the other for a degenerated representation, i.e. in hidden line removal and wireframe modes.
|
||||
|
||||
@@ -1864,14 +1842,14 @@ Let us look at the example of compute methods
|
||||
|
||||
~~~~~
|
||||
void MyPresentableObject::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsManager,
|
||||
const Handle(Prs3d_Presentation)& thePrs,
|
||||
const Handle(Graphic3d_Structure)& thePrs,
|
||||
const Standard_Integer theMode)
|
||||
(
|
||||
//...
|
||||
)
|
||||
|
||||
void MyPresentableObject::Compute (const Handle(Prs3d_Projector)& theProjector,
|
||||
const Handle(Prs3d_Presentation)& thePrs)
|
||||
const Handle(Graphic3d_Structure)& thePrs)
|
||||
(
|
||||
//...
|
||||
)
|
||||
@@ -1879,7 +1857,7 @@ void MyPresentableObject::Compute (const Handle(Prs3d_Projector)& theProjector,
|
||||
|
||||
@subsubsection occt_visu_4_5_6 Create primitives in the interactive object
|
||||
|
||||
Get the group used in *Prs3d_Presentation*.
|
||||
Get the group used in *Graphic3d_Structure*.
|
||||
|
||||
~~~~~
|
||||
Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
|
||||
|
@@ -5,7 +5,7 @@
|
||||
|
||||
@section occt_xde_1 Introduction
|
||||
|
||||
This manual explains how to use the Extended Data Exchange (XDE). It provides basic documentation on setting up and using XDE. For advanced information on XDE and its applications, see our <a href="http://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
This manual explains how to use the Extended Data Exchange (XDE). It provides basic documentation on setting up and using XDE. For advanced information on XDE and its applications, see our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
The Extended Data Exchange (XDE) module allows extending the scope of exchange by translating additional data attached to geometric BREP data, thereby improving the interoperability with external software.
|
||||
|
||||
|
2
genproj
@@ -40,7 +40,7 @@ if [ "$aTarget" == "" ]; then
|
||||
fi
|
||||
|
||||
cd $aScriptPath
|
||||
tclsh "./adm/start.tcl" genproj ${aTarget} $anOpt2 $anOpt3 $anOpt4 $anOpt5
|
||||
tclsh "./adm/start.tcl" genproj ${aTarget} -solution "OCCT" $anOpt2 $anOpt3 $anOpt4 $anOpt5
|
||||
|
||||
export PATH="$anOldPath"
|
||||
export LD_LIBRARY_PATH="$anOldLd"
|
||||
|
@@ -54,5 +54,5 @@ if "%aPrjFmt%" == "" ( set "aPrjFmt=vcxproj" )
|
||||
if "%aPrjFmt%" == "vcxproj" ( set "aPrjFmt=%VCFMT%" )
|
||||
|
||||
cd %~dp0
|
||||
%TCL_EXEC% %~dp0adm/start.tcl genproj %aPrjFmt% %aPlatform% %3 %4 %5
|
||||
%TCL_EXEC% %~dp0adm/start.tcl genproj %aPrjFmt% %aPlatform% -solution "OCCT" %3 %4 %5
|
||||
SET "PATH=%OLD_PATH%"
|
||||
|
@@ -35,13 +35,49 @@
|
||||
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
namespace
|
||||
{
|
||||
//! Convert GLFW mouse button into Aspect_VKeyMouse.
|
||||
static Aspect_VKeyMouse mouseButtonFromGlfw (int theButton)
|
||||
{
|
||||
switch (theButton)
|
||||
{
|
||||
case GLFW_MOUSE_BUTTON_LEFT: return Aspect_VKeyMouse_LeftButton;
|
||||
case GLFW_MOUSE_BUTTON_RIGHT: return Aspect_VKeyMouse_RightButton;
|
||||
case GLFW_MOUSE_BUTTON_MIDDLE: return Aspect_VKeyMouse_MiddleButton;
|
||||
}
|
||||
return Aspect_VKeyMouse_NONE;
|
||||
}
|
||||
|
||||
//! Convert GLFW key modifiers into Aspect_VKeyFlags.
|
||||
static Aspect_VKeyFlags keyFlagsFromGlfw (int theFlags)
|
||||
{
|
||||
Aspect_VKeyFlags aFlags = Aspect_VKeyFlags_NONE;
|
||||
if ((theFlags & GLFW_MOD_SHIFT) != 0)
|
||||
{
|
||||
aFlags |= Aspect_VKeyFlags_SHIFT;
|
||||
}
|
||||
if ((theFlags & GLFW_MOD_CONTROL) != 0)
|
||||
{
|
||||
aFlags |= Aspect_VKeyFlags_CTRL;
|
||||
}
|
||||
if ((theFlags & GLFW_MOD_ALT) != 0)
|
||||
{
|
||||
aFlags |= Aspect_VKeyFlags_ALT;
|
||||
}
|
||||
if ((theFlags & GLFW_MOD_SUPER) != 0)
|
||||
{
|
||||
aFlags |= Aspect_VKeyFlags_META;
|
||||
}
|
||||
return aFlags;
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : GlfwOcctView
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
GlfwOcctView::GlfwOcctView()
|
||||
: myCurAction3d (CurAction3d_Nothing),
|
||||
myToRedraw (true)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -193,15 +229,7 @@ void GlfwOcctView::mainloop()
|
||||
glfwWaitEvents();
|
||||
if (!myView.IsNull())
|
||||
{
|
||||
if (myView->IsInvalidated())
|
||||
{
|
||||
myView->Redraw();
|
||||
}
|
||||
else if (myToRedraw)
|
||||
{
|
||||
myView->RedrawImmediate();
|
||||
}
|
||||
myToRedraw = false;
|
||||
FlushViewEvents (myContext, myView, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -237,7 +265,6 @@ void GlfwOcctView::onResize (int theWidth, int theHeight)
|
||||
myView->MustBeResized();
|
||||
myView->Invalidate();
|
||||
myView->Redraw();
|
||||
//myToRedraw = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,13 +274,10 @@ void GlfwOcctView::onResize (int theWidth, int theHeight)
|
||||
// ================================================================
|
||||
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;
|
||||
if (!myView.IsNull())
|
||||
{
|
||||
UpdateZoom (Aspect_ScrollDelta (myOcctWindow->CursorPosition(), int(theOffsetY * 8.0)));
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
@@ -265,27 +289,13 @@ void GlfwOcctView::onMouseButton (int theButton, int theAction, int theMods)
|
||||
if (myView.IsNull()) { return; }
|
||||
|
||||
const Graphic3d_Vec2i aPos = myOcctWindow->CursorPosition();
|
||||
if (theAction != GLFW_PRESS)
|
||||
if (theAction == GLFW_PRESS)
|
||||
{
|
||||
myCurAction3d = CurAction3d_Nothing;
|
||||
return;
|
||||
PressMouseButton (aPos, mouseButtonFromGlfw (theButton), keyFlagsFromGlfw (theMods), false);
|
||||
}
|
||||
|
||||
myMouseMin = aPos;
|
||||
myMouseMax = aPos;
|
||||
switch (theButton)
|
||||
else
|
||||
{
|
||||
case GLFW_MOUSE_BUTTON_RIGHT:
|
||||
{
|
||||
myCurAction3d = CurAction3d_DynamicRoation;
|
||||
myView->StartRotation (aPos.x(), aPos.y());
|
||||
break;
|
||||
}
|
||||
case GLFW_MOUSE_BUTTON_MIDDLE:
|
||||
{
|
||||
myCurAction3d = CurAction3d_DynamicPanning;
|
||||
break;
|
||||
}
|
||||
ReleaseMouseButton (aPos, mouseButtonFromGlfw (theButton), keyFlagsFromGlfw (theMods), false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -295,30 +305,9 @@ void GlfwOcctView::onMouseButton (int theButton, int theAction, int theMods)
|
||||
// ================================================================
|
||||
void GlfwOcctView::onMouseMove (int thePosX, int thePosY)
|
||||
{
|
||||
if (myView.IsNull()) { return; }
|
||||
|
||||
switch (myCurAction3d)
|
||||
const Graphic3d_Vec2i aNewPos (thePosX, thePosY);
|
||||
if (!myView.IsNull())
|
||||
{
|
||||
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;
|
||||
}
|
||||
UpdateMousePosition (aNewPos, PressedMouseButtons(), LastMouseFlags(), false);
|
||||
}
|
||||
}
|
||||
|
@@ -25,20 +25,12 @@
|
||||
#include "GlfwOcctWindow.h"
|
||||
|
||||
#include <AIS_InteractiveContext.hxx>
|
||||
#include <AIS_ViewController.hxx>
|
||||
#include <V3d_View.hxx>
|
||||
|
||||
//! Sample class creating 3D Viewer within GLFW window.
|
||||
class GlfwOcctView
|
||||
class GlfwOcctView : protected AIS_ViewController
|
||||
{
|
||||
public:
|
||||
enum CurAction3d
|
||||
{
|
||||
CurAction3d_Nothing,
|
||||
CurAction3d_DynamicZooming,
|
||||
CurAction3d_DynamicPanning,
|
||||
CurAction3d_DynamicRoation
|
||||
};
|
||||
|
||||
public:
|
||||
//! Default constructor.
|
||||
GlfwOcctView();
|
||||
@@ -115,11 +107,6 @@ private:
|
||||
Handle(V3d_View) myView;
|
||||
Handle(AIS_InteractiveContext) myContext;
|
||||
|
||||
CurAction3d myCurAction3d;
|
||||
Graphic3d_Vec2i myMouseMin;
|
||||
Graphic3d_Vec2i myMouseMax;
|
||||
bool myToRedraw;
|
||||
|
||||
};
|
||||
|
||||
#endif // _GlfwOcctView_Header
|
||||
|
@@ -134,17 +134,17 @@ void GlfwOcctWindow::Unmap() const
|
||||
// Function : DoResize
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
Aspect_TypeOfResize GlfwOcctWindow::DoResize() const
|
||||
Aspect_TypeOfResize GlfwOcctWindow::DoResize()
|
||||
{
|
||||
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;
|
||||
myXLeft = anXPos;
|
||||
myXRight = anXPos + aWidth;
|
||||
myYTop = anYPos;
|
||||
myYBottom = anYPos + aHeight;
|
||||
}
|
||||
return Aspect_TOR_UNKNOWN;
|
||||
}
|
||||
|
@@ -65,7 +65,7 @@ public:
|
||||
virtual Aspect_Drawable NativeParentHandle() const Standard_OVERRIDE { return 0; }
|
||||
|
||||
//! Applies the resizing to the window <me>
|
||||
virtual Aspect_TypeOfResize DoResize() const Standard_OVERRIDE;
|
||||
virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE;
|
||||
|
||||
//! Returns True if the window <me> is opened and False if the window is closed.
|
||||
virtual Standard_Boolean IsMapped() const Standard_OVERRIDE;
|
||||
|
@@ -44,7 +44,7 @@ public:
|
||||
virtual void Unmap() const Standard_OVERRIDE {}
|
||||
|
||||
//! Applies the resizing to the window <me>
|
||||
virtual Aspect_TypeOfResize DoResize() const Standard_OVERRIDE { return Aspect_TOR_UNKNOWN; }
|
||||
virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE { return Aspect_TOR_UNKNOWN; }
|
||||
|
||||
//! Apply the mapping change to the window <me>
|
||||
virtual Standard_Boolean DoMapping() const Standard_OVERRIDE { return Standard_True; }
|
||||
|
@@ -216,8 +216,7 @@ void GeomSources::DisplaySurface(CGeometryDoc* aDoc,
|
||||
|
||||
void GeomSources::ResetView(CGeometryDoc* aDoc)
|
||||
{
|
||||
aDoc->GetAISContext()->CurrentViewer()->InitActiveViews();
|
||||
Handle(V3d_View) aView = aDoc->GetAISContext()->CurrentViewer()->ActiveView();
|
||||
Handle(V3d_View) aView = aDoc->GetAISContext()->CurrentViewer()->ActiveViews().First();
|
||||
aView->Reset();
|
||||
}
|
||||
|
||||
|
@@ -68,8 +68,7 @@ void TexturesExt_Presentation::DoSample()
|
||||
void TexturesExt_Presentation::Init()
|
||||
{
|
||||
// initialize v3d_view so it displays TexturesExt well
|
||||
getViewer()->InitActiveViews();
|
||||
Handle(V3d_View) aView = getViewer()->ActiveView();
|
||||
Handle(V3d_View) aView = getViewer()->ActiveViews().First();
|
||||
aView->SetSize(ZVIEW_SIZE);
|
||||
|
||||
// getDocument()->UpdateResultMessageDlg("Textured Shape",
|
||||
|
@@ -1020,8 +1020,7 @@ void CViewer3dDoc::OnDumpView()
|
||||
pView->UpdateWindow();
|
||||
}
|
||||
|
||||
myViewer->InitActiveViews();
|
||||
Handle(V3d_View) aView = myViewer->ActiveView();
|
||||
Handle(V3d_View) aView = myViewer->ActiveViews().First();
|
||||
ExportView (aView);
|
||||
}
|
||||
|
||||
|
@@ -1012,65 +1012,61 @@ aParams.NbMsaaSamples = aParams.NbMsaaSamples == 0 ? 8 : 0;\n\
|
||||
GetDocument()->UpdateResultMessageDlg("SetAntialiasingOn/SetAntialiasingOff",Message);
|
||||
}
|
||||
|
||||
void CViewer3dView::OnClearLights()
|
||||
void CViewer3dView::OnClearLights()
|
||||
{
|
||||
// Setting Off all viewer active lights
|
||||
TColStd_ListOfTransient lights;
|
||||
for(myView->Viewer()->InitActiveLights(); myView->Viewer()->MoreActiveLights(); myView->Viewer()->NextActiveLights())
|
||||
// Setting Off all viewer active lights
|
||||
V3d_ListOfLight lights;
|
||||
for (V3d_ListOfLightIterator anIter = myView->Viewer()->ActiveLightIterator(); anIter.More(); anIter.Next())
|
||||
{
|
||||
lights.Append(myView->Viewer()->ActiveLight());
|
||||
lights.Append (anIter.Value());
|
||||
}
|
||||
TColStd_ListIteratorOfListOfTransient itrLights(lights);
|
||||
V3d_ListOfLightIterator itrLights(lights);
|
||||
for (; itrLights.More(); itrLights.Next())
|
||||
{
|
||||
Handle(V3d_Light) light = Handle(V3d_Light)::DownCast(itrLights.Value());
|
||||
myView->Viewer()->SetLightOff(light);
|
||||
myView->Viewer()->SetLightOff (itrLights.Value());
|
||||
}
|
||||
|
||||
// Setting Off all view active lights
|
||||
// Setting Off all view active lights
|
||||
lights.Clear();
|
||||
for(myView->InitActiveLights(); myView->MoreActiveLights(); myView->NextActiveLights())
|
||||
for (V3d_ListOfLightIterator anIter = myView->ActiveLightIterator(); anIter.More(); anIter.Next())
|
||||
{
|
||||
lights.Append(myView->ActiveLight());
|
||||
lights.Append (anIter.Value());
|
||||
}
|
||||
itrLights.Initialize(lights);
|
||||
itrLights.Initialize (lights);
|
||||
for (; itrLights.More(); itrLights.Next())
|
||||
{
|
||||
Handle(V3d_Light) light = Handle(V3d_Light)::DownCast(itrLights.Value());
|
||||
myView->SetLightOff(light);
|
||||
myView->SetLightOff (itrLights.Value());
|
||||
}
|
||||
|
||||
myView->Viewer()->SetDefaultLights();// Setting the default lights on
|
||||
myView->Viewer()->SetDefaultLights(); // Setting the default lights on
|
||||
|
||||
NbActiveLights = 2;// There are 2 default active lights
|
||||
NbActiveLights = 2; // There are 2 default active lights
|
||||
|
||||
myView->Update();
|
||||
myView->Update();
|
||||
|
||||
TCollection_AsciiString Message("\
|
||||
// Setting Off all viewer active lights\n\
|
||||
TColStd_ListOfTransient lights;\n\
|
||||
for(myView->Viewer()->InitActiveLights(); myView->Viewer()->MoreActiveLights(); myView->Viewer()->NextActiveLights())\n\
|
||||
// Setting Off all viewer active lights\n\
|
||||
V3d_ListOfLight lights;\n\
|
||||
for (V3d_ListOfLightIterator anIter = myView->Viewer()->ActiveLightIterator(); anIter.More(); anIter.Next())\n\
|
||||
{\n\
|
||||
lights.Append(myView->Viewer()->ActiveLight());\n\
|
||||
lights.Append (anIter.Value());\n\
|
||||
}\n\
|
||||
TColStd_ListIteratorOfListOfTransient itrLights(lights);\n\
|
||||
V3d_ListOfLightIterator itrLights(lights);\n\
|
||||
for (; itrLights.More(); itrLights.Next())\n\
|
||||
{\n\
|
||||
Handle(V3d_Light) light = Handle(V3d_Light)::DownCast(itrLights.Value());\n\
|
||||
myView->Viewer()->SetLightOff(light);\n\
|
||||
myView->Viewer()->SetLightOff (itrLights.Value())\n\
|
||||
}\n\
|
||||
\n\
|
||||
// Setting Off all view active lights\n\
|
||||
// Setting Off all view active lights\n\
|
||||
lights.Clear();\n\
|
||||
for(myView->InitActiveLights(); myView->MoreActiveLights(); myView->NextActiveLights())\n\
|
||||
for (V3d_ListOfLightIterator anIter = myView->ActiveLightIterator(); anIter.More(); anIter.Next())\n\
|
||||
{\n\
|
||||
lights.Append(myView->ActiveLight());\n\
|
||||
lights.Append (anIter.Value());\n\
|
||||
}\n\
|
||||
itrLights.Initialize(lights);\n\
|
||||
for (; itrLights.More(); itrLights.Next())\n\
|
||||
{\n\
|
||||
Handle(V3d_Light) light = Handle(V3d_Light)::DownCast(itrLights.Value());\n\
|
||||
myView->SetLightOff(light);\n\
|
||||
myView->SetLightOff (itrLights.Value());\n\
|
||||
}\n\
|
||||
\n\
|
||||
myView->Viewer()->SetDefaultLights();// Setting the default lights on\n\
|
||||
|
@@ -413,8 +413,7 @@ void CTriangulationDoc::OnDumpView()
|
||||
pView->UpdateWindow();
|
||||
}
|
||||
|
||||
myViewer->InitActiveViews();
|
||||
Handle(V3d_View) aView = myViewer->ActiveView();
|
||||
Handle(V3d_View) aView = myViewer->ActiveViews().First();
|
||||
ExportView (aView);
|
||||
}
|
||||
|
||||
|
@@ -230,8 +230,7 @@ void COCCDemoDoc::OnDumpView()
|
||||
pView->UpdateWindow();
|
||||
}
|
||||
|
||||
myViewer->InitActiveViews();
|
||||
Handle(V3d_View) aView = myViewer->ActiveView();
|
||||
Handle(V3d_View) aView = myViewer->ActiveViews().First();
|
||||
ExportView (aView);
|
||||
}
|
||||
|
||||
|
@@ -489,8 +489,7 @@ void OCC_3dBaseDoc::OnUpdateV3dButtons (CCmdUI* pCmdUI)
|
||||
// Common function to change raytracing params and redraw view
|
||||
void OCC_3dBaseDoc::OnObjectRayTracingAction()
|
||||
{
|
||||
myAISContext->CurrentViewer()->InitActiveViews();
|
||||
Handle(V3d_View) aView = myAISContext->CurrentViewer()->ActiveView();
|
||||
Handle(V3d_View) aView = myAISContext->CurrentViewer()->ActiveViews().First();
|
||||
Graphic3d_RenderingParams& aParams = aView->ChangeRenderingParams();
|
||||
if (myRayTracingIsOn)
|
||||
aParams.Method = Graphic3d_RM_RAYTRACING;
|
||||
|
@@ -79,10 +79,10 @@ case 6: //color
|
||||
Handle(Graphic3d_Group) mygroup = Prs3d_Root::CurrentGroup(aPresentation);
|
||||
myAspect = (new Prs3d_ShadingAspect())->Aspect();
|
||||
Graphic3d_MaterialAspect material = myAspect->FrontMaterial();
|
||||
material.SetReflectionModeOff(Graphic3d_TOR_AMBIENT);
|
||||
material.SetReflectionModeOff(Graphic3d_TOR_DIFFUSE);
|
||||
material.SetReflectionModeOff(Graphic3d_TOR_SPECULAR);
|
||||
material.SetReflectionModeOff(Graphic3d_TOR_EMISSION);
|
||||
material.SetAmbientColor (Quantity_NOC_BLACK);
|
||||
material.SetDiffuseColor (Quantity_NOC_BLACK);
|
||||
material.SetSpecularColor(Quantity_NOC_BLACK);
|
||||
material.SetEmissiveColor(Quantity_NOC_BLACK);
|
||||
myAspect->SetFrontMaterial(material);
|
||||
|
||||
mygroup->SetPrimitivesAspect(myAspect);
|
||||
|
@@ -44,7 +44,7 @@ public:
|
||||
virtual void Unmap() const {}
|
||||
|
||||
//! Applies the resizing to the window <me>
|
||||
virtual Aspect_TypeOfResize DoResize() const { return Aspect_TOR_UNKNOWN; }
|
||||
virtual Aspect_TypeOfResize DoResize() { return Aspect_TOR_UNKNOWN; }
|
||||
|
||||
//! Apply the mapping change to the window <me>
|
||||
virtual Standard_Boolean DoMapping() const { return Standard_True; }
|
||||
|
@@ -81,7 +81,7 @@ void OcctWindow::Unmap() const
|
||||
// function : DoResize
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
Aspect_TypeOfResize OcctWindow::DoResize() const
|
||||
Aspect_TypeOfResize OcctWindow::DoResize()
|
||||
{
|
||||
int aMask = 0;
|
||||
Aspect_TypeOfResize aMode = Aspect_TOR_UNKNOWN;
|
||||
@@ -126,10 +126,10 @@ Aspect_TypeOfResize OcctWindow::DoResize() const
|
||||
break;
|
||||
} // end switch
|
||||
|
||||
*( ( Standard_Integer* )&myXLeft ) = myWidget->rect().left();
|
||||
*( ( Standard_Integer* )&myXRight ) = myWidget->rect().right();
|
||||
*( ( Standard_Integer* )&myYTop ) = myWidget->rect().top();
|
||||
*( ( Standard_Integer* )&myYBottom) = myWidget->rect().bottom();
|
||||
myXLeft = myWidget->rect().left();
|
||||
myXRight = myWidget->rect().right();
|
||||
myYTop = myWidget->rect().top();
|
||||
myYBottom = myWidget->rect().bottom();
|
||||
}
|
||||
|
||||
return aMode;
|
||||
|
@@ -51,7 +51,7 @@ public:
|
||||
virtual Aspect_Drawable NativeParentHandle() const;
|
||||
|
||||
//! Applies the resizing to the window <me>
|
||||
virtual Aspect_TypeOfResize DoResize() const;
|
||||
virtual Aspect_TypeOfResize DoResize();
|
||||
|
||||
//! Returns True if the window <me> is opened
|
||||
//! and False if the window is closed.
|
||||
|
@@ -276,7 +276,7 @@ blend result _model 2 _model_161
|
||||
# Show result
|
||||
pload VISUALIZATION
|
||||
vinit Driver1/Viewer1/View1
|
||||
vbackground -color 0.784314 0.784314 1
|
||||
vbackground -color C8C8FF
|
||||
vdisplay -dispMode 1 result
|
||||
vfit
|
||||
vaspects result -setFaceBoundaryDraw 1 -mostContinuity c2
|
||||
|
@@ -262,7 +262,7 @@ unifysamedom result p_1
|
||||
# Show result
|
||||
pload VISUALIZATION
|
||||
vinit Driver1/Viewer1/View1
|
||||
vbackground -color 0.784314 0.784314 1
|
||||
vbackground -color C8C8FF
|
||||
vdisplay -dispMode 1 result
|
||||
vfit
|
||||
vaspects result -setFaceBoundaryDraw 1
|
||||
|
@@ -86,7 +86,7 @@ sage " Fusion of this prism with the original part "
|
||||
sage " fuse result rr result"
|
||||
sage " "
|
||||
fuse result rr result
|
||||
donl result
|
||||
donly result
|
||||
nexplode result f
|
||||
erase result
|
||||
fit
|
||||
@@ -108,13 +108,13 @@ ttranslate cyl cyl 0 7.5 0
|
||||
sage " Display the Shape on Hidden Line Mode "
|
||||
sage " hlr hid r"
|
||||
sage ""
|
||||
donl r
|
||||
donly r
|
||||
hlr hid r
|
||||
sage " Display the Shape on HLR Mode "
|
||||
sage " hlr nohid r"
|
||||
sage " hlr hlr r"
|
||||
sage ""
|
||||
donl r
|
||||
donly r
|
||||
hlr nohid r
|
||||
hlr hlr r
|
||||
sage "Demo completed"
|
||||
|
@@ -68,18 +68,18 @@ vlight add directional direction 0 -10 0 head 1 color white
|
||||
vdisplay b1 b2 b3 b4 b5 b6 b7 b8 b9 b10
|
||||
|
||||
# set colors like in boxes of on OCC logo
|
||||
vsetcolor b1 0.8671875 0 0.16015625
|
||||
vsetcolor b2 0.96484375 0.8671875 0
|
||||
vsetcolor b3 0.609375 0.97734375 0.09375
|
||||
vsetcolor b4 0.90234375 0 0.48046875
|
||||
vsetcolor b5 0 0.48046875 0.73828125
|
||||
vsetcolor b6 0.578125 0 0.48046875
|
||||
vsetcolor b7 0.93359375 0.609375 0
|
||||
vsetcolor b8 0 0.70703125 0.9296875
|
||||
vsetcolor b9 0 0.64453125 0.48046875
|
||||
vsetcolor b10 0 0.48046875 0.73828125
|
||||
vsetcolor b1 DD0029
|
||||
vsetcolor b2 F6DD00
|
||||
vsetcolor b3 98F918
|
||||
vsetcolor b4 E9007A
|
||||
vsetcolor b5 007ABC
|
||||
vsetcolor b6 93007A
|
||||
vsetcolor b7 EE9800
|
||||
vsetcolor b8 00B489
|
||||
vsetcolor b9 00A47A
|
||||
vsetcolor b10 007ABC
|
||||
|
||||
# set material to plastic for better look
|
||||
for {set i 1} {$i <= 10} {incr i} {vsetmaterial b$i plastic}
|
||||
|
||||
vdrawtext label "Which\nbox\nis\ncloser\nto\nyou?" -pos 0 -6 -2 -color 0 0 0 -halign left -valign bottom -angle 0 -zoom 0 -height 40
|
||||
vdrawtext label "Which\nbox\nis\ncloser\nto\nyou?" -pos 0 -6 -2 -color BLACK -halign left -valign bottom -angle 0 -zoom 0 -height 40
|
||||
|
@@ -255,27 +255,27 @@ if [info exists i7_show_3dview] {
|
||||
vlight add directional direction 1 -1 -2 head 1
|
||||
|
||||
vdisplay case
|
||||
vsetcolor case 0.7 0.7 0.7
|
||||
vsetcolor case GRAY70
|
||||
|
||||
vdisplay title
|
||||
vsetcolor title 0.1 0.1 0.1
|
||||
vsetcolor title GRAY10
|
||||
|
||||
# board is mostly yellow (edges, triangle markers)
|
||||
foreach f [explode board f] { vdisplay $f; vsetcolor $f 0.7 0.5 0.3 }
|
||||
foreach f [explode board f] { vdisplay $f; vsetcolor $f B3803D }
|
||||
# top and bottom faces are light-green (outside) and dark-green (inside)
|
||||
vsetcolor board_4 0 0.6 0.55
|
||||
vsetcolor board_5 0 0.6 0.55
|
||||
vsetcolor board_12 0 0.3 0.33
|
||||
vsetcolor board_14 0 0.3 0.33
|
||||
vsetcolor board_4 00998C
|
||||
vsetcolor board_5 00998C
|
||||
vsetcolor board_12 004D54
|
||||
vsetcolor board_14 004D54
|
||||
|
||||
vdisplay rpads
|
||||
vsetcolor rpads 0.7 0.6 0.4
|
||||
vsetcolor rpads B39966
|
||||
|
||||
vdisplay bpads
|
||||
vsetcolor bpads 0.7 0.6 0.4
|
||||
vsetcolor bpads B39966
|
||||
|
||||
vdisplay brpk
|
||||
vsetcolor brpk 0.5 0.4 0.3
|
||||
vsetcolor brpk 80664D
|
||||
|
||||
donly board case rpads brpk; fit
|
||||
}
|
||||
@@ -287,17 +287,17 @@ pload OCAF XDE
|
||||
NewDocument D MDTV-XCAF
|
||||
|
||||
SetName D [XAddShape D board 0] "Board"
|
||||
foreach f [explode board f] { XSetColor D $f 0.7 0.5 0.3 }
|
||||
XSetColor D board_4 0 0.6 0.55
|
||||
XSetColor D board_5 0 0.6 0.55
|
||||
XSetColor D board_12 0 0.3 0.33
|
||||
XSetColor D board_14 0 0.3 0.33
|
||||
foreach f [explode board f] { XSetColor D $f B3803D }
|
||||
XSetColor D board_4 00998C
|
||||
XSetColor D board_5 00998C
|
||||
XSetColor D board_12 004D54
|
||||
XSetColor D board_14 004D54
|
||||
|
||||
SetName D [XAddShape D case 0] "Case"
|
||||
XSetColor D case 0.7 0.7 0.7
|
||||
XSetColor D case GRAY70
|
||||
|
||||
SetName D [XAddShape D title 0] "Case title"
|
||||
XSetColor D title 0.1 0.1 0.1
|
||||
XSetColor D title GRAY10
|
||||
|
||||
SetName D [XAddShape D rpads 1] "Top side contact pads"
|
||||
SetName D [XAddShape D bpads 1] "Bottom contact pads"
|
||||
@@ -306,17 +306,17 @@ SetName D [XFindShape D rpad] "Round pad"
|
||||
SetName D [XFindShape D Rpad] "Big round pad"
|
||||
SetName D [XFindShape D spad_1] "Square pad 1"
|
||||
SetName D [XFindShape D spad_2] "Square pad 2"
|
||||
XSetColor D rpad 0.7 0.6 0.4
|
||||
XSetColor D Rpad 0.7 0.6 0.4
|
||||
XSetColor D bpad 0.7 0.6 0.4
|
||||
XSetColor D spad_1 0.7 0.6 0.4
|
||||
XSetColor D spad_2 0.7 0.6 0.4
|
||||
XSetColor D rpad B39966
|
||||
XSetColor D Rpad B39966
|
||||
XSetColor D bpad B39966
|
||||
XSetColor D spad_1 B39966
|
||||
XSetColor D spad_2 B39966
|
||||
|
||||
SetName D [XAddShape D brpk 1] "Bottom packages"
|
||||
SetName D [XFindShape D rpk] "Bottom package"
|
||||
XSetColor D rpk1 0.7 0.7 0.7
|
||||
XSetColor D rpk2 0.5 0.4 0.3
|
||||
XSetColor D rpk3 0.7 0.7 0.7
|
||||
XSetColor D rpk1 GRAY70
|
||||
XSetColor D rpk2 80664D
|
||||
XSetColor D rpk3 GRAY70
|
||||
|
||||
XShow D
|
||||
vlight clear
|
||||
|
@@ -36,9 +36,7 @@ set anArrAngle [expr 3.14 * 12.0 / 180.0]
|
||||
|
||||
# Form dimension names list to set parameters with vdimparam command
|
||||
set aList {rd_1 rd_2 ad_1 ad_2 ad_3}
|
||||
for {set i 1} {$i <= 10} {incr i} {
|
||||
lappend aList ld_$i
|
||||
}
|
||||
for {set i 1} {$i <= 10} {incr i} { lappend aList ld_$i }
|
||||
|
||||
puts "Creating dimensions..."
|
||||
vdimension ld_1 -length -shapes bs_27 -plane xoy -color black -flyout -15
|
||||
@@ -67,29 +65,14 @@ foreach i $aList {
|
||||
vfit
|
||||
|
||||
puts "Displaying exported shapes..."
|
||||
vdisplay a b
|
||||
vsetdispmode a 1
|
||||
vsetdispmode b 1
|
||||
vdisplay -dispMode 1 a b
|
||||
vaspects a -setmaterial steel
|
||||
vaspects b -setmaterial bronze
|
||||
|
||||
puts "Clipping shapes for better view..."
|
||||
vclipplane create pa
|
||||
vclipplane change pa equation 0 0 1 0
|
||||
vclipplane change pa capping on
|
||||
vclipplane change pa capping color 0.9 0.9 0.9
|
||||
vclipplane set pa object a
|
||||
|
||||
vclipplane create pb
|
||||
vclipplane change pb equation 0 0 1 0
|
||||
vclipplane change pb capping on
|
||||
vclipplane change pb capping color 1.0 0.8 0.0
|
||||
vclipplane set pb object b
|
||||
|
||||
vclipplane change pa capping texname $aHatch
|
||||
vclipplane change pa capping texscale 0.05 -0.05
|
||||
vclipplane change pb capping texname $aHatch
|
||||
vclipplane change pb capping texscale 0.05 0.05
|
||||
vclipplane pa -set a -equation 0 0 1 0 -capping on -color GRAY90 -texName $aHatch -texScale 0.05 -0.05
|
||||
vclipplane pb -set b -equation 0 0 1 0 -capping on -color GOLD -texName $aHatch -texScale 0.05 -0.05
|
||||
|
||||
vbottom
|
||||
vrotate -0.3 -0.3 0
|
||||
|
@@ -77,14 +77,13 @@ SetName D $main "OCC Logo 2019"
|
||||
SetName D [XFindShape D sb] "Core"
|
||||
SetName D [XFindShape D tp] "Loop"
|
||||
SetName D [XFindShape D rs] "Connector"
|
||||
XSetColor D sb 1 0.21 0.32
|
||||
XSetColor D tp 0 0.667 0.855
|
||||
XSetColor D rs 0 0.45 0.69
|
||||
XSetColor D sb FF3652
|
||||
XSetColor D tp 00AADA
|
||||
XSetColor D rs 0073B0
|
||||
|
||||
# display
|
||||
vinit
|
||||
vsetcolorbg 1 1 1
|
||||
vsetdispmode 1
|
||||
XDisplay D
|
||||
vinit View1
|
||||
vbackground -color WHITE
|
||||
XDisplay -dispMode 1 D
|
||||
vtop
|
||||
vfit
|
||||
|
@@ -56,7 +56,7 @@ for { set aMarkerType 0 } { $aMarkerType <= 13 } { incr aMarkerType } {
|
||||
set aRow [expr $aMarkerType - 7]
|
||||
set aCol 5
|
||||
set aName [lindex $aMarkerTypeNames $aMarkerType]
|
||||
vdrawtext "$aName" "$aName" -pos 0 [expr $aRow + 0.5] 0 -color 0.5 1.0 1.0 -halign center -valign center -angle 000 -zoom 0 -height 12 -aspect bold -font $aLabelFont -noupdate
|
||||
vdrawtext "$aName" "$aName" -pos 0 [expr $aRow + 0.5] 0 -color 7FFFFF -halign center -valign center -angle 000 -zoom 0 -height 12 -aspect bold -font $aLabelFont -noupdate
|
||||
vdisplay -top -noupdate "$aName"
|
||||
if { $aMarkerType == 13 } {
|
||||
vmarkerstest m${aMarkerType}_${aCol} $aCol $aRow 0 PointsOnSide=1 FileName=$aCustom1
|
||||
|
@@ -4,36 +4,22 @@
|
||||
#Title: Material properties in viewer
|
||||
|
||||
set THE_MATERIALS {brass bronze copper gold jade neon_phc pewter obsidian plaster plastic satin silver steel stone chrome aluminium water glass diamond charcoal}
|
||||
set THE_COLORS {default red green blue1}
|
||||
set THE_COLORS {default red green blue}
|
||||
set THE_ROW_DIST 35
|
||||
|
||||
proc drawLabels {} {
|
||||
set x 20
|
||||
set y 15
|
||||
set r 0.098
|
||||
set g 0.098
|
||||
set b 0.098
|
||||
foreach aMatIter $::THE_MATERIALS {
|
||||
vdrawtext "$aMatIter" "$aMatIter" -pos $x $y 0 -color $r $g $b -halign right -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial
|
||||
vdrawtext "$aMatIter" "$aMatIter" -pos $x $y 0 -color GRAY10 -halign right -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial
|
||||
incr y 10
|
||||
}
|
||||
set x 40
|
||||
set y 5
|
||||
foreach aColIter $::THE_COLORS {
|
||||
if { $aColIter == "red" } {
|
||||
set r 1.0
|
||||
set g 0.0
|
||||
set b 0
|
||||
} elseif { $aColIter == "green" } {
|
||||
set r 0.0
|
||||
set g 1.0
|
||||
set b 0.0
|
||||
} elseif { $aColIter == "blue1" } {
|
||||
set r 0.0
|
||||
set g 0.0
|
||||
set b 1.0
|
||||
}
|
||||
vdrawtext "$aColIter" "$aColIter" -pos $x $y 0 -color $r $g $b -halign center -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial
|
||||
set aLabColor "$aColIter"
|
||||
if { "$aColIter" == "default" } { set aLabColor BLACK }
|
||||
vdrawtext "$aColIter" "$aColIter" -pos $x $y 0 -color "$aLabColor" -halign center -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial
|
||||
incr x $::THE_ROW_DIST
|
||||
}
|
||||
}
|
||||
@@ -69,7 +55,7 @@ vclose ALL
|
||||
vinit View1 w=768 h=768
|
||||
vtop
|
||||
vglinfo
|
||||
vbackground -gradient 0.705882 0.784314 1 0.705882 0.705882 0.705882 -gradientMode VERTICAL
|
||||
vbackground -gradient B4C8FF B4B4B4 -gradientMode VERTICAL
|
||||
|
||||
vlight -change 0 -dir 0.577 -0.577 -0.577
|
||||
vrenderparams -msaa 8
|
||||
@@ -86,3 +72,4 @@ drawObjects 0 ""
|
||||
drawObjects 1 red
|
||||
drawObjects 2 green
|
||||
drawObjects 3 blue1
|
||||
vrepaint
|
||||
|
@@ -57,11 +57,10 @@ for {set i 0} {$i < 12} {incr i} {
|
||||
}
|
||||
|
||||
# Configure light sources
|
||||
vlight del 1
|
||||
vlight change 0 head 0
|
||||
vlight change 0 direction -0.25 -1 -1
|
||||
vlight change 0 sm 0.3
|
||||
vlight change 0 int 10
|
||||
vlight -change 0 -head 0
|
||||
vlight -change 0 -direction -0.25 -1 -1
|
||||
vlight -change 0 -sm 0.3
|
||||
vlight -change 0 -int 10.0
|
||||
|
||||
# Load environment map
|
||||
vtextureenv on 1
|
||||
@@ -75,4 +74,4 @@ vrenderparams -ray -gi -rayDepth 10
|
||||
puts "Make several path tracing iterations to refine the picture, please wait..."
|
||||
vfps 100
|
||||
puts "Done. To improve the image further, or after view manipulations, give command:"
|
||||
puts "vfps \[nb_iteratons\]"
|
||||
puts "vfps \[nb_iteratons\] or vrepaint -continuous"
|
||||
|
@@ -12,11 +12,8 @@ vinit name=View1 w=512 h=512
|
||||
vglinfo
|
||||
|
||||
# setup light sources
|
||||
vlight del 0
|
||||
vlight del 1
|
||||
vlight add positional head 0 pos 0.5 0.5 0.85
|
||||
vlight change 0 sm 0.06
|
||||
vlight change 0 int 30.0
|
||||
vlight -clear
|
||||
vlight -add positional -head 0 -pos 0.5 0.5 0.85 -sm 0.06 -int 30.0
|
||||
|
||||
vvbo 0
|
||||
vsetdispmode 1
|
||||
@@ -85,4 +82,4 @@ vrenderparams -ray -gi -rayDepth 8
|
||||
puts "Make several path tracing iterations to refine the picture, please wait..."
|
||||
vfps 100
|
||||
puts "Done. To improve the image further, or after view manipulations, give command:"
|
||||
puts "vfps \[nb_iteratons\]"
|
||||
puts "vfps \[nb_iteratons\] or vrepaint -continuous"
|
||||
|
@@ -208,8 +208,9 @@ vviewparams -eye 139.412 -1.62643 178.037
|
||||
vviewparams -size 170.508
|
||||
|
||||
# Restore light source parameters
|
||||
vlight clear
|
||||
vlight add directional direction -0.303949 -0.434084 -0.848048 smoothness 0.3 intensity 12
|
||||
vlight -clear
|
||||
vlight -add ambient
|
||||
vlight -add directional -direction -0.303949 -0.434084 -0.848048 -smoothness 0.3 -intensity 12
|
||||
|
||||
# Load environment map
|
||||
vtextureenv on 1
|
||||
@@ -223,4 +224,4 @@ vrenderparams -ray -gi -rayDepth 10
|
||||
puts "Make several path tracing iterations to refine the picture, please wait..."
|
||||
vfps 512
|
||||
puts "Done. To improve the image further, or after view manipulations, give command:"
|
||||
puts "vfps \[nb_iteratons\]"
|
||||
puts "vfps \[nb_iteratons\] or vrepaint -continuous"
|
||||
|
@@ -46,18 +46,17 @@ NewDocument D
|
||||
XAddShape D body_1
|
||||
XAddShape D core_1
|
||||
|
||||
#XSetColor D body_1 0. 0. 1.
|
||||
for {set i 1} {$i <= 26} {incr i} {XSetColor D body_1_$i 0. 0. 1.}
|
||||
XSetColor D body_1_1 0.9 0.5 0.4
|
||||
XSetColor D body_1_9 0.9 0.5 0.4
|
||||
for {set i 10} {$i <= 22} {incr i} {XSetColor D body_1_$i 0.6 0.7 0.0}
|
||||
XSetColor D core_1 0.1 0.1 1.
|
||||
foreach ff [explode core_1 f] { XSetColor D $ff 0.1 0.1 1. ; puts "set color $ff" }
|
||||
|
||||
XShow D
|
||||
for {set i 1} {$i <= 26} {incr i} {XSetColor D body_1_$i BLUE}
|
||||
XSetColor D body_1_1 E68066
|
||||
XSetColor D body_1_9 E68066
|
||||
for {set i 10} {$i <= 22} {incr i} {XSetColor D body_1_$i 99B300}
|
||||
XSetColor D core_1 1A1AFF
|
||||
foreach ff [explode core_1 f] { XSetColor D $ff 1A1AFF ; puts "set color $ff" }
|
||||
|
||||
vclear
|
||||
vinit View1
|
||||
XDisplay -dispMode 1 D -explore
|
||||
vfit
|
||||
vsetdispmode 1
|
||||
vrenderparams -msaa 8
|
||||
vbackground -color WHITE
|
||||
|
||||
|
91
samples/tcl/vis_pbr_spheres.tcl
Normal file
@@ -0,0 +1,91 @@
|
||||
# Script demonstrating PBR metallic-roughness material properties
|
||||
#Category: Visualization
|
||||
#Title: PBR metallic-rougness spheres
|
||||
|
||||
pload XDE OCAF MODELING VISUALIZATION
|
||||
psphere s 0.35
|
||||
|
||||
catch { Close D }
|
||||
XNewDoc D
|
||||
|
||||
# grid of spheres
|
||||
set THE_UPPER 6
|
||||
foreach i [list 0 3] {
|
||||
set aPrefix ""
|
||||
set aColor "GRAY80"
|
||||
if { $i != 0 } {
|
||||
set aPrefix "g_";
|
||||
set aColor "CCB11D"
|
||||
}
|
||||
set aColShapes {}
|
||||
for { set m 0 } { $m <= $THE_UPPER } { incr m } {
|
||||
set aRowShapes {}
|
||||
for { set r 0 } { $r <= $THE_UPPER } { incr r } {
|
||||
set aName ${aPrefix}m${m}r${r}
|
||||
copy s $aName
|
||||
lappend aRowShapes $aName
|
||||
ttranslate $aName ${r} ${i} ${m}
|
||||
}
|
||||
set aName ${aPrefix}m${m}
|
||||
compound {*}$aRowShapes $aName
|
||||
lappend aColShapes $aName
|
||||
}
|
||||
set aName ${aPrefix}spheres
|
||||
compound {*}$aColShapes $aName
|
||||
set aLabName "Gray Spheres"
|
||||
if { $i != 0 } { set aLabName "Golden Spheres" }
|
||||
set aLabComp [XAddShape D $aName 0]
|
||||
SetName D $aLabComp $aLabName
|
||||
|
||||
for { set m 0 } { $m <= $THE_UPPER } { incr m } {
|
||||
set aMet [expr 100 * ${m}/$THE_UPPER]
|
||||
set aName ${aPrefix}m${m}
|
||||
XAddComponent D $aLabComp $aName
|
||||
set aLabCompCol [XFindShape D $aName]
|
||||
SetName D $aLabCompCol "${aPrefix}m${aMet}%"
|
||||
SetName D {*}[XFindComponent D $aName] "${aPrefix}m${aMet}%"
|
||||
for { set r 0 } { $r <= $THE_UPPER } { incr r } {
|
||||
set aRoug [expr 100 * ${r}/$THE_UPPER]
|
||||
set aName ${aPrefix}m${m}r${r}
|
||||
XAddComponent D $aLabCompCol $aName
|
||||
set aLab [XFindComponent D $aName]
|
||||
SetName D {*}$aLab "${aPrefix}m${aMet}%_r${aRoug}%"
|
||||
XAddVisMaterial D $aName -baseColor $aColor -metallic ${m}/$THE_UPPER -roughness ${r}/$THE_UPPER
|
||||
XSetVisMaterial D {*}$aLab $aName
|
||||
}
|
||||
}
|
||||
}
|
||||
set aLab [XFindShape D s]
|
||||
SetName D {*}$aLab "Sphere"
|
||||
|
||||
XGetAllVisMaterials D
|
||||
|
||||
# labels
|
||||
text2brep tm "Metal" -plane 0 -1 0 0 0 -1 -height 0.5 -pos -0.5 0 6.5 -halign left -valign top -font monospace
|
||||
text2brep tnm "Non-metal" -plane 0 -1 0 0 0 -1 -height 0.5 -pos -0.5 0 -0.5 -halign right -valign top -font monospace
|
||||
text2brep ts "Smooth" -plane 0 -1 0 1 0 0 -height 0.5 -pos -0.5 0 -0.5 -halign left -valign top -font monospace
|
||||
text2brep tr "Rough" -plane 0 -1 0 1 0 0 -height 0.5 -pos 6.5 0 -0.5 -halign right -valign top -font monospace
|
||||
compound tm tnm ts tr labs
|
||||
set aLab [XAddShape D labs 0]
|
||||
SetName D $aLab "Labels"
|
||||
XAddComponent D $aLab tm
|
||||
XAddComponent D $aLab tnm
|
||||
XAddComponent D $aLab ts
|
||||
XAddComponent D $aLab tr
|
||||
SetName D {*}[XFindComponent D tm] "Metal"
|
||||
SetName D [XFindShape D tm] "Metal"
|
||||
SetName D {*}[XFindComponent D tnm] "Non-metal"
|
||||
SetName D [XFindShape D tnm] "Non-metal"
|
||||
SetName D {*}[XFindComponent D ts] "Smooth"
|
||||
SetName D [XFindShape D ts] "Smooth"
|
||||
SetName D {*}[XFindComponent D tr] "Rough"
|
||||
SetName D [XFindShape D tr] "Rough"
|
||||
|
||||
vclear
|
||||
vinit View1 -width 768 -height 768
|
||||
vfront
|
||||
vrenderparams -shadingModel PBR
|
||||
vlight -change 0 -intensity 2.5
|
||||
XDisplay -dispMode 1 D
|
||||
vcamera -ortho
|
||||
vfit
|
@@ -28,19 +28,20 @@ SetName D [XFindShape D link]:2 "Nut instance 1"
|
||||
SetName D [XFindShape D link]:3 "Nut instance 2"
|
||||
|
||||
puts "- Pin will be white"
|
||||
XSetColor D [XFindShape D pin] 1 1 1
|
||||
XSetColor D [XFindShape D pin] WHITE
|
||||
puts "- Nut itself will be dark gray"
|
||||
XSetColor D [XFindShape D nut] 0.1 0.1 0.1
|
||||
XSetColor D [XFindShape D nut] GRAY10
|
||||
puts "- Nut instance #1 will be red"
|
||||
XSetColor D [XFindShape D link]:2 1 0 0
|
||||
XSetColor D [XFindShape D link]:2 RED
|
||||
puts "- Nut instance #2 will be green"
|
||||
XSetColor D [XFindShape D link]:3 0 1 0
|
||||
XSetColor D [XFindShape D link]:3 GREEN
|
||||
|
||||
puts "Starting DF browser..."
|
||||
DFBrowse D
|
||||
puts "Expand the document tree to see its structure and assigned names"
|
||||
|
||||
puts "Showing assembly in 3d view..."
|
||||
XShow D
|
||||
vclear
|
||||
vinit View1
|
||||
XDisplay -dispMode 1 D -explore
|
||||
vfit
|
||||
vsetdispmode 1
|
||||
|
2
samples/webgl/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/build
|
||||
/work
|
66
samples/webgl/CMakeLists.txt
Normal file
@@ -0,0 +1,66 @@
|
||||
cmake_minimum_required(VERSION 3.2)
|
||||
|
||||
project(occt-webgl-sample)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
set(APP_VERSION_MAJOR 1)
|
||||
set(APP_VERSION_MINOR 0)
|
||||
set(APP_TARGET occt-webgl-sample)
|
||||
|
||||
# customize build
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s USE_WEBGL2=1")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH=1")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s SAFE_HEAP=1")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s NO_EXIT_RUNTIME=1")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s TOTAL_MEMORY=16MB")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ABORTING_MALLOC=0")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s FORCE_FILESYSTEM=1")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --preload-file myFile")
|
||||
|
||||
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})
|
||||
file(GLOB SOURCES
|
||||
*.h
|
||||
*.cpp
|
||||
)
|
||||
source_group ("Headers" FILES
|
||||
WasmOcctView.h)
|
||||
source_group ("Sources" FILES
|
||||
WasmOcctView.cpp
|
||||
main.cpp)
|
||||
|
||||
# FreeType
|
||||
find_package(freetype REQUIRED NO_DEFAULT_PATH)
|
||||
if(freetype_FOUND)
|
||||
message (STATUS "Using FreeType from \"${freetype_DIR}\"" )
|
||||
else()
|
||||
message(WARNING "Could not find FreeType, please set freetype_DIR variable." )
|
||||
endif()
|
||||
|
||||
# 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 TKRWMesh TKBinXCAF TKBin TKBinL TKOpenGl TKXCAF TKVCAF TKCAF TKV3d TKHLR TKMesh TKService TKShHealing TKPrim TKTopAlgo TKGeomAlgo TKBRep TKGeomBase TKG3d TKG2d TKMath TKLCAF TKCDF TKernel)
|
||||
|
||||
add_executable(${APP_TARGET} ${SOURCES})
|
||||
target_link_libraries(
|
||||
${APP_TARGET}
|
||||
${OpenCASCADE_LIBS}
|
||||
freetype
|
||||
)
|
||||
set_target_properties(${APP_TARGET} PROPERTIES LINK_FLAGS "-s EXPORTED_FUNCTIONS=['_main','_onFileDataRead'] -s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall','cwrap']")
|
||||
|
||||
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}")
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.wasm DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||
install(FILES occt-webgl-sample.html DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||
install(FILES ${OpenCASCADE_RESOURCE_DIR}/DrawResources/OCC_logo.png DESTINATION ${CMAKE_INSTALL_PREFIX})
|
||||
install(FILES ${OpenCASCADE_RESOURCE_DIR}/DrawResources/lamp.ico DESTINATION ${CMAKE_INSTALL_PREFIX})
|
28
samples/webgl/ReadMe.md
Normal file
@@ -0,0 +1,28 @@
|
||||
OCCT WebGL Viewer sample {#occt_samples_webgl}
|
||||
==================
|
||||
|
||||
This sample demonstrates simple way of using OCCT libraries in Web application written in C++ and translated into WebAssembly module using Emscripten SDK (emsdk):
|
||||
https://emscripten.org/
|
||||
|
||||
Sample consists of the Open CASCADE 3D Viewer with a button for opening a model in BREP format.
|
||||
The sample requires a WebGL 2.0 capable browser supporting WebAssembly 1.0 (Wasm).
|
||||
|
||||
Installation and configuration:
|
||||
1. Install Emscripten SDK and activate minimal configuration (Python, Java and CLang) following *emsdk* documentation. Activate also MinGW when building sample on Windows host.
|
||||
2. Build (using *emsdk*) or download FreeType static library.
|
||||
3. Configure CMake for building Open CASCADE Technology (OCCT) static libraries (BUILD_LIBRARY_TYPE="Static").
|
||||
For this, activate *emsdk* command prompt, configure CMake for building OCCT using cross-compilation toolchain, disable *BUILD_MODULE_Draw*.
|
||||
4. Perform building and installation steps.
|
||||
~~~~~
|
||||
> ${EMSDK}/fastcomp/emscripten/cmake/Modules/Platform/Emscripten.cmake
|
||||
~~~~~
|
||||
5. Configure CMake for building this WebGL sample using *emsdk* with paths to OCCT and FreeType. Perform building and installation steps.
|
||||
6. Copy data/occ/Ball.brep from OCCT into "samples" folder within WebGL sample installation path.
|
||||
7. Navigate to installation folder and start web server from it; Python coming with *emsdk* can be used for this purpose:
|
||||
~~~~~
|
||||
> python -m SimpleHTTPServer 8080
|
||||
~~~~~
|
||||
8. Open compatible browser and enter path taking into account your web server settings:
|
||||
~~~~~
|
||||
> http://localhost:8080/occt-webgl-sample.html
|
||||
~~~~~
|
692
samples/webgl/WasmOcctView.cpp
Normal file
@@ -0,0 +1,692 @@
|
||||
// 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 "WasmOcctView.h"
|
||||
|
||||
#include "WasmVKeys.h"
|
||||
|
||||
#include <AIS_Shape.hxx>
|
||||
#include <AIS_ViewCube.hxx>
|
||||
#include <Aspect_Handle.hxx>
|
||||
#include <Aspect_DisplayConnection.hxx>
|
||||
#include <Aspect_NeutralWindow.hxx>
|
||||
#include <Message.hxx>
|
||||
#include <Message_Messenger.hxx>
|
||||
#include <OpenGl_GraphicDriver.hxx>
|
||||
#include <Prs3d_DatumAspect.hxx>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#define THE_CANVAS_ID "canvas"
|
||||
|
||||
namespace
|
||||
{
|
||||
EM_JS(int, jsCanvasGetWidth, (), {
|
||||
return canvas.width;
|
||||
});
|
||||
|
||||
EM_JS(int, jsCanvasGetHeight, (), {
|
||||
return canvas.height;
|
||||
});
|
||||
|
||||
EM_JS(float, jsDevicePixelRatio, (), {
|
||||
var aDevicePixelRatio = window.devicePixelRatio || 1;
|
||||
return aDevicePixelRatio;
|
||||
});
|
||||
|
||||
/*EM_JS(void, jsSetOcctCamera, (float theFOV, float theAspect, float theNear, float theFar), {
|
||||
setOcctCamera();
|
||||
});*/
|
||||
|
||||
EM_JS(void, jsPostFrameRender, (), {
|
||||
postFrameRender();
|
||||
});
|
||||
|
||||
//! Return cavas size in pixels.
|
||||
static Graphic3d_Vec2i jsCanvasSize()
|
||||
{
|
||||
return Graphic3d_Vec2i (jsCanvasGetWidth(), jsCanvasGetHeight());
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : WasmOcctView
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
WasmOcctView::WasmOcctView()
|
||||
: myDevicePixelRatio (1.0f),
|
||||
myUpdateRequests (0)
|
||||
{
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : ~WasmOcctView
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
WasmOcctView::~WasmOcctView()
|
||||
{
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : run
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::run()
|
||||
{
|
||||
initWindow();
|
||||
initViewer();
|
||||
initDemoScene();
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
myView->MustBeResized();
|
||||
myView->Redraw();
|
||||
|
||||
// There is no inifinite message loop, main() will return from here immediately.
|
||||
// Tell that our Module should be left loaded and handle events through callbacks.
|
||||
//emscripten_set_main_loop (redrawView, 60, 1);
|
||||
//emscripten_set_main_loop (redrawView, -1, 1);
|
||||
EM_ASM(Module['noExitRuntime'] = true);
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : initWindow
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::initWindow()
|
||||
{
|
||||
myDevicePixelRatio = jsDevicePixelRatio();
|
||||
myCanvasId = THE_CANVAS_ID;
|
||||
const char* aTargetId = !myCanvasId.IsEmpty() ? myCanvasId.ToCString() : NULL;
|
||||
const EM_BOOL toUseCapture = EM_TRUE;
|
||||
emscripten_set_resize_callback (NULL, this, toUseCapture, onResizeCallback);
|
||||
|
||||
emscripten_set_mousedown_callback (NULL, this, toUseCapture, onMouseCallback);
|
||||
emscripten_set_mouseup_callback (NULL, this, toUseCapture, onMouseCallback);
|
||||
emscripten_set_mousemove_callback (NULL, this, toUseCapture, onMouseCallback);
|
||||
emscripten_set_dblclick_callback (aTargetId, this, toUseCapture, onMouseCallback);
|
||||
emscripten_set_click_callback (aTargetId, this, toUseCapture, onMouseCallback);
|
||||
emscripten_set_mouseenter_callback (aTargetId, this, toUseCapture, onMouseCallback);
|
||||
emscripten_set_mouseleave_callback (aTargetId, this, toUseCapture, onMouseCallback);
|
||||
emscripten_set_wheel_callback (aTargetId, this, toUseCapture, onWheelCallback);
|
||||
|
||||
emscripten_set_touchstart_callback (aTargetId, this, toUseCapture, onTouchCallback);
|
||||
emscripten_set_touchend_callback (aTargetId, this, toUseCapture, onTouchCallback);
|
||||
emscripten_set_touchmove_callback (aTargetId, this, toUseCapture, onTouchCallback);
|
||||
emscripten_set_touchcancel_callback(aTargetId, this, toUseCapture, onTouchCallback);
|
||||
|
||||
//emscripten_set_keypress_callback (NULL, this, toUseCapture, onKeyCallback);
|
||||
emscripten_set_keydown_callback (NULL, this, toUseCapture, onKeyDownCallback);
|
||||
emscripten_set_keyup_callback (NULL, this, toUseCapture, onKeyUpCallback);
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : dumpGlInfo
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::dumpGlInfo (bool theIsBasic)
|
||||
{
|
||||
TColStd_IndexedDataMapOfStringString aGlCapsDict;
|
||||
myView->DiagnosticInformation (aGlCapsDict, theIsBasic ? Graphic3d_DiagnosticInfo_Basic : Graphic3d_DiagnosticInfo_Complete);
|
||||
if (theIsBasic)
|
||||
{
|
||||
TCollection_AsciiString aViewport;
|
||||
aGlCapsDict.FindFromKey ("Viewport", aViewport);
|
||||
aGlCapsDict.Clear();
|
||||
aGlCapsDict.Add ("Viewport", aViewport);
|
||||
}
|
||||
aGlCapsDict.Add ("Display scale", TCollection_AsciiString(myDevicePixelRatio));
|
||||
|
||||
// beautify output
|
||||
{
|
||||
TCollection_AsciiString* aGlVer = aGlCapsDict.ChangeSeek ("GLversion");
|
||||
TCollection_AsciiString* aGlslVer = aGlCapsDict.ChangeSeek ("GLSLversion");
|
||||
if (aGlVer != NULL
|
||||
&& aGlslVer != NULL)
|
||||
{
|
||||
*aGlVer = *aGlVer + " [GLSL: " + *aGlslVer + "]";
|
||||
aGlslVer->Clear();
|
||||
}
|
||||
}
|
||||
|
||||
TCollection_AsciiString anInfo;
|
||||
for (TColStd_IndexedDataMapOfStringString::Iterator aValueIter (aGlCapsDict); aValueIter.More(); aValueIter.Next())
|
||||
{
|
||||
if (!aValueIter.Value().IsEmpty())
|
||||
{
|
||||
if (!anInfo.IsEmpty())
|
||||
{
|
||||
anInfo += "\n";
|
||||
}
|
||||
anInfo += aValueIter.Key() + ": " + aValueIter.Value();
|
||||
}
|
||||
}
|
||||
|
||||
::Message::DefaultMessenger()->Send (anInfo, Message_Warning);
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : initPixelScaleRatio
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::initPixelScaleRatio()
|
||||
{
|
||||
SetTouchToleranceScale (myDevicePixelRatio);
|
||||
if (!myView.IsNull())
|
||||
{
|
||||
myView->ChangeRenderingParams().Resolution = (unsigned int )(96.0 * myDevicePixelRatio + 0.5);
|
||||
}
|
||||
if (!myContext.IsNull())
|
||||
{
|
||||
myContext->SetPixelTolerance (int(myDevicePixelRatio * 6.0));
|
||||
if (!myViewCube.IsNull())
|
||||
{
|
||||
static const double THE_CUBE_SIZE = 60.0;
|
||||
myViewCube->SetSize (myDevicePixelRatio * THE_CUBE_SIZE, false);
|
||||
myViewCube->SetBoxFacetExtension (myViewCube->Size() * 0.15);
|
||||
myViewCube->SetAxesPadding (myViewCube->Size() * 0.10);
|
||||
myViewCube->SetFontHeight (THE_CUBE_SIZE * 0.16);
|
||||
if (myViewCube->HasInteractiveContext())
|
||||
{
|
||||
myContext->Redisplay (myViewCube, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : initViewer
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
bool WasmOcctView::initViewer()
|
||||
{
|
||||
// Build with "--preload-file MyFontFile.ttf" option
|
||||
// and register font in Font Manager to use custom font(s).
|
||||
/*const char* aFontPath = "MyFontFile.ttf";
|
||||
if (Handle(Font_SystemFont) aFont = Font_FontMgr::GetInstance()->CheckFont (aFontPath))
|
||||
{
|
||||
Font_FontMgr::GetInstance()->RegisterFont (aFont, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: font '") + aFontPath + "' is not found", Message_Fail);
|
||||
}*/
|
||||
|
||||
Handle(Aspect_DisplayConnection) aDisp;
|
||||
Handle(OpenGl_GraphicDriver) aDriver = new OpenGl_GraphicDriver (aDisp, false);
|
||||
aDriver->ChangeOptions().buffersNoSwap = true; // swap has no effect in WebGL
|
||||
if (!aDriver->InitContext())
|
||||
{
|
||||
Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: EGL initialization failed"), Message_Fail);
|
||||
return false;
|
||||
}
|
||||
|
||||
Handle(V3d_Viewer) aViewer = new V3d_Viewer (aDriver);
|
||||
aViewer->SetComputedMode (false);
|
||||
aViewer->SetDefaultShadingModel (Graphic3d_TOSM_FRAGMENT);
|
||||
aViewer->SetDefaultLights();
|
||||
aViewer->SetLightOn();
|
||||
|
||||
Handle(Aspect_NeutralWindow) aWindow = new Aspect_NeutralWindow();
|
||||
Graphic3d_Vec2i aWinSize = jsCanvasSize();
|
||||
if (aWinSize.x() < 10 || aWinSize.y() < 10)
|
||||
{
|
||||
Message::DefaultMessenger()->Send (TCollection_AsciiString ("Warning: invalid canvas size"), Message_Warning);
|
||||
}
|
||||
aWindow->SetSize (aWinSize.x(), aWinSize.y());
|
||||
|
||||
myTextStyle = new Prs3d_TextAspect();
|
||||
myTextStyle->SetFont (Font_NOF_ASCII_MONO);
|
||||
myTextStyle->SetHeight (12);
|
||||
myTextStyle->Aspect()->SetColor (Quantity_NOC_GRAY95);
|
||||
myTextStyle->Aspect()->SetColorSubTitle (Quantity_NOC_BLACK);
|
||||
myTextStyle->Aspect()->SetDisplayType (Aspect_TODT_SHADOW);
|
||||
myTextStyle->Aspect()->SetTextFontAspect (Font_FA_Bold);
|
||||
myTextStyle->Aspect()->SetTextZoomable (false);
|
||||
myTextStyle->SetHorizontalJustification (Graphic3d_HTA_LEFT);
|
||||
myTextStyle->SetVerticalJustification (Graphic3d_VTA_BOTTOM);
|
||||
|
||||
myView = new V3d_View (aViewer);
|
||||
myView->SetImmediateUpdate (false);
|
||||
myView->ChangeRenderingParams().Resolution = (unsigned int )(96.0 * myDevicePixelRatio + 0.5);
|
||||
myView->ChangeRenderingParams().ToShowStats = true;
|
||||
myView->ChangeRenderingParams().StatsTextAspect = myTextStyle->Aspect();
|
||||
myView->ChangeRenderingParams().StatsTextHeight = (int )myTextStyle->Height();
|
||||
myView->SetWindow (aWindow);
|
||||
dumpGlInfo (false);
|
||||
|
||||
myContext = new AIS_InteractiveContext (aViewer);
|
||||
initPixelScaleRatio();
|
||||
return true;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : initDemoScene
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::initDemoScene()
|
||||
{
|
||||
if (myContext.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//myView->TriedronDisplay (Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD, 0.08, V3d_WIREFRAME);
|
||||
|
||||
myViewCube = new AIS_ViewCube();
|
||||
// presentation parameters
|
||||
initPixelScaleRatio();
|
||||
myViewCube->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_TriedronPers, Aspect_TOTP_RIGHT_LOWER, Graphic3d_Vec2i (100, 100)));
|
||||
myViewCube->Attributes()->SetDatumAspect (new Prs3d_DatumAspect());
|
||||
myViewCube->Attributes()->DatumAspect()->SetTextAspect (myTextStyle);
|
||||
// animation parameters
|
||||
myViewCube->SetViewAnimation (myViewAnimation);
|
||||
myViewCube->SetFixedAnimationLoop (false);
|
||||
myViewCube->SetAutoStartAnimation (true);
|
||||
myContext->Display (myViewCube, false);
|
||||
|
||||
// Build with "--preload-file MySampleFile.brep" option to load some shapes here.
|
||||
}
|
||||
|
||||
|
||||
// ================================================================
|
||||
// Function : updateView
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::updateView()
|
||||
{
|
||||
if (!myView.IsNull())
|
||||
{
|
||||
if (++myUpdateRequests == 1)
|
||||
{
|
||||
emscripten_async_call (onRedrawView, this, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : redrawView
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::redrawView()
|
||||
{
|
||||
if (!myView.IsNull())
|
||||
{
|
||||
FlushViewEvents (myContext, myView, true);
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : handleViewRedraw
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void WasmOcctView::handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
myUpdateRequests = 0;
|
||||
|
||||
theView->Invalidate(); /// Three.js cannot be rendered properly without full redraw
|
||||
glEnable (GL_POLYGON_OFFSET_FILL); /// reset defaults Graphic3d_PolygonOffset after Three.js
|
||||
glPolygonOffset (1.0f, 1.0f);
|
||||
|
||||
AIS_ViewController::handleViewRedraw (theCtx, theView);
|
||||
jsPostFrameRender();
|
||||
if (myToAskNextFrame)
|
||||
{
|
||||
// ask more frames
|
||||
++myUpdateRequests;
|
||||
emscripten_async_call (onRedrawView, this, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : onResizeEvent
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
EM_BOOL WasmOcctView::onResizeEvent (int theEventType, const EmscriptenUiEvent* theEvent)
|
||||
{
|
||||
(void )theEventType; // EMSCRIPTEN_EVENT_RESIZE or EMSCRIPTEN_EVENT_CANVASRESIZED
|
||||
(void )theEvent;
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
Handle(Aspect_NeutralWindow) aWindow = Handle(Aspect_NeutralWindow)::DownCast (myView->Window());
|
||||
Graphic3d_Vec2i aWinSizeOld, aWinSizeNew (jsCanvasSize());
|
||||
if (aWinSizeNew.x() < 10 || aWinSizeNew.y() < 10)
|
||||
{
|
||||
Message::DefaultMessenger()->Send (TCollection_AsciiString ("Warning: invalid canvas size"), Message_Warning);
|
||||
}
|
||||
aWindow->Size (aWinSizeOld.x(), aWinSizeOld.y());
|
||||
const float aPixelRatio = jsDevicePixelRatio();
|
||||
if (aWinSizeNew != aWinSizeOld
|
||||
|| aPixelRatio != myDevicePixelRatio)
|
||||
{
|
||||
if (myDevicePixelRatio != aPixelRatio)
|
||||
{
|
||||
myDevicePixelRatio = aPixelRatio;
|
||||
initPixelScaleRatio();
|
||||
}
|
||||
aWindow->SetSize (aWinSizeNew.x(), aWinSizeNew.y());
|
||||
myView->MustBeResized();
|
||||
myView->Invalidate();
|
||||
myView->Redraw();
|
||||
dumpGlInfo (true);
|
||||
}
|
||||
return EM_TRUE;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : onMouseEvent
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
EM_BOOL WasmOcctView::onMouseEvent (int theEventType, const EmscriptenMouseEvent* theEvent)
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
Graphic3d_Vec2i aWinSize;
|
||||
myView->Window()->Size (aWinSize.x(), aWinSize.y());
|
||||
const Graphic3d_Vec2i aNewPos = convertPointToBacking (Graphic3d_Vec2i (theEvent->canvasX, theEvent->canvasY));
|
||||
Aspect_VKeyFlags aFlags = 0;
|
||||
if (theEvent->ctrlKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_CTRL; }
|
||||
if (theEvent->shiftKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_SHIFT; }
|
||||
if (theEvent->altKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_ALT; }
|
||||
if (theEvent->metaKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_META; }
|
||||
|
||||
const bool isEmulated = false;
|
||||
const Aspect_VKeyMouse aButtons = WasmVKeys_MouseButtonsFromNative (theEvent->buttons);
|
||||
switch (theEventType)
|
||||
{
|
||||
case EMSCRIPTEN_EVENT_MOUSEMOVE:
|
||||
{
|
||||
if ((aNewPos.x() < 0 || aNewPos.x() > aWinSize.x()
|
||||
|| aNewPos.y() < 0 || aNewPos.y() > aWinSize.y())
|
||||
&& PressedMouseButtons() == Aspect_VKeyMouse_NONE)
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
if (UpdateMousePosition (aNewPos, aButtons, aFlags, isEmulated))
|
||||
{
|
||||
updateView();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EMSCRIPTEN_EVENT_MOUSEDOWN:
|
||||
case EMSCRIPTEN_EVENT_MOUSEUP:
|
||||
{
|
||||
if (aNewPos.x() < 0 || aNewPos.x() > aWinSize.x()
|
||||
|| aNewPos.y() < 0 || aNewPos.y() > aWinSize.y())
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
if (UpdateMouseButtons (aNewPos, aButtons, aFlags, isEmulated))
|
||||
{
|
||||
updateView();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EMSCRIPTEN_EVENT_CLICK:
|
||||
case EMSCRIPTEN_EVENT_DBLCLICK:
|
||||
{
|
||||
if (aNewPos.x() < 0 || aNewPos.x() > aWinSize.x()
|
||||
|| aNewPos.y() < 0 || aNewPos.y() > aWinSize.y())
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EMSCRIPTEN_EVENT_MOUSEENTER:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case EMSCRIPTEN_EVENT_MOUSELEAVE:
|
||||
{
|
||||
// there is no SetCapture() support, so that mouse unclick events outside canvas will not arrive,
|
||||
// so we have to forget current state...
|
||||
if (UpdateMouseButtons (aNewPos, Aspect_VKeyMouse_NONE, aFlags, isEmulated))
|
||||
{
|
||||
updateView();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return EM_TRUE;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : onWheelEvent
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
EM_BOOL WasmOcctView::onWheelEvent (int theEventType, const EmscriptenWheelEvent* theEvent)
|
||||
{
|
||||
if (myView.IsNull()
|
||||
|| theEventType != EMSCRIPTEN_EVENT_WHEEL)
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
Graphic3d_Vec2i aWinSize;
|
||||
myView->Window()->Size (aWinSize.x(), aWinSize.y());
|
||||
const Graphic3d_Vec2i aNewPos = convertPointToBacking (Graphic3d_Vec2i (theEvent->mouse.canvasX, theEvent->mouse.canvasY));
|
||||
if (aNewPos.x() < 0 || aNewPos.x() > aWinSize.x()
|
||||
|| aNewPos.y() < 0 || aNewPos.y() > aWinSize.y())
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
double aDelta = 0.0;
|
||||
switch (theEvent->deltaMode)
|
||||
{
|
||||
case DOM_DELTA_PIXEL:
|
||||
{
|
||||
aDelta = theEvent->deltaY / (5.0 * myDevicePixelRatio);
|
||||
break;
|
||||
}
|
||||
case DOM_DELTA_LINE:
|
||||
{
|
||||
aDelta = theEvent->deltaY * 8.0;
|
||||
break;
|
||||
}
|
||||
case DOM_DELTA_PAGE:
|
||||
{
|
||||
aDelta = theEvent->deltaY >= 0.0 ? 24.0 : -24.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (UpdateZoom (Aspect_ScrollDelta (aNewPos, -aDelta)))
|
||||
{
|
||||
updateView();
|
||||
}
|
||||
return EM_TRUE;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : onTouchEvent
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
EM_BOOL WasmOcctView::onTouchEvent (int theEventType, const EmscriptenTouchEvent* theEvent)
|
||||
{
|
||||
const double aClickTolerance = 5.0;
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
Graphic3d_Vec2i aWinSize;
|
||||
myView->Window()->Size (aWinSize.x(), aWinSize.y());
|
||||
bool hasUpdates = false;
|
||||
for (int aTouchIter = 0; aTouchIter < theEvent->numTouches; ++aTouchIter)
|
||||
{
|
||||
const EmscriptenTouchPoint& aTouch = theEvent->touches[aTouchIter];
|
||||
if (!aTouch.isChanged)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
const Standard_Size aTouchId = (Standard_Size )aTouch.identifier;
|
||||
const Graphic3d_Vec2i aNewPos = convertPointToBacking (Graphic3d_Vec2i (aTouch.canvasX, aTouch.canvasY));
|
||||
switch (theEventType)
|
||||
{
|
||||
case EMSCRIPTEN_EVENT_TOUCHSTART:
|
||||
{
|
||||
if (aNewPos.x() >= 0 && aNewPos.x() < aWinSize.x()
|
||||
&& aNewPos.y() >= 0 && aNewPos.y() < aWinSize.y())
|
||||
{
|
||||
hasUpdates = true;
|
||||
AddTouchPoint (aTouchId, Graphic3d_Vec2d (aNewPos));
|
||||
myClickTouch.From.SetValues (-1.0, -1.0);
|
||||
if (myTouchPoints.Extent() == 1)
|
||||
{
|
||||
myClickTouch.From = Graphic3d_Vec2d (aNewPos);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EMSCRIPTEN_EVENT_TOUCHMOVE:
|
||||
{
|
||||
const int anOldIndex = myTouchPoints.FindIndex (aTouchId);
|
||||
if (anOldIndex != 0)
|
||||
{
|
||||
hasUpdates = true;
|
||||
UpdateTouchPoint (aTouchId, Graphic3d_Vec2d (aNewPos));
|
||||
if (myTouchPoints.Extent() == 1
|
||||
&& (myClickTouch.From - Graphic3d_Vec2d (aNewPos)).cwiseAbs().maxComp() > aClickTolerance)
|
||||
{
|
||||
myClickTouch.From.SetValues (-1.0, -1.0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EMSCRIPTEN_EVENT_TOUCHEND:
|
||||
case EMSCRIPTEN_EVENT_TOUCHCANCEL:
|
||||
{
|
||||
if (RemoveTouchPoint (aTouchId))
|
||||
{
|
||||
if (myTouchPoints.IsEmpty()
|
||||
&& myClickTouch.From.minComp() >= 0.0)
|
||||
{
|
||||
if (myDoubleTapTimer.IsStarted()
|
||||
&& myDoubleTapTimer.ElapsedTime() <= myMouseDoubleClickInt)
|
||||
{
|
||||
myView->FitAll (0.01, false);
|
||||
myView->Invalidate();
|
||||
}
|
||||
else
|
||||
{
|
||||
myDoubleTapTimer.Stop();
|
||||
myDoubleTapTimer.Reset();
|
||||
myDoubleTapTimer.Start();
|
||||
SelectInViewer (Graphic3d_Vec2i (myClickTouch.From), false);
|
||||
}
|
||||
}
|
||||
hasUpdates = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hasUpdates)
|
||||
{
|
||||
updateView();
|
||||
}
|
||||
return hasUpdates || !myTouchPoints.IsEmpty() ? EM_TRUE : EM_FALSE;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : onKeyDownEvent
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
EM_BOOL WasmOcctView::onKeyDownEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent)
|
||||
{
|
||||
if (myView.IsNull()
|
||||
|| theEventType != EMSCRIPTEN_EVENT_KEYDOWN) // EMSCRIPTEN_EVENT_KEYPRESS
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
const double aTimeStamp = EventTime();
|
||||
const Aspect_VKey aVKey = WasmVKeys_VirtualKeyFromNative (theEvent->keyCode);
|
||||
if (aVKey == Aspect_VKey_UNKNOWN)
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
if (theEvent->repeat == EM_FALSE)
|
||||
{
|
||||
myKeys.KeyDown (aVKey, aTimeStamp);
|
||||
}
|
||||
|
||||
if (Aspect_VKey2Modifier (aVKey) == 0)
|
||||
{
|
||||
// normal key
|
||||
}
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : onKeyUpEvent
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
EM_BOOL WasmOcctView::onKeyUpEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent)
|
||||
{
|
||||
if (myView.IsNull()
|
||||
|| theEventType != EMSCRIPTEN_EVENT_KEYUP)
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
const double aTimeStamp = EventTime();
|
||||
const Aspect_VKey aVKey = WasmVKeys_VirtualKeyFromNative (theEvent->keyCode);
|
||||
if (aVKey == Aspect_VKey_UNKNOWN)
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
if (theEvent->repeat == EM_TRUE)
|
||||
{
|
||||
return EM_FALSE;
|
||||
}
|
||||
|
||||
const unsigned int aModif = myKeys.Modifiers();
|
||||
myKeys.KeyUp (aVKey, aTimeStamp);
|
||||
if (Aspect_VKey2Modifier (aVKey) == 0)
|
||||
{
|
||||
// normal key released
|
||||
switch (aVKey | aModif)
|
||||
{
|
||||
case Aspect_VKey_F:
|
||||
{
|
||||
myView->FitAll (0.01, false);
|
||||
myView->Invalidate();
|
||||
updateView();
|
||||
return EM_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return EM_FALSE;
|
||||
}
|
157
samples/webgl/WasmOcctView.h
Normal file
@@ -0,0 +1,157 @@
|
||||
// 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 _WasmOcctView_HeaderFile
|
||||
#define _WasmOcctView_HeaderFile
|
||||
|
||||
#include <AIS_InteractiveContext.hxx>
|
||||
#include <AIS_ViewController.hxx>
|
||||
#include <V3d_View.hxx>
|
||||
|
||||
#include <emscripten.h>
|
||||
#include <emscripten/html5.h>
|
||||
|
||||
class AIS_ViewCube;
|
||||
|
||||
//! Sample class creating 3D Viewer within Emscripten canvas.
|
||||
class WasmOcctView : protected AIS_ViewController
|
||||
{
|
||||
public:
|
||||
//! Default constructor.
|
||||
WasmOcctView();
|
||||
|
||||
//! Destructor.
|
||||
virtual ~WasmOcctView();
|
||||
|
||||
//! Main application entry point.
|
||||
void run();
|
||||
|
||||
//! Return interactive context.
|
||||
const Handle(AIS_InteractiveContext)& Context() const { return myContext; }
|
||||
|
||||
//! Return view.
|
||||
const Handle(V3d_View)& View() const { return myView; }
|
||||
|
||||
//! Return device pixel ratio for handling high DPI displays.
|
||||
float DevicePixelRatio() const { return myDevicePixelRatio; }
|
||||
|
||||
private:
|
||||
|
||||
//! Create window.
|
||||
void initWindow();
|
||||
|
||||
//! Create 3D Viewer.
|
||||
bool initViewer();
|
||||
|
||||
//! Fill 3D Viewer with a DEMO items.
|
||||
void initDemoScene();
|
||||
|
||||
//! Application event loop.
|
||||
void mainloop();
|
||||
|
||||
//! Request view redrawing.
|
||||
void updateView();
|
||||
|
||||
//! Flush events and redraw view.
|
||||
void redrawView();
|
||||
|
||||
//! Handle view redraw.
|
||||
virtual void handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx,
|
||||
const Handle(V3d_View)& theView) override;
|
||||
|
||||
//! Dump WebGL context information.
|
||||
void dumpGlInfo (bool theIsBasic);
|
||||
|
||||
//! Initialize pixel scale ratio.
|
||||
void initPixelScaleRatio();
|
||||
|
||||
//! Return point from logical units to backing store.
|
||||
Graphic3d_Vec2d convertPointToBacking (const Graphic3d_Vec2d& thePnt) const
|
||||
{
|
||||
return thePnt * myDevicePixelRatio;
|
||||
}
|
||||
|
||||
//! Return point from logical units to backing store.
|
||||
Graphic3d_Vec2i convertPointToBacking (const Graphic3d_Vec2i& thePnt) const
|
||||
{
|
||||
Graphic3d_Vec2d aPnt = Graphic3d_Vec2d (thePnt) * myDevicePixelRatio + Graphic3d_Vec2d (0.5);
|
||||
return Graphic3d_Vec2i (aPnt);
|
||||
}
|
||||
|
||||
//! @name Emscripten callbacks
|
||||
private:
|
||||
//! Window resize event.
|
||||
EM_BOOL onResizeEvent (int theEventType, const EmscriptenUiEvent* theEvent);
|
||||
|
||||
//! Mouse event.
|
||||
EM_BOOL onMouseEvent (int theEventType, const EmscriptenMouseEvent* theEvent);
|
||||
|
||||
//! Scroll event.
|
||||
EM_BOOL onWheelEvent (int theEventType, const EmscriptenWheelEvent* theEvent);
|
||||
|
||||
//! Touch event.
|
||||
EM_BOOL onTouchEvent (int theEventType, const EmscriptenTouchEvent* theEvent);
|
||||
|
||||
//! Key down event.
|
||||
EM_BOOL onKeyDownEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent);
|
||||
|
||||
//! Key up event.
|
||||
EM_BOOL onKeyUpEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent);
|
||||
|
||||
//! @name Emscripten callbacks (static functions)
|
||||
private:
|
||||
|
||||
static EM_BOOL onResizeCallback (int theEventType, const EmscriptenUiEvent* theEvent, void* theView)
|
||||
{ return ((WasmOcctView* )theView)->onResizeEvent (theEventType, theEvent); }
|
||||
|
||||
static void onRedrawView (void* theView)
|
||||
{ return ((WasmOcctView* )theView)->redrawView(); }
|
||||
|
||||
static EM_BOOL onMouseCallback (int theEventType, const EmscriptenMouseEvent* theEvent, void* theView)
|
||||
{ return ((WasmOcctView* )theView)->onMouseEvent (theEventType, theEvent); }
|
||||
|
||||
static EM_BOOL onWheelCallback (int theEventType, const EmscriptenWheelEvent* theEvent, void* theView)
|
||||
{ return ((WasmOcctView* )theView)->onWheelEvent (theEventType, theEvent); }
|
||||
|
||||
static EM_BOOL onTouchCallback (int theEventType, const EmscriptenTouchEvent* theEvent, void* theView)
|
||||
{ return ((WasmOcctView* )theView)->onTouchEvent (theEventType, theEvent); }
|
||||
|
||||
static EM_BOOL onKeyDownCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView)
|
||||
{ return ((WasmOcctView* )theView)->onKeyDownEvent (theEventType, theEvent); }
|
||||
|
||||
static EM_BOOL onKeyUpCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView)
|
||||
{ return ((WasmOcctView* )theView)->onKeyUpEvent (theEventType, theEvent); }
|
||||
|
||||
private:
|
||||
|
||||
Handle(AIS_InteractiveContext) myContext; //!< interactive context
|
||||
Handle(V3d_View) myView; //!< 3D view
|
||||
Handle(Prs3d_TextAspect) myTextStyle; //!< text style for OSD elements
|
||||
Handle(AIS_ViewCube) myViewCube; //!< view cube object
|
||||
TCollection_AsciiString myCanvasId; //!< canvas element id on HTML page
|
||||
Aspect_Touch myClickTouch; //!< single touch position for handling clicks
|
||||
OSD_Timer myDoubleTapTimer; //!< timer for handling double tap
|
||||
float myDevicePixelRatio; //!< device pixel ratio for handling high DPI displays
|
||||
unsigned int myUpdateRequests; //!< counter for unhandled update requests
|
||||
|
||||
};
|
||||
|
||||
#endif // _WasmOcctView_HeaderFile
|
264
samples/webgl/WasmVKeys.h
Normal file
@@ -0,0 +1,264 @@
|
||||
// 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 _WasmVKeys_HeaderFile
|
||||
#define _WasmVKeys_HeaderFile
|
||||
|
||||
#include <Aspect_VKey.hxx>
|
||||
|
||||
#include <emscripten/key_codes.h>
|
||||
|
||||
//! Convert Emscripten mouse buttons into Aspect_VKeyMouse.
|
||||
inline Aspect_VKeyMouse WasmVKeys_MouseButtonsFromNative (unsigned short theButtons)
|
||||
{
|
||||
Aspect_VKeyMouse aButtons = Aspect_VKeyMouse_NONE;
|
||||
if ((theButtons & 0x1) != 0)
|
||||
{
|
||||
aButtons |= Aspect_VKeyMouse_LeftButton;
|
||||
}
|
||||
if ((theButtons & 0x2) != 0)
|
||||
{
|
||||
aButtons |= Aspect_VKeyMouse_RightButton;
|
||||
}
|
||||
if ((theButtons & 0x4) != 0)
|
||||
{
|
||||
aButtons |= Aspect_VKeyMouse_MiddleButton;
|
||||
}
|
||||
return aButtons;
|
||||
}
|
||||
|
||||
//! Convert DOM virtual key into Aspect_VKey.
|
||||
inline Aspect_VKey WasmVKeys_VirtualKeyFromNative (Standard_Integer theKey)
|
||||
{
|
||||
if (theKey >= DOM_VK_0
|
||||
&& theKey <= DOM_VK_9)
|
||||
{
|
||||
// numpad keys
|
||||
return Aspect_VKey((theKey - DOM_VK_0) + Aspect_VKey_0);
|
||||
}
|
||||
if (theKey >= DOM_VK_A
|
||||
&& theKey <= DOM_VK_Z)
|
||||
{
|
||||
// main latin alphabet keys
|
||||
return Aspect_VKey((theKey - DOM_VK_A) + Aspect_VKey_A);
|
||||
}
|
||||
if (theKey >= DOM_VK_F1
|
||||
&& theKey <= DOM_VK_F24)
|
||||
{
|
||||
// special keys
|
||||
if (theKey <= DOM_VK_F12)
|
||||
{
|
||||
return Aspect_VKey((theKey - DOM_VK_F1) + Aspect_VKey_F1);
|
||||
}
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
}
|
||||
if (theKey >= DOM_VK_NUMPAD0
|
||||
&& theKey <= DOM_VK_NUMPAD9)
|
||||
{
|
||||
// numpad keys
|
||||
return Aspect_VKey((theKey - DOM_VK_NUMPAD0) + Aspect_VKey_Numpad0);
|
||||
}
|
||||
|
||||
switch (theKey)
|
||||
{
|
||||
case DOM_VK_CANCEL:
|
||||
case DOM_VK_HELP:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_BACK_SPACE:
|
||||
return Aspect_VKey_Backspace;
|
||||
case DOM_VK_TAB:
|
||||
return Aspect_VKey_Tab;
|
||||
case DOM_VK_CLEAR:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_RETURN:
|
||||
case DOM_VK_ENTER:
|
||||
return Aspect_VKey_Enter;
|
||||
case DOM_VK_SHIFT:
|
||||
return Aspect_VKey_Shift;
|
||||
case DOM_VK_CONTROL:
|
||||
return Aspect_VKey_Control;
|
||||
case DOM_VK_ALT:
|
||||
return Aspect_VKey_Alt;
|
||||
case DOM_VK_PAUSE:
|
||||
case DOM_VK_CAPS_LOCK:
|
||||
case DOM_VK_KANA:
|
||||
//case DOM_VK_HANGUL:
|
||||
case DOM_VK_EISU:
|
||||
case DOM_VK_JUNJA:
|
||||
case DOM_VK_FINAL:
|
||||
case DOM_VK_HANJA:
|
||||
//case DOM_VK_KANJI:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_ESCAPE:
|
||||
return Aspect_VKey_Escape;
|
||||
case DOM_VK_CONVERT:
|
||||
case DOM_VK_NONCONVERT:
|
||||
case DOM_VK_ACCEPT:
|
||||
case DOM_VK_MODECHANGE:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_SPACE:
|
||||
return Aspect_VKey_Space;
|
||||
case DOM_VK_PAGE_UP:
|
||||
return Aspect_VKey_PageUp;
|
||||
case DOM_VK_PAGE_DOWN:
|
||||
return Aspect_VKey_PageDown;
|
||||
case DOM_VK_END:
|
||||
return Aspect_VKey_End;
|
||||
case DOM_VK_HOME:
|
||||
return Aspect_VKey_Home;
|
||||
case DOM_VK_LEFT:
|
||||
return Aspect_VKey_Left;
|
||||
case DOM_VK_UP:
|
||||
return Aspect_VKey_Up;
|
||||
case DOM_VK_RIGHT:
|
||||
return Aspect_VKey_Right;
|
||||
case DOM_VK_DOWN:
|
||||
return Aspect_VKey_Down;
|
||||
case DOM_VK_SELECT:
|
||||
case DOM_VK_PRINT:
|
||||
case DOM_VK_EXECUTE:
|
||||
case DOM_VK_PRINTSCREEN:
|
||||
case DOM_VK_INSERT:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_DELETE:
|
||||
return Aspect_VKey_Delete;
|
||||
case DOM_VK_COLON:
|
||||
return Aspect_VKey_Comma;
|
||||
case DOM_VK_SEMICOLON:
|
||||
return Aspect_VKey_Semicolon;
|
||||
case DOM_VK_LESS_THAN:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_EQUALS:
|
||||
return Aspect_VKey_Equal;
|
||||
case DOM_VK_GREATER_THAN:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_QUESTION_MARK:
|
||||
return Aspect_VKey_Slash;
|
||||
case DOM_VK_AT: // @ key
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_WIN:
|
||||
return Aspect_VKey_Meta;
|
||||
case DOM_VK_CONTEXT_MENU:
|
||||
case DOM_VK_SLEEP:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_MULTIPLY:
|
||||
return Aspect_VKey_NumpadMultiply;
|
||||
case DOM_VK_ADD:
|
||||
return Aspect_VKey_NumpadAdd;
|
||||
case DOM_VK_SEPARATOR:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_SUBTRACT:
|
||||
return Aspect_VKey_NumpadSubtract;
|
||||
case DOM_VK_DECIMAL:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_DIVIDE:
|
||||
return Aspect_VKey_NumpadDivide;
|
||||
case DOM_VK_NUM_LOCK:
|
||||
return Aspect_VKey_Numlock;
|
||||
case DOM_VK_SCROLL_LOCK:
|
||||
return Aspect_VKey_Scroll;
|
||||
case DOM_VK_WIN_OEM_FJ_JISHO:
|
||||
case DOM_VK_WIN_OEM_FJ_MASSHOU:
|
||||
case DOM_VK_WIN_OEM_FJ_TOUROKU:
|
||||
case DOM_VK_WIN_OEM_FJ_LOYA:
|
||||
case DOM_VK_WIN_OEM_FJ_ROYA:
|
||||
case DOM_VK_CIRCUMFLEX:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_EXCLAMATION:
|
||||
case DOM_VK_DOUBLE_QUOTE:
|
||||
//case DOM_VK_HASH:
|
||||
case DOM_VK_DOLLAR:
|
||||
case DOM_VK_PERCENT:
|
||||
case DOM_VK_AMPERSAND:
|
||||
case DOM_VK_UNDERSCORE:
|
||||
case DOM_VK_OPEN_PAREN:
|
||||
case DOM_VK_CLOSE_PAREN:
|
||||
case DOM_VK_ASTERISK:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_PLUS:
|
||||
return Aspect_VKey_Plus;
|
||||
case DOM_VK_PIPE:
|
||||
case DOM_VK_HYPHEN_MINUS:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_OPEN_CURLY_BRACKET:
|
||||
return Aspect_VKey_BracketLeft;
|
||||
case DOM_VK_CLOSE_CURLY_BRACKET:
|
||||
return Aspect_VKey_BracketRight;
|
||||
case DOM_VK_TILDE:
|
||||
return Aspect_VKey_Tilde;
|
||||
case DOM_VK_VOLUME_MUTE:
|
||||
return Aspect_VKey_VolumeMute;
|
||||
case DOM_VK_VOLUME_DOWN:
|
||||
return Aspect_VKey_VolumeDown;
|
||||
case DOM_VK_VOLUME_UP:
|
||||
return Aspect_VKey_VolumeUp;
|
||||
case DOM_VK_COMMA:
|
||||
return Aspect_VKey_Comma;
|
||||
case DOM_VK_PERIOD:
|
||||
return Aspect_VKey_Period;
|
||||
case DOM_VK_SLASH:
|
||||
return Aspect_VKey_Slash;
|
||||
case DOM_VK_BACK_QUOTE:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_OPEN_BRACKET:
|
||||
return Aspect_VKey_BracketLeft;
|
||||
case DOM_VK_BACK_SLASH:
|
||||
return Aspect_VKey_Backslash;
|
||||
case DOM_VK_CLOSE_BRACKET:
|
||||
return Aspect_VKey_BracketRight;
|
||||
case DOM_VK_QUOTE:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_META:
|
||||
return Aspect_VKey_Meta;
|
||||
case DOM_VK_ALTGR:
|
||||
return Aspect_VKey_Alt;
|
||||
case DOM_VK_WIN_ICO_HELP:
|
||||
case DOM_VK_WIN_ICO_00:
|
||||
case DOM_VK_WIN_ICO_CLEAR:
|
||||
case DOM_VK_WIN_OEM_RESET:
|
||||
case DOM_VK_WIN_OEM_JUMP:
|
||||
case DOM_VK_WIN_OEM_PA1:
|
||||
case DOM_VK_WIN_OEM_PA2:
|
||||
case DOM_VK_WIN_OEM_PA3:
|
||||
case DOM_VK_WIN_OEM_WSCTRL:
|
||||
case DOM_VK_WIN_OEM_CUSEL:
|
||||
case DOM_VK_WIN_OEM_ATTN:
|
||||
case DOM_VK_WIN_OEM_FINISH:
|
||||
case DOM_VK_WIN_OEM_COPY:
|
||||
case DOM_VK_WIN_OEM_AUTO:
|
||||
case DOM_VK_WIN_OEM_ENLW:
|
||||
case DOM_VK_WIN_OEM_BACKTAB:
|
||||
case DOM_VK_ATTN:
|
||||
case DOM_VK_CRSEL:
|
||||
case DOM_VK_EXSEL:
|
||||
case DOM_VK_EREOF:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
case DOM_VK_PLAY:
|
||||
return Aspect_VKey_MediaPlayPause;
|
||||
case DOM_VK_ZOOM:
|
||||
case DOM_VK_PA1:
|
||||
case DOM_VK_WIN_OEM_CLEAR:
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
}
|
||||
return Aspect_VKey_UNKNOWN;
|
||||
}
|
||||
|
||||
#endif // _WasmVKeys_HeaderFile
|
69
samples/webgl/main.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
#include <iostream>
|
||||
|
||||
#include "WasmOcctView.h"
|
||||
|
||||
#include <Message.hxx>
|
||||
#include <Message_Messenger.hxx>
|
||||
#include <Message_PrinterSystemLog.hxx>
|
||||
#include <OSD_MemInfo.hxx>
|
||||
#include <OSD_Parallel.hxx>
|
||||
|
||||
#include <AIS_Shape.hxx>
|
||||
#include <BRepTools.hxx>
|
||||
#include <BRep_Builder.hxx>
|
||||
#include <Standard_ArrayStreamBuffer.hxx>
|
||||
|
||||
#include <emscripten.h>
|
||||
#include <emscripten/html5.h>
|
||||
|
||||
//! Global viewer instance.
|
||||
static WasmOcctView aViewer;
|
||||
|
||||
//! File data read event.
|
||||
extern "C" void onFileDataRead (void* theOpaque, void* theBuffer, int theDataLen)
|
||||
{
|
||||
const char* aName = theOpaque != NULL ? (const char* )theOpaque : "";
|
||||
{
|
||||
AIS_ListOfInteractive aShapes;
|
||||
aViewer.Context()->DisplayedObjects (AIS_KOI_Shape, -1, aShapes);
|
||||
for (AIS_ListOfInteractive::Iterator aShapeIter (aShapes); aShapeIter.More(); aShapeIter.Next())
|
||||
{
|
||||
aViewer.Context()->Remove (aShapeIter.Value(), false);
|
||||
}
|
||||
}
|
||||
|
||||
Standard_ArrayStreamBuffer aStreamBuffer ((const char* )theBuffer, theDataLen);
|
||||
std::istream aStream (&aStreamBuffer);
|
||||
TopoDS_Shape aShape;
|
||||
BRep_Builder aBuilder;
|
||||
BRepTools::Read (aShape, aStream, aBuilder);
|
||||
|
||||
Handle(AIS_Shape) aShapePrs = new AIS_Shape (aShape);
|
||||
aShapePrs->SetMaterial (Graphic3d_NOM_SILVER);
|
||||
aViewer.Context()->Display (aShapePrs, AIS_Shaded, 0, false);
|
||||
aViewer.View()->FitAll (0.01, false);
|
||||
aViewer.View()->Redraw();
|
||||
Message::DefaultMessenger()->Send (TCollection_AsciiString("Loaded file ") + aName, Message_Info);
|
||||
Message::DefaultMessenger()->Send (OSD_MemInfo::PrintInfo(), Message_Trace);
|
||||
}
|
||||
|
||||
//! File read error event.
|
||||
static void onFileReadFailed (void* theOpaque)
|
||||
{
|
||||
const char* aName = (const char* )theOpaque;
|
||||
Message::DefaultMessenger()->Send (TCollection_AsciiString("Error: unable to load file ") + aName, Message_Fail);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
Message::DefaultMessenger()->Printers().First()->SetTraceLevel (Message_Trace);
|
||||
Handle(Message_PrinterSystemLog) aJSConsolePrinter = new Message_PrinterSystemLog ("webgl-sample", Message_Trace);
|
||||
Message::DefaultMessenger()->AddPrinter (aJSConsolePrinter); // open JavaScript console within the Browser to see this output
|
||||
Message::DefaultMessenger()->Send (TCollection_AsciiString("NbLogicalProcessors: ") + OSD_Parallel::NbLogicalProcessors(), Message_Trace);
|
||||
aViewer.run();
|
||||
Message::DefaultMessenger()->Send (OSD_MemInfo::PrintInfo(), Message_Trace);
|
||||
|
||||
// load some file
|
||||
emscripten_async_wget_data ("samples/Ball.brep", (void* )"samples/Ball.brep", onFileDataRead, onFileReadFailed);
|
||||
return 0;
|
||||
}
|
173
samples/webgl/occt-webgl-sample.html
Normal file
@@ -0,0 +1,173 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang=en-us>
|
||||
<head>
|
||||
<meta charset=utf-8><meta content="text/html; charset=utf-8" http-equiv=Content-Type>
|
||||
<link rel="shortcut icon" href="lamp.ico" type="image/x-icon" />
|
||||
<title>OCCT WebGL Viewer Sample</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h2>OCCT WebGL Viewer Sample</h2>
|
||||
<div>
|
||||
<canvas id=canvas oncontextmenu=event.preventDefault() tabindex=-1 style="border:0 none;background-color:#000" width="409" height="409"></canvas>
|
||||
<img id=occlogo src="OCC_logo.png" style="position: absolute; left: 20px; top: 0px; z-index: 2;" />
|
||||
</div>
|
||||
|
||||
<div><label for="fileInput">Choose BREP file to upload: </label><input type="file" id="fileInput" accept=".brep"></div>
|
||||
<h4>Console output:</h4>
|
||||
<p id="output"></p>
|
||||
<script src="three.min.js"></script>
|
||||
<script>
|
||||
//! Resize canvas to fit into window.
|
||||
function updateCanvasSize()
|
||||
{
|
||||
// size of canvas in logical (density-independent) units
|
||||
var aSizeX = Math.min (window.innerWidth, window.screen.availWidth);
|
||||
var aSizeY = Math.min (window.innerHeight, window.screen.availHeight);
|
||||
aSizeX = Math.max (300, aSizeX - 30);
|
||||
aSizeY = Math.max (300, aSizeY / 2);
|
||||
canvas.style.width = aSizeX + "px";
|
||||
canvas.style.height = aSizeY + "px";
|
||||
|
||||
// drawing buffer size (aka backing store)
|
||||
var aDevicePixelRatio = window.devicePixelRatio || 1;
|
||||
canvas.width = aSizeX * aDevicePixelRatio;
|
||||
canvas.height = aSizeY * aDevicePixelRatio;
|
||||
|
||||
occlogo.style.top = (aSizeY - 30) + "px";
|
||||
}
|
||||
window.onresize = updateCanvasSize;
|
||||
updateCanvasSize();
|
||||
|
||||
//! Check browser support.
|
||||
function isWasmSupported()
|
||||
{
|
||||
try {
|
||||
if (typeof WebAssembly === "object"
|
||||
&& typeof WebAssembly.instantiate === "function") {
|
||||
const aDummyModule = new WebAssembly.Module (Uint8Array.of (0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));
|
||||
if (aDummyModule instanceof WebAssembly.Module)
|
||||
{
|
||||
return new WebAssembly.Instance(aDummyModule) instanceof WebAssembly.Instance;
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
return false;
|
||||
}
|
||||
if (!isWasmSupported())
|
||||
{
|
||||
var anElement = document.getElementById('output');
|
||||
anElement.innerHTML += "Browser is too old - WebAssembly support is missing!<br>Please check updates or install a modern browser.<br>";
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
//! Define OCCT WebGL Viewer module.
|
||||
var Module =
|
||||
{
|
||||
print: (function() {
|
||||
var anElement = document.getElementById('output');
|
||||
return function(theText) { anElement.innerHTML += theText + "<br>"; };
|
||||
})(),
|
||||
printErr: function(theText) {
|
||||
//var anElement = document.getElementById('output');
|
||||
//anElement.innerHTML += theText + "<br>";
|
||||
},
|
||||
canvas: (function() {
|
||||
var aCanvas = document.getElementById('canvas');
|
||||
return aCanvas;
|
||||
})()
|
||||
};
|
||||
|
||||
var aCanvas = document.getElementById ('canvas');
|
||||
var aGlCtx = aCanvas.getContext ('webgl2', { alpha: false, depth: true, antialias: false, preserveDrawingBuffer: true } );
|
||||
if (aGlCtx == null)
|
||||
{
|
||||
aGlCtx = aCanvas.getContext ('webgl', { alpha: false, depth: true, antialias: false, preserveDrawingBuffer: true } );
|
||||
}
|
||||
var aScene = new THREE.Scene();
|
||||
var aCamera = new THREE.PerspectiveCamera (75, window.innerWidth / window.innerHeight);
|
||||
//var aRenderer = new THREE.WebGLRenderer ({antialias: true});
|
||||
var aRenderer = new THREE.WebGLRenderer ({antialias: false, canvas: aCanvas, context: aGlCtx});
|
||||
aRenderer.autoClear = false;
|
||||
aRenderer.autoClearColor = false;
|
||||
aRenderer.autoClearDepth = false;
|
||||
aRenderer.autoClearStencil = false;
|
||||
aRenderer.setSize (window.innerWidth,window.innerHeight);
|
||||
//document.body.appendChild (aRenderer.domElement);
|
||||
var aGeom = new THREE.BoxGeometry (1,1,1);
|
||||
var aMat = new THREE.MeshBasicMaterial ({color: 0xff0000});
|
||||
var aCube = new THREE.Mesh (aGeom, aMat);
|
||||
aScene.add (aCube);
|
||||
aCube.position.z = -5; aCube.rotation.x = 10; aCube.rotation.y = 5;
|
||||
/*aRenderer.render (aScene, aCamera);
|
||||
var anAnimate = function(){
|
||||
aCube.rotation.x += 0.01;
|
||||
aRenderer.state.reset();
|
||||
aRenderer.render (aScene, aCamera);
|
||||
requestAnimationFrame (anAnimate);
|
||||
}
|
||||
anAnimate();*/
|
||||
|
||||
function postFrameRender()
|
||||
{
|
||||
//console.log("postFrameRender()"); ///
|
||||
//aCamera.
|
||||
aRenderer.state.reset();
|
||||
aRenderer.render (aScene, aCamera)
|
||||
}
|
||||
|
||||
//! Handle file uploading.
|
||||
fileInput.onchange = function()
|
||||
{
|
||||
if (fileInput.files.length == 0) { return; }
|
||||
// Warning! Entire file is pre-loaded into memory.
|
||||
var aFile = fileInput.files[0];
|
||||
var aReader = new FileReader();
|
||||
aReader.onload = function()
|
||||
{
|
||||
var aDataArray = new Uint8Array (aReader.result);
|
||||
var aNameArray = new Uint8Array (toUtf8Array (aFile.name));
|
||||
const aDataBuffer = Module._malloc(aDataArray.length);
|
||||
const aNameBuffer = Module._malloc(aNameArray.length);
|
||||
Module.HEAPU8.set(aNameArray, aNameBuffer);
|
||||
Module.HEAPU8.set(aDataArray, aDataBuffer);
|
||||
Module.ccall('onFileDataRead', null, ['number', 'number', 'number'], [aNameBuffer, aDataBuffer, aDataArray.length]);
|
||||
Module._free(aDataBuffer);
|
||||
Module._free(aNameBuffer);
|
||||
fileInput.value = '';
|
||||
};
|
||||
aReader.readAsArrayBuffer(aFile);
|
||||
};
|
||||
|
||||
//! Convert string into UTF-8 array.
|
||||
function toUtf8Array (theText)
|
||||
{
|
||||
var aRes = [];
|
||||
for (var aCharIter = 0; aCharIter < theText.length; ++aCharIter)
|
||||
{
|
||||
var aCharCode = theText.charCodeAt (aCharIter);
|
||||
if (aCharCode < 0x80)
|
||||
{
|
||||
aRes.push (aCharCode);
|
||||
}
|
||||
else if (aCharCode < 0x800)
|
||||
{
|
||||
aRes.push (0xc0 | (aCharCode >> 6), 0x80 | (aCharCode & 0x3f));
|
||||
}
|
||||
else if (aCharCode < 0xd800 || aCharCode >= 0xe000)
|
||||
{
|
||||
aRes.push (0xe0 | (aCharCode >> 12), 0x80 | ((aCharCode>>6) & 0x3f), 0x80 | (aCharCode & 0x3f));
|
||||
}
|
||||
else
|
||||
{
|
||||
++aCharIter;
|
||||
aCharCode = 0x10000 + (((aCharCode & 0x3ff)<<10) | (theText.charCodeAt (aCharIter) & 0x3ff));
|
||||
aRes.push(0xf0 | (aCharCode >>18), 0x80 | ((aCharCode>>12) & 0x3f), 0x80 | ((aCharCode>>6) & 0x3f), 0x80 | (aCharCode & 0x3f));
|
||||
}
|
||||
}
|
||||
return aRes;
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript" src="occt-webgl-sample.js" charset="utf-8"></script>
|
||||
</body>
|
||||
</html>
|
@@ -197,7 +197,7 @@ void AIS_Circle::UnsetColor()
|
||||
}
|
||||
else
|
||||
{
|
||||
Quantity_Color CC = Quantity_NOC_YELLOW;;
|
||||
Quantity_Color CC = Quantity_NOC_YELLOW;
|
||||
if( HasColor() ) CC = myDrawer->Color();
|
||||
else if (myDrawer->HasLink()) AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC);
|
||||
myDrawer->LineAspect()->SetColor(CC);
|
||||
|
@@ -415,11 +415,6 @@ Standard_Boolean AIS_ColorScale::FindColor (const Standard_Real theValue,
|
||||
//=======================================================================
|
||||
Standard_Integer AIS_ColorScale::computeMaxLabelWidth (const TColStd_SequenceOfExtendedString& theLabels) const
|
||||
{
|
||||
{
|
||||
Handle(V3d_Viewer) aViewer = GetContext()->CurrentViewer();
|
||||
aViewer->InitActiveViews(); // for AIS_ColorScale::TextSize()
|
||||
}
|
||||
|
||||
Standard_Integer aWidthMax = 0;
|
||||
for (TColStd_SequenceOfExtendedString::Iterator aLabIter (theLabels); aLabIter.More(); aLabIter.Next())
|
||||
{
|
||||
|
@@ -26,6 +26,7 @@ public:
|
||||
//! Default constructor.
|
||||
AIS_ColoredDrawer (const Handle(Prs3d_Drawer)& theLink)
|
||||
: myIsHidden (false),
|
||||
myHasOwnMaterial(false),
|
||||
myHasOwnColor (false),
|
||||
myHasOwnTransp(false),
|
||||
myHasOwnWidth (false)
|
||||
@@ -36,6 +37,10 @@ public:
|
||||
bool IsHidden() const { return myIsHidden; }
|
||||
void SetHidden (const bool theToHide) { myIsHidden = theToHide;}
|
||||
|
||||
bool HasOwnMaterial() const { return myHasOwnMaterial; }
|
||||
void UnsetOwnMaterial() { myHasOwnMaterial = false; }
|
||||
void SetOwnMaterial() { myHasOwnMaterial = true; }
|
||||
|
||||
bool HasOwnColor() const { return myHasOwnColor; }
|
||||
void UnsetOwnColor() { myHasOwnColor = false; }
|
||||
void SetOwnColor (const Quantity_Color& /*theColor*/) { myHasOwnColor = true; }
|
||||
@@ -51,6 +56,7 @@ public:
|
||||
public: //! @name list of overridden properties
|
||||
|
||||
bool myIsHidden;
|
||||
bool myHasOwnMaterial;
|
||||
bool myHasOwnColor;
|
||||
bool myHasOwnTransp;
|
||||
bool myHasOwnWidth;
|
||||
|
@@ -333,7 +333,11 @@ void AIS_ColoredShape::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
|
||||
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
|
||||
{
|
||||
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
|
||||
//if (aDrawer->HasOwnMaterial()) continue;
|
||||
if (aDrawer->HasOwnMaterial())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (aDrawer->HasOwnShadingAspect())
|
||||
{
|
||||
setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), aDrawer->HasOwnTransparency());
|
||||
|
@@ -79,6 +79,12 @@ void AIS_ConnectedInteractive::connect (const Handle(AIS_InteractiveObject)& the
|
||||
|
||||
if (!myReference.IsNull())
|
||||
{
|
||||
if (myReference->HasInteractiveContext()
|
||||
&& myReference->GetContext()->DisplayStatus (myReference) != AIS_DS_None)
|
||||
{
|
||||
myReference.Nullify();
|
||||
throw Standard_ProgramError("AIS_ConnectedInteractive::Connect() - connected object should NOT be displayed in context");
|
||||
}
|
||||
myTypeOfPresentation3d = myReference->TypeOfPresentation3d();
|
||||
}
|
||||
setLocalTransformation (theLocation);
|
||||
|
@@ -403,16 +403,17 @@ void AIS_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentation
|
||||
anArrow->AddVertex (aRightPoint);
|
||||
|
||||
// Set aspect for arrow triangles
|
||||
Graphic3d_MaterialAspect aShadeMat (Graphic3d_NOM_DEFAULT);
|
||||
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
|
||||
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
|
||||
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
|
||||
|
||||
Handle(Prs3d_ShadingAspect) aShadingStyle = new Prs3d_ShadingAspect();
|
||||
Graphic3d_PolygonOffset aPolOffset;
|
||||
aPolOffset.Mode = Aspect_POM_Off;
|
||||
aPolOffset.Factor = 0.0f;
|
||||
aPolOffset.Units = 0.0f;
|
||||
Handle(Graphic3d_AspectFillArea3d) aShadingStyle = new Graphic3d_AspectFillArea3d();
|
||||
aShadingStyle->SetInteriorStyle (Aspect_IS_SOLID);
|
||||
aShadingStyle->SetColor (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()->Color());
|
||||
aShadingStyle->SetMaterial (aShadeMat);
|
||||
aShadingStyle->SetShadingModel (Graphic3d_TOSM_UNLIT);
|
||||
aShadingStyle->SetPolygonOffset (aPolOffset);
|
||||
|
||||
aGroup->SetPrimitivesAspect (aShadingStyle->Aspect());
|
||||
aGroup->SetPrimitivesAspect (aShadingStyle);
|
||||
aGroup->AddPrimitiveArray (anArrow);
|
||||
}
|
||||
|
||||
@@ -530,9 +531,9 @@ void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation,
|
||||
}
|
||||
|
||||
Graphic3d_MaterialAspect aShadeMat (Graphic3d_NOM_DEFAULT);
|
||||
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
|
||||
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
|
||||
aShadeMat.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
|
||||
aShadeMat.SetAmbientColor (Quantity_NOC_BLACK);
|
||||
aShadeMat.SetDiffuseColor (Quantity_NOC_BLACK);
|
||||
aShadeMat.SetSpecularColor(Quantity_NOC_BLACK);
|
||||
myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aColor);
|
||||
myDrawer->ShadingAspect()->Aspect()->SetBackInteriorColor (aColor);
|
||||
myDrawer->ShadingAspect()->SetMaterial (aShadeMat);
|
||||
|
@@ -300,7 +300,7 @@ void AIS_FixRelation::ComputeVertex(const TopoDS_Vertex& /*FixVertex*/,
|
||||
gp_Pln pln(myPlane->Pln());
|
||||
gp_Dir dir(pln.XAxis().Direction());
|
||||
gp_Vec transvec = gp_Vec(dir)*myArrowSize;
|
||||
curpos = myPntAttach.Translated(transvec);;
|
||||
curpos = myPntAttach.Translated(transvec);
|
||||
myPosition = curpos;
|
||||
myAutomaticPosition = Standard_True;
|
||||
}
|
||||
|
@@ -65,7 +65,7 @@ public:
|
||||
|
||||
//! Returns true if the Interactive Objects in the relation
|
||||
//! are movable.
|
||||
virtual Standard_Boolean IsMovable() const Standard_OVERRIDE;
|
||||
virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; }
|
||||
|
||||
//! computes the presentation according to a point of view
|
||||
//! given by <aProjector>.
|
||||
@@ -109,6 +109,4 @@ private:
|
||||
|
||||
};
|
||||
|
||||
#include <AIS_FixRelation.lxx>
|
||||
|
||||
#endif // _AIS_FixRelation_HeaderFile
|
||||
|
@@ -1,24 +0,0 @@
|
||||
// Created on: 1997-02-28
|
||||
// Created by: Jean-Pierre COMBE
|
||||
// Copyright (c) 1997-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.
|
||||
|
||||
//=======================================================================
|
||||
//function : IsMovable
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
inline Standard_Boolean AIS_FixRelation::IsMovable() const
|
||||
{
|
||||
return Standard_True;
|
||||
}
|
@@ -92,7 +92,7 @@ Aspect_TypeOfLine AIS_GraphicTool::GetLineType (const Handle(Prs3d_Drawer)& Dr,
|
||||
const AIS_TypeOfAttribute Att)
|
||||
{
|
||||
Handle(Prs3d_LineAspect) LA = GetLineAspect(Dr,Att);
|
||||
return LA->Aspect()->Type();;
|
||||
return LA->Aspect()->Type();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -560,7 +560,7 @@ void AIS_IdenticRelation::ComputeTwoLinesPresentation(const Handle(Prs3d_Present
|
||||
gp_Pln pln(myPlane->Pln());
|
||||
gp_Dir dir(pln.XAxis().Direction());
|
||||
gp_Vec transvec = gp_Vec(dir)*myArrowSize;
|
||||
curpos = myFAttach.Translated(transvec);;
|
||||
curpos = myFAttach.Translated(transvec);
|
||||
myPosition = curpos;
|
||||
myAutomaticPosition = Standard_True;
|
||||
}
|
||||
|
@@ -58,7 +58,7 @@ public:
|
||||
void ClearUsers() { myUsers.Clear(); }
|
||||
|
||||
//! Returns true if the interactive object is movable.
|
||||
virtual Standard_Boolean IsMovable() const Standard_OVERRIDE;
|
||||
virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; }
|
||||
|
||||
//! computes the presentation according to a point of view
|
||||
//! given by <aProjector>.
|
||||
@@ -134,11 +134,4 @@ private:
|
||||
|
||||
};
|
||||
|
||||
|
||||
#include <AIS_IdenticRelation.lxx>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // _AIS_IdenticRelation_HeaderFile
|
||||
|