1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-09 18:50:54 +03:00

0027398: Integrate Qt Browser Widget to Open CASCADE Technology

The following implementation has been made:
- CMake procedure is extended to compile Qt tools. This is optional and is handled by USE_QT_TOOLS option(OFF by default)
- It is possible to build Qt tools using Qt5 or Qt4, it is settled with USE_QT4 option.
- Sample of DFBrowser tool is available in samples/tools/TInspectorEXE. It is build with tools, executable is placed in binaries. To start the sample, use dfbrowser.bat command.
- DFBrowser tool may be started from DRAW
This commit is contained in:
nds 2017-07-26 16:40:36 +03:00 committed by bugmaster
parent 8dbf046236
commit 14bbbdcbc1
445 changed files with 30198 additions and 15 deletions
CMakeLists.txt
adm
samples/tools
src/DrawResources
tests/tools
tools/DFBrowser

@ -365,6 +365,9 @@ if (WIN32)
set (USE_D3D OFF CACHE BOOL "${USE_D3D_DESCR}")
endif()
set (USE_QT_TOOLS OFF CACHE BOOL "${USE_QT_TOOLS_DESCR}")
set (USE_QT4 ON CACHE BOOL "${USE_QT4}")
# Enable/Disable the floating point exceptions (FPE) during runtime.
if (NOT BUILD_ENABLE_FPE_SIGNAL_HANDLER)
set (BUILD_ENABLE_FPE_SIGNAL_HANDLER OFF CACHE BOOL "${BUILD_ENABLE_FPE_SIGNAL_HANDLER_DESCR}" FORCE)
@ -691,7 +694,7 @@ if (3RDPARTY_INCLUDE_DIRS)
endif()
# include <cmake binary folder>/inc
include_directories (${CMAKE_BINARY_DIR}/inc)
include_directories (${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE})
if (3RDPARTY_LIBRARY_DIRS AND BUILD_SHARED_LIBS)
list (REMOVE_DUPLICATES 3RDPARTY_LIBRARY_DIRS)
@ -732,7 +735,7 @@ string(TIMESTAMP CURRENT_TIME "%H:%M:%S")
message (STATUS "\nInfo: \(${CURRENT_TIME}\) Start collecting all OCCT header files into ${CMAKE_BINARY_DIR}/inc ...")
# collect all the headers to <binary dir>/inc folder
COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}" "${BUILD_TOOLKITS}")
COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}" "${BUILD_TOOLKITS}" "${CMAKE_SOURCE_DIR}/src" "${INSTALL_DIR_INCLUDE}")
string(TIMESTAMP CURRENT_TIME "%H:%M:%S")
message (STATUS "Info: \(${CURRENT_TIME}\) End the collecting")
@ -749,6 +752,33 @@ else()
set (SCRIPT_EXT sh)
endif()
# OCCT tools
# include the patched or original list of tools
# list <TOOLNAME>_TOOLKITS is created foreach tool and contains its toolkits
# list <OCCT_TOOLS> will contain all tools
if (NOT USE_QT_TOOLS)
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_QT")
OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_TQTMALLOC")
OCCT_CHECK_AND_UNSET ("INSTALL_QT")
else()
OCCT_TOOLS_AND_TOOLKITS (OCCT_TOOLS)
foreach (OCCT_TOOL ${OCCT_TOOLS})
list (APPEND BUILD_TOOL_TOOLKITS ${${OCCT_TOOL}_TOOL_TOOLKITS})
endforeach()
# collect all the headers to <binary dir>/inc folder
string(TIMESTAMP CURRENT_TIME "%H:%M:%S")
message (STATUS "\nInfo: \(${CURRENT_TIME}\) Start collecting all OCCT tool header files into ${CMAKE_BINARY_DIR}/tools/inc ...")
COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE}" "${BUILD_TOOL_TOOLKITS}" "${CMAKE_SOURCE_DIR}/tools" "tools")
include_directories (${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE}/tools)
# check qt 3rdparty path
add_definitions (-DHAVE_QT)
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt5")
message (STATUS "Info: Qt is used by OCCT")
endif()
# OCCT samples
# get absolute path from INSTALL_DIR
set (INSTALL_DIR_ABSOLUTE "${INSTALL_DIR}")
@ -891,8 +921,14 @@ if (MSVC AND 3RDPARTY_DLL_DIRS)
endif()
endif()
message (STATUS "Info: \(${CURRENT_TIME}\) OCCT toolkits processed")
# include patched toolkit projects or original ones
if (BUILD_TOOL_TOOLKITS)
foreach (BUILD_TOOL_TOOLKIT ${BUILD_TOOL_TOOLKITS})
OCCT_ADD_SUBDIRECTORY ("tools/${BUILD_TOOL_TOOLKIT}")
endforeach()
endif()
message (STATUS "Info: \(${CURRENT_TIME}\) OCCT toolkits processed")
# samples do not support patch usage
if (BUILD_MODULE_MfcSamples)
set (OCCT_ROOT ${CMAKE_SOURCE_DIR})
@ -919,6 +955,22 @@ if (BUILD_MODULE_UwpSample)
add_subdirectory(samples/xaml)
endif()
if (BUILD_TOOL_TOOLKITS)
# copy tinspector script to install script folder
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/adm/templates/dfbrowser.${SCRIPT_EXT}")
install (FILES "${BUILD_PATCH}/adm/templates/dfbrowser.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SCRIPT}"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_WRITE WORLD_EXECUTE)
else()
install (FILES "${CMAKE_SOURCE_DIR}/adm/templates/dfbrowser.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SCRIPT}"
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_WRITE WORLD_EXECUTE)
endif()
set (BUILD_SAMPLE_TOOLKITS TInspectorEXE)
foreach (BUILD_SAMPLE_TOOL_TOOLKIT ${BUILD_SAMPLE_TOOLKITS})
OCCT_ADD_SUBDIRECTORY ("samples/tools/${BUILD_SAMPLE_TOOL_TOOLKIT}")
endforeach()
endif()
# Prepare variables for configuration of OpenCASCADE cmake config file
set (OCCT_MODULES_ENABLED)
set (OCCT_LIBRARIES)

4
adm/TOOLS Normal file

@ -0,0 +1,4 @@
TModelingData TKShapeView
TVisualization TKView TKVInspector
TApplicationFramework TKTreeModel TKTInspectorAPI TKDFBrowser
TTool TKTInspector TKToolsDraw

@ -139,6 +139,17 @@ macro (THIRDPARTY_PRODUCT PRODUCT_NAME HEADER_NAME LIBRARY_CSF_NAME LIBRARY_NAME
PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES}
CMAKE_FIND_ROOT_PATH_BOTH
NO_DEFAULT_PATH)
if ("${3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX}}" STREQUAL "3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX}-NOTFOUND")
# find directory recursive
FIND_SUBDIRECTORY (${3RDPARTY_${PRODUCT_NAME}_DIR} "${${PRODUCT_NAME}_PATH_SUFFIXES}" SUBDIR_NAME)
if (NOT "${SUBDIR_NAME}" STREQUAL "")
find_library (3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX} NAMES ${LIBRARY_NAME_SUFFIX}
PATHS "${SUBDIR_NAME}"
PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES}
CMAKE_FIND_ROOT_PATH_BOTH
NO_DEFAULT_PATH)
endif()
endif()
else()
find_library (3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX} NAMES ${LIBRARY_NAME}
PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES}
@ -175,6 +186,16 @@ macro (THIRDPARTY_PRODUCT PRODUCT_NAME HEADER_NAME LIBRARY_CSF_NAME LIBRARY_NAME
PATHS "${3RDPARTY_${PRODUCT_NAME}_DIR}"
PATH_SUFFIXES bin win${COMPILER_BITNESS}/${COMPILER}/bin
NO_DEFAULT_PATH)
if (3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX} STREQUAL "3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX}-NOTFOUND")
# find directory recursive
FIND_SUBDIRECTORY (${3RDPARTY_${PRODUCT_NAME}_DIR} bin SUBDIR_NAME)
if (NOT "${SUBDIR_NAME}" STREQUAL "")
find_library (3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX} NAMES ${LIBRARY_NAME_SUFFIX}
PATHS "${SUBDIR_NAME}"
PATH_SUFFIXES bin
NO_DEFAULT_PATH)
endif()
endif()
else()
find_library (3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX} NAMES ${LIBRARY_NAME} PATH_SUFFIXES bin)
endif()
@ -206,6 +227,7 @@ macro (THIRDPARTY_PRODUCT PRODUCT_NAME HEADER_NAME LIBRARY_CSF_NAME LIBRARY_NAME
string (REPLACE "." "" LIBRARY_NAME_SUFFIX "${LIBRARY_NAME}")
if (WIN32)
set (3RDPARTY_${PRODUCT_NAME}_DLL_DIRS "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR_${LIBRARY_NAME_SUFFIX}};${3RDPARTY_${PRODUCT_NAME}_DLL_DIRS}")
set (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIRS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR_${LIBRARY_NAME_SUFFIX}}")
else()
set (3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIRS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR_${LIBRARY_NAME_SUFFIX}}:${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIRS}")
endif()

@ -106,6 +106,34 @@ function (SUBDIRECTORY_NAMES MAIN_DIRECTORY RESULT)
set (${RESULT} ${LOCAL_RESULT} PARENT_SCOPE)
endfunction()
function (FIND_SUBDIRECTORY ROOT_DIRECTORY DIRECTORY_SUFFIX SUBDIRECTORY_NAME)
#message("Trying to find directory with suffix ${DIRECTORY_SUFFIX} in ${ROOT_DIRECTORY}")
SUBDIRECTORY_NAMES ("${ROOT_DIRECTORY}" SUBDIR_NAME_LIST)
#message("Subdirectories: ${SUBDIR_NAME_LIST}")
#set(${SUBDIRECTORY_NAME} "${SUBDIR_NAME_LIST}" PARENT_SCOPE)
foreach (SUBDIR_NAME ${SUBDIR_NAME_LIST})
#message("Subdir: ${SUBDIR_NAME}, ${DIRECTORY_SUFFIX}")
# REGEX failed if the directory name contains '++' combination, so we replace it
string(REPLACE "++" "\\+\\+" SUBDIR_NAME_ESCAPED ${SUBDIR_NAME})
string (REGEX MATCH "${SUBDIR_NAME_ESCAPED}" DOES_PATH_CONTAIN "${DIRECTORY_SUFFIX}")
if (DOES_PATH_CONTAIN)
set(${SUBDIRECTORY_NAME} "${ROOT_DIRECTORY}/${SUBDIR_NAME}" PARENT_SCOPE)
#message("Subdirectory is found: ${SUBDIRECTORY_NAME}")
BREAK()
else()
#message("Check directory: ${ROOT_DIRECTORY}/${SUBDIR_NAME}")
FIND_SUBDIRECTORY ("${ROOT_DIRECTORY}/${SUBDIR_NAME}" "${DIRECTORY_SUFFIX}" SUBDIR_REC_NAME)
if (NOT "${SUBDIR_REC_NAME}" STREQUAL "")
set(${SUBDIRECTORY_NAME} "${SUBDIR_REC_NAME}" PARENT_SCOPE)
#message("Subdirectory is found: ${SUBDIRECTORY_NAME}")
BREAK()
endif()
endif()
endforeach()
endfunction()
function (OCCT_ORIGIN_AND_PATCHED_FILES RELATIVE_PATH SEARCH_TEMPLATE RESULT)
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_PATH}")
@ -194,7 +222,7 @@ macro (OCCT_CONFIGURE_AND_INSTALL BEING_CONGIRUGED_FILE BUILD_NAME INSTALL_NAME
install(FILES "${OCCT_BINARY_DIR}/${BUILD_NAME}" DESTINATION "${DESTINATION_PATH}" RENAME ${INSTALL_NAME})
endmacro()
macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOOLKITS)
macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOOLKITS OCCT_COLLECT_SOURCE_DIR OCCT_INSTALL_DIR_PREFIX)
set (OCCT_USED_PACKAGES)
# consider patched header.in template
@ -210,8 +238,8 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
set (OCCT_TOOLKIT_PACKAGES)
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${OCCT_USED_TOOLKIT}/PACKAGES")
file (STRINGS "${BUILD_PATCH}/src/${OCCT_USED_TOOLKIT}/PACKAGES" OCCT_TOOLKIT_PACKAGES)
elseif (EXISTS "${CMAKE_SOURCE_DIR}/src/${OCCT_USED_TOOLKIT}/PACKAGES")
file (STRINGS "${CMAKE_SOURCE_DIR}/src/${OCCT_USED_TOOLKIT}/PACKAGES" OCCT_TOOLKIT_PACKAGES)
elseif (EXISTS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_USED_TOOLKIT}/PACKAGES")
file (STRINGS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_USED_TOOLKIT}/PACKAGES" OCCT_TOOLKIT_PACKAGES)
endif()
list (APPEND OCCT_USED_PACKAGES ${OCCT_TOOLKIT_PACKAGES})
@ -229,10 +257,10 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
foreach (OCCT_PACKAGE ${OCCT_USED_PACKAGES})
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES")
file (STRINGS "${BUILD_PATCH}/src/${OCCT_PACKAGE}/FILES" OCCT_ALL_FILE_NAMES)
elseif (EXISTS "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES")
file (STRINGS "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES" OCCT_ALL_FILE_NAMES)
elseif (EXISTS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/FILES")
file (STRINGS "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/FILES" OCCT_ALL_FILE_NAMES)
else()
message (WARNING "FILES has not been found in ${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}")
message (WARNING "FILES has not been found in ${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}")
continue()
endif()
@ -240,13 +268,13 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
math (EXPR ALL_FILES_NB "${ALL_FILES_NB} - 1" )
# emit warnings if there is unprocessed headers
file (GLOB OCCT_ALL_FILES_IN_DIR "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/*.*")
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}/*.*")
# use patched header files
foreach (OCCT_FILE_IN_PATCH_DIR ${OCCT_ALL_FILES_IN_PATCH_DIR})
get_filename_component (OCCT_FILE_IN_PATCH_DIR_NAME ${OCCT_FILE_IN_PATCH_DIR} NAME)
list (REMOVE_ITEM OCCT_ALL_FILES_IN_DIR "${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/${OCCT_FILE_IN_PATCH_DIR_NAME}")
list (REMOVE_ITEM OCCT_ALL_FILES_IN_DIR "${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/${OCCT_FILE_IN_PATCH_DIR_NAME}")
list (APPEND OCCT_ALL_FILES_IN_DIR "${OCCT_FILE_IN_PATCH_DIR}")
endforeach()
@ -287,7 +315,7 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
endforeach()
if (NOT OCCT_FILE_IN_DIR_STATUS)
message (STATUS "Warning. File ${OCCT_FILE_IN_DIR} is not listed in ${CMAKE_SOURCE_DIR}/src/${OCCT_PACKAGE}/FILES")
message (STATUS "Warning. File ${OCCT_FILE_IN_DIR} is not listed in ${OCCT_COLLECT_SOURCE_DIR}/${OCCT_PACKAGE}/FILES")
string (REGEX MATCH ".+\\.[hlg]xx|.+\\.h$" IS_HEADER_FOUND "${OCCT_FILE_NAME}")
if (IS_HEADER_FOUND)
@ -304,10 +332,10 @@ macro (COLLECT_AND_INSTALL_OCCT_HEADER_FILES ROOT_TARGET_OCCT_DIR OCCT_BUILD_TOO
foreach (OCCT_HEADER_FILE ${OCCT_HEADER_FILES_COMPLETE})
get_filename_component (HEADER_FILE_NAME ${OCCT_HEADER_FILE} NAME)
set (OCCT_HEADER_FILE_CONTENT "#include \"${OCCT_HEADER_FILE}\"")
configure_file ("${TEMPLATE_HEADER_PATH}" "${ROOT_TARGET_OCCT_DIR}/inc/${HEADER_FILE_NAME}" @ONLY)
configure_file ("${TEMPLATE_HEADER_PATH}" "${ROOT_TARGET_OCCT_DIR}/${OCCT_INSTALL_DIR_PREFIX}/${HEADER_FILE_NAME}" @ONLY)
endforeach()
install (FILES ${OCCT_HEADER_FILES_COMPLETE} DESTINATION "${INSTALL_DIR_INCLUDE}")
install (FILES ${OCCT_HEADER_FILES_COMPLETE} DESTINATION "${INSTALL_DIR}/${OCCT_INSTALL_DIR_PREFIX}")
string(TIMESTAMP CURRENT_TIME "%H:%M:%S")
message (STATUS "Info: \(${CURRENT_TIME}\) Checking headers in inc folder...")
@ -319,7 +347,7 @@ 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 "${CMAKE_SOURCE_DIR}/src/${PACKAGE_NAME}/${HEADER_FILE_NAME}")
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")
file (REMOVE "${OCCT_HEADER_FILE_OLD}")
else()
@ -490,6 +518,24 @@ function (OCCT_MODULES_AND_TOOLKITS MODULE_LIST)
set (${MODULE_LIST} ${${MODULE_LIST}} PARENT_SCOPE)
endfunction()
# Function to get list of tools and toolkits from file adm/TOOLS.
# Creates list <$TOOL_LIST> to store list of TOOLS and
# <NAME_OF_TOOL>_TOOLKITS foreach tool to store its toolkits.
function (OCCT_TOOLS_AND_TOOLKITS TOOL_LIST)
FILE_TO_LIST ("adm/TOOLS" FILE_CONTENT)
foreach (CONTENT_LINE ${FILE_CONTENT})
string (REPLACE " " ";" CONTENT_LINE ${CONTENT_LINE})
list (GET CONTENT_LINE 0 TOOL_NAME)
list (REMOVE_AT CONTENT_LINE 0)
list (APPEND ${TOOL_LIST} ${TOOL_NAME})
# (!) REMOVE THE LINE BELOW (implicit variables)
set (${TOOL_NAME}_TOOL_TOOLKITS ${CONTENT_LINE} PARENT_SCOPE)
endforeach()
set (${TOOL_LIST} ${${TOOL_LIST}} PARENT_SCOPE)
endfunction()
# Returns OCC version string from file Standard_Version.hxx (if available)
function (OCC_VERSION OCC_VERSION_MAJOR OCC_VERSION_MINOR OCC_VERSION_MAINTENANCE OCC_VERSION_DEVELOPMENT OCC_VERSION_STRING_EXT)

@ -0,0 +1,298 @@
# script for each OCCT tool toolkit
# Qt dependencies
OCCT_INCLUDE_CMAKE_FILE (adm/cmake/qt5_macro)
FIND_QT5_PACKAGE(PROJECT_LIBRARIES_DEBUG PROJECT_LIBRARIES_RELEASE PROJECT_INCLUDES)
include_directories("${PROJECT_INCLUDES}"
"${CMAKE_BINARY_DIR}/${INSTALL_DIR_INCLUDE}/tools")
FILE_TO_LIST ("tools/${PROJECT_NAME}/PACKAGES" USED_PACKAGES)
# parce PACKAGES file
if ("${PROJECT_NAME}" STREQUAL TInspectorEXE)
set (USED_PACKAGES ${PROJECT_NAME})
set (PACKAGE_PREFIX_DIR "samples/tools")
include_directories("${PROJECT_INCLUDES}"
"${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${PROJECT_NAME}")
else()
FILE_TO_LIST ("tools/${PROJECT_NAME}/PACKAGES" USED_PACKAGES)
set (PACKAGE_PREFIX_DIR "tools")
endif()
SET (RCC_FILES)
foreach (OCCT_PACKAGE ${USED_PACKAGES})
file (STRINGS "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
#message("Sources are ${SOURCE_FILES_C}")
FIND_AND_WRAP_MOC_FILES("${SOURCE_FILES_C}")
#message("Dir is ${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/${OCCT_PACKAGE}.qrc")
FIND_AND_WRAP_RESOURCE_FILE("${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/${OCCT_PACKAGE}.qrc" RCC_FILES)
endforeach()
#message("RCC_FILES for ${PROJECT_NAME} are ${RCC_FILES}")
set (PRECOMPILED_DEFS)
if (NOT BUILD_SHARED_LIBS)
list (APPEND PRECOMPILED_DEFS "-DOCCT_NO_PLUGINS")
endif()
# Get all used packages from toolkit
foreach (OCCT_PACKAGE ${USED_PACKAGES})
ADD_DEFINITIONS(-D${OCCT_PACKAGE}_EXPORTS)
# TKService contains platform-dependent packages: Xw and WNT
if ((WIN32 AND "${OCCT_PACKAGE}" STREQUAL "Xw") OR (NOT WIN32 AND "${OCCT_PACKAGE}" STREQUAL "WNT"))
# do nothing
else()
if (WIN32)
list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE}_DLL")
endif()
set (SOURCE_FILES)
set (HEADER_FILES)
# Generate Flex and Bison files
if (${BUILD_YACCLEX})
# flex files
OCCT_ORIGIN_AND_PATCHED_FILES ("tools/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX)
list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN)
# bison files
OCCT_ORIGIN_AND_PATCHED_FILES ("tools/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON)
list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN)
if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0)
list (SORT SOURCE_FILES_FLEX)
list (SORT SOURCE_FILES_BISON)
math (EXPR SOURCE_FILES_FLEX_LEN "${SOURCE_FILES_FLEX_LEN} - 1")
foreach (FLEX_FILE_INDEX RANGE ${SOURCE_FILES_FLEX_LEN})
list (GET SOURCE_FILES_FLEX ${FLEX_FILE_INDEX} CURRENT_FLEX_FILE)
get_filename_component (CURRENT_FLEX_FILE_NAME ${CURRENT_FLEX_FILE} NAME_WE)
list (GET SOURCE_FILES_BISON ${FLEX_FILE_INDEX} CURRENT_BISON_FILE)
get_filename_component (CURRENT_BISON_FILE_NAME ${CURRENT_BISON_FILE} NAME_WE)
string (COMPARE EQUAL ${CURRENT_FLEX_FILE_NAME} ${CURRENT_BISON_FILE_NAME} ARE_FILES_EQUAL)
if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL})
set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.c)
set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.c)
BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} ${CMAKE_SOURCE_DIR}/tools/${OCCT_PACKAGE}/${BISON_OUTPUT_FILE} COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME}")
FLEX_TARGET (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} ${CMAKE_SOURCE_DIR}/tools/${OCCT_PACKAGE}/${FLEX_OUTPUT_FILE} COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME}")
ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME})
list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE})
endif()
endforeach()
endif()
endif()
# header files
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/FILES")
file (STRINGS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h")
file (STRINGS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
file (STRINGS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
file (STRINGS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
if(APPLE)
file (STRINGS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
endif()
else()
file (STRINGS "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h")
file (STRINGS "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
file (STRINGS "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
file (STRINGS "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
if(APPLE)
file (STRINGS "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
endif()
endif()
list (APPEND HEADER_FILES ${HEADER_FILES_M} ${HEADER_FILES_LXX} ${SOURCE_FILES_GXX})
list (APPEND SOURCE_FILES ${SOURCE_FILES_C})
if(APPLE)
list (APPEND SOURCE_FILES ${SOURCE_FILES_M})
endif()
foreach(HEADER_FILE ${HEADER_FILES})
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${HEADER_FILE}")
message (STATUS "Info: consider patched file: ${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${HEADER_FILE}")
list (APPEND USED_INCFILES "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${HEADER_FILE}")
SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE}" FILES "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${HEADER_FILE}")
else()
list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE}" FILES "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
endif()
endforeach()
foreach(SOURCE_FILE ${SOURCE_FILES})
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${SOURCE_FILE}")
message (STATUS "Info: consider patched file: ${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${SOURCE_FILE}")
list (APPEND USED_SRCFILES "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${SOURCE_FILE}")
SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE}" FILES "${BUILD_PATCH}/tools/${OCCT_PACKAGE}/${SOURCE_FILE}")
else()
list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE}" FILES "${CMAKE_SOURCE_DIR}/${PACKAGE_PREFIX_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
endif()
endforeach()
endif()
endforeach()
string (REGEX REPLACE ";" " " PRECOMPILED_DEFS "${PRECOMPILED_DEFS}")
set (USED_RCFILE "")
if (MSVC)
set (USED_RCFILE "${CMAKE_BINARY_DIR}/resources/${PROJECT_NAME}.rc")
if (APPLY_OCCT_PATCH_DIR AND EXISTS "${APPLY_OCCT_PATCH_DIR}/adm/templates/occt_toolkit.rc.in")
configure_file("${APPLY_OCCT_PATCH_DIR}/adm/templates/occt_toolkit.rc.in" "${USED_RCFILE}" @ONLY)
else()
configure_file("${CMAKE_SOURCE_DIR}/adm/templates/occt_toolkit.rc.in" "${USED_RCFILE}" @ONLY)
endif()
endif()
set (CURRENT_MODULE)
foreach (OCCT_MODULE ${OCCT_TOOLS})
list (FIND ${OCCT_MODULE}_TOOL_TOOLKITS ${PROJECT_NAME} CURRENT_PROJECT_IS_BUILT)
if (NOT ${CURRENT_PROJECT_IS_BUILT} EQUAL -1)
set (CURRENT_MODULE ${OCCT_MODULE})
endif()
endforeach()
if (NOT SINGLE_GENERATOR)
OCCT_INSERT_CODE_FOR_TARGET ()
endif()
if ("${PROJECT_NAME}" STREQUAL TInspectorEXE)
add_executable (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RCC_FILES})
install (TARGETS ${PROJECT_NAME}
DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}")
else()
add_library (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RCC_FILES})
if (MSVC)
install (FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bind/${PROJECT_NAME}.pdb
CONFIGURATIONS Debug
DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}")
endif()
if (BUILD_SHARED_LIBS AND NOT "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}" STREQUAL "")
set (CMAKE_SHARED_LIBRARY_SUFFIX_DEFAULT ${CMAKE_SHARED_LIBRARY_SUFFIX})
set (CMAKE_SHARED_LIBRARY_SUFFIX "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}")
endif()
install (TARGETS ${PROJECT_NAME}
EXPORT OpenCASCADE${CURRENT_MODULE}Targets
RUNTIME DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}"
ARCHIVE DESTINATION "${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}"
LIBRARY DESTINATION "${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}")
if (NOT WIN32)
if (BUILD_SHARED_LIBS AND NOT "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}" STREQUAL "")
set (LINK_NAME "${INSTALL_DIR}/${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX_DEFAULT}/tools")
set (LIBRARY_NAME "${INSTALL_DIR}/${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}/tools")
OCCT_CREATE_SYMLINK_TO_FILE (${LIBRARY_NAME} ${LINK_NAME})
endif()
endif()
endif()
if (CURRENT_MODULE)
set_target_properties (${PROJECT_NAME} PROPERTIES FOLDER "Tools/${CURRENT_MODULE}")
set_target_properties (${PROJECT_NAME} PROPERTIES MODULE "${CURRENT_MODULE}")
if (APPLE)
if (NOT "${INSTALL_NAME_DIR}" STREQUAL "")
set_target_properties (${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "${INSTALL_NAME_DIR}")
endif()
endif()
endif()
get_property (OCC_VERSION_MAJOR GLOBAL PROPERTY OCC_VERSION_MAJOR)
get_property (OCC_VERSION_MINOR GLOBAL PROPERTY OCC_VERSION_MINOR)
get_property (OCC_VERSION_MAINTENANCE GLOBAL PROPERTY OCC_VERSION_MAINTENANCE)
if (ANDROID)
# do not append version to the filename
set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}")
else()
set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}"
SOVERSION "${OCC_VERSION_MAJOR}"
VERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}.${OCC_VERSION_MAINTENANCE}")
endif()
set (USED_TOOLKITS_BY_CURRENT_PROJECT)
set (USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT)
# parce EXTERNLIB file
FILE_TO_LIST ("${PACKAGE_PREFIX_DIR}/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS)
foreach (USED_ITEM ${USED_EXTERNLIB_AND_TOOLKITS})
string (REGEX MATCH "^ *#" COMMENT_FOUND ${USED_ITEM})
if (NOT COMMENT_FOUND)
string (REGEX MATCH "^TK" TK_FOUND ${USED_ITEM})
string (REGEX MATCH "^vtk" VTK_FOUND ${USED_ITEM})
if (NOT "${TK_FOUND}" STREQUAL "" OR NOT "${VTK_FOUND}" STREQUAL "")
list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT ${USED_ITEM})
else()
string (REGEX MATCH "^CSF_" CSF_FOUND ${USED_ITEM})
if ("${CSF_FOUND}" STREQUAL "")
message (STATUS "Info: ${USED_ITEM} from ${PROJECT_NAME} skipped due to it is empty")
else() # get CSF_ value
set (CURRENT_CSF ${${USED_ITEM}})
if (NOT "x${CURRENT_CSF}" STREQUAL "x")
# prepare a list from a string with whitespaces
separate_arguments (CURRENT_CSF)
list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT ${CURRENT_CSF})
endif()
endif()
endif()
endif()
endforeach()
if (APPLE)
list (FIND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT X11 IS_X11_FOUND)
if (NOT ${IS_X11_FOUND} EQUAL -1)
find_package (X11 COMPONENTS X11 Xext Xmu Xi)
if (NOT X11_FOUND)
message (STATUS "Warning: X11 is not found. It's required to install The XQuartz project: http://www.xquartz.org")
endif()
endif()
endif()
# Update list of used VTK libraries if OpenGL2 Rendering BackEnd is used.
# Add VTK_OPENGL2_BACKEND definition.
if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2")
add_definitions(-DVTK_OPENGL2_BACKEND)
foreach (VTK_EXCLUDE_LIBRARY vtkRenderingOpenGL vtkRenderingFreeTypeOpenGL)
list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "${VTK_EXCLUDE_LIBRARY}" IS_VTK_OPENGL_FOUND)
if (NOT ${IS_VTK_OPENGL_FOUND} EQUAL -1)
list (REMOVE_ITEM USED_TOOLKITS_BY_CURRENT_PROJECT ${VTK_EXCLUDE_LIBRARY})
if (${VTK_EXCLUDE_LIBRARY} STREQUAL vtkRenderingOpenGL)
list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT vtkRenderingOpenGL2)
endif()
endif()
endforeach()
endif()
if (BUILD_SHARED_LIBS)
target_link_libraries (${PROJECT_NAME} ${USED_TOOLKITS_BY_CURRENT_PROJECT} ${USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT})
endif()
# Set Qt dependencies
target_link_libraries(${PROJECT_NAME} "${PROJECT_LIBRARIES}")
target_link_libraries(${PROJECT_NAME} debug "${PROJECT_LIBRARIES_DEBUG}")
target_link_libraries(${PROJECT_NAME} optimized "${PROJECT_LIBRARIES_RELEASE}")

22
adm/cmake/qt5.cmake Normal file

@ -0,0 +1,22 @@
#qt
#looking for 3RDPARTY_QT_DIR variable used later in qt5_macro.cmake
if (${USE_QT4})
SET(CSF_QtCore "QtCore")
THIRDPARTY_PRODUCT("QT" "" "CSF_QtCore" "d")
else()
SET(CSF_Qt5Core "Qt5Core")
THIRDPARTY_PRODUCT("QT" "" "CSF_Qt5Core" "d")
endif()
list (REMOVE_ITEM 3RDPARTY_NOT_INCLUDED "3RDPARTY_QT_INCLUDE_DIR")
list (REMOVE_ITEM 3RDPARTY_NOT_INCLUDED "3RDPARTY_QT_LIBRARY_DIR")
list (REMOVE_ITEM 3RDPARTY_NOT_INCLUDED "3RDPARTY_QT_DLL_DIR")
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)
set (USED_3RDPARTY_QT_DIR "${3RDPARTY_QT_DIR}")

68
adm/cmake/qt5_macro.cmake Normal file

@ -0,0 +1,68 @@
#qt
macro (FIND_QT5_PACKAGE PROJECT_LIBRARIES_DEBUG PROJECT_LIBRARIES_RELEASE PROJECT_INCLUDES)
if ("${3RDPARTY_QT_DIR}" STREQUAL "")
message (FATAL_ERROR "Empty Qt dir")
endif()
# Now set CMAKE_PREFIX_PATH to point to local Qt installation.
# Without this setting find_package() will not work
set(CMAKE_PREFIX_PATH ${3RDPARTY_QT_DIR})
if (USE_QT4)
# Now we can apply standard CMake finder for Qt. We do this mostly
# to have qt5_wrap_cpp() function available
find_package(Qt4)
#message (STATUS "Qt cmake configuration at directory ${Qt4DIR}")
set(PROJECT_INCLUDES ${QT_INCLUDES})
if (WIN32)
set(PROJECT_LIBRARIES_DEBUG "${3RDPARTY_QT_DIR}/lib/QtCored4.lib;${3RDPARTY_QT_DIR}/lib/QtGuid4.lib")
set(PROJECT_LIBRARIES_RELEASE "${3RDPARTY_QT_DIR}/lib/QtCore4.lib;${3RDPARTY_QT_DIR}/lib/QtGui4.lib")
else()
set(PROJECT_LIBRARIES_DEBUG "${3RDPARTY_QT_DIR}/lib/libQtCore.so;${3RDPARTY_QT_DIR}/lib/libQtGui.so")
set(PROJECT_LIBRARIES_RELEASE "${3RDPARTY_QT_DIR}/lib/libQtCore.so;${3RDPARTY_QT_DIR}/lib/libQtGui.so")
endif(WIN32)
else()
# Now we can apply standard CMake finder for Qt4. We do this mostly
# to have qt5_wrap_cpp() function available
find_package(Qt5 REQUIRED COMPONENTS Widgets)
#message (STATUS "Qt cmake configuration at directory ${Qt5DIR}")
set(PROJECT_INCLUDES "${Qt5Widgets_INCLUDE_DIRS}")
set(PROJECT_LIBRARIES_DEBUG "${Qt5Widgets_LIBRARIES}")
set(PROJECT_LIBRARIES_RELEASE "${Qt5Widgets_LIBRARIES}")
endif()
endmacro()
macro (FIND_AND_WRAP_MOC_FILES SOURCE_FILES)
SET(CMAKE_AUTOMOC ON)
foreach (FILE ${SOURCE_FILES})
set (src_files ${src_files} ${FILE})
unset (MOC_FILE)
if (USE_QT4)
qt4_wrap_cpp(MOC_FILE ${FILE})
else()
qt5_wrap_cpp(MOC_FILE ${FILE})
endif()
#message (STATUS "... Info: next MOC file ${MOC_FILE}")
endforeach (FILE)
endmacro()
macro (FIND_AND_WRAP_RESOURCE_FILE RESOURCE_FILE_NAME RCC_FILES)
if(EXISTS "${RESOURCE_FILE_NAME}")
if (USE_QT4)
qt4_add_resources(RCC_FILES "${RESOURCE_FILE_NAME}")
# suppress some GCC warnings coming from source files generated from .qrc resources
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable")
endif()
else()
qt5_add_resources(RCC_FILES "${RESOURCE_FILE_NAME}")
endif()
endif()
endmacro()

@ -167,6 +167,11 @@ set (USE_GLX_DESCR "Indicates whether X11 OpenGl on OSX is used or not")
set (USE_D3D_DESCR "Indicates whether optional Direct3D wrapper in OCCT visualization module should be build or not")
set (BUILD_QT_TOOLS_DESCR "Indicates whether OCCT tools should be build or not")
set (USE_QT_TOOLS_DESCR "Indicates whether OCCT tools should be used or not
The tools will be searched in third-party directory or may be set manually")
macro (BUILD_MODULE MODULE_NAME)
set (ENABLE_MODULE TRUE)
set (BUILD_MODULE_${MODULE_NAME} ${ENABLE_MODULE} CACHE BOOL "${BUILD_MODULE_${MODULE_NAME}_DESCR}")

@ -1354,6 +1354,7 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } {
set aLibsMap(CSF_TclLibs) ""
set aFrmsMap(CSF_TclTkLibs) "Tk"
set aLibsMap(CSF_TclTkLibs) ""
set aLibsMap(CSF_QT) "QtCore QtGui"
} else {
if { "$theOS" == "qnx" } {
# CSF_ThreadLibs - pthread API is part of libc on QNX

@ -15,6 +15,9 @@ if /I "%VCVER%" == "@COMPILER@" (
set "TBB_DIR=@3RDPARTY_TBB_DLL_DIR@"
set "VTK_DIR=@3RDPARTY_VTK_DLL_DIR@"
if not "@3RDPARTY_QT_DIR@" == "" (
set "QTDIR=@3RDPARTY_QT_DIR@"
)
set "TCL_VERSION_WITH_DOT=@3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT@"
set "TK_VERSION_WITH_DOT=@3RDPARTY_TK_LIBRARY_VERSION_WITH_DOT@"

@ -13,6 +13,10 @@ if [ "$1" == "@BIN_LETTER@" ]; then
export TBB_DIR="@3RDPARTY_TBB_LIBRARY_DIR@"
export VTK_DIR="@3RDPARTY_VTK_LIBRARY_DIR@"
if [ "x@3RDPARTY_QT_DIR" != "x" ]; then
export QTDIR="@3RDPARTY_QT_DIR@"
fi
export TCL_VERSION_WITH_DOT="@3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT@"
export TK_VERSION_WITH_DOT="@3RDPARTY_TK_LIBRARY_VERSION_WITH_DOT@"

@ -17,6 +17,9 @@ if /I "%VCVER%" == "@COMPILER@" (
set "TBB_DIR=@USED_3RDPARTY_TBB_DIR@"
set "VTK_DIR=@USED_3RDPARTY_VTK_DIR@"
if not "@USED_3RDPARTY_QT_DIR@" == "" (
set "QTDIR=@USED_3RDPARTY_QT_DIR@"
)
set "TCL_VERSION_WITH_DOT=@3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT@"
set "TK_VERSION_WITH_DOT=@3RDPARTY_TK_LIBRARY_VERSION_WITH_DOT@"

@ -13,6 +13,10 @@ if [ "$1" == "@BIN_LETTER@" ]; then
export TBB_DIR="@USED_3RDPARTY_TBB_DIR@"
export VTK_DIR="@USED_3RDPARTY_VTK_DIR@"
if [ "x@USED_3RDPARTY_QT_DIR@" != "x" ]; then
export QTDIR="@USED_3RDPARTY_QT_DIR@"
fi
export TCL_VERSION_WITH_DOT="@3RDPARTY_TCL_LIBRARY_VERSION_WITH_DOT@"
export TK_VERSION_WITH_DOT="@3RDPARTY_TK_LIBRARY_VERSION_WITH_DOT@"

@ -0,0 +1,7 @@
@echo off
rem Setup environment and launch TInspector
call "%~dp0env.bat" %1 %2 %3
TInspectorEXE.exe --dfbrowser

@ -0,0 +1,9 @@
#!/bin/bash
aCurrentPath="$PWD"
aScriptPath=${BASH_SOURCE%/*}; if [ -d "${aScriptPath}" ]; then cd "$aScriptPath"; fi; aScriptPath="$PWD";
source "${aScriptPath}/env.sh" "$1"
cd ${aCurrentPath}
TInspectorEXE --dfbrowser

@ -115,6 +115,7 @@ if not ["%GLES2_DIR%"] == [""] set "PATH=%GLES2_DIR%;%PATH%"
if not ["%GL2PS_DIR%"] == [""] set "PATH=%GL2PS_DIR%;%PATH%"
if not ["%TBB_DIR%"] == [""] set "PATH=%TBB_DIR%;%PATH%"
if not ["%VTK_DIR%"] == [""] set "PATH=%VTK_DIR%;%PATH%"
if not ["%QTDIR%"] == [""] set "PATH=%QTDIR%/bin;%PATH%"
rem ----- Set path to 3rd party and OCCT libraries -----
if not "%CSF_OCCTBinPath%" == "" (

@ -66,6 +66,10 @@ if [ "$VTK_DIR" != "" ]; then
THRDPARTY_PATH="${VTK_DIR}:${THRDPARTY_PATH}"
fi
if [ "$QTDIR" != "" ]; then
THRDPARTY_PATH="${QTDIR}/lib:${THRDPARTY_PATH}"
fi
if [ "$TK_DIR" != "$TCL_DIR" ]; then
if [ "$TK_DIR" != "" ]; then
export TK_LIBRARY="${TK_DIR}/../lib/tk${TK_VERSION_WITH_DOT}"

@ -0,0 +1,5 @@
project(TInspectorEXE)
OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_tool)
set_property (TARGET ${PROJECT_NAME} PROPERTY FOLDER Samples)

@ -0,0 +1 @@
TKTInspector

@ -0,0 +1,5 @@
TInspectorEXE.cxx
TInspectorEXE_OpenFileDialog.cxx
TInspectorEXE_OpenFileDialog.hxx
TInspectorEXE_OpenFileViewModel.cxx
TInspectorEXE_OpenFileViewModel.hxx

@ -0,0 +1,134 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <OSD_Environment.hxx>
#include <TInspectorEXE_OpenFileDialog.hxx>
#include <TInspector_Communicator.hxx>
#include <QAction>
#include <QApplication>
#include <QDir>
#include <QMainWindow>
#include <QToolBar>
#include <set>
// =======================================================================
// function : fileNameInDataDir
// purpose :
// =======================================================================
TCollection_AsciiString fileNameInDataDir(const TCollection_AsciiString& theEnvironmentDir,
const TCollection_AsciiString& theName)
{
OSD_Environment anEnvironment(theEnvironmentDir);
TCollection_AsciiString aFileName = anEnvironment.Value();
aFileName += TCollection_AsciiString("/") + theName;
return aFileName;
}
// =======================================================================
// function : setPluginSampleDirectory
// purpose :
// =======================================================================
void setPluginSampleDirectory (const TCollection_AsciiString& theName, TInspector_Communicator* theCommunicator,
TInspectorEXE_OpenButton* theButtonControl)
{
if (theName.IsEqual ("TKDFBrowser"))
{
theCommunicator->OpenFile (theName, fileNameInDataDir ("CSF_OCCTDataPath", "step/screw.step"));
theButtonControl->SetPluginDir (theName, fileNameInDataDir ("CSF_OCCTDataPath", "step"));
}
else if (theName.IsEqual ("TKShapeView"))
{
theCommunicator->OpenFile (theName, fileNameInDataDir ("CSF_OCCTDataPath", "occ/hammer.brep"));
theButtonControl->SetPluginDir (theName, fileNameInDataDir ("CSF_OCCTDataPath", "occ"));
}
else if (theName.IsEqual ("TKVInspector"))
{
theCommunicator->OpenFile (theName, fileNameInDataDir ("CSF_OCCTDataPath", "occ/face1.brep"));
theCommunicator->OpenFile (theName, fileNameInDataDir ("CSF_OCCTDataPath", "occ/face2.brep"));
theButtonControl->SetPluginDir (theName, fileNameInDataDir ("CSF_OCCTDataPath", "occ"));
}
}
// =======================================================================
// function : main
// purpose :
// =======================================================================
int main (int argc, char** argv)
{
OSD_Environment anEnvironment ("QTDIR");
TCollection_AsciiString aPlugindsDirName = anEnvironment.Value();
if (aPlugindsDirName.IsEmpty())
{
std::cout << "QTDIR is not defined" << std::endl;
return 0;
}
aPlugindsDirName += "/plugins";
QApplication::addLibraryPath (aPlugindsDirName.ToCString());
QApplication anApp (argc, argv);
std::set<TCollection_AsciiString> aPlugins;
for (int anArgId = 1; anArgId < argc; anArgId++ )
{
if (!strcmp (argv[anArgId], "--dfbrowser"))
aPlugins.insert ("TKDFBrowser");
if (!strcmp (argv[anArgId], "--shapeview"))
aPlugins.insert ("TKShapeView");
if (!strcmp (argv[anArgId], "--vinspector"))
aPlugins.insert ("TKVInspector");
}
NCollection_List<Handle(Standard_Transient)> aParameters;
// Create tool communicator
TInspector_Communicator* aCommunicator = TInspectorEXE_OpenFileDialog::Communicator();
if (!aCommunicator)
{
std::cout << "Communicator can not be created" << std::endl;
return 0;
}
TInspectorEXE_OpenButton* aButtonControl = new TInspectorEXE_OpenButton (0);
TCollection_AsciiString anActivatedPluginName;
if (aPlugins.empty())
{
aPlugins.insert("TKDFBrowser");
aPlugins.insert("TKShapeView");
aPlugins.insert("TKVInspector");
anActivatedPluginName = "TKDFBrowser";
}
else
anActivatedPluginName = *aPlugins.rbegin();
for (std::set<TCollection_AsciiString>::const_iterator aPluginIt = aPlugins.begin(); aPluginIt != aPlugins.end(); aPluginIt++)
{
TCollection_AsciiString aName = *aPluginIt;
aCommunicator->RegisterPlugin (aName);
aCommunicator->Init (aName, aParameters);
setPluginSampleDirectory (aName, aCommunicator, aButtonControl);
}
aCommunicator->Activate (anActivatedPluginName);
aCommunicator->SetVisible (true);
aCommunicator->SetOpenButton (aButtonControl->StartButton());
return anApp.exec();
}

@ -0,0 +1,6 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>icons/folder_open.png</file>
<file>icons/folder_import.png</file>
</qresource>
</RCC>

@ -0,0 +1,311 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <TInspectorEXE_OpenFileDialog.hxx>
#include <TInspector_Communicator.hxx>
#include <TInspectorEXE_OpenFileViewModel.hxx>
#include <QApplication>
#include <QCompleter>
#include <QDir>
#include <QFileDialog>
#include <QFileSystemModel>
#include <QItemSelectionModel>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QLabel>
#include <QLineEdit>
#include <QScrollBar>
#include <QTableView>
#include <QToolButton>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
const int FONT_POINT_SIZE = 18;
const int ICON_SIZE = 40;
const int OPEN_DIALOG_WIDTH = 550;
const int OPEN_DIALOG_HEIGHT = 200;
const int MARGIN_DIALOG = 4;
const int SPACING_DIALOG = 2;
TInspector_Communicator* MyCommunicator;
// =======================================================================
// function : StartButton
// purpose :
// =======================================================================
QPushButton* TInspectorEXE_OpenButton::StartButton()
{
if (!myStartButton)
{
myStartButton = new QPushButton();
myStartButton->setIcon (QIcon (":/icons/folder_open.png"));
connect (myStartButton, SIGNAL (clicked()), this, SLOT (onStartButtonClicked()));
}
return myStartButton;
}
// =======================================================================
// function : onStartButtonClicked
// purpose :
// =======================================================================
void TInspectorEXE_OpenButton::onStartButtonClicked()
{
QPushButton* aButton = (QPushButton*)sender();
TCollection_AsciiString aPluginName (aButton->objectName().toStdString().c_str());
if (aPluginName.IsEmpty())
return;
QString aDataDirName = QDir::currentPath();
if (myDefaultDirs.IsBound (aPluginName))
aDataDirName = myDefaultDirs.Find (aPluginName).ToCString();
QString aFileName = TInspectorEXE_OpenFileDialog::OpenFile (0, aDataDirName);
aFileName = QDir().toNativeSeparators (aFileName);
if (!aFileName.isEmpty()) {
QApplication::setOverrideCursor (Qt::WaitCursor);
TInspectorEXE_OpenFileDialog::Communicator()->OpenFile (aPluginName, TCollection_AsciiString (aFileName.toUtf8().data()));
QApplication::restoreOverrideCursor();
}
}
// =======================================================================
// function : changeMargins
// purpose :
// =======================================================================
void changeMargins (QBoxLayout* theLayout)
{
theLayout->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
theLayout->setSpacing (SPACING_DIALOG);
}
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
TInspectorEXE_OpenFileDialog::TInspectorEXE_OpenFileDialog (QWidget* theParent, const QString& theDataDirName)
: QDialog(theParent), myDataDir (theDataDirName)
{
setWindowTitle (theDataDirName);
QVBoxLayout* aDialogLay = new QVBoxLayout (this);
changeMargins (aDialogLay);
// Title label
QLabel* aTitleLabel = new QLabel (this);
aTitleLabel->setText (tr ("Open File"));
aDialogLay->addWidget (aTitleLabel);
// Samples View
QGroupBox* aSamplesBox = new QGroupBox (this);
aSamplesBox->setTitle (tr ("Samples"));
aDialogLay->addWidget (aSamplesBox);
QVBoxLayout* aSampleLay = new QVBoxLayout (aSamplesBox);
changeMargins (aSampleLay);
mySamplesView = createTableView (readSampleNames());
aSampleLay->addWidget (mySamplesView);
// Select file
QGroupBox* aSelectFileBox = new QGroupBox (this);
aSelectFileBox->setTitle (tr ("Select file"));
aDialogLay->addWidget (aSelectFileBox);
QGridLayout* aSelectFileLay = new QGridLayout (aSelectFileBox);
aSelectFileLay->setContentsMargins (MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG, MARGIN_DIALOG);
mySelectedName = new QLineEdit (aSelectFileBox);
QCompleter* aCompleter = new QCompleter();
QFileSystemModel* aFileSystemModel = new QFileSystemModel;
aFileSystemModel->setRootPath (QDir::rootPath());
aCompleter->setModel (aFileSystemModel);
mySelectedName->setCompleter (aCompleter);
aSelectFileLay->addWidget (mySelectedName, 1, 0);
QToolButton* aSelectFileBtn = new QToolButton (aSelectFileBox);
aSelectFileBtn->setIcon (QIcon (":/icons/folder_open.png"));
aSelectFileLay->addWidget (aSelectFileBtn, 1, 1);
myFolderApplyOpen = new QToolButton (aSelectFileBox);
myFolderApplyOpen->setIcon (QIcon (":/icons/folder_import.png"));
myFolderApplyOpen->setIconSize (QSize (ICON_SIZE, ICON_SIZE));
myFolderApplyOpen->setEnabled (false);
aSelectFileLay->addWidget (myFolderApplyOpen, 0, 2, 2, 1);
connect (mySelectedName, SIGNAL (textChanged (const QString&)),
this, SLOT (onNameChanged (const QString&)));
connect (aSelectFileBtn, SIGNAL (clicked()), this, SLOT (onSelectClicked()));
connect (myFolderApplyOpen, SIGNAL (clicked()), this, SLOT (onApplySelectClicked()));
resize (OPEN_DIALOG_WIDTH, OPEN_DIALOG_HEIGHT);
}
// =======================================================================
// function : OpenFile
// purpose :
// =======================================================================
QString TInspectorEXE_OpenFileDialog::OpenFile (QWidget* theParent, const QString& theDataDirName)
{
QString aFileName;
TInspectorEXE_OpenFileDialog* aDialog = new TInspectorEXE_OpenFileDialog(theParent, theDataDirName);
if (aDialog->exec() == QDialog::Accepted)
aFileName = aDialog->GetFileName();
return aFileName;
}
// =======================================================================
// function : Communicator
// purpose :
// =======================================================================
TInspector_Communicator* TInspectorEXE_OpenFileDialog::Communicator()
{
if (!MyCommunicator)
MyCommunicator = new TInspector_Communicator();
return MyCommunicator;
}
// =======================================================================
// function : onSampleSelectionChanged
// purpose :
// =======================================================================
void TInspectorEXE_OpenFileDialog::onSampleSelectionChanged (const QItemSelection& theSelected,
const QItemSelection&)
{
QItemSelectionModel* aSelectionModel = (QItemSelectionModel*)sender();
if (!aSelectionModel)
return;
if (theSelected.isEmpty())
return;
QModelIndex anIndex = theSelected.first().indexes().first();
if (!anIndex.isValid())
return;
myFileName = aSelectionModel->model()->data (anIndex, Qt::ToolTipRole).toString();
accept();
}
// =======================================================================
// function : onNameChanged
// purpose :
// =======================================================================
void TInspectorEXE_OpenFileDialog::onNameChanged (const QString& theText)
{
QFileInfo aFileInfo (theText);
bool anExists = aFileInfo.exists() && aFileInfo.isFile();
myFolderApplyOpen->setEnabled (anExists);
}
// =======================================================================
// function : onSelectClicked
// purpose :
// =======================================================================
void TInspectorEXE_OpenFileDialog::onSelectClicked()
{
QString anEnteredPath;
QString aDirName = mySelectedName->text();
if (!aDirName.isEmpty())
{
QDir aDir (aDirName);
if (aDir.exists())
anEnteredPath = aDirName;
}
QString aFileName = QFileDialog::getOpenFileName (0, "Open document", anEnteredPath);
if (aFileName.isEmpty())
return; // do nothing, left the previous value
mySelectedName->setText (aFileName);
onNameChanged (aFileName);
}
// =======================================================================
// function : onApplySelectClicked
// purpose :
// =======================================================================
void TInspectorEXE_OpenFileDialog::onApplySelectClicked()
{
myFileName = mySelectedName->text();
accept();
}
// =======================================================================
// function : createTableView
// purpose :
// =======================================================================
QTableView* TInspectorEXE_OpenFileDialog::createTableView (const QStringList& theFileNames)
{
QTableView* aTableView = new QTableView (this);
aTableView->setFrameStyle (QFrame::NoFrame);
QPalette aPalette = aTableView->viewport()->palette();
QColor aWindowColor = aPalette.color (QPalette::Window);
aPalette.setBrush (QPalette::Base, aWindowColor);
aTableView->viewport()->setPalette (aPalette);
aTableView->horizontalHeader()->setVisible (false);
aTableView->verticalHeader()->setVisible (false);
aTableView->setGridStyle (Qt::NoPen);
aTableView->setModel (createModel (theFileNames));
aTableView->setItemDelegateForRow (0, new TInspectorEXE_OpenFileItemDelegate (aTableView,
aPalette.color (QPalette::Highlight)));
aTableView->viewport()->setAttribute (Qt::WA_Hover);
int aCellHeight = ICON_SIZE + aTableView->verticalHeader()->defaultSectionSize();
aTableView->setRowHeight (0, aCellHeight);
int aScrollHeight = aTableView->horizontalScrollBar()->sizeHint().height();
aTableView->setMinimumHeight (aCellHeight + aScrollHeight);
QItemSelectionModel* aSelectionModel = new QItemSelectionModel (aTableView->model());
connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
this, SLOT (onSampleSelectionChanged (const QItemSelection&, const QItemSelection&)));
aTableView->setSelectionModel (aSelectionModel);
return aTableView;
}
// =======================================================================
// function : createModel
// purpose :
// =======================================================================
QAbstractItemModel* TInspectorEXE_OpenFileDialog::createModel (const QStringList& theFileNames)
{
TInspectorEXE_OpenFileViewModel* aModel = new TInspectorEXE_OpenFileViewModel (this);
aModel->Init (theFileNames);
return aModel;
}
// =======================================================================
// function : readSampleNames
// purpose :
// =======================================================================
QStringList TInspectorEXE_OpenFileDialog::readSampleNames()
{
QStringList aNames;
QDir aDir(myDataDir);
aDir.setSorting(QDir::Name);
QFileInfoList aDirEntries = aDir.entryInfoList();
for (int aDirId = 0; aDirId < aDirEntries.size(); ++aDirId)
{
QFileInfo aFileInfo = aDirEntries.at(aDirId);
if (aFileInfo.isFile())
aNames.append (aFileInfo.absoluteFilePath());
}
return aNames;
}

@ -0,0 +1,143 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef TInspectorEXE_OpenFileDialog_H
#define TInspectorEXE_OpenFileDialog_H
#include <NCollection_DataMap.hxx>
#include <TCollection_AsciiString.hxx>
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QDialog>
#include <QItemSelection>
#include <QStringList>
#include <map>
class TInspector_Communicator;
class QAbstractItemModel;
class QLineEdit;
class QPushButton;
class QTableView;
class QToolButton;
class QWidget;
//! \class TInspectorEXE_OpenButton
//! Class that contains push button and the button processing. It obtains a file name from the default or current
//! directory and gives the name into TInspector communicator
//! Object name of the button is the name of the plugin to get the default directory, or the current directory is used.
class TInspectorEXE_OpenButton : public QObject
{
Q_OBJECT
public:
//! Constructor
TInspectorEXE_OpenButton (QObject* theParent) : QObject (theParent), myStartButton (0) {}
//! Destructor
virtual ~TInspectorEXE_OpenButton() {}
//! Returns the start button, if this is the first call, it creates the button and connect it to the slot
QPushButton* StartButton();
//! Sets the default directory of plugin.
void SetPluginDir (const TCollection_AsciiString& thePluginName, const TCollection_AsciiString& theDefaultDir)
{ myDefaultDirs.Bind (thePluginName, theDefaultDir); }
private slots:
//! Processes the button click, open default/current directory to select open file, calls OpenFile of communicator
void onStartButtonClicked();
private:
QPushButton* myStartButton; //!< processed button
NCollection_DataMap<TCollection_AsciiString, TCollection_AsciiString> myDefaultDirs; //!< plugins default directories
};
//! \class TInspectorEXE_OpenFileDialog
//! Control that contains table view of samples and line to select a file name from other directory.
//! Click on element of samples table view calls this sample opening else after entering(or opening) file name
//! the import becomes active. Click on the button will open selected file if it is possible
class TInspectorEXE_OpenFileDialog : public QDialog
{
Q_OBJECT
private:
//! Constructor
TInspectorEXE_OpenFileDialog (QWidget* theParent, const QString& theDataDirName);
public:
//! Destructor
virtual ~TInspectorEXE_OpenFileDialog() Standard_OVERRIDE {}
//! Opens this file dialog using for samples view the given directory and try to open new file
//! \param theParent a parent for the new dialog
//! \param theDataDirName path to default samples directory
//! \returns a file name from the open file dialog
static QString OpenFile (QWidget* theParent, const QString& theDataDirName);
//! Returns selection name from the dialog
QString GetFileName() const { return myFileName; }
//! Returns communicator, if this is the first call, create a communicator instance
static TInspector_Communicator* Communicator();
private slots:
//! Stores name of selected sample file
void onSampleSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
//! Updates enabling state of Open file button, it is enabled if the file by the entered path exists
//! \param theText a file name text in line edit
void onNameChanged (const QString& theText);
//! Open file dialog to select a file name. Fills file name line, enable import button
void onSelectClicked();
//! Accepts open file dialog
void onApplySelectClicked();
private:
//! Creates view of file names in samples directory
//! \param theFileNames a container of names
//! \return table view
QTableView* createTableView (const QStringList& theFileNames);
//! Creates view model and fills it by the file names
//! \param theFileNames a container of names
//! \return model
QAbstractItemModel* createModel (const QStringList& theFileNames);
//! Generates container of file names in samples directory
//! \return container of names
QStringList readSampleNames();
private:
QString myDataDir; //!< samples directory
QString myFileName; //!< result file name
QTableView* mySamplesView; //! <view of sample file names
QLineEdit* mySelectedName; //!< alternative control to open file
QToolButton* myFolderApplyOpen; //! button to open file
};
#endif

@ -0,0 +1,75 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <TInspectorEXE_OpenFileViewModel.hxx>
#include <QApplication>
#include <QFileInfo>
#include <QIcon>
#include <QPainter>
const int ICON_SIZE = 40;
// =======================================================================
// function : paint
// purpose :
// =======================================================================
void TInspectorEXE_OpenFileItemDelegate::paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
const QModelIndex& theIndex) const
{
// highlight cell
if (theOption.state & QStyle::State_MouseOver)
thePainter->fillRect (theOption.rect, myColor);
// action icon for all indices before the last one
QIcon anIcon (":/icons/folder_import.png");
QSize anIconSize (ICON_SIZE, ICON_SIZE);
int aWidth = theOption.rect.width();
int aCenter = aWidth / 2.;
int aHalf = anIconSize.width() / 2.;
int aMargin = qApp->style()->pixelMetric (QStyle::PM_HeaderMargin);
thePainter->drawPixmap (QRect (theOption.rect.left() + (aCenter - aHalf),
theOption.rect.top() + aMargin,
anIconSize.width(),
anIconSize.height()),
anIcon.pixmap(anIconSize.width(), anIconSize.height()));
// default paint
QItemDelegate::paint (thePainter, theOption, theIndex);
}
// =======================================================================
// function : Init
// purpose :
// =======================================================================
void TInspectorEXE_OpenFileViewModel::Init (const QStringList& theValues)
{
myValues = theValues;
}
// =======================================================================
// function : data
// purpose :
// =======================================================================
QVariant TInspectorEXE_OpenFileViewModel::data (const QModelIndex& theIndex, int theRole) const
{
switch (theRole)
{
case Qt::DisplayRole: return QFileInfo (myValues[theIndex.column()]).fileName();
case Qt::ToolTipRole: return myValues[theIndex.column()];
case Qt::TextAlignmentRole: return QVariant (Qt::AlignBottom | Qt::AlignHCenter);
default: break;
}
return QVariant();
}

@ -0,0 +1,99 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef TInspectorEXE_OpenFileViewModel_H
#define TInspectorEXE_OpenFileViewModel_H
#include <Standard_Macro.hxx>
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QAbstractTableModel>
#include <QStringList>
#include <QItemDelegate>
class QObject;
class QPainter;
//! \class TInspectorEXE_OpenFileItemDelegate
//! Draws large(40x40) icons in cell. The icon background in colored in highlight when mouse is over button
class TInspectorEXE_OpenFileItemDelegate : public QItemDelegate
{
public:
//! Constructor
TInspectorEXE_OpenFileItemDelegate (QObject* theParent, const QColor& theHighlightColor)
: QItemDelegate (theParent), myColor(theHighlightColor) {}
//! Destructor
virtual ~TInspectorEXE_OpenFileItemDelegate() {}
//! Draw an icon in the cell
//! \param thePainter a painter
//! \param theOption a paint options
//! \param theIndex a view index
virtual void paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
const QModelIndex& theIndex) const Standard_OVERRIDE;
private:
QColor myColor; //!< highlight color
};
//! \class TInspectorEXE_OpenFileViewModel
//! Table model that visualizes container of string values (file names)
//! Table orientation is horizontal, it has 1 row, number of columns equals to number of values
class TInspectorEXE_OpenFileViewModel : public QAbstractTableModel
{
public:
//! Constructor
TInspectorEXE_OpenFileViewModel (QObject* theParent = 0) : QAbstractTableModel (theParent) {}
//! Destructor
virtual ~TInspectorEXE_OpenFileViewModel() {}
//! Store values
//! \param theValues a container of values to fill model
void Init (const QStringList& theValues);
//! Returns content of the model index for the given role, it is obtained from internal container of values
//! It returns value only for DisplayRole.
//! \param theIndex a model index
//! \param theRole a view role
//! \return value intepreted depending on the given role
virtual QVariant data (const QModelIndex& theIndex, int theRole = Qt::DisplayRole) const Standard_OVERRIDE;
//! Returns number of rows
//! \param theParent an index of the parent item
//! \return an integer value
virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
{ (void)theParent; return 1; }
//! Returns number of columns
//! \param theParent an index of the parent item
//! \return an integer value
virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
{ (void)theParent; return myValues.size(); }
private:
QStringList myValues; //!< file names
};
#endif

Binary file not shown.

After

(image error) Size: 1.2 KiB

Binary file not shown.

After

(image error) Size: 1.4 KiB

Binary file not shown.

After

(image error) Size: 1.9 KiB

@ -0,0 +1,127 @@
cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
project (TStandalone)
set (CASROOT "" CACHE PATH "Third party OpenCascade dir" )
set (3RDPARTY_DIR "" CACHE PATH "Third party dir" )
set (INSTALL_DIR "" CACHE PATH "Where to install" )
set (USE_QT4 ON CACHE BOOL "${USE_QT4}")
if (NOT "$ENV{CASROOT}" STREQUAL "" AND EXISTS "$ENV{CASROOT}")
set (CASROOT "$ENV{CASROOT}")
#set (3RDPARTY_OCCT_DIR "${CASROOT}")
#message("Environment CASROOT: ${CASROOT}")
#message("Environment 3RDPARTY_OCCT_DIR: ${CASROOT}")
endif()
if (NOT "$ENV{THIRDPARTY_DIR}" STREQUAL "" AND EXISTS "$ENV{THIRDPARTY_DIR}")
set (3RDPARTY_DIR "$ENV{THIRDPARTY_DIR}")
message("Environment THIRDPARTY_DIR: ${3RDPARTY_DIR}")
endif()
if (NOT "$ENV{INSTALL_DIR}" STREQUAL "")
set (INSTALL_DIR "$ENV{INSTALL_DIR}")
message("Environment INSTALL_DIR: ${INSTALL_DIR}")
endif()
# Define the next variable to has defined 3rdParties DLL dir variables
set (BUILD_SHARED_LIBS ON)
set (CASROOT_SOURCE_FILES "${CMAKE_SOURCE_DIR}/../../.." CACHE PATH "OCCT sources dir to find tools packages" )
if ("${CASROOT}" STREQUAL "")
set (CASROOT "${CASROOT_SOURCE_FILES}/work/install" CACHE PATH "OCCT sources dir to find tools packages" )
endif()
macro (OCCT_INCLUDE_CMAKE_FILE BEING_INCLUDED_FILE)
include (${CASROOT_SOURCE_FILES}/${BEING_INCLUDED_FILE}.cmake)
endmacro()
macro (OCCT_INCLUDE_CMAKE_FILE_STANDALONE BEING_INCLUDED_FILE)
include (${CMAKE_SOURCE_DIR}/${BEING_INCLUDED_FILE}.cmake)
endmacro()
set (ADDITIONAL_DLL_DIR "" CACHE PATH "Additional paths that should be included into PATH" )
if (NOT "$ENV{ADDITIONAL_DLL_DIR}" STREQUAL "")
set (ADDITIONAL_DLL_DIR "$ENV{ADDITIONAL_DLL_DIR}")
message("Environment ADDITIONAL_DLL_DIR: ${ADDITIONAL_DLL_DIR}")
endif()
set (CMAKE_CONFIGURATION_TYPES Release Debug RelWithDebInfo CACHE INTERNAL "" FORCE)
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/3rdparty_macro")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros")
OCCT_INCLUDE_CMAKE_FILE_STANDALONE("adm/cmake/occt")
if (OCCT_LIBRARY_NOT_FOUND)
message (FATAL_ERROR "Could NOT find OCCT Library in : ${3RDPARTY_OCCT_LIBRARY_DIR}" )
endif()
OCCT_MAKE_OS_WITH_BITNESS()
OCCT_MAKE_COMPILER_SHORT_NAME()
set (CMAKE_INSTALL_PREFIX "${INSTALL_DIR}" CACHE INTERNAL "" FORCE )
set (INSTALL_API_DIR "${INSTALL_DIR}/api" CACHE PATH "" FORCE)
set (INSTALL_DIR_BIN "${OS_WITH_BIT}/${COMPILER}/bin" CACHE PATH "" FORCE)
set (INSTALL_DIR_LIB "${OS_WITH_BIT}/${COMPILER}/lib" CACHE PATH "" FORCE)
set (INSTALL_DIR_INCLUDE "inc" CACHE PATH "")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/freetype")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/freeimage")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/gl2ps")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tbb")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt5")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/occt_macros")
#include (${CMAKE_SOURCE_DIR}/adm/cmake/3rdparty.cmake)
set (3RDPARTY_DLL_PATH "${USED_3RDPARTY_OCCT_DIRS};\
${USED_3RDPARTY_FREETYPE_DIR};\
${USED_3RDPARTY_FREEIMAGE_DIRS};\
${USED_3RDPARTY_GL2PS_DIRS};\
${3RDPARTY_QT_DIR}/bin;\
${3RDPARTY_TBB_DLL_DIR}")
if (ADDITIONAL_DLL_DIR)
set (3RDPARTY_DLL_PATH "${3RDPARTY_DLL_PATH};\
${ADDITIONAL_DLL_DIR}")
endif()
set (3RDPARTY_DLL_DEB_PATH "${3RDPARTY_DLL_PATH}")
set (BUILD_TOOLKITS
TKTInspectorAPI
TKView
TKTreeModel
TKDFBrowser
TKVInspector
TKShapeView
TKTInspector
TKToolsDraw
)
string(TIMESTAMP CURRENT_TIME "%H:%M:%S")
message (STATUS "\nInfo: \(${CURRENT_TIME}\) Start collecting all header files into ${CMAKE_BINARY_DIR}/inc ...")
# collect all the headers to <binary dir>/inc folder
COLLECT_AND_INSTALL_OCCT_HEADER_FILES ("${CMAKE_BINARY_DIR}" "${BUILD_TOOLKITS}" "${CASROOT_SOURCE_FILES}/tools" "${INSTALL_DIR_INCLUDE}")
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/standalone_macros")
OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/qt5_macro")
set (BUILD_PROJECTS
TInspectorAPI
View
TreeModel
DFBrowserPane
DFBrowserPaneXDE
DFBrowser
ShapeView
VInspector
TInspector
TInspectorEXE
ToolsDraw
)
# include patched toolkit projects or original ones
foreach (PROJECT_ITEM ${BUILD_PROJECTS})
OCCT_ADD_SUBDIRECTORY ("src/${PROJECT_ITEM}")
endforeach()

@ -0,0 +1,75 @@
#freeimage
if(NOT "${CASROOT}" STREQUAL "")
#message(FATAL_ERROR, "Empty OCCT dir")
#return()
#set("3RDPARTY_OCCT_DIR ${CASROOT}")
endif()
#set(3RDPARTY_OCC_DIR ${CASROOT})
#message("3RDPARTY_OCC_DIR: ${3RDPARTY_OCC_DIR}")
#set("3RDPARTY_OCC_DIR ${3RDPARTY_OCCT_DIR}")
#message("3RDPARTY_OCC_DIR: ${3RDPARTY_OCC_DIR}")
set(CSF_TKernel "TKernel")
THIRDPARTY_PRODUCT("OCCT" "Standard.hxx" "CSF_TKernel" "")
set(3RDPARTY_OCCT_DIR ${3RDPARTY_OCC_DIR} CACHE PATH "OCCT dir")
OCCT_MAKE_OS_WITH_BITNESS()
OCCT_MAKE_COMPILER_SHORT_NAME()
SET(3RDPARTY_OCCT_INCLUDE_DIR "${3RDPARTY_OCC_INCLUDE_DIR}" CACHE PATH "OCCT include dir")
SET(3RDPARTY_OCCT_LIBRARY_DIR "${3RDPARTY_OCC_LIBRARY_DIR}" CACHE PATH "OCCT library dir")
SET(3RDPARTY_OCCT_DLL_DIR "${3RDPARTY_OCC_DLL_DIR}" CACHE PATH "OCCT dll dir")
SET(CSF_StandardDefaults_DIR ${CASROOT}/src/StdResource CACHE PATH "OCCT Standard Resource")
SET(CSF_XCAFDefaults_DIR ${CASROOT}/src/StdResource CACHE PATH "OCCT XCAF Defaults")
SET(CSF_PluginDefaults_DIR ${CASROOT}/src/StdResource CACHE PATH "OCCT Plugin Defaults")
message (STATUS "... OCCT dir: ${3RDPARTY_OCCT_DIR}")
message (STATUS "... OCCT Include dirs: ${3RDPARTY_OCCT_INCLUDE_DIR}")
message (STATUS "... OCCT Library dirs: ${3RDPARTY_OCCT_LIBRARY_DIRS}")
message (STATUS "... OCCT Binary dirs: ${3RDPARTY_OCCT_DLL_DIRS}")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${3RDPARTY_OCCT_LIBRARY_DIRS}")
find_library(TKernel TKernel PATHS "${3RDPARTY_OCCT_LIBRARY_DIRS}"
PATH_SUFFIXES lib
NO_DEFAULT_PATH)
if ("${TKernel}" STREQUAL "TKernel-NOTFOUND")
set (OCCT_LIBRARY_NOT_FOUND ON)
endif()
find_library(TKMath TKMath)
find_library(TKCAF TKCAF)
find_library(TKCDF TKCDF)
find_library(TKLCAF TKLCAF)
find_library(TKVCAF TKVCAF)
find_library(TKBRep TKBRep)
find_library(TKService TKService)
find_library(TKOpenGl TKOpenGl)
find_library(TKV3d TKV3d)
find_library(TKXCAF TKXCAF)
find_library(TKXSBase TKXSBase)
find_library(TKXDESTEP TKXDESTEP)
find_library(TKXmlXCAF TKXmlXCAF)
find_library(TKXml TKXml)
find_library(TKBin TKBin)
find_library(TKBinL TKBinL)
find_library(TKBinXCAF TKBinXCAF)
find_library(TKStd TKStd)
find_library(TKXmlL TKXmlL)
find_library(TKStdL TKStdL)
# VInspector additionally:
find_library(TKBO TKBO)
# ShapeView additionally:
find_library(TKGeomBase TKGeomBase)
find_library(TKG3d TKG3d)

@ -0,0 +1,115 @@
# script for each OCCT toolkit
#Qt dependencies
#message ("Project is ${PROJECT_NAME}")
if (EXECUTABLE_PROJECT)
set (PACKAGE_PREFIX_DIR "samples/tools")
SET(SOURCE_DIR ${CMAKE_SOURCE_DIR}/../${PROJECT_NAME})
include_directories("${SOURCE_DIR}")
#message("Inc dir: ${CMAKE_SOURCE_DIR}/../${PROJECT_NAME}")
else()
set (PACKAGE_PREFIX_DIR "tools")
SET(SOURCE_DIR ${CASROOT_SOURCE_FILES}/${PACKAGE_PREFIX_DIR}/${PROJECT_NAME})
endif()
FIND_SOURCES_AND_HEADERS_FILES(${SOURCE_DIR} SOURCE_FILES HEADER_FILES)
#message ("Source dir is ${SOURCE_DIR}")
#message ("Sources are ${SOURCE_FILES}")
unset(RCC_FILES)
if (USE_QT)
FIND_QT5_PACKAGE(PROJECT_LIBRARIES_DEBUG PROJECT_LIBRARIES_RELEASE PROJECT_INCLUDES)
FIND_AND_WRAP_MOC_FILES("${SOURCE_FILES}")
FIND_AND_WRAP_RESOURCE_FILE("${SOURCE_DIR}/${PROJECT_NAME}.qrc" RCC_FILES)
endif()
if (TOOLKIT_NAME)
set(TARGET_NAME TK${PROJECT_NAME})
else ()
set(TARGET_NAME ${PROJECT_NAME})
endif()
if (EXECUTABLE_PROJECT)
add_executable (${TARGET_NAME} ${SOURCE_FILES} ${HEADER_FILES})
else()
add_library(${TARGET_NAME} SHARED ${SOURCE_FILES} ${HEADER_FILES})
endif()
include_directories(
${PROJECT_INCLUDES}
${SOURCE_DIR}
${3RDPARTY_OCCT_INCLUDE_DIR}
"${CMAKE_BINARY_DIR}/inc")
add_definitions(-D__WIN32__)
add_definitions(-DWNT)
add_definitions(-D${PROJECT_NAME}_EXPORTS)
# parce EXTERNLIB file
FILE_TO_LIST ("src/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS)
foreach (USED_ITEM ${USED_EXTERNLIB_AND_TOOLKITS})
string (REGEX MATCH "^ *#" COMMENT_FOUND ${USED_ITEM})
if (NOT COMMENT_FOUND)
set (LIB_ITEM ${USED_ITEM})
set (LIB_PARSED_ITEM ${${USED_ITEM}})
if (LIB_PARSED_ITEM)
list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT ${${USED_ITEM}})
#message("Append external lib: ${${USED_ITEM}}")
else ()
list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT ${USED_ITEM})
#message("Append lib: ${USED_ITEM}")
endif()
endif()
endforeach()
target_link_libraries (${TARGET_NAME} ${USED_TOOLKITS_BY_CURRENT_PROJECT})
if (USE_QT)
target_link_libraries (${TARGET_NAME} debug ${PROJECT_LIBRARIES_DEBUG})
target_link_libraries (${TARGET_NAME} optimized ${PROJECT_LIBRARIES_RELEASE})
if (NOT "${RCC_FILES}" STREQUAL "")
#message("RCC files: ${RCC_FILES}")
target_sources(${TARGET_NAME} PRIVATE ${RCC_FILES})
endif()
endif()
if (EXECUTABLE_PROJECT)
INSTALL(TARGETS ${TARGET_NAME} DESTINATION "${INSTALL_DIR_BIN}")
else()
if (MSVC)
install (DIRECTORY ${PROJECT_BINARY_DIR}/Debug/
DESTINATION "${INSTALL_DIR_BIN}"
FILES_MATCHING PATTERN *.pdb)
if (INSTALL_API_DIR)
install (DIRECTORY ${PROJECT_BINARY_DIR}/Debug/
DESTINATION "${INSTALL_API_DIR}/bin"
FILES_MATCHING PATTERN *.pdb)
endif()
endif()
install (TARGETS ${TARGET_NAME}
RUNTIME DESTINATION "${INSTALL_DIR_BIN}"
ARCHIVE DESTINATION "${INSTALL_DIR_LIB}"
LIBRARY DESTINATION "${INSTALL_DIR_LIB}")
if (INSTALL_API_DIR)
install (TARGETS ${TARGET_NAME}
RUNTIME DESTINATION "${INSTALL_API_DIR}/bin")
if (INSTALL_API)
INSTALL(FILES ${HEADER_FILES} DESTINATION "${INSTALL_API_DIR}/${INSTALL_DIR_INCLUDE}")
install (DIRECTORY ${PROJECT_BINARY_DIR}/Debug/
DESTINATION "${INSTALL_API_DIR}/lib"
FILES_MATCHING PATTERN *.lib)
endif()
endif()
endif()

@ -0,0 +1,33 @@
#freeimage
macro (FIND_SOURCES_AND_HEADERS_FILES CURRENT_SOURCES_DIR SOURCE_FILES HEADER_FILES)
if (EXISTS "${CURRENT_SOURCES_DIR}/FILES")
file (STRINGS "${CURRENT_SOURCES_DIR}/FILES" HEADER_FILES_H REGEX ".+[.]h")
file (STRINGS "${CURRENT_SOURCES_DIR}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
if (NOT "${HEADER_FILES_H}" STREQUAL "")
foreach (ORIGIN_FILE ${HEADER_FILES_H})
list (APPEND HEADER_FILES_ ${CURRENT_SOURCES_DIR}/${ORIGIN_FILE})
endforeach()
#message("${HEADER_FILES_}")
set(${HEADER_FILES} ${HEADER_FILES_})
endif()
if(NOT "${SOURCE_FILES_C}" STREQUAL "")
foreach (ORIGIN_FILE ${SOURCE_FILES_C})
list (APPEND SOURCE_FILES_ ${CURRENT_SOURCES_DIR}/${ORIGIN_FILE})
endforeach()
#message("${SOURCE_FILES_}")
set(${SOURCE_FILES} ${SOURCE_FILES_})
endif()
#set(${HEADER_FILES} ${HEADER_FILES_H})
#set(${SOURCE_FILES} ${SOURCE_FILES_C})
else()
message(WARNING "file FILES is absent in $TARGET")
endif()
endmacro()

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<LocalDebuggerEnvironment>PATH=@3RDPARTY_DLL_DEB_PATH@;@CMAKE_INSTALL_PREFIX@/@INSTALL_DIR_BIN@;%PATH%
DATA_DIR=@INSTALL_DIR@/data
QTDIR=@3RDPARTY_QT_DIR@
CSF_OCCTDataPath=@3RDPARTY_OCCT_DIR@/data
</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<LocalDebuggerEnvironment>PATH=@3RDPARTY_DLL_DEB_PATH@;@CMAKE_INSTALL_PREFIX@/@INSTALL_DIR_BIN@;%PATH%
DATA_DIR=@INSTALL_DIR@/data
QTDIR=@3RDPARTY_QT_DIR@
CSF_OCCTDataPath=@3RDPARTY_OCCT_DIR@/data
</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<LocalDebuggerEnvironment>PATH=@3RDPARTY_DLL_DEB_PATH@;@CMAKE_INSTALL_PREFIX@/@INSTALL_DIR_BIN@;%PATH%
DATA_DIR=@INSTALL_DIR@/data
QTDIR=@3RDPARTY_QT_DIR@
CSF_OCCTDataPath=@3RDPARTY_OCCT_DIR@/data
CSF_ShadersDirectory=@CASROOT@/src/Shaders
</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|x64'" Label="Configuration">
</PropertyGroup>
</Project>

@ -0,0 +1 @@
@OCCT_HEADER_FILE_CONTENT@

@ -0,0 +1,11 @@
project(DFBrowser)
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
set (USE_QT ON)
set (TOOLKIT_NAME ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)
unset (TOOLKIT_NAME)

@ -0,0 +1,29 @@
DFBrowserPane
DFBrowserPaneXDE
TKBRep
TKMath
TKV3d
TKBRep
TKBin
TKBinL
TKBinXCAF
TKCAF
TKCDF
TKernel
TKLCAF
TKMath
TKOpenGl
TKService
TKStd
TKStdL
TKTInspector
TKTInspectorAPI
TKTreeModel
TKV3d
TKView
TKXSBase
TKXCAF
TKXDESTEP
TKXmlXCAF
TKXml
TKXmlL

@ -0,0 +1,5 @@
project(DFBrowserPane)
set (USE_QT ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)

@ -0,0 +1,12 @@
TKG3d
TKTInspectorAPI
TKTreeModel
TKernel
TKMath
TKService
TKV3d
TKVCAF
TKCDF
TKCAF
TKLCAF
TKBRep

@ -0,0 +1,5 @@
project(DFBrowserPaneXDE)
set (USE_QT ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)

@ -0,0 +1,7 @@
DFBrowserPane
TKernel
TKTInspectorAPI
TKXSBase
TKXDESTEP
TKBRep
TKXCAF

@ -0,0 +1,11 @@
project(ShapeView)
set (USE_QT ON)
set (TOOLKIT_NAME ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)
unset (TOOLKIT_NAME)

@ -0,0 +1,8 @@
TKBRep
TKGeomBase
TKG3d
TKMath
TKTInspectorAPI
TKTreeModel
TKService
TKView

@ -0,0 +1,11 @@
project(TInspector)
set (USE_QT ON)
set (TOOLKIT_NAME ON)
set (INSTALL_API ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)
unset (TOOLKIT_NAME)
unset (INSTALL_API)

@ -0,0 +1,2 @@
TKernel
TKTInspectorAPI

@ -0,0 +1,10 @@
project(TInspectorAPI)
set (TOOLKIT_NAME ON)
set (INSTALL_API ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (TOOLKIT_NAME)
unset (INSTALL_API)

@ -0,0 +1,2 @@
TKernel
TKLCAF

@ -0,0 +1,13 @@
project(TInspectorEXE)
set (USE_QT ON)
set (EXECUTABLE_PROJECT ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)
unset (EXECUTABLE_PROJECT)
configure_file(${CMAKE_SOURCE_DIR}/adm/templates/${PROJECT_NAME}.vcxproj.user.in
${${PROJECT_NAME}_BINARY_DIR}/${PROJECT_NAME}.vcxproj.user @ONLY)

@ -0,0 +1,8 @@
TKBRep
TKG3d
TKService
TKTInspector
TKXCAF
TKXDESTEP
TKXSBase
TKView

@ -0,0 +1,10 @@
project(TreeModel)
set (USE_QT ON)
set (TOOLKIT_NAME ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)

@ -0,0 +1,9 @@
project(VInspector)
set (USE_QT ON)
set (TOOLKIT_NAME ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)
unset (TOOLKIT_NAME)

@ -0,0 +1,10 @@
TKBO
TKBRep
TKG3d
TKernel
TKMath
TKTInspectorAPI
TKTreeModel
TKService
TKV3d
TKView

@ -0,0 +1,9 @@
project(View)
set (USE_QT ON)
set (TOOLKIT_NAME ON)
OCCT_INCLUDE_CMAKE_FILE_STANDALONE ("adm/cmake/occt_toolkit_standalone")
unset (USE_QT)

@ -0,0 +1,5 @@
TKernel
TKMath
TKService
TKOpenGl
TKV3d

@ -48,3 +48,4 @@ TOBJ : TKTObjDRAW
DFBROWSER : TKDFBrowser
QAcommands : TKQADraw
VIS : TKIVtkDraw
TOOLS : TKToolsDraw

3
tests/tools/begin Normal file

@ -0,0 +1,3 @@
if { [array get Draw_Groups "TOOLS Check commands"] == "" } {
pload TOOLS
}

12
tests/tools/dfbrowser/A1 Normal file

@ -0,0 +1,12 @@
pload DCAF
pload TOOLS
NewDocument Doc BinOcaf
set aSetAttr1 100
set aLabel 0:2
SetInteger Doc ${aLabel} ${aSetAttr1}
tinspector -dfbrowser
tinspector -update

53
tests/tools/dfbrowser/A2 Normal file

@ -0,0 +1,53 @@
pload DCAF
pload VISUALIZATION
pload TOOLS
chrono qat start
# Create a new document and set UndoLimit
NewDocument D BinOcaf
tinspector -dfbrowser
#NewDocument D
cpulimit 300
UndoLimit D 100
# Open a transaction
NewCommand D
#1 - create box using more flexible set of commands
NewCommand D
# add object
set B2 [AddObject D]
# add function
set F2 [AddFunction D $B2 Box]
# set argumets of this function
BoxDX D $B2 190
BoxDY D $B2 290
BoxDZ D $B2 390
# initialize (clean) internal maps of labels
InitLogBook D
AddDriver D Box Attach Cyl
# compute the function
ComputeFun D $F2
# check result
set IsDone [catch {GetShape D $F2:2 Box2} aResult]
if { ${IsDone} != 0 } {
puts "Error: Get a value of TNaming_NamedShape attribute from restoring document"
} else {
puts "OK: Value of TNaming_NamedShape attribute from restoring document was got"
}
if { [regexp "SOLID FORWARD" [whatis Box2] ] != 1 } {
puts "Error: Box2 is not a solid forward"
} else {
puts "OK: Box2 is a solid forward"
}
# referes to result NS
GetReference D $B2;
tinspector -update
vinit
vdisplay Box2
vfit
checkview -screenshot -3d -path ${imagedir}/${test_image}.png

2
tests/tools/end Normal file

@ -0,0 +1,2 @@
# to end a test script
puts "TEST COMPLETED"

1
tests/tools/grids.list Normal file

@ -0,0 +1 @@
001 dfbrowser

2
tests/tools/parse.rules Normal file

@ -0,0 +1,2 @@
FAILED /\bFaulty\b/ bad shape
OK /Relative error of mass computation/ message from vprops

@ -0,0 +1,12 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>icons/item_type_folder.png</file>
<file>icons/item_type_folder_40x40.png</file>
<file>icons/level_change.png</file>
<file>icons/search.png</file>
<file>icons/search_cancel.png</file>
<file>icons/treeline_backward.png</file>
<file>icons/treeline_forward.png</file>
<file>icons/treeline_update.png</file>
</qresource>
</RCC>

@ -0,0 +1,142 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_AttributePaneStack.hxx>
#include <DFBrowserPane_AttributePaneAPI.hxx>
#include <DFBrowserPane_AttributePaneSelector.hxx>
#include <DFBrowser_Item.hxx>
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowser_TreeLevelView.hxx>
#include <DFBrowser_TreeModel.hxx>
#include <DFBrowser_SearchView.hxx>
#include <DFBrowser_Window.hxx>
#include <TDF_Attribute.hxx>
#include <QItemSelectionModel>
#include <QMap>
#include <QStackedWidget>
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_AttributePaneStack::DFBrowser_AttributePaneStack (QObject* theParent)
: QObject (theParent), myCurrentPane (0), myAttributesStack (0), myModule (0), myTreeLevelView (0),
mySearchView (0), myEmptyWidget (0), myPaneMode (DFBrowser_AttributePaneType_ItemView)
{
myPaneSelector = new DFBrowserPane_AttributePaneSelector (theParent);
}
// =======================================================================
// function : CreateWidget
// purpose :
// =======================================================================
void DFBrowser_AttributePaneStack::CreateWidget (QWidget* theParent)
{
myAttributesStack = new QStackedWidget (theParent);
DFBrowser_Window::SetWhiteBackground (myAttributesStack);
myEmptyWidget = new QWidget (theParent);
DFBrowser_Window::SetWhiteBackground (myEmptyWidget);
myAttributesStack->addWidget (myEmptyWidget);
myTreeLevelView = new DFBrowser_TreeLevelView (theParent);
myAttributesStack->addWidget (myTreeLevelView->GetControl());
mySearchView = new DFBrowser_SearchView (theParent);
myAttributesStack->addWidget (mySearchView->GetControl());
myAttributesStack->setCurrentWidget (myEmptyWidget);
}
// =======================================================================
// function : SetPaneMode
// purpose :
// =======================================================================
void DFBrowser_AttributePaneStack::SetPaneMode (const DFBrowser_AttributePaneType& theMode)
{
if (myPaneMode == theMode)
return;
myPaneMode = theMode;
if (myPaneMode == DFBrowser_AttributePaneType_SearchView)
{
//! clear highlight in tree model
DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
if (aModel && aModel->HasHighlighted())
aModel->SetHighlighted (QModelIndexList());
myAttributesStack->setCurrentWidget (mySearchView->GetControl());
}
else
{
QItemSelectionModel* aSelectionModel = myModule->GetOCAFViewSelectionModel();
QModelIndex anIndex = DFBrowser_Window::SingleSelected (aSelectionModel->selectedIndexes(), 0);
SetCurrentItem (anIndex);
}
}
// =======================================================================
// function : SetCurrentItem
// purpose :
// =======================================================================
void DFBrowser_AttributePaneStack::SetCurrentItem (const QModelIndex& theIndex)
{
if (myPaneMode != DFBrowser_AttributePaneType_ItemView)
return;
//! clear highlight in tree model
DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (myModule->GetOCAFViewModel());
if (aModel && aModel->HasHighlighted())
aModel->SetHighlighted (QModelIndexList());
myCurrentPane = 0;
QWidget* aWidget = 0;
TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (theIndex);
if (!anItemBase)
return;
if (DFBrowser_TreeLevelView::ProcessItem (theIndex))
aWidget = myTreeLevelView->GetControl();
else
{
DFBrowser_ItemPtr anItem = itemDynamicCast<DFBrowser_Item> (anItemBase);
if (!anItem)
return;
if (myAttributesStack->currentWidget() == myTreeLevelView->GetControl())
myTreeLevelView->ClearSelection();
Handle(TDF_Attribute) anAttribute = anItem->GetAttribute();
myCurrentPane = myModule->GetAttributePane (anAttribute);
if (myCurrentPane)
{
aWidget = myCurrentPane->GetWidget (myAttributesStack, true);
if (aWidget)
{
int aWidgetIndex = myAttributesStack->indexOf (aWidget);
if (aWidgetIndex < 0)
myAttributesStack->addWidget (aWidget);
}
myCurrentPane->Init (anAttribute);
std::list<QItemSelectionModel*> aSelectionModels = myCurrentPane->GetSelectionModels();
myPaneSelector->SetCurrentSelectionModels (aSelectionModels);
}
}
myAttributesStack->setCurrentWidget (aWidget != NULL ? aWidget : myEmptyWidget);
}

@ -0,0 +1,92 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_AttributePaneStack_H
#define DFBrowser_AttributePaneStack_H
#include <DFBrowser_AttributePaneType.hxx>
#include <Standard.hxx>
#include <TreeModel_ItemBase.hxx>
#include <QMap>
#include <QItemSelection>
#include <QStackedWidget>
#include <QWidget>
class DFBrowserPane_AttributePaneAPI;
class DFBrowserPane_AttributePaneSelector;
class DFBrowser_Module;
class DFBrowser_SearchView;
class DFBrowser_TreeLevelView;
class QStackedWidget;
class QWidget;
//! \class DFBrowser_AttributePaneStack
//! \brief Provides work to stacked widget where the current attribute pane is shown.
class DFBrowser_AttributePaneStack : public QObject
{
public:
//! Constructor
Standard_EXPORT DFBrowser_AttributePaneStack (QObject* theParent);
//! Destructor
virtual ~DFBrowser_AttributePaneStack() {}
//! Creates a stacked widget
//! \param theParent a parent widget
Standard_EXPORT virtual void CreateWidget (QWidget* theParent);
//! \return the stacked widget
QWidget* GetWidget() const { return myAttributesStack; }
//! Fills stackk with the information
//! \param theAttributeTypes a map of attribute type name to information pane
void SetModule (DFBrowser_Module* theModule) { myModule = theModule; }
//! Sets the current widget in the stacked control either attribute pane or search view
//! \param theMode an active mode
Standard_EXPORT void SetPaneMode (const DFBrowser_AttributePaneType& theMode);
//! \return an attribute pane, which corresponds the current widget of the stacked widget control
DFBrowserPane_AttributePaneAPI* GetCurrentPane() const { return myCurrentPane; }
//! \return tree level view
DFBrowser_TreeLevelView* GetTreeLevelView() const { return myTreeLevelView; }
//! \return the search view
DFBrowser_SearchView* GetSearchView() const { return mySearchView; }
//! \return the pane selector
DFBrowserPane_AttributePaneSelector* GetPaneSelector() const { return myPaneSelector; }
//! Sets an active widget of attribute pane if the pane mode is item view mode.
//! Gets selection models of this pane and set the models into pane selector
Standard_EXPORT void SetCurrentItem (const QModelIndex& theIndex);
protected:
DFBrowserPane_AttributePaneAPI* myCurrentPane; //!< active pane if mode is item view mode
DFBrowserPane_AttributePaneSelector* myPaneSelector; //!< pane selector filled by the active pane
QStackedWidget* myAttributesStack; //!< container of already created panes
DFBrowser_Module* myModule; //!< the current module
DFBrowser_TreeLevelView* myTreeLevelView; //!< view of objects from one level of tree view
DFBrowser_SearchView* mySearchView; //!< view of search control
QWidget* myEmptyWidget; //!< an empty widget when nothing is selected in tree view
DFBrowser_AttributePaneType myPaneMode; //!< the current pane mode, either item view or search view
};
#endif

@ -0,0 +1,26 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_AttributePaneType_H
#define DFBrowser_AttributePaneType_H
//! Type of view shown in attribute pane stack
enum DFBrowser_AttributePaneType
{
DFBrowser_AttributePaneType_ItemView, //!< attribute pane stack shows either TreeLevelView or attribute pane
DFBrowser_AttributePaneType_SearchView //!< attribute pane stack shows search view
};
#endif

@ -0,0 +1,50 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_Communicator.hxx>
#include <CDF_Session.hxx>
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Window.hxx>
// =======================================================================
// function : CreateCommunicator
// purpose : Creates a communicator by the library loading
// =======================================================================
Standard_EXPORTEXTERNC TInspectorAPI_Communicator* CreateCommunicator()
{
return new DFBrowser_Communicator();
}
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_Communicator::DFBrowser_Communicator()
: TInspectorAPI_Communicator(), myWindow (0)
{
myWindow = new DFBrowser_Window();
}
// =======================================================================
// function : SetParameters
// purpose :
// =======================================================================
void DFBrowser_Communicator::SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters)
{
myWindow->SetParameters (theParameters);
myWindow->UpdateContent();
}

@ -0,0 +1,57 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_Communicator_H
#define DFBrowser_Communicator_H
#include <DFBrowser_Window.hxx>
#include <Standard.hxx>
#include <Standard_Macro.hxx>
#include <TInspectorAPI_Communicator.hxx>
#include <QObject>
class DFBrowser_Window;
//! \class DFBrowser_Communicator.
//! \brief This is a connector from TInspector application to DFBrowser view
class DFBrowser_Communicator : public QObject, public TInspectorAPI_Communicator
{
public:
//! Constructor
Standard_EXPORT DFBrowser_Communicator();
//! Destructor
virtual ~DFBrowser_Communicator() Standard_OVERRIDE {}
//! Provides the container with a parent where this container should be inserted.
//! If Qt implementation, it should be QWidget with QLayout set inside
//! \param theParent a parent class
virtual void SetParent (void* theParent) Standard_OVERRIDE { myWindow->SetParent (theParent); }
//! Sets parameters container, it should be used when the plugin is initialized or in update content
//! \param theParameters a parameters container
Standard_EXPORT virtual void SetParameters (const Handle(TInspectorAPI_PluginParameters)& theParameters) Standard_OVERRIDE;
//! Updates content of the current window
virtual void UpdateContent() Standard_OVERRIDE { myWindow->UpdateContent(); }
private:
DFBrowser_Window* myWindow; //!< the current window
};
#endif

@ -0,0 +1,96 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_DumpView.hxx>
#include <DFBrowser_Item.hxx>
#include <DFBrowser_Window.hxx>
#include <DFBrowser_TreeLevelView.hxx>
#include <OSD_OpenFile.hxx>
#include <TreeModel_ModelBase.hxx>
#include <QAbstractItemModel>
#include <QDir>
#include <QFile>
#include <QPlainTextEdit>
#include <QTextStream>
#include <QWidget>
// =======================================================================
// function : onSelectionChanged
// purpose :
// =======================================================================
void DFBrowser_DumpView::OnTreeViewSelectionChanged (const QItemSelection& theSelected,
const QItemSelection&)
{
myTextEdit->setVisible (false);
myTextEdit->clear();
QModelIndexList aSelectedIndices = theSelected.indexes();
QModelIndexList aFirstColumnSelectedIndices;
for (QModelIndexList::const_iterator aSelIt = aSelectedIndices.begin(); aSelIt != aSelectedIndices.end(); aSelIt++)
{
QModelIndex anIndex = *aSelIt;
if (anIndex.column() == 0)
aFirstColumnSelectedIndices.append (anIndex);
}
if (aFirstColumnSelectedIndices.size() != 1)
return;
QString aDumpInfo;
const QModelIndex& anIndex = aFirstColumnSelectedIndices.first();
TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (anIndex);
//#define REQUIRE_OCAF_REVIEW:18 : start
DFBrowser_ItemPtr anItem;
if (anItemBase)
anItem = itemDynamicCast<DFBrowser_Item> (anItemBase);
if (!anItem)
return;
TCollection_AsciiString aFileName = DFBrowser_Window::TmpDirectory();
aFileName += "/dfbrowser.txt";
// print dump to file(not in a string stream because result might be too long)
std::ofstream aFileStream;
OSD_OpenStream(aFileStream, aFileName, ios::out);
if (anItem->HasAttribute())
{
Handle(TDF_Attribute) anAttribute = anItem->GetAttribute();
if (!anAttribute.IsNull())
anAttribute->Dump(aFileStream);
}
else if (anItem->HasLabel())
anItem->GetLabel().Dump(aFileStream);
aFileStream.close();
// read dumped file to fill view
QFile aFile (aFileName.ToCString());
if (!aFile.open (QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream aStream (&aFile);
while (!aStream.atEnd())
{
aDumpInfo.append (QString ("%1\n").arg (aStream.readLine()));
}
aFile.close();
QDir aDir;
aDir.remove (aFileName.ToCString());
//#define REQUIRE_OCAF_REVIEW:18 : end
if (!aDumpInfo.isEmpty())
{
myTextEdit->setVisible (true);
myTextEdit->setPlainText (aDumpInfo);
}
}

@ -0,0 +1,58 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_DumpView_H
#define DFBrowser_DumpView_H
#include <Standard.hxx>
#include <Standard_Macro.hxx>
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QObject>
#include <QItemSelection>
#include <QPlainTextEdit>
class QWidget;
//! \class DFBrowser_DumpView
//! \brief View to display result of Dump() method of a TDF_Attribute
class DFBrowser_DumpView : public QObject
{
Q_OBJECT
public:
//! Constructor
DFBrowser_DumpView (QWidget* theParent) : QObject(theParent), myTextEdit( new QPlainTextEdit(theParent) ) {}
//! Destructor
virtual ~DFBrowser_DumpView() Standard_OVERRIDE {}
//! \return the text edit control
QWidget* GetControl() const { return myTextEdit; }
public slots:
//! Slots listen selection change and update the current control content by selection
//! \param theSelected container of selected items
//! \param theDeselected container of items that become deselected
Standard_EXPORT void OnTreeViewSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
private:
QPlainTextEdit* myTextEdit; //!< information view
};
#endif

@ -0,0 +1,37 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_HighlightDelegate.hxx>
#include <DFBrowser_Window.hxx>
#include <QPainter>
// =======================================================================
// function : paint
// purpose :
// =======================================================================
void DFBrowser_HighlightDelegate::paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
const QModelIndex& theIndex) const
{
// highlight cell
if (theOption.state & QStyle::State_MouseOver)
{
QColor aHighlightColor = DFBrowser_Window::LightHighlightColor();
thePainter->fillRect (theOption.rect, aHighlightColor);
}
// default paint
QItemDelegate::paint (thePainter, theOption, theIndex);
}

@ -0,0 +1,46 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_HighlightDelegate_H
#define DFBrowser_HighlightDelegate_H
#include <Standard.hxx>
#include <Standard_Macro.hxx>
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QItemDelegate>
//! \class DFBrowser_HighlightDelegate
//! \brief An item delegate to paint in highlight color the cell when the mouse cursor is over it
class DFBrowser_HighlightDelegate : public QItemDelegate
{
public:
//! Constructor
DFBrowser_HighlightDelegate (QObject* theParent = 0) : QItemDelegate (theParent) {}
//! Destructor
virtual ~DFBrowser_HighlightDelegate() Standard_OVERRIDE {}
//! Redefine of the parent virtual method to color the cell rectangle in highlight style
//! \param thePainter a painter
//! \param theOption a paint options
//! \param theIndex a view index
Standard_EXPORT virtual void paint (QPainter* thePainter, const QStyleOptionViewItem& theOption,
const QModelIndex& theIndex) const Standard_OVERRIDE;
};
#endif

@ -0,0 +1,189 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_Item.hxx>
#include <DFBrowser_ItemRole.hxx>
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowserPane_AttributePane.hxx>
#include <DFBrowserPane_ItemRole.hxx>
#include <DFBrowserPane_Tools.hxx>
#include <TDF_AttributeIterator.hxx>
#include <TDF_ChildIterator.hxx>
#include <QIcon>
#include <QObject>
const int INFO_LENGHT = 60;
//#define REQUIRE_OCAF_REVIEW:23
// =======================================================================
// function : hasAttribute
// purpose :
// =======================================================================
bool DFBrowser_Item::HasAttribute() const
{
initItem();
return myAttributeGUID != Standard_GUID();
}
// =======================================================================
// function : getAttribute
// purpose :
// =======================================================================
Handle(TDF_Attribute) DFBrowser_Item::GetAttribute() const
{
initItem();
Handle(TDF_Attribute) anAttribute;
GetLabel().FindAttribute (myAttributeGUID, anAttribute);
return anAttribute;
}
// =======================================================================
// function : Init
// purpose :
// =======================================================================
void DFBrowser_Item::Init()
{
DFBrowser_ItemBasePtr aParentItem = itemDynamicCast<DFBrowser_ItemBase> (Parent());
if (!aParentItem)
return;
TDF_Label aParentLabel = aParentItem->GetLabel();
// items can exist only by items with not empty label
if (aParentLabel.IsNull())
return;
int aNbAttributes = aParentLabel.NbAttributes();
int aRowId = Row();
if (aRowId < aNbAttributes)
{
Handle(TDF_Attribute) anAttribute;
int anAttributeId = 0;
for (TDF_AttributeIterator anAttrIt (aParentLabel); anAttrIt.More(); anAttrIt.Next(), anAttributeId++)
{
if (anAttributeId == aRowId)
anAttribute = anAttrIt.Value();
}
SetAttribute (anAttribute);
}
else {
int aCurrentId = aRowId - aNbAttributes;
TDF_ChildIterator aLabelsIt (aParentLabel);
TDF_Label aLabel;
for (int aLabelId = 0; aLabelsIt.More(); aLabelsIt.Next(), aLabelId++)
{
if (aLabelId < aCurrentId)
continue;
aLabel = aLabelsIt.Value();
break;
}
if (!aLabel.IsNull())
setLabel (aLabel);
}
TreeModel_ItemBase::Init();
}
// =======================================================================
// function : reset
// purpose :
// =======================================================================
void DFBrowser_Item::Reset()
{
SetAttribute (Handle(TDF_Attribute)());
DFBrowser_ItemBase::Reset();
}
// =======================================================================
// function : initRowCount
// purpose :
// =======================================================================
int DFBrowser_Item::initRowCount() const
{
return HasAttribute() ? 0 : DFBrowser_ItemBase::initRowCount();
}
// =======================================================================
// function : initValue
// purpose :
// =======================================================================
QVariant DFBrowser_Item::initValue (const int theItemRole) const
{
if (!HasAttribute())
return DFBrowser_ItemBase::initValue (theItemRole);
if (theItemRole == DFBrowserPane_ItemRole_DisplayExtended || theItemRole == DFBrowserPane_ItemRole_ToolTipExtended)
{
int aRole = theItemRole == DFBrowserPane_ItemRole_DisplayExtended ? Qt::DisplayRole : Qt::ToolTipRole;
QVariant aValue = DFBrowser_Module::GetAttributeInfo (GetAttribute(), GetModule(), aRole, Column());
QString anAdditionalInfo = DFBrowser_Module::GetAttributeInfo (GetAttribute(), GetModule(),
DFBrowser_ItemRole_AdditionalInfo, Column()).toString();
if (!anAdditionalInfo.isEmpty())
{
if (theItemRole == DFBrowserPane_ItemRole_DisplayExtended && anAdditionalInfo.length() > INFO_LENGHT)
anAdditionalInfo = anAdditionalInfo.mid (0, INFO_LENGHT - 3) + "...";
if (!anAdditionalInfo.isEmpty())
aValue = QVariant (aValue.toString() + QString (" [%1]").arg (anAdditionalInfo));
//if (aRole == Qt::ToolTipRole)
// aValue = wrapTextByWords(aValue.toString().toStdString(), INFO_LENGHT).c_str();
}
return aValue;
}
return DFBrowser_Module::GetAttributeInfo (GetAttribute(), GetModule(), theItemRole, Column());
}
// =======================================================================
// function : GetAttributeInfo
// purpose :
// =======================================================================
QVariant DFBrowser_Item::GetAttributeInfo (int theRole) const
{
initItem();
return cachedValue (theRole);
}
// =======================================================================
// function : initItem
// purpose :
// =======================================================================
void DFBrowser_Item::initItem() const
{
if (IsInitialized())
return;
const_cast<DFBrowser_Item*>(this)->Init();
}
// =======================================================================
// function : SetAttribute
// purpose :
// =======================================================================
void DFBrowser_Item::SetAttribute (Handle(TDF_Attribute) theAttribute)
{
if (!theAttribute.IsNull())
{
setLabel (theAttribute->Label());
myAttributeGUID = theAttribute->ID();
}
else
{
setLabel (TDF_Label());
myAttributeGUID = Standard_GUID();
}
}

@ -0,0 +1,96 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_Item_H
#define DFBrowser_Item_H
#include <DFBrowser_ItemBase.hxx>
#include <TDF_Attribute.hxx>
#include <Standard.hxx>
#include <Standard_GUID.hxx>
#include <QMap>
#include <QList>
#include <QVariant>
class DFBrowser_Item;
typedef QExplicitlySharedDataPointer<DFBrowser_Item> DFBrowser_ItemPtr;
//! \class DFBrowser_Item
//! \brief Declaration of the tree model root item.
class DFBrowser_Item : public DFBrowser_ItemBase
{
public:
//! Creates an item wrapped by a shared pointer
//! \param theRow the item row positition in the parent item
//! \param theColumn the item column positition in the parent item
//! \return the pointer to the created item
static DFBrowser_ItemPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
{ return DFBrowser_ItemPtr (new DFBrowser_Item (theParent, theRow, theColumn)); }
//! Destructor
virtual ~DFBrowser_Item() Standard_OVERRIDE {};
//! \return true if the attribute is set in the item, otherwise it is initialized by a label
Standard_EXPORT bool HasAttribute() const;
//! \return the item attribute
Standard_EXPORT Handle(TDF_Attribute) GetAttribute() const;
//! Finds int parent item attribute or label by this item row and store it in a field of this item.
Standard_EXPORT virtual void Init() Standard_OVERRIDE;
//! Resets the cached item values, set null attribute and calls reset of the parent class
Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
//! Init item and calls cachedValue() for the role
//! \param theItemRole a value role
//! \return the value
Standard_EXPORT QVariant GetAttributeInfo(int theRole) const;
protected:
//! \return number of children.
virtual int initRowCount() const Standard_OVERRIDE;
//! Return data value for the role:
//! - if content is label, calls DFBrowser_ItemBase;
//! - if content is attribute, if the fole is extended display, asks additional info text or ask module about info
//! \param theItemRole a value role
//! \return the value
virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
//! Constructor
//! param theParent a parent item
//! \param theRow the item row positition in the parent item
//! \param theColumn the item column positition in the parent item
DFBrowser_Item (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
: DFBrowser_ItemBase (theParent, theRow, theColumn) {}
//! Initialize the current item. It creates a backup of the specific item information
void initItem() const;
//! Sets the item attribute
//! \param theAttribute an item attribute
void SetAttribute (Handle(TDF_Attribute) theAttribute);
private:
Standard_GUID myAttributeGUID; //!< if attribute, stores GUID of the attibute because label can contain only one attribute of a kind
};
#endif

@ -0,0 +1,70 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_ItemApplication.hxx>
#include <DFBrowser_Item.hxx>
#include <DFBrowser_ItemDocument.hxx>
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowserPane_AttributePane.hxx>
#include <DFBrowserPane_ItemRole.hxx>
#include <QObject>
//#define REQUIRE_OCAF_REVIEW:21
// =======================================================================
// function : createChild
// purpose :
// =======================================================================
TreeModel_ItemBasePtr DFBrowser_ItemApplication::createChild (int theRow, int theColumn)
{
TreeModel_ItemBasePtr anItem = DFBrowser_ItemDocument::CreateItem (currentItem(), theRow, theColumn);
DFBrowser_ItemBasePtr aBaseItem = itemDynamicCast<DFBrowser_ItemBase> (anItem);
aBaseItem->SetModule (GetModule());
return anItem;
}
// =======================================================================
// function : initRowCount
// purpose :
// =======================================================================
int DFBrowser_ItemApplication::initRowCount() const
{
if (myApplication.IsNull())
return 0;
return myApplication->NbDocuments();
}
// =======================================================================
// function : initValue
// purpose :
// =======================================================================
QVariant DFBrowser_ItemApplication::initValue (const int theItemRole) const
{
if (theItemRole == Qt::DisplayRole ||
theItemRole == Qt::EditRole ||
theItemRole == Qt::ToolTipRole ||
theItemRole == DFBrowserPane_ItemRole_DisplayExtended ||
theItemRole == DFBrowserPane_ItemRole_ToolTipExtended)
{
return "TDocStd_Application";
}
return QVariant();
}

@ -0,0 +1,77 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_ItemApplication_H
#define DFBrowser_ItemApplication_H
#include <DFBrowser_ItemBase.hxx>
#include <TDocStd_Application.hxx>
class DFBrowser_ItemApplication;
typedef QExplicitlySharedDataPointer<DFBrowser_ItemApplication> DFBrowser_ItemApplicationPtr;
//! \class DFBrowser_ItemApplication
//! \brief Declaration of the tree model root item.
//! This item is connected to the main label of the document.
class DFBrowser_ItemApplication : public DFBrowser_ItemBase
{
public:
//! Creates an item wrapped by a shared pointer
static DFBrowser_ItemApplicationPtr CreateItem (TreeModel_ItemBasePtr theParent)
{ return DFBrowser_ItemApplicationPtr (new DFBrowser_ItemApplication (theParent)); }
//! Destructor
virtual ~DFBrowser_ItemApplication() Standard_OVERRIDE {};
//! Sets the item label
//! \param theLabel an object where the child items structure is found
void SetApplication (const Handle(TDocStd_Application)& theApplication) { myApplication = theApplication; }
//! Returns the current label
//! \return a label
const Handle(TDocStd_Application)& GetApplication() const { return myApplication; }
protected:
//! Returns number of documents if the application is not NULL
//! \return rows count
virtual int initRowCount() const Standard_OVERRIDE;
//! Returns fixed item text or empty.
//! \param theItemRole a value role
//! \return the value
virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
protected:
//! Creates a child item in the given position.
//! \param theRow the child row position
//! \param theColumn the child column position
//! \return the created item
virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
private:
//! Constructor
//! param theParent a parent item
DFBrowser_ItemApplication(TreeModel_ItemBasePtr theParent) : DFBrowser_ItemBase(theParent, 0, 0) {}
private:
Handle(TDocStd_Application) myApplication; //!<! OCAF application
};
#endif

@ -0,0 +1,151 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_ItemBase.hxx>
#include <DFBrowser_Item.hxx>
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowserPane_AttributePane.hxx>
#include <DFBrowserPane_ItemRole.hxx>
#include <DFBrowserPane_Tools.hxx>
#include <TDataStd_Name.hxx>
#include <TDF_ChildIterator.hxx>
#include <QColor>
#include <QIcon>
#include <QVariant>
//#define REQUIRE_OCAF_REVIEW:20
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_ItemBase::DFBrowser_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
: TreeModel_ItemBase (theParent, theRow, theColumn), myModule (0), myIsUseAdditionalInfo (true)
{
}
// =======================================================================
// function : reset
// purpose :
// =======================================================================
void DFBrowser_ItemBase::Reset()
{
setLabel (TDF_Label());
TreeModel_ItemBase::Reset();
}
// =======================================================================
// function : GetLabel
// purpose :
// =======================================================================
TDF_Label DFBrowser_ItemBase::GetLabel() const
{
initItem();
return myLabel;
}
// =======================================================================
// function : data
// purpose :
// =======================================================================
QVariant DFBrowser_ItemBase::data (const QModelIndex& theIndex, int theRole) const
{
int aRole = theRole;
if (Column() == 0 && useAdditionalInfo())
{
switch (theRole)
{
case Qt::DisplayRole: { aRole = DFBrowserPane_ItemRole_DisplayExtended; break; }
case Qt::ToolTipRole: { aRole = DFBrowserPane_ItemRole_ToolTipExtended; break; }
}
}
return TreeModel_ItemBase::data (theIndex, aRole);
}
// =======================================================================
// function : initRowCount
// purpose :
// =======================================================================
int DFBrowser_ItemBase::initRowCount() const
{
TDF_Label aLabel = GetLabel();
if (aLabel.IsNull())
return 0;
return aLabel.NbChildren() + aLabel.NbAttributes();
}
// =======================================================================
// function : initValue
// purpose :
// =======================================================================
QVariant DFBrowser_ItemBase::initValue (const int theItemRole) const
{
switch (theItemRole)
{
case Qt::DisplayRole:
case Qt::EditRole:
case Qt::ToolTipRole:
return DFBrowser_Tools::GetLabelInfo (myLabel, false);
case DFBrowserPane_ItemRole_DisplayExtended:
case DFBrowserPane_ItemRole_ToolTipExtended:
return DFBrowser_Tools::GetLabelInfo (myLabel, true);
case Qt::ForegroundRole:
{
QVariant aValue = QColor (Qt::black);
if (DFBrowser_Tools::IsEmptyLabel(GetLabel()))
aValue = QColor (Qt::lightGray);
else
{ //! TEMPORARY HERE : should be moved in the pane of TDataStd_Name kind of attribute
Handle(TDataStd_Name) aName;
if (useAdditionalInfo() && myLabel.FindAttribute (TDataStd_Name::GetID(), aName))
aValue = QColor (Qt::darkGreen);
}
return aValue;
}
case Qt::DecorationRole: return DFBrowser_Tools::GetLabelIcon (myLabel);
default: break;
}
return QVariant();
}
// =======================================================================
// function : createChild
// purpose :
// =======================================================================
TreeModel_ItemBasePtr DFBrowser_ItemBase::createChild (int theRow, int theColumn)
{
TreeModel_ItemBasePtr anItem = DFBrowser_Item::CreateItem (currentItem(), theRow, theColumn);
DFBrowser_ItemBasePtr aBaseItem = itemDynamicCast<DFBrowser_ItemBase> (anItem);
aBaseItem->SetModule (GetModule());
return anItem;
}
// =======================================================================
// function : SetUseAdditionalInfo
// purpose :
// =======================================================================
bool DFBrowser_ItemBase::SetUseAdditionalInfo (const bool theValue)
{
bool aPreviousValue = myIsUseAdditionalInfo;
myIsUseAdditionalInfo = theValue;
return aPreviousValue;
}

@ -0,0 +1,104 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_ItemBase_H
#define DFBrowser_ItemBase_H
#include <Standard.hxx>
#include <TreeModel_ItemBase.hxx>
#include <TDF_Label.hxx>
class DFBrowser_ItemBase;
class DFBrowser_Module;
typedef QExplicitlySharedDataPointer<DFBrowser_ItemBase> DFBrowser_ItemBasePtr;
//! \class DFBrowser_ItemBase
//! \brief Declaration of the tree model base item.
//! This item provide method to process a TDF label.
class DFBrowser_ItemBase : public TreeModel_ItemBase
{
public:
//! Sets the module to have an access to attribute information
//! \param theModule a current loaded application module
void SetModule (DFBrowser_Module* theModule) { myModule = theModule; }
//! Resets the cached item values
Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
//! \return true if the current label is not null
bool HasLabel() const { return !GetLabel().IsNull(); }
//! \return the current label
Standard_EXPORT virtual TDF_Label GetLabel() const;
//! \return the current module
DFBrowser_Module* GetModule() const { return myModule; }
//! Change using of additional information in item. It it does not use additional info,
//! it will not return extended text in initValue().
//! \param theValue a new value
//! \return the previous value
Standard_EXPORT bool SetUseAdditionalInfo (const bool theValue);
//! Returns the data stored under the given role for the current item
//! \param theIndex the item model index
//! \param theRole the item model role
Standard_EXPORT virtual QVariant data (const QModelIndex& theIndex, int theRole) const Standard_OVERRIDE;
protected:
//! Sets the item label
//! \param theLabel an object where the child items structure is found
void setLabel(TDF_Label theLabel) { myLabel = theLabel; }
//! Returns if additional information is shown in item for Display and ToolTip values
//! \return boolean value
bool useAdditionalInfo() const { return myIsUseAdditionalInfo; }
//! Returns sum of label children and attributes
//! \return rows count
virtual int initRowCount() const Standard_OVERRIDE;
//! Returns label information like text, icon or background(if it contains TDataStd_Name attribute)
//! \param theItemRole a value role
//! \return the value
virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
//! Creates a child item in the given position.
//! \param theRow the child row position
//! \param theColumn the child column position
//! \return the created item
virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
//! Initialize the current item. It creates a backup of the specific item information
virtual void initItem() const {};
protected:
//! Constructor
//! param theParent a parent item
//! \param theRow the item row positition in the parent item
//! \param theColumn the item column positition in the parent item
DFBrowser_ItemBase (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn);
private:
TDF_Label myLabel; //!< a label of the document, which contains child labels and attributes
DFBrowser_Module* myModule; //!< the current module
bool myIsUseAdditionalInfo; //!< if true, additional item info is shown in square brackets
};
#endif

@ -0,0 +1,148 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_ItemDocument.hxx>
#include <DFBrowser_Item.hxx>
#include <DFBrowser_ItemApplication.hxx>
#include <DFBrowser_ItemDocument.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowserPane_AttributePane.hxx>
#include <DFBrowserPane_ItemRole.hxx>
#include <QIcon>
#include <QLabel>
#include <QObject>
//#define REQUIRE_OCAF_REVIEW:22
// =======================================================================
// function : GetLabel
// purpose :
// =======================================================================
TDF_Label DFBrowser_ItemDocument::GetLabel() const
{
TDF_Label aLabel;
if (myDocument.IsNull())
getDocument();
if (!myDocument.IsNull())
aLabel = myDocument->Main().Root();
if (!aLabel.IsNull())
aLabel = aLabel.Root();
return aLabel;
}
// =======================================================================
// function : getDocument
// purpose :
// =======================================================================
const Handle(TDocStd_Document)& DFBrowser_ItemDocument::getDocument() const
{
initItem();
return myDocument;
}
// =======================================================================
// function : initValue
// purpose :
// =======================================================================
QVariant DFBrowser_ItemDocument::initValue (const int theItemRole) const
{
if (theItemRole == Qt::DisplayRole ||
theItemRole == Qt::EditRole ||
theItemRole == DFBrowserPane_ItemRole_DisplayExtended ||
theItemRole == DFBrowserPane_ItemRole_ToolTipExtended)
return DFBrowser_Tools::GetLabelInfo (GetLabel());
if (theItemRole == Qt::DecorationRole)
return DFBrowser_Tools::GetLabelIcon (GetLabel());
return QVariant();
}
// =======================================================================
// function : createChild
// purpose :
// =======================================================================
TreeModel_ItemBasePtr DFBrowser_ItemDocument::createChild (int theRow, int theColumn)
{
TreeModel_ItemBasePtr anItem = DFBrowser_Item::CreateItem (currentItem(), theRow, theColumn);
DFBrowser_ItemBasePtr aBaseItem = itemDynamicCast<DFBrowser_ItemBase> (anItem);
aBaseItem->SetModule (GetModule());
return anItem;
}
// =======================================================================
// function : Init
// purpose :
// =======================================================================
void DFBrowser_ItemDocument::Init()
{
DFBrowser_ItemApplicationPtr aParentItem = itemDynamicCast<DFBrowser_ItemApplication> (Parent());
if (!aParentItem)
return;
const Handle(TDocStd_Application)& anApplication = aParentItem->GetApplication();
// items can exist only by items with not empty label
if (anApplication.IsNull())
return;
int aRowId = Row();
int aDocumentId = -1;
for (Standard_Integer aDocId = 1, aNbDoc = anApplication->NbDocuments(); aDocId <= aNbDoc && aDocumentId < 0; aDocId++)
{
if (aDocId - 1 == aRowId)
aDocumentId = aDocId;
}
if (aDocumentId > 0)
{
Handle(TDocStd_Document) aDocument;
anApplication->GetDocument (aDocumentId, aDocument);
setDocument (aDocument);
}
else
setDocument (Handle(TDocStd_Document)());
TreeModel_ItemBase::Init();
}
// =======================================================================
// function : reset
// purpose :
// =======================================================================
void DFBrowser_ItemDocument::Reset()
{
Handle(TDocStd_Document) aDocument;
setDocument (aDocument);
DFBrowser_ItemBase::Reset();
}
// =======================================================================
// function : initItem
// purpose :
// =======================================================================
void DFBrowser_ItemDocument::initItem() const
{
if (IsInitialized())
return;
const_cast<DFBrowser_ItemDocument*>(this)->Init();
}

@ -0,0 +1,93 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_ItemDocument_H
#define DFBrowser_ItemDocument_H
#include <DFBrowser_ItemBase.hxx>
#include <Standard.hxx>
#include <TDocStd_Document.hxx>
class DFBrowser_ItemDocument;
typedef QExplicitlySharedDataPointer<DFBrowser_ItemDocument> DFBrowser_ItemDocumentPtr;
//! \class DFBrowser_ItemDocument
//! \brief Declaration of the tree model document item.
//! This item is connected to the OCAF document. Parent item is application, children are either labels or attributes
class DFBrowser_ItemDocument : public DFBrowser_ItemBase
{
public:
//! Creates an item wrapped by a shared pointer
//! \param theRow the item row positition in the parent item
//! \param theColumn the item column positition in the parent item
//! \return the pointer to the created item
static DFBrowser_ItemDocumentPtr CreateItem (TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
{ return DFBrowser_ItemDocumentPtr (new DFBrowser_ItemDocument (theParent, theRow, theColumn)); }
//! Destructor
virtual ~DFBrowser_ItemDocument() Standard_OVERRIDE {};
//! Returns the current label
//! \return a label
Standard_EXPORT virtual TDF_Label GetLabel() const Standard_OVERRIDE;
//! Sets the item document
//! \param theLabel an object where the child items structure is found
void setDocument (const Handle(TDocStd_Document)& theDocument) { myDocument = theDocument; }
//! Returns true if the current document is not null
//! \return a boolean value
bool hasDocument() const { return !getDocument().IsNull(); }
//! Returns the current document
//! \return a label
Standard_EXPORT const Handle(TDocStd_Document)& getDocument() const;
//! Inits the item, fills internal containers
Standard_EXPORT virtual void Init() Standard_OVERRIDE;
//! Resets the cached item values
Standard_EXPORT virtual void Reset() Standard_OVERRIDE;
protected:
//! Initialize the current item. It is empty because Reset() is also empty.
virtual void initItem() const Standard_OVERRIDE;
//!
virtual QVariant initValue (const int theItemRole) const Standard_OVERRIDE;
protected:
//! Creates a child item in the given position.
//! \param theRow the child row position
//! \param theColumn the child column position
//! \return the created item
virtual TreeModel_ItemBasePtr createChild (int theRow, int theColumn) Standard_OVERRIDE;
private:
//! Constructor
//! param theParent a parent item
DFBrowser_ItemDocument(TreeModel_ItemBasePtr theParent, const int theRow, const int theColumn)
: DFBrowser_ItemBase (theParent, theRow, theColumn) {}
private:
Handle(TDocStd_Document) myDocument; //!< cached application document by the row index of the item
};
#endif

@ -0,0 +1,27 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_ItemRole_H
#define DFBrowser_ItemRole_H
#include <Qt>
//! Additional data item role for DFBrowser tree item
enum DFBrowser_ItemRole
{
DFBrowser_ItemRole_AdditionalInfo = Qt::UserRole + 1 //!< an attribute additional information
};
#endif

@ -0,0 +1,231 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Item.hxx>
#include <DFBrowser_ItemApplication.hxx>
#include <DFBrowser_ItemBase.hxx>
#include <DFBrowser_ItemRole.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowser_TreeModel.hxx>
#include <DFBrowserPane_AttributePane.hxx>
#include <DFBrowserPane_AttributePaneCreator.hxx>
#include <DFBrowserPane_ItemRole.hxx>
#include <DFBrowserPane_Tools.hxx>
#include <DFBrowserPaneXDE_AttributePaneCreator.hxx>
#include <DFBrowserPaneXDE_Tools.hxx>
#include <XCAFApp_Application.hxx>
#include <QItemSelectionModel>
#include <QMessageBox>
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_Module::DFBrowser_Module()
: myOCAFViewModel (0)
{
RegisterPaneCreator (new DFBrowserPane_AttributePaneCreator());
}
// =======================================================================
// function : CreateViewModel
// purpose :
// =======================================================================
void DFBrowser_Module::CreateViewModel (void* theParent)
{
myOCAFViewModel = new DFBrowser_TreeModel ((QWidget*)theParent, this);
}
// =======================================================================
// function : SetApplication
// purpose :
// =======================================================================
void DFBrowser_Module::SetApplication (const Handle(TDocStd_Application)& theApplication)
{
myOCAFViewModel->Init (theApplication);
myPaneCreators.clear();
RegisterPaneCreator (new DFBrowserPane_AttributePaneCreator());
if (!theApplication.IsNull() && DFBrowserPaneXDE_Tools::IsXDEApplication (theApplication))
RegisterPaneCreator (new DFBrowserPaneXDE_AttributePaneCreator (myPaneCreators[0]));
}
// =======================================================================
// function : SetExternalContext
// purpose :
// =======================================================================
void DFBrowser_Module::SetExternalContext (const Handle(Standard_Transient)& theContext)
{
myExternalContext = Handle(AIS_InteractiveContext)::DownCast (theContext);
}
// =======================================================================
// function : GetTDocStdApplication
// purpose :
// =======================================================================
Handle(TDocStd_Application) DFBrowser_Module::GetTDocStdApplication() const
{
return myOCAFViewModel->GetTDocStdApplication();
}
// =======================================================================
// function : UpdateTreeModel
// purpose :
// =======================================================================
void DFBrowser_Module::UpdateTreeModel()
{
QAbstractItemModel* aModel = GetOCAFViewModel();
QItemSelectionModel* aSelectionModel = GetOCAFViewSelectionModel();
if (!aModel || !aSelectionModel)
return;
aSelectionModel->clearSelection();
emit beforeUpdateTreeModel();
myOCAFViewModel->Reset();
myOCAFViewModel->EmitLayoutChanged();
SetInitialTreeViewSelection();
}
// =======================================================================
// function : SetInitialTreeViewSelection
// purpose :
// =======================================================================
void DFBrowser_Module::SetInitialTreeViewSelection()
{
QAbstractItemModel* aModel = GetOCAFViewModel();
QItemSelectionModel* aSelectionModel = GetOCAFViewSelectionModel();
if (!aModel || !aSelectionModel)
return;
// select a parent(aplication) item
aSelectionModel->select (aModel->index (0, 0), QItemSelectionModel::ClearAndSelect);
}
// =======================================================================
// function : FindAttribute
// purpose :
// =======================================================================
Handle(TDF_Attribute) DFBrowser_Module::FindAttribute (const QModelIndex& theIndex)
{
TreeModel_ItemBasePtr anItemBase = TreeModel_ModelBase::GetItemByIndex (theIndex);
if (!anItemBase)
return Handle(TDF_Attribute)();
DFBrowser_ItemPtr anItem = itemDynamicCast<DFBrowser_Item> (anItemBase);
return (anItem && anItem->HasAttribute()) ? anItem->GetAttribute() : Handle(TDF_Attribute)();
}
// =======================================================================
// function : GetAttributePane
// purpose :
// =======================================================================
DFBrowserPane_AttributePaneAPI* DFBrowser_Module::GetAttributePane (Handle(TDF_Attribute) theAttribute)
{
DFBrowserPane_AttributePaneAPI* aPane = 0;
if (theAttribute.IsNull())
return aPane;
return GetAttributePane (theAttribute->DynamicType()->Name());
}
// =======================================================================
// function : GetAttributePane
// purpose :
// =======================================================================
DFBrowserPane_AttributePaneAPI* DFBrowser_Module::GetAttributePane (const Standard_CString& theAttributeName)
{
DFBrowserPane_AttributePaneAPI* aPane = 0;
if (!myAttributeTypes.contains (theAttributeName))
{
aPane = CreateAttributePane (theAttributeName);
if (aPane)
myAttributeTypes[theAttributeName] = aPane;
}
else
aPane = myAttributeTypes[theAttributeName];
return aPane;
}
// =======================================================================
// function : GetAttributeInfo
// purpose :
// =======================================================================
QVariant DFBrowser_Module::GetAttributeInfo (Handle(TDF_Attribute) theAttribute, DFBrowser_Module* theModule,
int theRole, int theColumnId)
{
DFBrowserPane_AttributePane* anAttributePane = 0;
if (!theAttribute.IsNull())
{
DFBrowserPane_AttributePaneAPI* anAPIPane = theModule->GetAttributePane (theAttribute);
if (anAPIPane)
anAttributePane = dynamic_cast<DFBrowserPane_AttributePane*> (anAPIPane);
}
QVariant aValue;
if (anAttributePane)
aValue = anAttributePane->GetAttributeInfo (theAttribute,
theRole == DFBrowser_ItemRole_AdditionalInfo ? DFBrowserPane_ItemRole_ShortInfo : theRole,
theColumnId);
else
aValue = DFBrowserPane_AttributePane::GetAttributeInfoByType (theAttribute->DynamicType()->Name(), theRole, theColumnId);
return aValue;
}
// =======================================================================
// function : GetAttributeInfo
// purpose :
// =======================================================================
QVariant DFBrowser_Module::GetAttributeInfo (const Standard_CString& theAttributeName, DFBrowser_Module* theModule,
int theRole, int theColumnId)
{
DFBrowserPane_AttributePane* anAttributePane = 0;
DFBrowserPane_AttributePaneAPI* anAPIPane = theModule->GetAttributePane (theAttributeName);
if (anAPIPane)
anAttributePane = dynamic_cast<DFBrowserPane_AttributePane*> (anAPIPane);
QVariant aValue;
if (anAttributePane)
{
Handle(TDF_Attribute) anAttribute;
aValue = anAttributePane->GetAttributeInfo (anAttribute,
theRole == DFBrowser_ItemRole_AdditionalInfo ? DFBrowserPane_ItemRole_ShortInfo : theRole, theColumnId);
}
else
aValue = DFBrowserPane_AttributePane::GetAttributeInfoByType (theAttributeName, theRole, theColumnId);
return aValue;
}
// =======================================================================
// function : CreateAttributePane
// purpose :
// =======================================================================
DFBrowserPane_AttributePaneAPI* DFBrowser_Module::CreateAttributePane (const Standard_CString& theAttributeName)
{
DFBrowserPane_AttributePaneAPI* aPane = 0;
// iteration should be performed from the tail of the list, as latest added creator has
// larger priority
for (int aPaneCreatorId = myPaneCreators.size()-1; aPaneCreatorId >= 0 && !aPane; aPaneCreatorId--)
aPane = myPaneCreators[aPaneCreatorId]->CreateAttributePane (theAttributeName);
return aPane;
}

@ -0,0 +1,150 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_Module_H
#define DFBrowser_Module_H
#include <AIS_InteractiveContext.hxx>
#include <DFBrowser_TreeModel.hxx>
#include <NCollection_Map.hxx>
#include <Standard.hxx>
#include <TCollection_AsciiString.hxx>
#include <TDF_Attribute.hxx>
#include <TDocStd_Application.hxx>
#include <TopoDS_Shape.hxx>
#include <TreeModel_ItemBase.hxx>
#include <QObject>
class DFBrowserPane_AttributePaneAPI;
class DFBrowserPane_AttributePaneCreatorAPI;
class QAbstractItemModel;
class QItemSelectionModel;
//! \class DFBrowser_Module
//! The class is a container of current components of DFBrowser:
//! - OCAF view model
//! - OCAF selection model
//! - container of attribute panes into attribute name
//! - acceptable attribute pane creators
//! - external AIS interactive context
//! It has general attribute pane creator, if the application is XDE, it uses XDE attribute pane creator.
//! It fills container of created attribute pane.
class DFBrowser_Module : public QObject
{
Q_OBJECT
public:
//! Constructor
Standard_EXPORT DFBrowser_Module();
//! Destructor
virtual ~DFBrowser_Module() Standard_OVERRIDE {};
//! Creates tree model for OCAF application
Standard_EXPORT void CreateViewModel (void* theParent);
//! Fills tree model by the application and register pane creator
//! \param theApplication a current application
Standard_EXPORT void SetApplication (const Handle(TDocStd_Application)& theApplication);
//! Fills viewer by the context
//! \param theContext a current context where presentations should be visualized
Standard_EXPORT void SetExternalContext (const Handle(Standard_Transient)& theContext);
//! Returns external context or NULL
const Handle(AIS_InteractiveContext)& GetExternalContext() const { return myExternalContext; }
//! Returns a view model with the OCAF structure content
QAbstractItemModel* GetOCAFViewModel() { return myOCAFViewModel; }
//! Sets selection model of tree view
void SetOCAFViewSelectionModel(QItemSelectionModel* theSelectionModel)
{ myOCAFViewSelectionModel = theSelectionModel; }
//! Returns selection model of tree view
QItemSelectionModel* GetOCAFViewSelectionModel() const { return myOCAFViewSelectionModel; }
//! Returns an OCAF application or NULL
//! \return an application instance
Standard_EXPORT Handle(TDocStd_Application) GetTDocStdApplication() const;
//! Rebuild an OCAF tree view model
Standard_EXPORT void UpdateTreeModel();
//! Sets initial selection in OCAF tree view, it is an application(root) item
Standard_EXPORT void SetInitialTreeViewSelection();
//! Returns attibute placed on the parameter index in the OCAF tree view or NULL
//! \param theIndex an index in OCAF tree view.
//! \return an attribute
Standard_EXPORT Handle(TDF_Attribute) FindAttribute (const QModelIndex& theIndex);
//! Append creator of a pane by attribute type
//! \param thePaneCreator
void RegisterPaneCreator (DFBrowserPane_AttributePaneCreatorAPI* thePaneCreator)
{ myPaneCreators.append (thePaneCreator); }
//! Returns an attribute pane for the attribute: create a new if it is not exist in
//! internal map and the module processes this kind of attribute
//! \param theAttributeGUID an attribute key
//! \return attribute pane
Standard_EXPORT DFBrowserPane_AttributePaneAPI* GetAttributePane (Handle(TDF_Attribute) theAttribute);
//! Returns an attribute pane for the attribute GUID: create a new if it is not exist in
//! internal map and the module processes this kind of attribute
//! \param theAttributeGUID an attribute key
//! \return attribute pane
Standard_EXPORT DFBrowserPane_AttributePaneAPI* GetAttributePane (const Standard_CString& theAttributeName);
//! Finds the attribute pane according to the give attribute and returns its information
//! \param theAttribute a source attribute
//! \param theModule to provide a map of attribute id to attribute pane
//! \param theRole an attribute role in the tree view, includes: text, icon, color roles
//! \param theColumnId a column index
Standard_EXPORT static QVariant GetAttributeInfo (Handle(TDF_Attribute) theAttribute, DFBrowser_Module* theModule,
int theRole, int theColumnId);
//! Returns information for the given attribute type name
//! \param theAttributeName a current attribute type name
//! \param theModule a current module
//! \param theRole a role of information, used by tree model (e.g. DisplayRole, icon, background and so on)
//! \param theColumnId a tree model column
//! \return value, interpreted by tree model depending on the role
Standard_EXPORT static QVariant GetAttributeInfo (const Standard_CString& theAttributeName, DFBrowser_Module* theModule,
int theRole, int theColumnId);
signals:
//! Emits signal about updating tree model
void beforeUpdateTreeModel();
protected:
//! Tries to create attribute pane for the attribute name using registered attribute pane creators
//! \param theAttributeName a source attribute
//! \return attribute pane or NULL
DFBrowserPane_AttributePaneAPI* CreateAttributePane (const Standard_CString& theAttributeName);
private:
DFBrowser_TreeModel* myOCAFViewModel; //!< the tree view abstract model
QItemSelectionModel* myOCAFViewSelectionModel; //!< selection model over OCAF tree view
QMap<TCollection_AsciiString, DFBrowserPane_AttributePaneAPI*> myAttributeTypes; //!< container of created panes
QList<DFBrowserPane_AttributePaneCreatorAPI*> myPaneCreators; //!< pane creators
Handle(AIS_InteractiveContext) myExternalContext; //!< context that comes in initialize parameters
};
#endif

@ -0,0 +1,107 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_OpenApplication.hxx>
#include <BinDrivers.hxx>
#include <BinLDrivers.hxx>
#include <BinXCAFDrivers.hxx>
#include <PCDM_ReadWriter.hxx>
#include <Standard_Version.hxx>
#include <StdDrivers.hxx>
#include <StdLDrivers.hxx>
#include <STEPCAFControl_Reader.hxx>
#include <STEPCAFControl_Controller.hxx>
#include <TPrsStd_DriverTable.hxx>
#include <XCAFApp_Application.hxx>
#include <XCAFPrs_Driver.hxx>
#include <XmlDrivers.hxx>
#include <XmlLDrivers.hxx>
#include <XmlXCAFDrivers.hxx>
#include <UTL.hxx>
//#define REQUIRE_OCAF_REVIEW:24
namespace DFBrowser_OpenApplication
{
// =======================================================================
// function : OpenApplication
// purpose :
// =======================================================================
Handle(TDocStd_Application) OpenApplication (const TCollection_AsciiString& theFileName, bool& isSTEPFile)
{
Handle(TDocStd_Application) anApplication = CreateApplicationBySTEPFile (theFileName);
if (!anApplication.IsNull())
{
isSTEPFile = true;
return anApplication;
}
#if OCC_VERSION_HEX > 0x060901
// Load static variables for STEPCAF (ssv; 16.08.2012)
STEPCAFControl_Controller::Init();
anApplication = new TDocStd_Application();
// Initialize standard document formats at creation - they should
// be available even if this DRAW plugin is not loaded by pload command
StdLDrivers::DefineFormat (anApplication);
BinLDrivers::DefineFormat (anApplication);
XmlLDrivers::DefineFormat (anApplication);
StdDrivers::DefineFormat (anApplication);
BinDrivers::DefineFormat (anApplication);
XmlDrivers::DefineFormat (anApplication);
// Initialize XCAF formats
BinXCAFDrivers::DefineFormat (anApplication);
XmlXCAFDrivers::DefineFormat (anApplication);
// Register driver in global table for displaying XDE documents
// in 3d viewer using OCAF mechanics
TPrsStd_DriverTable::Get()->AddDriver (XCAFPrs_Driver::GetID(), new XCAFPrs_Driver);
Handle(TDocStd_Document) aDocument;
PCDM_ReaderStatus aStatus = anApplication->Open (theFileName, aDocument);
if (aStatus != PCDM_RS_OK)
return Handle(TDocStd_Application)();
#endif
return anApplication;
}
// =======================================================================
// function : CreateApplicationBySTEPFile
// purpose :
// =======================================================================
Handle(TDocStd_Application) CreateApplicationBySTEPFile (const TCollection_AsciiString& theFileName)
{
if (!theFileName.EndsWith (".step") && !theFileName.EndsWith (".stp"))
return Handle(TDocStd_Application)();
Handle(TDocStd_Application) aTmpApplication = XCAFApp_Application::GetApplication();
STEPCAFControl_Reader aStepReader;
const TCollection_AsciiString aStr (theFileName);
IFSelect_ReturnStatus aStatus = aStepReader.ReadFile (aStr.ToCString());
if (aStatus != IFSelect_RetDone)
return Handle(TDocStd_Application)();
aStepReader.SetColorMode (Standard_True);
aStepReader.SetLayerMode (Standard_True);
aStepReader.SetNameMode (Standard_True);
Handle(TDocStd_Document) aDocument;
aTmpApplication->NewDocument ("BinOcaf", aDocument);
return aStepReader.Transfer (aDocument) ? aTmpApplication : Handle(TDocStd_Application)();
}
}

@ -0,0 +1,41 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_OpenApplication_H
#define DFBrowser_OpenApplication_H
#include <Standard.hxx>
#include <TCollection_AsciiString.hxx>
#include <TDocStd_Application.hxx>
//! \namespace DFBrowser_OpenApplication
namespace DFBrowser_OpenApplication
{
//! Open the application by the name.
//! \param theFileName a name of the file initialized the application
//! \param isSTEPFile an output parameter, true if the file name is a STEP file
//! \return an opened application
Standard_EXPORT Handle(TDocStd_Application) OpenApplication (const TCollection_AsciiString& theFileName,
bool& isSTEPFile);
//! Creates a new application if the name contains "stp" or "step" extension. The application is "BinOcaf",
//! STEP reader transfers the file into the application
//! \param theFileName a name of the file initialized the application
//! \return a new application
Standard_EXPORT Handle(TDocStd_Application) CreateApplicationBySTEPFile (const TCollection_AsciiString& theFileName);
}
#endif

@ -0,0 +1,58 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_PropertyPanel.hxx>
#include <DFBrowser_AttributePaneStack.hxx>
#include <DFBrowser_Item.hxx>
#include <DFBrowser_SearchView.hxx>
#include <DFBrowser_Window.hxx>
#include <DFBrowser_TreeLevelView.hxx>
#include <QAbstractItemModel>
#include <QGridLayout>
#include <QItemSelectionModel>
#include <QWidget>
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_PropertyPanel::DFBrowser_PropertyPanel (QWidget* theParent)
: QObject (theParent), myAttributesStack (0)
{
myMainWindow = new QWidget (theParent);
DFBrowser_Window::SetWhiteBackground (myMainWindow);
QGridLayout* aLayout = new QGridLayout (myMainWindow);
aLayout->setContentsMargins (0, 0, 0, 0);
myAttributesStack = new DFBrowser_AttributePaneStack (this);
myAttributesStack->CreateWidget (myMainWindow);
aLayout->addWidget (myAttributesStack->GetWidget(), 0, 0);
}
// =======================================================================
// function : UpdateBySelectionChanged
// purpose :
// =======================================================================
void DFBrowser_PropertyPanel::UpdateBySelectionChanged (const QItemSelection& theSelected,
const QItemSelection&)
{
GetAttributesStack()->GetSearchView()->Reset();
QModelIndex anIndex = DFBrowser_Window::SingleSelected (theSelected.indexes(), 0);
myAttributesStack->SetCurrentItem (anIndex);
}

@ -0,0 +1,60 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_PropertyPanel_H
#define DFBrowser_PropertyPanel_H
#include <Standard.hxx>
#include <TreeModel_ItemBase.hxx>
#include <QItemSelection>
#include <QObject>
class DFBrowser_AttributePaneStack;
class QAbstractItemModel;
class QWidget;
//! \class DFBrowser_PropertyPanel
//! Control that contains attribute pane stack
class DFBrowser_PropertyPanel : public QObject
{
Q_OBJECT
public:
//! Constructor
Standard_EXPORT DFBrowser_PropertyPanel (QWidget* theParent);
//! Destructor
virtual ~DFBrowser_PropertyPanel() Standard_OVERRIDE {}
//! Returns main control
QWidget* GetControl() const { return myMainWindow; }
//! Returns instance of attributes stack
//! \return stack
DFBrowser_AttributePaneStack* GetAttributesStack() { return myAttributesStack; }
//! Fills attributes stack by selected index
//! \param theSelected selected items
//! \param theDeselected deselected items
Standard_EXPORT void UpdateBySelectionChanged (const QItemSelection& theSelected,
const QItemSelection& theDeselected);
private:
QWidget* myMainWindow; //! < parent of attribute stack control
DFBrowser_AttributePaneStack* myAttributesStack; //! < panes stack
};
#endif

@ -0,0 +1,60 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_SearchItemInfo_H
#define DFBrowser_SearchItemInfo_H
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QVariant>
#include <QStringList>
#include <QString>
//! \class DFBrowser_SearchItemInfo
//! Information of item in search model
class DFBrowser_SearchItemInfo
{
public:
//! Constructor
DFBrowser_SearchItemInfo() {}
//! Constructor
DFBrowser_SearchItemInfo (const QVariant& theIcon, const QString& theName,
const QStringList& thePath, const QString& theSeparator)
: myIcon (theIcon), myPath (thePath)
{ myPathUnited = QString ("%1 \n%2").arg (theName).arg (myPath.join (theSeparator)); }
//! Destructor
virtual ~DFBrowser_SearchItemInfo() {}
//! Returns the item icon
const QVariant& Icon() const { return myIcon; }
//! Returns path to the item.
const QStringList& Path() const { return myPath; }
//! Returns united path to the item.
const QString& PathUnited() const { return myPathUnited; }
private:
QVariant myIcon; //!< item icon
QStringList myPath; //!< item path
QString myPathUnited; //!< item name and item path
};
#endif

@ -0,0 +1,180 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_SearchLine.hxx>
#include <DFBrowser_SearchLineModel.hxx>
#include <DFBrowser_Window.hxx>
#include <DFBrowserPane_Tools.hxx>
#include <DFBrowser_Module.hxx>
#include <TDocStd_Application.hxx>
#include <TDocStd_Document.hxx>
#include <TDF_AttributeIterator.hxx>
#include <TDF_ChildIterator.hxx>
#include <QStringList>
#include <QWidget>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QToolButton>
#include <QCompleter>
#include <QIcon>
#include <QPaintEvent>
#include <QPainter>
#include <QStyle>
//! class DFBrowser_LineEdit
//! Extension of Qt line edit to visualize help text until the line edit control has not been filled yet
class DFBrowser_LineEdit : public QLineEdit
{
public:
//! Constructor
DFBrowser_LineEdit (QWidget* theParent) : QLineEdit(theParent) {}
//! Destructor
virtual ~DFBrowser_LineEdit() {}
//! Sets text that is shown in line edit it the text of this control is empty
//! \param theText a string value
void setPlaneHolder (const QString& theText) { myPlaceHolder = theText; }
//! Draws the line edit context, put plane holder if text is empty
//! \param theEvent a paint event
virtual void paintEvent (QPaintEvent* theEvent) Standard_OVERRIDE
{
QLineEdit::paintEvent (theEvent);
if (!text().isEmpty())
return;
QPainter aPainter (this);
QFontMetrics aFontMetrics = fontMetrics();
QRect aLineRect = rect();
Qt::Alignment anAlignment = QStyle::visualAlignment (layoutDirection(), Qt::AlignLeft);
QColor aColor = palette().text().color();
aColor.setAlpha (128);
QPen anOldpen = aPainter.pen();
aPainter.setPen (aColor);
aLineRect.adjust (4, 4, 0, 0);
QString anElidedText = aFontMetrics.elidedText (myPlaceHolder, Qt::ElideRight, aLineRect.width());
aPainter.drawText (aLineRect, anAlignment, anElidedText);
aPainter.setPen (anOldpen);
}
private:
QString myPlaceHolder; //!< text of filling line edit content if the text is empty
};
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_SearchLine::DFBrowser_SearchLine (QWidget* theParent)
: QFrame (theParent)
{
QHBoxLayout* aLayout = new QHBoxLayout (this);
aLayout->setContentsMargins (0, 0, 0, 0);
aLayout->setSpacing (0);
myLineControl = new DFBrowser_LineEdit (this);
((DFBrowser_LineEdit*)myLineControl)->setPlaneHolder (QString (tr ("Scanning application ...")));
mySearchButton = new QToolButton (this);
mySearchButton->setIcon (QIcon (":/icons/search.png"));
QCompleter* aCompleter = new QCompleter (this);
aCompleter->setCaseSensitivity (Qt::CaseInsensitive);
myLineControl->setCompleter (aCompleter);
aLayout->addWidget (myLineControl);
aLayout->addWidget (mySearchButton);
connect (myLineControl, SIGNAL (textChanged (const QString&)), this, SLOT (onTextChanged (const QString&)));
connect (myLineControl, SIGNAL (returnPressed()), this, SLOT (onReturnPressed()));
connect (mySearchButton, SIGNAL (clicked()), this, SLOT (onSearchButtonClicked()));
DFBrowser_Window::SetWhiteBackground (this);
}
// =======================================================================
// function : SetModule
// purpose :
// =======================================================================
void DFBrowser_SearchLine::SetModule (DFBrowser_Module* theModule)
{
DFBrowser_SearchLineModel* aModel = new DFBrowser_SearchLineModel (myLineControl, theModule);
myLineControl->completer()->setModel (aModel);
}
// =======================================================================
// function : GetModule
// purpose :
// =======================================================================
DFBrowser_Module* DFBrowser_SearchLine::GetModule()
{
DFBrowser_SearchLineModel* aModel = dynamic_cast<DFBrowser_SearchLineModel*> (GetModel());
return aModel->GetModule();
}
// =======================================================================
// function : SetValues
// purpose :
// =======================================================================
void DFBrowser_SearchLine::SetValues (const QMap<int, QMap<QString, DFBrowser_SearchItemInfo > >& theDocumentValues,
const QMap<int, QStringList>& theDocumentInfoValues)
{
DFBrowser_SearchLineModel* aModel = dynamic_cast<DFBrowser_SearchLineModel*> (GetModel());
aModel->SetValues (theDocumentValues, theDocumentInfoValues);
QString aFirstValue = !theDocumentInfoValues.empty() ? theDocumentInfoValues.begin().value().first() : "";
DFBrowser_LineEdit* aLineEdit = dynamic_cast<DFBrowser_LineEdit*> (myLineControl);
aLineEdit->setPlaneHolder (QString (tr ("Search : %1")).arg (aFirstValue));
}
// =======================================================================
// function : ClearValues
// purpose :
// =======================================================================
void DFBrowser_SearchLine::ClearValues()
{
DFBrowser_SearchLineModel* aModel = dynamic_cast<DFBrowser_SearchLineModel*> (GetModel());
aModel->ClearValues();
DFBrowser_LineEdit* aLineEdit = dynamic_cast<DFBrowser_LineEdit*> (myLineControl);
aLineEdit->setPlaneHolder(QString (tr ("Scanning application ...")));
}
// =======================================================================
// function : onTextChanged
// purpose :
// =======================================================================
void DFBrowser_SearchLine::onTextChanged (const QString& theText)
{
mySearchButton->setIcon (theText.isEmpty() ? QIcon (":/icons/search.png")
: QIcon (":/icons/search_cancel.png"));
emit searchActivated();
}
// =======================================================================
// function : onSearchButtonClicked
// purpose :
// =======================================================================
void DFBrowser_SearchLine::onSearchButtonClicked()
{
if (!Text().isEmpty())
SetText (QString());
}

@ -0,0 +1,98 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_SearchLine_H
#define DFBrowser_SearchLine_H
#include <DFBrowser_SearchLineModel.hxx> // to include DFBrowser_SearchItemInfo
#include <Standard.hxx>
#include <TDocStd_Application.hxx>
#include <TDF_Label.hxx>
#include <QCompleter>
#include <QFrame>
#include <QLineEdit>
class DFBrowser_Module;
class DFBrowser_SearchLineModel;
class QAbstractItemModel;
class QLineEdit;
class QToolButton;
class QStringList;
//! \class DFBrowser_SearchLine
//! It contains a line edit control with auto completion and search button
class DFBrowser_SearchLine : public QFrame
{
Q_OBJECT
public:
//! Constructor
Standard_EXPORT DFBrowser_SearchLine (QWidget* theParent);
//! Destructor
virtual ~DFBrowser_SearchLine() Standard_OVERRIDE {}
//! Creates search line model filled by the module. It is necessary for auto completion of line edit
//! \param theModule a current module
Standard_EXPORT void SetModule (DFBrowser_Module* theModule);
//! Returns the current module
Standard_EXPORT DFBrowser_Module* GetModule();
//! Fills the search line model by OCAF document values
//! \param theDocumentValues container of document index to container of entry/attribute name to item information
//! \param theDocumentInfoValues container of a document index to entry/attribute name
Standard_EXPORT void SetValues (const QMap<int, QMap<QString, DFBrowser_SearchItemInfo > >& theDocumentValues,
const QMap<int, QStringList>& theDocumentInfoValues);
//! Clears cache of values in search line model
Standard_EXPORT void ClearValues();
//! Returns completer model
Standard_EXPORT QAbstractItemModel* GetModel() { return myLineControl->completer()->model(); }
//! Returns completion completer model
Standard_EXPORT QAbstractItemModel* GetCompletionModel() { return myLineControl->completer()->completionModel(); }
//! Returns the current line edit text
QString Text() const { return myLineControl->text(); }
//! Sets the current text value
//! \param theValue a string value
void SetText (const QString& theValue) { myLineControl->setText (theValue); }
signals:
//! Signals that is emitted by text changed in line edit control
void searchActivated();
private slots:
//! Updates icon of search button depending on text is empty and emits searchActivated signal
void onTextChanged (const QString& theText);
//! Set completion prefix in completer model
void onReturnPressed() { myLineControl->completer()->setCompletionPrefix (myLineControl->text()); }
//! Set empty text if the current text is not empty: new search is started
void onSearchButtonClicked();
private:
QLineEdit* myLineControl; //!< line editor control
QToolButton* mySearchButton; //! < search button
};
#endif

@ -0,0 +1,201 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_SearchLineModel.hxx>
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowserPane_AttributePane.hxx>
#include <DFBrowserPane_ItemRole.hxx>
#include <DFBrowserPane_Tools.hxx>
#include <QDir>
#include <QIcon>
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_SearchLineModel::DFBrowser_SearchLineModel (QObject* theParent, DFBrowser_Module* theModule)
: QAbstractTableModel (theParent), myModule (theModule), myRowCount (0)
{
}
// =======================================================================
// function : SetValues
// purpose :
// =======================================================================
void DFBrowser_SearchLineModel::SetValues (const QMap<int, QMap<QString, DFBrowser_SearchItemInfo > >& theDocumentValues,
const QMap<int, QStringList>& theDocumentInfoValues)
{
myAdditionalValues = theDocumentValues;
myDocumentInfoValues = theDocumentInfoValues;
myRowCount = 0;
for (QMap<int, QStringList>::const_iterator aValuesIt = myDocumentInfoValues.begin();
aValuesIt != myDocumentInfoValues.end(); aValuesIt++)
myRowCount += aValuesIt.value().size();
}
// =======================================================================
// function : ClearValues
// purpose :
// =======================================================================
void DFBrowser_SearchLineModel::ClearValues()
{
myAdditionalValues.clear();
myDocumentInfoValues.clear();
myRowCount = 0;
}
// =======================================================================
// function : GetPath
// purpose :
// =======================================================================
QStringList DFBrowser_SearchLineModel::GetPath (const QModelIndex& theIndex) const
{
int aRowInDocument;
int aDocumentId = getDocumentId (theIndex.row(), aRowInDocument);
if (aDocumentId < 0)
return QStringList();
const QMap<QString, DFBrowser_SearchItemInfo>& anAdditionalValues = myAdditionalValues[aDocumentId];
const QStringList& anInfoValues = myDocumentInfoValues[aDocumentId];
return anAdditionalValues[anInfoValues[aRowInDocument] ].Path();
}
// =======================================================================
// function : GetValue
// purpose :
// =======================================================================
QString DFBrowser_SearchLineModel::GetValue (const QModelIndex& theIndex) const
{
int aRowInDocument;
int aDocumentId = getDocumentId (theIndex.row(), aRowInDocument);
if (aDocumentId < 0)
return QString();
QString aValue = myDocumentInfoValues[aDocumentId][aRowInDocument];
return aValue.mid (0, aValue.indexOf (SplitSeparator()));
}
// =======================================================================
// function : index
// purpose :
// =======================================================================
QModelIndex DFBrowser_SearchLineModel::index (int theRow, int theColumn, const QModelIndex& theParent) const
{
if (!hasIndex (theRow, theColumn, theParent))
return QModelIndex();
return createIndex (theRow, theColumn);
}
// =======================================================================
// function : data
// purpose :
// =======================================================================
QVariant DFBrowser_SearchLineModel::data (const QModelIndex& theIndex, int theRole) const
{
switch (theIndex.column())
{
case 0:
{
if (theRole == Qt::DisplayRole || theRole == Qt::EditRole || theRole == Qt::ToolTipRole)
{
int aRowInDocument;
int aDocumentId = getDocumentId (theIndex.row(), aRowInDocument);
if (aDocumentId < 0)
return QVariant();
return myDocumentInfoValues[aDocumentId][aRowInDocument];
}
break;
}
case 1:
{
if (theRole == Qt::DecorationRole)
{
int aRowInDocument;
int aDocumentId = getDocumentId (theIndex.row(), aRowInDocument);
if (aDocumentId < 0)
return QVariant();
QString anInfoValue = myDocumentInfoValues[aDocumentId][aRowInDocument];
QVariant anIcon = myAdditionalValues[aDocumentId][anInfoValue].Icon();
if (anIcon.isNull())
{
QString anAttributeName = anInfoValue.mid (0, anInfoValue.indexOf (SplitSeparator()));
anIcon = DFBrowser_Module::GetAttributeInfo (anAttributeName.toUtf8().data(),
myModule, DFBrowserPane_ItemRole_Decoration_40x40, 0);
}
return anIcon;
}
if (theRole == Qt::SizeHintRole) return QSize (80, 80);
break;
}
case 2:
{
if (theRole == Qt::DisplayRole || theRole == Qt::EditRole)
{
int aRowInDocument;
int aDocumentId = getDocumentId (theIndex.row(), aRowInDocument);
if (aDocumentId < 0)
return QVariant();
QString anInfoValue = myDocumentInfoValues[aDocumentId][aRowInDocument];
return myAdditionalValues[aDocumentId][anInfoValue].PathUnited();
}
break;
}
default:
break;
}
return QVariant();
}
// =======================================================================
// function : emitLayoutChanged
// purpose :
// =======================================================================
void DFBrowser_SearchLineModel::EmitLayoutChanged()
{
emit layoutChanged();
}
// =======================================================================
// function : getDocumentId
// purpose :
// =======================================================================
int DFBrowser_SearchLineModel::getDocumentId (const int theRow, int& theRowInDocument) const
{
theRowInDocument = 0;
int aDocumentId = -1;
int aCurrentRow = theRow;
for (int aValueId = 0, aSize = myDocumentInfoValues.size(); aValueId < aSize; aValueId++)
{
int aValueIndex = aValueId+1;
if (!myDocumentInfoValues.contains (aValueIndex))
continue;
QStringList aValues = myDocumentInfoValues[aValueIndex];
int aValuesSize = aValues.size();
if (aCurrentRow < aValuesSize)
{
aDocumentId = aValueIndex;
theRowInDocument= aCurrentRow;
}
else
aCurrentRow = aCurrentRow - aValuesSize;
}
return aDocumentId;
}

@ -0,0 +1,121 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_SearchLineModel_H
#define DFBrowser_SearchLineModel_H
#include <DFBrowser_SearchItemInfo.hxx>
#include <Standard.hxx>
#include <TDF_Attribute.hxx>
#include <TDF_Label.hxx>
#include <TreeModel_ItemBase.hxx>
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QAbstractTableModel>
#include <QMap>
#include <QStringList>
#include <QVariant>
class QObject;
class DFBrowser_Module;
//! \class DFBrowser_SearchLineModel
//! Table view model filled by OCAF labels and attributes. It contain information in the next form:
//! <document index> into <document values container>
//! <document values container> is key(attribute name or label entry) into item information
//! The model contains 3 columns:
//! - 0: information text
//! - 1: icon size is [80, 80]
//! - 2: information text that contains united path
class DFBrowser_SearchLineModel : public QAbstractTableModel
{
public:
//! Constructor
Standard_EXPORT DFBrowser_SearchLineModel (QObject* theParent, DFBrowser_Module* theModule);
//! Destructor
virtual ~DFBrowser_SearchLineModel() Standard_OVERRIDE {}
//! Separator as attribute name is divided from the label entry in information text
static QString SplitSeparator() { return ": "; }
//! Returns the current module
DFBrowser_Module* GetModule() const { return myModule; }
//! Fills internal containers by the OCAF values. Updates number of rows value
//! \param theDocumentValues container of document index to container of entry/attribute name to item information
//! \param theDocumentInfoValues container of a document index to entry/attribute name
Standard_EXPORT void SetValues (const QMap<int, QMap<QString, DFBrowser_SearchItemInfo > >& theDocumentValues,
const QMap<int, QStringList>& theDocumentInfoValues);
//! Clears cache of values
Standard_EXPORT void ClearValues();
//! Returns path to attribute or label element of OCAF by the index.
//! \param theIndex a tree model index
Standard_EXPORT QStringList GetPath (const QModelIndex& theIndex) const;
//! Returns value(attribute name or label entry) of OCAF by the index
Standard_EXPORT QString GetValue (const QModelIndex& theIndex) const;
//! Emits the layoutChanged signal from outside of this class
Standard_EXPORT void EmitLayoutChanged();
//! Creates new model index
//! \param theRow the index row position
//! \param theColummn the index column position
//! \param theParent the parent index
//! \return the model index
Standard_EXPORT virtual QModelIndex index (int theRow, int theColumn,
const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE;
//! Returns the data stored under the given role for the item referred to by the index.
//! \param theIndex a model index
//! \param theRole an enumeration value of role for data obtaining
Standard_EXPORT virtual QVariant data (const QModelIndex& theIndex,
int theRole = Qt::DisplayRole) const Standard_OVERRIDE;
//! Returns the number of rows under the given parent.
//! \param theParent a parent model index
//! \return the number of rows
virtual int rowCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
{ (void)theParent; return myRowCount; }
//! Returns the number of columns for the children of the given parent.
//! \param theParent a parent model index
//! \return the number of columns
virtual int columnCount (const QModelIndex& theParent = QModelIndex()) const Standard_OVERRIDE
{ (void)theParent; return 3; }
protected:
//! Returns document index by a row index in table model
//! \param theRow a row index of a QModelIndex
//! \param theRowInDocument an output index, to obtain information from myDocumentInfoValues
int getDocumentId (const int theRow, int& theRowInDocument) const;
private:
DFBrowser_Module* myModule; //!< the current module
//! a document index to container of entry/attribute name to item information
QMap<int, QMap<QString, DFBrowser_SearchItemInfo> > myAdditionalValues;
QMap<int, QStringList> myDocumentInfoValues; //!< a document index to entry/attribute name
int myRowCount; //!< number of rows in the model: summ of row counts in all documents
};
#endif

@ -0,0 +1,118 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_SearchView.hxx>
#include <DFBrowser_HighlightDelegate.hxx>
#include <DFBrowser_SearchLine.hxx>
#include <DFBrowser_SearchLineModel.hxx>
#include <DFBrowser_Window.hxx>
#include <DFBrowserPane_Tools.hxx>
#include <QAbstractProxyModel>
#include <QGridLayout>
#include <QHeaderView>
#include <QTableView>
#include <QWidget>
const int DEFAULT_COLUMN_WIDTH = 500;
const int DEFAULT_ICON_SIZE = 40;
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_SearchView::DFBrowser_SearchView (QWidget* theParent)
: QObject (theParent)
{
myMainWindow = new QWidget (theParent);
QGridLayout* aLayout = new QGridLayout (myMainWindow);
aLayout->setContentsMargins (0, 0, 0, 0);
myTableView = new QTableView (myMainWindow);
myTableView->verticalHeader()->setVisible (false);
myTableView->verticalHeader()->setDefaultSectionSize (DEFAULT_ICON_SIZE + DFBrowserPane_Tools::HeaderSectionMargin());
myTableView->setIconSize (QSize (DEFAULT_ICON_SIZE, DEFAULT_ICON_SIZE));
myTableView->horizontalHeader()->setVisible (false);
myTableView->horizontalHeader()->setStretchLastSection (true);
myTableView->viewport()->setAttribute (Qt::WA_Hover);
myTableView->setItemDelegate (new DFBrowser_HighlightDelegate (myTableView));
aLayout->addWidget (myTableView);
DFBrowser_Window::SetWhiteBackground (myTableView);
myTableView->setGridStyle (Qt::NoPen);
}
// =======================================================================
// function : InitModels
// purpose :
// =======================================================================
void DFBrowser_SearchView::InitModels()
{
QAbstractItemModel* aModel = mySearchLine->GetCompletionModel();
myTableView->setModel (aModel);
myTableView->setColumnWidth (0, 0); // to hide column
myTableView->setColumnWidth (1, DEFAULT_ICON_SIZE + DFBrowserPane_Tools::HeaderSectionMargin());
QItemSelectionModel* aSelectionModel = new QItemSelectionModel (aModel);
myTableView->setSelectionMode (QAbstractItemView::SingleSelection);
myTableView->setSelectionModel (aSelectionModel);
connect (aSelectionModel, SIGNAL (selectionChanged (const QItemSelection&, const QItemSelection&)),
this, SLOT (onTableSelectionChanged (const QItemSelection&, const QItemSelection&)));
connect (myTableView, SIGNAL (doubleClicked (const QModelIndex&)),
this, SLOT (onTableDoubleClicked (const QModelIndex&)));
}
// =======================================================================
// function : onTableSelectionChanged
// purpose :
// =======================================================================
void DFBrowser_SearchView::onTableSelectionChanged (const QItemSelection& theSelected,
const QItemSelection&)
{
QModelIndexList aSelectedIndices = theSelected.indexes();
QModelIndex aSelectedIndex = DFBrowser_Window::SingleSelected (aSelectedIndices, 2);
if (!aSelectedIndex.isValid())
return;
QAbstractProxyModel* aTableModel = dynamic_cast<QAbstractProxyModel*> (myTableView->model());
if (!aTableModel)
return;
DFBrowser_SearchLineModel* aSourceModel = dynamic_cast<DFBrowser_SearchLineModel*> (aTableModel->sourceModel());
if (!aSourceModel)
return;
QModelIndex aSourceSelectedIndex = aTableModel->mapToSource(aSelectedIndex);
emit pathSelected(aSourceModel->GetPath (aSourceSelectedIndex), aSourceModel->GetValue (aSourceSelectedIndex));
}
// =======================================================================
// function : onTableDoubleClicked
// purpose :
// =======================================================================
void DFBrowser_SearchView::onTableDoubleClicked (const QModelIndex& theIndex)
{
QAbstractProxyModel* aTableModel = dynamic_cast<QAbstractProxyModel*> (myTableView->model());
if (!aTableModel)
return;
DFBrowser_SearchLineModel* aSourceModel = dynamic_cast<DFBrowser_SearchLineModel*> (aTableModel->sourceModel());
if (!aSourceModel)
return;
QModelIndex aSourceSelectedIndex = aTableModel->mapToSource(theIndex);
emit pathDoubleClicked (aSourceModel->GetPath (aSourceSelectedIndex), aSourceModel->GetValue (aSourceSelectedIndex));
}

@ -0,0 +1,86 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_SearchView_H
#define DFBrowser_SearchView_H
#include <DFBrowser_SearchLine.hxx>
#include <Standard.hxx>
#include <TreeModel_ItemBase.hxx>
#include <QItemSelection>
#include <QObject>
class DFBrowser_SearchLine;
class QTableView;
class QWidget;
//! \class DFBrowser_SearchView
//! Container of search result. It has a table of values
class DFBrowser_SearchView : public QObject
{
Q_OBJECT
public:
//! Constructor
Standard_EXPORT DFBrowser_SearchView (QWidget* theParent);
//! Destructor
virtual ~DFBrowser_SearchView() Standard_OVERRIDE {}
//! Returns search parent control
QWidget* GetControl() const { return myMainWindow; }
//! Sets search line to connect to the search line completion model
void SetSearchLine (DFBrowser_SearchLine* theSearchLine) { mySearchLine = theSearchLine; }
//! Fills the table by values of search line completion model. The zero column of the table is hidden,
//! so it visualizes values of 1st and 2nd columns of this model. It creates selection model and connects
//! to selectionChanged and doubleClicked signals
Standard_EXPORT void InitModels();
//! Resets search line
void Reset() { mySearchLine->SetText (""); }
signals:
//! Signal about selecting of an item in the view.
//! \param thePath path to the selected item (e.g. 0, 0:1, 0:1:1)
//! \param theValue value of the selected item (e.g. TDataStd_Name)
void pathSelected (const QStringList& thePath, const QString& theValue);
//! Signal about double click on an item in the view.
//! \param thePath path to the selected item (e.g. 0, 0:1, 0:1:1)
//! \param theValue value of the selected item (e.g. TDataStd_Name)
void pathDoubleClicked (const QStringList& thePath, const QString& theValue);
protected slots:
//! Listens selection change and emits the pathSelected signal
//! \param theSelected selected items
//! \param theDeselected deselected items
void onTableSelectionChanged (const QItemSelection& theSelected, const QItemSelection& theDeselected);
//! Listens double click signal on table view
//! \theIndex a model index of double clicked item
void onTableDoubleClicked (const QModelIndex& theIndex);
private:
QWidget* myMainWindow; //!< control where table view is placed
QTableView* myTableView; //!< table view to visualize search values
DFBrowser_SearchLine* mySearchLine; //!< search line to have access to search model completor
};
#endif

@ -0,0 +1,53 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_Shortcut.hxx>
#include <DFBrowser_Module.hxx>
#include <QApplication>
#include <QKeyEvent>
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_Shortcut::DFBrowser_Shortcut (QObject* theParent)
: QObject (theParent), myModule (0)
{
qApp->installEventFilter (this);
}
// =======================================================================
// function : eventFilter
// purpose :
// =======================================================================
bool DFBrowser_Shortcut::eventFilter (QObject* theObject, QEvent* theEvent)
{
if (!myModule || theEvent->type() != QEvent::KeyRelease)
return QObject::eventFilter (theObject, theEvent);
QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*> (theEvent);
switch (aKeyEvent->key())
{
case Qt::Key_F5:
{
myModule->UpdateTreeModel();
return true;
}
default: break;
}
return QObject::eventFilter (theObject, theEvent);
}

@ -0,0 +1,55 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_Shortcut_H
#define DFBrowser_Shortcut_H
#include <Standard.hxx>
#include <Standard_Macro.hxx>
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QObject>
class DFBrowser_Module;
class QEvent;
//! \class DFBrowser_Shortcut
//! Listens application KeyRelease event. Processes key event:
//! - <Key_F5>: updates tree view model
class DFBrowser_Shortcut : public QObject
{
public:
//! Constructor
Standard_EXPORT DFBrowser_Shortcut (QObject* theParent);
//! Destructor
virtual ~DFBrowser_Shortcut() {}
//! Sets the current module
//! \param theModule a module
void SetModule (DFBrowser_Module* theModule) { myModule = theModule; }
//! Processes key release event to update view model, otherwise do usual QObject functionality
Standard_EXPORT virtual bool eventFilter (QObject *theObject, QEvent* theEvent) Standard_OVERRIDE;
private:
DFBrowser_Module* myModule; //!< the current module
};
#endif

@ -0,0 +1,152 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_Thread.hxx>
#include <DFBrowser_ThreadItemSearch.hxx>
#include <DFBrowser_ThreadItemUsedShapesMap.hxx>
#include <DFBrowser_TreeLevelLine.hxx>
#include <DFBrowser_SearchLine.hxx>
#include <DFBrowser_Window.hxx>
#include <QThread>
//! \class DFBrowser_QThread
//! Internal class to cover QThread in order to process ThreadItem.
class DFBrowser_QThread : public QThread
{
public:
//! Constructor
DFBrowser_QThread (QObject* theParent) : QThread (theParent), myItem (0) {}
//! Destructor
virtual ~DFBrowser_QThread() Standard_OVERRIDE {}
//! Sets thread item to be processed
//! \param theItem a thread item
void setItem (DFBrowser_ThreadItem* theItem) { myItem = theItem; }
//! Returns the current processing thread item
DFBrowser_ThreadItem* getItem() const { return myItem; }
protected:
//! Starts thread item
virtual void run() Standard_OVERRIDE
{
if (myItem)
myItem->Run();
}
private:
DFBrowser_ThreadItem* myItem;
};
// =======================================================================
// function : Constructor
// purpose :
// =======================================================================
DFBrowser_Thread::DFBrowser_Thread (DFBrowser_Window* theWindow)
: QObject (theWindow), myPostponedItem (0), myIsFinishProcessing (false)
{
DFBrowser_SearchLine* aSearchLine = theWindow->GetTreeLevelLine()->GetSearchLine();
myItems.append (new DFBrowser_ThreadItemSearch(aSearchLine));
myItems.append (new DFBrowser_ThreadItemUsedShapesMap());
}
// =======================================================================
// function : SetModule
// purpose :
// =======================================================================
void DFBrowser_Thread::SetModule (DFBrowser_Module* theModule)
{
for (int anItemId = 0, aSize = myItems.size(); anItemId < aSize; anItemId++)
{
DFBrowser_ThreadItemUsedShapesMap* aShapesItem = dynamic_cast<DFBrowser_ThreadItemUsedShapesMap*> (myItems[anItemId]);
if (aShapesItem)
aShapesItem->SetModule (theModule);
}
}
// =======================================================================
// function : ProcessApplication
// purpose :
// =======================================================================
void DFBrowser_Thread::ProcessApplication()
{
for (int anItemId = 0, aSize = myItems.size(); anItemId < aSize; anItemId++)
startThread (myItems[anItemId]);
}
// =======================================================================
// function : startThread
// purpose :
// =======================================================================
void DFBrowser_Thread::startThread (DFBrowser_ThreadItem* theItem)
{
DFBrowser_QThread* aThread = new DFBrowser_QThread (this);
aThread->setItem (theItem);
aThread->start();
connect (aThread, SIGNAL (finished()), this, SLOT (onFinished()), Qt::QueuedConnection);
myStartedThreads.append (aThread);
}
// =======================================================================
// function : TerminateThread
// purpose :
// =======================================================================
void DFBrowser_Thread::TerminateThread()
{
for (int aThreadsId = 0, aCount = myStartedThreads.size(); aThreadsId < aCount; aThreadsId++)
{
QThread* aThread = myStartedThreads[aThreadsId];
if (aThread->isRunning())
aThread->terminate();
}
}
// =======================================================================
// function : onFinished
// purpose :
// =======================================================================
void DFBrowser_Thread::onFinished()
{
DFBrowser_QThread* aThread = (DFBrowser_QThread*)(sender());
if (myIsFinishProcessing)
{
// if thread send signal when other finished signal is processed
if (aThread)
myPostponedItem = aThread->getItem();
return;
}
myIsFinishProcessing = true;
if (aThread)
{
myStartedThreads.removeAll (aThread);
DFBrowser_ThreadItem* anItem = aThread->getItem();
if (anItem)
anItem->ApplyValues();
}
myIsFinishProcessing = false;
if (myPostponedItem)
{
myPostponedItem->ApplyValues();
myPostponedItem = 0;
}
}

@ -0,0 +1,78 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_Thread_H
#define DFBrowser_Thread_H
#include <Standard.hxx>
#ifdef _MSC_VER
#pragma warning(disable : 4127) // conditional expression is constant
#endif
#include <QList>
#include <QObject>
class DFBrowser_Module;
class DFBrowser_ThreadItem;
class DFBrowser_Window;
class QThread;
//! /class DFBrowser_Thread
//! Starts algorithm item in a separate thread and perform some functionality by the algorithm(thread) is finished
class DFBrowser_Thread : public QObject
{
Q_OBJECT
public:
//! Constructor
Standard_EXPORT DFBrowser_Thread (DFBrowser_Window* theWindow);
//! Destructor
virtual ~DFBrowser_Thread() {}
//! Sets module to the started thread items
//! \param theModule a current module
Standard_EXPORT void SetModule (DFBrowser_Module* theModule);
//! Starts all candidate thread items
Standard_EXPORT void ProcessApplication();
//! Terminates all started threads.
Standard_EXPORT void TerminateThread();
protected:
//! Creates new Qt thread and starts the item. Connects to finished signal of thread.
//! \param theItem a thread item
void startThread (DFBrowser_ThreadItem* theItem);
protected slots:
//! Removes finished thread from the thread items and apply values of this thread
//! If this signal is come when another thread is processed, the current thread is stored in a cache and
//! is processed after the previous thread is processed.
void onFinished();
private:
QList<DFBrowser_ThreadItem*> myItems; //!< candidates to be processed in a thread
QList<QThread*> myStartedThreads; //!< container of started threads
DFBrowser_ThreadItem* myPostponedItem; //!< currently processed item in onFinished()
bool myIsFinishProcessing; //!< blocking state if onFinished() is started but has not been finished yet
};
#endif

@ -0,0 +1,42 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef DFBrowser_ThreadItem_H
#define DFBrowser_ThreadItem_H
#include <Standard_Macro.hxx>
//! \class DFBrowser_ThreadItem
//! An abstract interface for candidates to be processed in a separate thread.
//! To do this, new thread item should inherit this interface and be started in DFBrowser_Thread.
class DFBrowser_ThreadItem
{
public:
//! Constructor
DFBrowser_ThreadItem() {}
//! Destructor
virtual ~DFBrowser_ThreadItem() {}
//! Algorithm of this item work. It will be performed only once
virtual void Run() = 0;
//! Applying values accepted by algorithm
virtual void ApplyValues() = 0;
};
#endif

@ -0,0 +1,174 @@
// Created on: 2017-06-16
// Created by: Natalia ERMOLAEVA
// Copyright (c) 2017 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <DFBrowser_ThreadItemSearch.hxx>
#include <DFBrowser_Module.hxx>
#include <DFBrowser_Tools.hxx>
#include <DFBrowser_TreeModel.hxx>
#include <DFBrowser_SearchLine.hxx>
#include <DFBrowserPane_Tools.hxx>
#include <TDataStd_Comment.hxx>
#include <TDataStd_Name.hxx>
#include <TDataStd_UAttribute.hxx>
#include <TDF_AttributeIterator.hxx>
#include <TDF_ChildIterator.hxx>
#include <QDir>
// =======================================================================
// function : Run
// purpose :
// =======================================================================
void DFBrowser_ThreadItemSearch::Run()
{
DFBrowser_TreeModel* aModel = dynamic_cast<DFBrowser_TreeModel*> (mySearchLine->GetModule()->GetOCAFViewModel());
Handle(TDocStd_Application) anApplication = aModel->GetTDocStdApplication();
if (anApplication.IsNull())
return;
myDocumentValues.clear();
myDocumentInfoValues.clear();
//#define REQUIRE_OCAF_REVIEW:25 : start
QMap<QString, DFBrowser_SearchItemInfo> anAdditionalValues;
QStringList anInfoValues;
QStringList aCurrentPath;
for (Standard_Integer aDocId = 1, aNbDoc = anApplication->NbDocuments(); aDocId <= aNbDoc; aDocId++)
{
Handle(TDocStd_Document) aDocument;
anApplication->GetDocument (aDocId, aDocument);
if (aDocument.IsNull())
continue;
anAdditionalValues.clear();
anInfoValues.clear();
aCurrentPath.clear();
getLabelLines (aDocument->Main().Root(), aCurrentPath, anAdditionalValues, anInfoValues);
myDocumentValues[aDocId] = anAdditionalValues;
myDocumentInfoValues[aDocId] = anInfoValues;
}
//#define REQUIRE_OCAF_REVIEW:25 : end
}
// =======================================================================
// function : ApplyValues
// purpose :
// =======================================================================
void DFBrowser_ThreadItemSearch::ApplyValues()
{
mySearchLine->SetValues (myDocumentValues, myDocumentInfoValues);
}
// =======================================================================
// function : ClearValues
// purpose :
// =======================================================================
void DFBrowser_ThreadItemSearch::ClearValues (DFBrowser_SearchLine* theSearchLine)
{
theSearchLine->ClearValues();
}
// =======================================================================
// function : getLabelLines
// purpose :
// =======================================================================
void DFBrowser_ThreadItemSearch::getLabelLines (const TDF_Label& theLabel, QStringList& theCurrentPath,
QMap<QString, DFBrowser_SearchItemInfo >& theValues,
QStringList& theInfoValues)
{
addLabel (theLabel, theCurrentPath, theValues, theInfoValues);
theCurrentPath.append (DFBrowserPane_Tools::GetEntry (theLabel).ToCString());
int anId = 0;
for (TDF_AttributeIterator anAttrIt (theLabel); anAttrIt.More(); anAttrIt.Next(), anId++)
addAttribute(anAttrIt.Value(), theCurrentPath, theValues, theInfoValues);
for (TDF_ChildIterator aChildIt (theLabel); aChildIt.More(); aChildIt.Next())
getLabelLines(aChildIt.Value(), theCurrentPath, theValues, theInfoValues);
theCurrentPath.removeLast();
}
// =======================================================================
// function : addLabel
// purpose :
// =======================================================================
void DFBrowser_ThreadItemSearch::addLabel (const TDF_Label& theLabel, const QStringList& theCurrentPath,
QMap<QString, DFBrowser_SearchItemInfo>& theValues,
QStringList& theInfoValues)
{
QString anEntry = DFBrowserPane_Tools::GetEntry (theLabel).ToCString();
if (!theValues.contains (anEntry))
{
theInfoValues.append (anEntry);
theValues[anEntry] = DFBrowser_SearchItemInfo (DFBrowser_Tools::GetLabelIcon (theLabel, false),
anEntry, theCurrentPath, QDir::separator());
}
}
// =======================================================================
// function : addAttribute
// purpose :
// =======================================================================
void DFBrowser_ThreadItemSearch::addAttribute (const Handle(TDF_Attribute)& theAttribute,
const QStringList& theCurrentPath,
QMap<QString, DFBrowser_SearchItemInfo >& theValues,
QStringList& theInfoValues)
{
Standard_CString anAttributeKind = theAttribute->DynamicType()->Name();
// add element of attribute kind
QString anAttributeName = QString ("%1%2%3").arg (anAttributeKind)
.arg (DFBrowser_SearchLineModel::SplitSeparator())
.arg (DFBrowserPane_Tools::GetEntry (theAttribute->Label()).ToCString());
if (!theInfoValues.contains (anAttributeName))
{
theInfoValues.append (anAttributeName);
theValues[anAttributeName] = DFBrowser_SearchItemInfo (QVariant(), anAttributeName, theCurrentPath,
QDir::separator());
}
// add element of attribute value, e.g. Name or Comment string
QString anAttributeValue;
if (anAttributeKind == STANDARD_TYPE (TDataStd_Name)->Name())
{
Handle(TDataStd_Name) anAttribute = Handle(TDataStd_Name)::DownCast (theAttribute);
anAttributeValue = DFBrowserPane_Tools::ToString (anAttribute->Get());
}
else if (anAttributeKind == STANDARD_TYPE (TDataStd_Comment)->Name())
{
Handle(TDataStd_Comment) anAttribute = Handle(TDataStd_Comment)::DownCast (theAttribute);
anAttributeValue = DFBrowserPane_Tools::ToString (anAttribute->Get());
}
else
return;
if (anAttributeValue == "")
return;
// using attribute value in the name
QString anAttributeValueExt = QString ("%1%2%3").arg (anAttributeValue)
.arg (DFBrowser_SearchLineModel::SplitSeparator())
.arg (DFBrowserPane_Tools::GetEntry (theAttribute->Label()).ToCString());
if (!theInfoValues.contains (anAttributeValueExt))
{
theInfoValues.append (anAttributeValueExt);
theValues[anAttributeValueExt] = DFBrowser_SearchItemInfo (QVariant(), anAttributeValueExt,
theCurrentPath, QDir::separator());
}
}

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