Merge branch 'master' of ssh://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad
This commit is contained in:
commit
b0dcfe6dcf
|
@ -52,6 +52,10 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
add_definitions(-Wno-write-strings)
|
add_definitions(-Wno-write-strings)
|
||||||
add_definitions(-Wno-deprecated)
|
add_definitions(-Wno-deprecated)
|
||||||
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
# get linker errors as soon as possible and not at runtime e.g. for modules
|
||||||
|
if(UNIX)
|
||||||
|
# SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined")
|
||||||
|
endif(UNIX)
|
||||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,7 +100,21 @@ OPTION(FREECAD_MAINTAINERS_BUILD "Build FreeCAD for Maintainers, with Docu and 3
|
||||||
OPTION(FREECAD_BUILD_CAM "Build the FreeCAD CAM module and the needed libs, be aware, unfinished code!" OFF)
|
OPTION(FREECAD_BUILD_CAM "Build the FreeCAD CAM module and the needed libs, be aware, unfinished code!" OFF)
|
||||||
OPTION(FREECAD_BUILD_FEM "Build the FreeCAD FEM module, be aware, unfinished code!" ON)
|
OPTION(FREECAD_BUILD_FEM "Build the FreeCAD FEM module, be aware, unfinished code!" ON)
|
||||||
OPTION(FREECAD_BUILD_SANDBOX "Build the FreeCAD Sandbox module which is only for testing purposes" OFF)
|
OPTION(FREECAD_BUILD_SANDBOX "Build the FreeCAD Sandbox module which is only for testing purposes" OFF)
|
||||||
|
OPTION(FREECAD_BUILD_TEMPLATE "Build the FreeCAD template module which is only for testing purposes" OFF)
|
||||||
OPTION(FREECAD_BUILD_DEBIAN "Prepare for a build of a Debian package" OFF)
|
OPTION(FREECAD_BUILD_DEBIAN "Prepare for a build of a Debian package" OFF)
|
||||||
|
OPTION(FREECAD_USE_EXTERNAL_ZIPIOS "Use system installed zipios++ instead of the bundled." OFF)
|
||||||
|
OPTION(FREECAD_USE_EXTERNAL_PIVY "Use system installed python-pivy instead of the bundled." OFF)
|
||||||
|
if(MSVC)
|
||||||
|
OPTION(FREECAD_USE_3DCONNEXION "Use the 3D connexion SDK to support 3d mouse." ON)
|
||||||
|
else(MSVC)
|
||||||
|
set(FREECAD_USE_3DCONNEXION OFF)
|
||||||
|
endif(MSVC)
|
||||||
|
|
||||||
|
# if this is set override some options
|
||||||
|
if (FREECAD_BUILD_DEBIAN)
|
||||||
|
set(FREECAD_USE_EXTERNAL_ZIPIOS ON)
|
||||||
|
set(FREECAD_USE_EXTERNAL_PIVY ON)
|
||||||
|
endif (FREECAD_BUILD_DEBIAN)
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
|
|
||||||
|
@ -104,6 +122,7 @@ if(FREECAD_LIBPACK_USE)
|
||||||
# checking for a unique file in LibPack location to make sure the right version of the LibPack is there
|
# checking for a unique file in LibPack location to make sure the right version of the LibPack is there
|
||||||
find_file(FREECAD_LIBPACK_CHECKFILE6X boost_program_options-vc80-mt-gd.lib ${FREECAD_LIBPACK_DIR}/lib )
|
find_file(FREECAD_LIBPACK_CHECKFILE6X boost_program_options-vc80-mt-gd.lib ${FREECAD_LIBPACK_DIR}/lib )
|
||||||
find_file(FREECAD_LIBPACK_CHECKFILE7X boost_program_options-vc90-mt-gd-1_39.lib ${FREECAD_LIBPACK_DIR}/lib )
|
find_file(FREECAD_LIBPACK_CHECKFILE7X boost_program_options-vc90-mt-gd-1_39.lib ${FREECAD_LIBPACK_DIR}/lib )
|
||||||
|
find_file(FREECAD_LIBPACK_CHECKFILE8X boost_program_options-vc90-mt-gd-1_48.lib ${FREECAD_LIBPACK_DIR}/lib )
|
||||||
find_file(FREECAD_LIBPACK_CHECKCUSTOM boost_program_options-vc90-mt-gd-1_41.lib ${FREECAD_LIBPACK_DIR}/lib )
|
find_file(FREECAD_LIBPACK_CHECKCUSTOM boost_program_options-vc90-mt-gd-1_41.lib ${FREECAD_LIBPACK_DIR}/lib )
|
||||||
IF(FREECAD_LIBPACK_CHECKFILE6X)
|
IF(FREECAD_LIBPACK_CHECKFILE6X)
|
||||||
include(cMake/UseLibPack6x.cmake)
|
include(cMake/UseLibPack6x.cmake)
|
||||||
|
@ -115,6 +134,13 @@ if(FREECAD_LIBPACK_USE)
|
||||||
set(FREECAD_LIBPACK6 NOTFOUND CACHE STRING "Displays if the libpack has been found")
|
set(FREECAD_LIBPACK6 NOTFOUND CACHE STRING "Displays if the libpack has been found")
|
||||||
MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK6)
|
MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK6)
|
||||||
set(FREECAD_LIBPACK7 FOUND CACHE STRING "Displays if the libpack has been found")
|
set(FREECAD_LIBPACK7 FOUND CACHE STRING "Displays if the libpack has been found")
|
||||||
|
ELSEIF(FREECAD_LIBPACK_CHECKFILE8X)
|
||||||
|
include(cMake/UseLibPack8x.cmake)
|
||||||
|
set(FREECAD_LIBPACK6 NOTFOUND CACHE STRING "Displays if the libpack has been found")
|
||||||
|
set(FREECAD_LIBPACK7 NOTFOUND CACHE STRING "Displays if the libpack has been found")
|
||||||
|
set(SWIG_EXECUTABLE ${FREECAD_LIBPACK_DIR}/tools/swigwin-1.3.40/swig.exe)
|
||||||
|
MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK6)
|
||||||
|
set(FREECAD_LIBPACK8 FOUND CACHE STRING "Displays if the libpack has been found")
|
||||||
ELSEIF(FREECAD_LIBPACK_CHECKCUSTOM)
|
ELSEIF(FREECAD_LIBPACK_CHECKCUSTOM)
|
||||||
include(cMake/UseLibPackCustom.cmake)
|
include(cMake/UseLibPackCustom.cmake)
|
||||||
set(FREECAD_LIBPACKX FOUND CACHE STRING "Displays if the libpack has been found")
|
set(FREECAD_LIBPACKX FOUND CACHE STRING "Displays if the libpack has been found")
|
||||||
|
@ -185,7 +211,7 @@ MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK_CHECKFILE6X FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
if( ${OCE_FOUND} )
|
if( ${OCE_FOUND} )
|
||||||
message("-- OpenCASCADE Community Edition has been found.")
|
message("-- OpenCASCADE Community Edition has been found.")
|
||||||
add_definitions ( -DHAVE_CONFIG_H )
|
add_definitions ( -DHAVE_CONFIG_H )
|
||||||
set( OCC_LIBRARIES "TKFillet;TKMesh;TKernel;TKG2d;TKG3d;TKMath;TKIGES;TKSTL;TKShHealing;TKXSBase;TKBool;TKBO;TKBRep;TKTopAlgo;TKGeomAlgo;TKGeomBase;TKOffset;TKPrim;TKSTEP;TKSTEPBase;TKSTEPAttr;TKHLR" ) #lib list copied from FreeCAD's FindOpenCasCade.cmake
|
set( OCC_LIBRARIES "TKFeat;TKFillet;TKMesh;TKernel;TKG2d;TKG3d;TKMath;TKIGES;TKSTL;TKShHealing;TKXSBase;TKBool;TKBO;TKBRep;TKTopAlgo;TKGeomAlgo;TKGeomBase;TKOffset;TKPrim;TKSTEP;TKSTEPBase;TKSTEPAttr;TKHLR" ) #lib list copied from FreeCAD's FindOpenCasCade.cmake
|
||||||
set( OCC_INCLUDE_DIR ${OCE_INCLUDE_DIRS} )
|
set( OCC_INCLUDE_DIR ${OCE_INCLUDE_DIRS} )
|
||||||
set( OCC_FOUND ${OCE_FOUND} )
|
set( OCC_FOUND ${OCE_FOUND} )
|
||||||
else() #look for OpenCASCADE
|
else() #look for OpenCASCADE
|
||||||
|
@ -198,12 +224,6 @@ MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK_CHECKFILE6X FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# -------------------------------- f2c ----------------------------------
|
|
||||||
|
|
||||||
IF(OCC_FOUND)
|
|
||||||
find_package(F2C REQUIRED)
|
|
||||||
ENDIF(OCC_FOUND)
|
|
||||||
|
|
||||||
# -------------------------------- Salome SMESH --------------------------
|
# -------------------------------- Salome SMESH --------------------------
|
||||||
|
|
||||||
# Salome SMESH sources are under src/3rdParty now
|
# Salome SMESH sources are under src/3rdParty now
|
||||||
|
@ -247,22 +267,22 @@ MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK_CHECKFILE6X FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
|
|
||||||
# -------------------------------- ODE ----------------------------------
|
# -------------------------------- ODE ----------------------------------
|
||||||
|
|
||||||
find_package(ODE)
|
# find_package(ODE)
|
||||||
|
|
||||||
# -------------------------------- Qt --------------------------------
|
# -------------------------------- Qt --------------------------------
|
||||||
|
|
||||||
# sets ${QT_LIBRARIES}
|
# sets ${QT_LIBRARIES}
|
||||||
|
|
||||||
SET(QT_MIN_VERSION 4.1.4)
|
SET(QT_MIN_VERSION 4.5.0)
|
||||||
set(QT_USE_QTNETWORK TRUE)
|
set(QT_USE_QTNETWORK TRUE)
|
||||||
set(QT_USE_QTXML TRUE)
|
set(QT_USE_QTXML TRUE)
|
||||||
if(FREECAD_BUILD_GUI)
|
if(FREECAD_BUILD_GUI)
|
||||||
set(QT_USE_QTOPENGL TRUE)
|
set(QT_USE_QTOPENGL TRUE)
|
||||||
set(QT_USE_QTSVG TRUE)
|
set(QT_USE_QTSVG TRUE)
|
||||||
set(QT_USE_QTUITOOLS TRUE)
|
set(QT_USE_QTUITOOLS TRUE)
|
||||||
set(QT_USE_QTWEBKIT TRUE)
|
set(QT_USE_QTWEBKIT TRUE)
|
||||||
endif(FREECAD_BUILD_GUI)
|
endif(FREECAD_BUILD_GUI)
|
||||||
find_package(Qt4)
|
find_package(Qt4 REQUIRED)
|
||||||
|
|
||||||
include(${QT_USE_FILE})
|
include(${QT_USE_FILE})
|
||||||
|
|
||||||
|
@ -271,7 +291,7 @@ MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK_CHECKFILE6X FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
ENDIF(NOT QT4_FOUND)
|
ENDIF(NOT QT4_FOUND)
|
||||||
|
|
||||||
IF(NOT QT_QTWEBKIT_FOUND)
|
IF(NOT QT_QTWEBKIT_FOUND)
|
||||||
MESSAGE("QT Webkit not found, will not build browser integration!")
|
MESSAGE("Qt Webkit not found, will not build browser integration!")
|
||||||
ENDIF(NOT QT_QTWEBKIT_FOUND)
|
ENDIF(NOT QT_QTWEBKIT_FOUND)
|
||||||
|
|
||||||
|
|
||||||
|
@ -282,13 +302,15 @@ MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK_CHECKFILE6X FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
# There is probably a cleaner solution than this
|
# There is probably a cleaner solution than this
|
||||||
macro(fc_wrap_cpp outfiles )
|
macro(fc_wrap_cpp outfiles )
|
||||||
# get include dirs
|
# get include dirs
|
||||||
QT4_GET_MOC_FLAGS(moc_includes)
|
QT4_GET_MOC_FLAGS(moc_flags)
|
||||||
QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN})
|
QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN})
|
||||||
|
# fixes bug 0000585: bug with boost 1.48
|
||||||
|
SET(moc_options ${moc_options} -DBOOST_TT_HAS_OPERATOR_HPP_INCLUDED)
|
||||||
|
|
||||||
foreach(it ${moc_files})
|
foreach(it ${moc_files})
|
||||||
get_filename_component(it ${it} ABSOLUTE)
|
get_filename_component(it ${it} ABSOLUTE)
|
||||||
QT4_MAKE_OUTPUT_FILE(${it} moc_ cpp outfile)
|
QT4_MAKE_OUTPUT_FILE(${it} moc_ cpp outfile)
|
||||||
QT4_CREATE_MOC_COMMAND(${it} ${outfile} "${moc_includes}" "${moc_options}")
|
QT4_CREATE_MOC_COMMAND(${it} ${outfile} "${moc_flags}" "${moc_options}")
|
||||||
set(${outfiles} ${${outfiles}} ${outfile})
|
set(${outfiles} ${${outfiles}} ${outfile})
|
||||||
add_file_dependencies(${it} ${outfile})
|
add_file_dependencies(${it} ${outfile})
|
||||||
endforeach(it)
|
endforeach(it)
|
||||||
|
@ -297,7 +319,7 @@ MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK_CHECKFILE6X FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
if(FREECAD_BUILD_GUI)
|
if(FREECAD_BUILD_GUI)
|
||||||
# -------------------------------- OpenGL --------------------------------
|
# -------------------------------- OpenGL --------------------------------
|
||||||
|
|
||||||
find_package(OpenGL)
|
find_package(OpenGL)
|
||||||
include(FindPackageMessage)
|
include(FindPackageMessage)
|
||||||
if(OPENGL_GLU_FOUND)
|
if(OPENGL_GLU_FOUND)
|
||||||
find_package_message(OPENGL_GLU
|
find_package_message(OPENGL_GLU
|
||||||
|
@ -309,16 +331,16 @@ MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK_CHECKFILE6X FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
|
|
||||||
# -------------------------------- Coin3D --------------------------------
|
# -------------------------------- Coin3D --------------------------------
|
||||||
|
|
||||||
find_package(Coin3D REQUIRED)
|
find_package(Coin3D REQUIRED)
|
||||||
find_package(SoQt REQUIRED)
|
find_package(SoQt REQUIRED)
|
||||||
|
|
||||||
# ------------------------------ Spaceball -------------------------------
|
# ------------------------------ Spaceball -------------------------------
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
#future
|
#future
|
||||||
else(WIN32)
|
else(WIN32)
|
||||||
find_package(Spnav)
|
find_package(Spnav)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -330,7 +352,9 @@ endif(FREECAD_LIBPACK_USE)
|
||||||
|
|
||||||
# copy build convenient files for M$
|
# copy build convenient files for M$
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
configure_file(BuildAll.bat ${CMAKE_BINARY_DIR}/BuildAll.bat COPYONLY)
|
if (EXISTS BuildAll.bat)
|
||||||
|
configure_file(BuildAll.bat ${CMAKE_BINARY_DIR}/BuildAll.bat COPYONLY)
|
||||||
|
endif (EXISTS BuildAll.bat)
|
||||||
#configure_file(BuildAllNice.bat ${CMAKE_BINARY_DIR}/BuildAllNice.bat COPYONLY)
|
#configure_file(BuildAllNice.bat ${CMAKE_BINARY_DIR}/BuildAllNice.bat COPYONLY)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
|
@ -383,6 +407,10 @@ IF(MINGW)
|
||||||
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -mthreads -Wl,--export-all-symbols")
|
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -mthreads -Wl,--export-all-symbols")
|
||||||
LINK_LIBRARIES(-lgdi32)
|
LINK_LIBRARIES(-lgdi32)
|
||||||
ENDIF(MINGW)
|
ENDIF(MINGW)
|
||||||
|
# 0000661: cmake build on Mac OS: dealing with dylib versus so
|
||||||
|
IF(APPLE)
|
||||||
|
SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
|
||||||
|
ENDIF(APPLE)
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
add_subdirectory(data)
|
add_subdirectory(data)
|
||||||
|
@ -410,7 +438,7 @@ if(FREECAD_MAINTAINERS_BUILD AND NOT WIN32)
|
||||||
set(PKG_ARCH amd64)
|
set(PKG_ARCH amd64)
|
||||||
ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 4 )
|
ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 4 )
|
||||||
set(CPACK_DEBIAN_PACKAGE_SECTION "science")
|
set(CPACK_DEBIAN_PACKAGE_SECTION "science")
|
||||||
set(CPACK_DEBIAN_PACKAGE_DEPENDS "python, oce | opencascade, libqtgui4, libcoin60, libode1, libsoqt4-20, libxerces-c3.1, libgts-0.7-5, zlib1g, libboost-dev, libeigen2-dev")
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS "python, oce | opencascade, libqtgui4, libcoin60, libsoqt4-20, libxerces-c3.1, zlib1g, libboost-dev, libeigen2-dev")
|
||||||
set(CPACK_PACKAGE_CONTACT "<root@localhost>")
|
set(CPACK_PACKAGE_CONTACT "<root@localhost>")
|
||||||
set(CPACK_PACKAGE_FILE_NAME "${PACKAGE_NAME}-${PACKAGE_VERSION}_${PKG_ARCH}")
|
set(CPACK_PACKAGE_FILE_NAME "${PACKAGE_NAME}-${PACKAGE_VERSION}_${PKG_ARCH}")
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,7 @@ IF(OCC_LIBRARY)
|
||||||
TKSTEPBase
|
TKSTEPBase
|
||||||
TKSTEPAttr
|
TKSTEPAttr
|
||||||
TKHLR
|
TKHLR
|
||||||
|
TKFeat
|
||||||
)
|
)
|
||||||
ENDIF(OCC_LIBRARY)
|
ENDIF(OCC_LIBRARY)
|
||||||
|
|
||||||
|
|
331
cMake/UseLibPack8x.cmake
Normal file
331
cMake/UseLibPack8x.cmake
Normal file
|
@ -0,0 +1,331 @@
|
||||||
|
# ================================================================================
|
||||||
|
# == Win32 is default behaviour use the LibPack copied in Source tree ============
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
# General includes
|
||||||
|
|
||||||
|
link_directories(${FREECAD_LIBPACK_DIR}/lib)
|
||||||
|
include_directories(${FREECAD_LIBPACK_DIR}/include)
|
||||||
|
|
||||||
|
# OpenGL
|
||||||
|
set(OPENGL_gl_LIBRARY opengl32 glu32)
|
||||||
|
|
||||||
|
# Python
|
||||||
|
set(PYTHON_DEBUG_LIBRARY python26_d.lib)
|
||||||
|
set(PYTHON_LIBRARY python26.lib)
|
||||||
|
set(PYTHON_INCLUDE_PATH ${FREECAD_LIBPACK_DIR}/include/python)
|
||||||
|
set(PYTHON_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/python.exe)
|
||||||
|
set(PYTHONLIBS_FOUND TRUE)
|
||||||
|
|
||||||
|
# XercesC
|
||||||
|
set(XERCESC_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/xercesc)
|
||||||
|
set(XERCESC_LIBRARIES xerces-c_2.lib)
|
||||||
|
set(XERCESC_DEBUG_LIBRARIES xerces-c_2D.lib)
|
||||||
|
set(XERCESC_FOUND TRUE)
|
||||||
|
|
||||||
|
# Boost
|
||||||
|
set(Boost_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/boost)
|
||||||
|
set(Boost_LIBRARIES
|
||||||
|
optimized boost_filesystem-vc90-mt-1_48.lib
|
||||||
|
optimized boost_system-vc90-mt-1_48.lib
|
||||||
|
optimized boost_graph-vc90-mt-1_48.lib
|
||||||
|
optimized boost_program_options-vc90-mt-1_48.lib
|
||||||
|
optimized boost_regex-vc90-mt-1_48.lib
|
||||||
|
optimized boost_signals-vc90-mt-1_48.lib
|
||||||
|
optimized boost_thread-vc90-mt-1_48.lib
|
||||||
|
)
|
||||||
|
set(Boost_DEBUG_LIBRARIES
|
||||||
|
debug boost_filesystem-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_date_time-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_filesystem-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_iostreams-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_math_c99f-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_math_tr1f-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_thread-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_system-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_graph-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_program_options-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_regex-vc90-mt-gd-1_48.lib
|
||||||
|
debug boost_signals-vc90-mt-gd-1_48.lib
|
||||||
|
)
|
||||||
|
set(Boost_FOUND TRUE)
|
||||||
|
|
||||||
|
# Zlib
|
||||||
|
set(ZLIB_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/zlib)
|
||||||
|
set(ZLIB_LIBRARIES zdll.lib)
|
||||||
|
set(ZLIB_FOUND TRUE)
|
||||||
|
|
||||||
|
# SMESH
|
||||||
|
set(SMESH_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/smesh)
|
||||||
|
set(SMESH_LIBRARIES
|
||||||
|
StdMeshers.lib
|
||||||
|
MEFISTO2.lib
|
||||||
|
SMESH.lib
|
||||||
|
DriverUNV.lib
|
||||||
|
SMESHDS.lib
|
||||||
|
DriverSTL.lib
|
||||||
|
DriverDAT.lib
|
||||||
|
Driver.lib
|
||||||
|
SMDS.lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SMESH_FOUND TRUE)
|
||||||
|
|
||||||
|
# Coin3D
|
||||||
|
set(COIN3D_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/coin)
|
||||||
|
set(COIN3D_LIBRARY_DEBUG coin3d.lib)
|
||||||
|
set(COIN3D_LIBRARY_RELEASE coin3.lib)
|
||||||
|
set(COIN3D_FOUND TRUE)
|
||||||
|
|
||||||
|
|
||||||
|
# QT
|
||||||
|
set(QT_INCLUDE_DIR
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/Qt
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtCore
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtGui
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtDesigner
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtSvg
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtNetwork
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtSql
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtTest
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtUiTools
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtXml
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtOpenGl
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtWebKit
|
||||||
|
)
|
||||||
|
|
||||||
|
set(QT_QTCORE_INCLUDE_DIR
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/
|
||||||
|
${FREECAD_LIBPACK_DIR}/include/QT/QtCore
|
||||||
|
)
|
||||||
|
|
||||||
|
set(QT_LIBRARIES
|
||||||
|
optimized QtCore4.lib
|
||||||
|
optimized QtGui4.lib
|
||||||
|
optimized QtDesigner4.lib
|
||||||
|
optimized QtSvg4.lib
|
||||||
|
optimized QtNetwork4.lib
|
||||||
|
optimized QtSql4.lib
|
||||||
|
optimized QtTest4.lib
|
||||||
|
optimized QtXml4.lib
|
||||||
|
optimized QtOpenGl4.lib
|
||||||
|
optimized QtWebKit4.lib
|
||||||
|
)
|
||||||
|
set(QT_DEBUG_LIBRARIES
|
||||||
|
debug QtCored4.lib
|
||||||
|
debug QtGuid4.lib
|
||||||
|
debug QtDesignerd4.lib
|
||||||
|
debug QtSvgd4.lib
|
||||||
|
debug QtNetworkd4.lib
|
||||||
|
debug QtSqld4.lib
|
||||||
|
debug QtTestd4.lib
|
||||||
|
debug QtXmld4.lib
|
||||||
|
debug QtOpenGld4.lib
|
||||||
|
debug QtWebKitd4.lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(QT_QTCORE_LIBRARY_DEBUG
|
||||||
|
debug QtCored4.lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(QT_QTCORE_LIBRARY
|
||||||
|
optimized QtCore4.lib
|
||||||
|
)
|
||||||
|
|
||||||
|
set(QT_UIC_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/uic.exe)
|
||||||
|
set(QT_MOC_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/moc.exe)
|
||||||
|
set(QT_RCC_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/rcc.exe)
|
||||||
|
set(QT_HELPCOMPILER_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/qhelpgenerator.exe)
|
||||||
|
set(QT_COLLECTIOMGENERATOR_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/qcollectiongenerator.exe)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MACRO (QT4_EXTRACT_OPTIONS _qt4_files _qt4_options)
|
||||||
|
SET(${_qt4_files})
|
||||||
|
SET(${_qt4_options})
|
||||||
|
#SET(_QT4_DOING_OPTIONS FALSE)
|
||||||
|
FOREACH(_currentArg ${ARGN})
|
||||||
|
# IF ("${_currentArg}" STREQUAL "OPTIONS")
|
||||||
|
# SET(_QT4_DOING_OPTIONS TRUE)
|
||||||
|
# ELSE ("${_currentArg}" STREQUAL "OPTIONS")
|
||||||
|
# IF(_QT4_DOING_OPTIONS)
|
||||||
|
# LIST(APPEND ${_qt4_options} "${_currentArg}")
|
||||||
|
# ELSE(_QT4_DOING_OPTIONS)
|
||||||
|
LIST(APPEND ${_qt4_files} "${_currentArg}")
|
||||||
|
# ENDIF(_QT4_DOING_OPTIONS)
|
||||||
|
# ENDIF ("${_currentArg}" STREQUAL "OPTIONS")
|
||||||
|
ENDFOREACH(_currentArg)
|
||||||
|
ENDMACRO (QT4_EXTRACT_OPTIONS)
|
||||||
|
|
||||||
|
# macro used to create the names of output files preserving relative dirs
|
||||||
|
MACRO (QT4_MAKE_OUTPUT_FILE infile prefix ext outfile )
|
||||||
|
STRING(LENGTH ${CMAKE_CURRENT_BINARY_DIR} _binlength)
|
||||||
|
STRING(LENGTH ${infile} _infileLength)
|
||||||
|
SET(_checkinfile ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
IF(_infileLength GREATER _binlength)
|
||||||
|
STRING(SUBSTRING "${infile}" 0 ${_binlength} _checkinfile)
|
||||||
|
IF(_checkinfile STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_BINARY_DIR} ${infile})
|
||||||
|
ELSE(_checkinfile STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${infile})
|
||||||
|
ENDIF(_checkinfile STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
ELSE(_infileLength GREATER _binlength)
|
||||||
|
FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${infile})
|
||||||
|
ENDIF(_infileLength GREATER _binlength)
|
||||||
|
SET(_outfile "${CMAKE_CURRENT_BINARY_DIR}/${rel}")
|
||||||
|
STRING(REPLACE ".." "__" _outfile ${_outfile})
|
||||||
|
GET_FILENAME_COMPONENT(outpath ${_outfile} PATH)
|
||||||
|
GET_FILENAME_COMPONENT(_outfile ${_outfile} NAME_WE)
|
||||||
|
FILE(MAKE_DIRECTORY ${outpath})
|
||||||
|
SET(${outfile} ${outpath}/${prefix}${_outfile}.${ext})
|
||||||
|
ENDMACRO (QT4_MAKE_OUTPUT_FILE )
|
||||||
|
|
||||||
|
MACRO (QT4_WRAP_CPP outfiles )
|
||||||
|
QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN})
|
||||||
|
SET(ARGN)
|
||||||
|
foreach(it ${moc_files})
|
||||||
|
get_filename_component(it ${it} ABSOLUTE)
|
||||||
|
QT4_MAKE_OUTPUT_FILE(${it} moc_ cpp outfile)
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
|
||||||
|
COMMAND ${QT_MOC_EXECUTABLE}
|
||||||
|
ARGS ${moc_options} ${it} -o ${outfile}
|
||||||
|
MAIN_DEPENDENCY ${it}
|
||||||
|
)
|
||||||
|
SET(${outfiles} ${${outfiles}} ${outfile})
|
||||||
|
endforeach(it)
|
||||||
|
ENDMACRO (QT4_WRAP_CPP)
|
||||||
|
|
||||||
|
|
||||||
|
# This is a special version of the built in macro qt4_wrap_cpp
|
||||||
|
# It is required since moc'ed files are now included instead of being added to projects directly
|
||||||
|
# It adds a reverse dependency to solve this
|
||||||
|
# This has the unfortunate side effect that some files are always rebuilt
|
||||||
|
# There is probably a cleaner solution than this
|
||||||
|
|
||||||
|
include(AddFileDependencies)
|
||||||
|
|
||||||
|
macro(fc_wrap_cpp outfiles )
|
||||||
|
QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN})
|
||||||
|
SET(ARGN)
|
||||||
|
foreach(it ${moc_files})
|
||||||
|
get_filename_component(it ${it} ABSOLUTE)
|
||||||
|
QT4_MAKE_OUTPUT_FILE(${it} moc_ cpp outfile)
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
|
||||||
|
COMMAND ${QT_MOC_EXECUTABLE}
|
||||||
|
ARGS ${moc_options} ${it} -o ${outfile}
|
||||||
|
MAIN_DEPENDENCY ${it}
|
||||||
|
)
|
||||||
|
SET(${outfiles} ${${outfiles}} ${outfile})
|
||||||
|
add_file_dependencies(${it} ${outfile})
|
||||||
|
endforeach(it)
|
||||||
|
endmacro(fc_wrap_cpp)
|
||||||
|
|
||||||
|
|
||||||
|
MACRO (QT4_ADD_RESOURCES outfiles )
|
||||||
|
QT4_EXTRACT_OPTIONS(rcc_files rcc_options ${ARGN})
|
||||||
|
SET(ARGN)
|
||||||
|
FOREACH (it ${rcc_files})
|
||||||
|
GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE)
|
||||||
|
GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
|
||||||
|
GET_FILENAME_COMPONENT(rc_path ${infile} PATH)
|
||||||
|
SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx)
|
||||||
|
# parse file for dependencies
|
||||||
|
# all files are absolute paths or relative to the location of the qrc file
|
||||||
|
FILE(READ "${infile}" _RC_FILE_CONTENTS)
|
||||||
|
STRING(REGEX MATCHALL "<file[^<]+" _RC_FILES "${_RC_FILE_CONTENTS}")
|
||||||
|
SET(_RC_DEPENDS)
|
||||||
|
FOREACH(_RC_FILE ${_RC_FILES})
|
||||||
|
STRING(REGEX REPLACE "^<file[^>]*>" "" _RC_FILE "${_RC_FILE}")
|
||||||
|
STRING(REGEX MATCH "^/|([A-Za-z]:/)" _ABS_PATH_INDICATOR "${_RC_FILE}")
|
||||||
|
IF(NOT _ABS_PATH_INDICATOR)
|
||||||
|
SET(_RC_FILE "${rc_path}/${_RC_FILE}")
|
||||||
|
ENDIF(NOT _ABS_PATH_INDICATOR)
|
||||||
|
SET(_RC_DEPENDS ${_RC_DEPENDS} "${_RC_FILE}")
|
||||||
|
ENDFOREACH(_RC_FILE)
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
|
||||||
|
COMMAND ${QT_RCC_EXECUTABLE}
|
||||||
|
ARGS ${rcc_options} -name ${outfilename} -o ${outfile} ${infile}
|
||||||
|
MAIN_DEPENDENCY ${infile}
|
||||||
|
DEPENDS ${_RC_DEPENDS})
|
||||||
|
SET(${outfiles} ${${outfiles}} ${outfile})
|
||||||
|
ENDFOREACH (it)
|
||||||
|
ENDMACRO (QT4_ADD_RESOURCES)
|
||||||
|
|
||||||
|
MACRO (QT4_WRAP_UI outfiles )
|
||||||
|
QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN})
|
||||||
|
|
||||||
|
FOREACH (it ${ui_files})
|
||||||
|
GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
|
||||||
|
GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
|
||||||
|
SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
|
||||||
|
COMMAND ${QT_UIC_EXECUTABLE}
|
||||||
|
ARGS -o ${outfile} ${infile}
|
||||||
|
MAIN_DEPENDENCY ${infile})
|
||||||
|
SET(${outfiles} ${${outfiles}} ${outfile})
|
||||||
|
ENDFOREACH (it)
|
||||||
|
ENDMACRO (QT4_WRAP_UI)
|
||||||
|
|
||||||
|
|
||||||
|
set(QT4_FOUND TRUE)
|
||||||
|
|
||||||
|
# SoQt
|
||||||
|
set(SOQT_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/soqt)
|
||||||
|
set(SOQT_LIBRARY_RELEASE soqt1.lib)
|
||||||
|
set(SOQT_LIBRARY_DEBUG soqt1d.lib)
|
||||||
|
set(SOQT_FOUND TRUE)
|
||||||
|
|
||||||
|
# OpenCV
|
||||||
|
set(OPENCV_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/opencv)
|
||||||
|
set(OPENCV_LIBRARIES cv.lib cvaux.lib cxcore.lib cxts.lib highgui.lib)
|
||||||
|
set(OPENCV_FOUND TRUE)
|
||||||
|
|
||||||
|
# OCC
|
||||||
|
set(OCC_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/OpenCascade)
|
||||||
|
set(OCC_LIBRARIES
|
||||||
|
TKFillet
|
||||||
|
TKMesh
|
||||||
|
TKernel
|
||||||
|
TKG2d
|
||||||
|
TKG3d
|
||||||
|
TKMath
|
||||||
|
TKIGES
|
||||||
|
TKSTL
|
||||||
|
TKShHealing
|
||||||
|
TKXSBase
|
||||||
|
TKBool
|
||||||
|
TKXSBase
|
||||||
|
TKXCAF
|
||||||
|
TKLCAF
|
||||||
|
TKCAF
|
||||||
|
TKSTEP
|
||||||
|
TKIGES
|
||||||
|
TKXDESTEP
|
||||||
|
TKXDEIGES
|
||||||
|
TKBO
|
||||||
|
TKBRep
|
||||||
|
TKTopAlgo
|
||||||
|
TKGeomAlgo
|
||||||
|
TKGeomBase
|
||||||
|
TKOffset
|
||||||
|
TKPrim
|
||||||
|
TKSTEP
|
||||||
|
TKSTEPBase
|
||||||
|
TKSTEPAttr
|
||||||
|
TKHLR
|
||||||
|
)
|
||||||
|
set(OCC_LIBRARY_DIR
|
||||||
|
${FREECAD_LIBPACK_DIR}/lib
|
||||||
|
)
|
||||||
|
set(OCC_FOUND TRUE)
|
||||||
|
|
||||||
|
SET(EIGEN2_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/eigen2)
|
||||||
|
set(EIGEN2_FOUND TRUE)
|
||||||
|
|
||||||
|
SET(EIGEN3_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/eigen3)
|
||||||
|
set(EIGEN3_FOUND TRUE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -329,6 +329,7 @@ set(OCC_LIBRARIES
|
||||||
TKSTEPBase
|
TKSTEPBase
|
||||||
TKSTEPAttr
|
TKSTEPAttr
|
||||||
TKHLR
|
TKHLR
|
||||||
|
TKFeat
|
||||||
)
|
)
|
||||||
set(OCC_LIBRARY_DIR
|
set(OCC_LIBRARY_DIR
|
||||||
${FREECAD_LIBPACK_DIR}/lib
|
${FREECAD_LIBPACK_DIR}/lib
|
||||||
|
|
32
configure.ac
32
configure.ac
|
@ -795,6 +795,26 @@ AC_ARG_ENABLE([sandbox],
|
||||||
|
|
||||||
AM_CONDITIONAL(BUILD_SANDBOX, test x"$fc_set_sandbox" = xtrue)
|
AM_CONDITIONAL(BUILD_SANDBOX, test x"$fc_set_sandbox" = xtrue)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([assembly],
|
||||||
|
AC_HELP_STRING([--enable-assembly], [Enable the build of the Assembly module (disabled by default)]),
|
||||||
|
[case $enableval in
|
||||||
|
no | false) fc_set_assembly=false ;;
|
||||||
|
*) fc_set_assembly=true ;;
|
||||||
|
esac],
|
||||||
|
[fc_set_assembly=false])
|
||||||
|
|
||||||
|
AM_CONDITIONAL(BUILD_ASSEMBLY, test x"$fc_set_assembly" = xtrue)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([cam],
|
||||||
|
AC_HELP_STRING([--enable-cam], [Enable the build of the Cam module (disabled by default)]),
|
||||||
|
[case $enableval in
|
||||||
|
no | false) fc_set_cam=false ;;
|
||||||
|
*) fc_set_cam=true ;;
|
||||||
|
esac],
|
||||||
|
[fc_set_cam=false])
|
||||||
|
|
||||||
|
AM_CONDITIONAL(BUILD_CAM, test x"$fc_set_cam" = xtrue)
|
||||||
|
|
||||||
dnl Check if you want debug information enabled, or not
|
dnl Check if you want debug information enabled, or not
|
||||||
dnl **************************************************************************
|
dnl **************************************************************************
|
||||||
|
|
||||||
|
@ -952,6 +972,13 @@ src/Main/Makefile
|
||||||
src/Doc/Makefile
|
src/Doc/Makefile
|
||||||
src/Doc/BuildDevDoc.cfg
|
src/Doc/BuildDevDoc.cfg
|
||||||
src/Mod/Makefile
|
src/Mod/Makefile
|
||||||
|
src/Mod/Assembly/App/Makefile
|
||||||
|
src/Mod/Assembly/Gui/Resources/Makefile
|
||||||
|
src/Mod/Assembly/Gui/Makefile
|
||||||
|
src/Mod/Assembly/Makefile
|
||||||
|
src/Mod/Cam/App/Makefile
|
||||||
|
src/Mod/Cam/Gui/Makefile
|
||||||
|
src/Mod/Cam/Makefile
|
||||||
src/Mod/Part/Makefile
|
src/Mod/Part/Makefile
|
||||||
src/Mod/Part/App/Makefile
|
src/Mod/Part/App/Makefile
|
||||||
src/Mod/Part/Gui/Makefile
|
src/Mod/Part/Gui/Makefile
|
||||||
|
@ -1055,7 +1082,10 @@ AC_MSG_NOTICE([
|
||||||
RTTI enabled (forced): true
|
RTTI enabled (forced): true
|
||||||
Compiler warnings enabled: $fc_set_warn
|
Compiler warnings enabled: $fc_set_warn
|
||||||
installation prefix: $prefix
|
installation prefix: $prefix
|
||||||
|
enable-assembly: $fc_set_assembly
|
||||||
|
enable-cam: $fc_set_cam
|
||||||
|
enable-sandbox: $fc_set_sandbox
|
||||||
|
enable-template: $fc_set_template
|
||||||
Now, run 'make' to build FreeCAD.
|
Now, run 'make' to build FreeCAD.
|
||||||
|
|
||||||
**************************************************************************
|
**************************************************************************
|
||||||
|
|
|
@ -7,8 +7,8 @@ by the authors who actually wrote it.
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||||
59 Temple Place - Suite 330
|
51 Franklin Street - Fifth Floor
|
||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02110-1301, USA.
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
Binary file not shown.
BIN
data/tests/PadTest.fcstd
Normal file
BIN
data/tests/PadTest.fcstd
Normal file
Binary file not shown.
BIN
data/tests/PocketTest.fcstd
Normal file
BIN
data/tests/PocketTest.fcstd
Normal file
Binary file not shown.
4
src/3rdParty/CMakeLists.txt
vendored
4
src/3rdParty/CMakeLists.txt
vendored
|
@ -20,7 +20,7 @@ elseif(FREECAD_BUILD_GUI AND FREECAD_LIBPACK_CHECKFILE7X)
|
||||||
#endif(MINGW)
|
#endif(MINGW)
|
||||||
# applies for Unix, MinGW and Windows with custom LibPack
|
# applies for Unix, MinGW and Windows with custom LibPack
|
||||||
elseif(FREECAD_BUILD_GUI)
|
elseif(FREECAD_BUILD_GUI)
|
||||||
if (NOT FREECAD_BUILD_DEBIAN)
|
if (NOT FREECAD_USE_EXTERNAL_PIVY)
|
||||||
find_path(COIN_VERSION3 Inventor/scxml/ScXML.h ${COIN3D_INCLUDE_DIR})
|
find_path(COIN_VERSION3 Inventor/scxml/ScXML.h ${COIN3D_INCLUDE_DIR})
|
||||||
if (COIN_VERSION3)
|
if (COIN_VERSION3)
|
||||||
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Pivy-0.5)
|
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Pivy-0.5)
|
||||||
|
@ -31,7 +31,7 @@ elseif(FREECAD_BUILD_GUI)
|
||||||
add_subdirectory(Pivy)
|
add_subdirectory(Pivy)
|
||||||
endif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Pivy)
|
endif (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Pivy)
|
||||||
endif(COIN_VERSION3)
|
endif(COIN_VERSION3)
|
||||||
endif (NOT FREECAD_BUILD_DEBIAN)
|
endif (NOT FREECAD_USE_EXTERNAL_PIVY)
|
||||||
endif(FREECAD_BUILD_GUI AND FREECAD_LIBPACK_CHECKFILE6X)
|
endif(FREECAD_BUILD_GUI AND FREECAD_LIBPACK_CHECKFILE6X)
|
||||||
|
|
||||||
# For Windows we have all stuff in the LibPack
|
# For Windows we have all stuff in the LibPack
|
||||||
|
|
2
src/3rdParty/Pivy-0.5/CMakeLists.txt
vendored
2
src/3rdParty/Pivy-0.5/CMakeLists.txt
vendored
|
@ -88,7 +88,7 @@ if(MSVC)
|
||||||
debug ${PYTHON_DEBUG_LIBRARY}
|
debug ${PYTHON_DEBUG_LIBRARY}
|
||||||
optimized ${PYTHON_LIBRARY})
|
optimized ${PYTHON_LIBRARY})
|
||||||
else(MSVC)
|
else(MSVC)
|
||||||
set(CoinPy_LIBS
|
set(SoQtPy_LIBS
|
||||||
${SOQT_LIBRARIES}
|
${SOQT_LIBRARIES}
|
||||||
${COIN3D_LIBRARY}
|
${COIN3D_LIBRARY}
|
||||||
${PYTHON_LIBRARY})
|
${PYTHON_LIBRARY})
|
||||||
|
|
2
src/3rdParty/salomesmesh/CMakeLists.txt
vendored
2
src/3rdParty/salomesmesh/CMakeLists.txt
vendored
|
@ -173,7 +173,7 @@ FILE(GLOB StdMeshers_source_files src/StdMeshers/*.cpp src/MEFISTO2/*.cpp src/ME
|
||||||
INCLUDE_DIRECTORIES(src/StdMeshers)
|
INCLUDE_DIRECTORIES(src/StdMeshers)
|
||||||
|
|
||||||
ADD_LIBRARY(StdMeshers SHARED ${StdMeshers_source_files})
|
ADD_LIBRARY(StdMeshers SHARED ${StdMeshers_source_files})
|
||||||
TARGET_LINK_LIBRARIES(StdMeshers SMESH TKernel TKMath TKAdvTools f2c gfortran)
|
TARGET_LINK_LIBRARIES(StdMeshers SMESH TKernel TKMath TKAdvTools gfortran)
|
||||||
SET(StdMeshers_CFLAGS "")
|
SET(StdMeshers_CFLAGS "")
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
SET(StdMeshers_CFLAGS "-DSTDMESHERS_EXPORTS -DMEFISTO2D_EXPORTS")
|
SET(StdMeshers_CFLAGS "-DSTDMESHERS_EXPORTS -DMEFISTO2D_EXPORTS")
|
||||||
|
|
|
@ -63,6 +63,11 @@
|
||||||
|
|
||||||
#include "SMESHDS_Mesh.hxx"
|
#include "SMESHDS_Mesh.hxx"
|
||||||
#include "SMESHDS_GroupBase.hxx"
|
#include "SMESHDS_GroupBase.hxx"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
AUXILIARY METHODS
|
AUXILIARY METHODS
|
||||||
|
|
|
@ -82,6 +82,10 @@
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
|
||||||
#define cast2Node(elem) static_cast<const SMDS_MeshNode*>( elem )
|
#define cast2Node(elem) static_cast<const SMDS_MeshNode*>( elem )
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
|
@ -74,6 +74,11 @@
|
||||||
#include "SMESH_subMesh.hxx"
|
#include "SMESH_subMesh.hxx"
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,11 @@
|
||||||
#include <TopExp.hxx>
|
#include <TopExp.hxx>
|
||||||
#include <TopoDS.hxx>
|
#include <TopoDS.hxx>
|
||||||
#include <TopoDS_Edge.hxx>
|
#include <TopoDS_Edge.hxx>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,11 @@
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef _DEBUG_
|
#ifdef _DEBUG_
|
||||||
|
|
|
@ -47,6 +47,11 @@ typedef NCollection_Array1<TColStd_SequenceOfInteger> StdMeshers_Array1OfSequenc
|
||||||
#include <SMESH_Array1.hxx>
|
#include <SMESH_Array1.hxx>
|
||||||
typedef SMESH_Array1<TColStd_SequenceOfInteger> StdMeshers_Array1OfSequenceOfInteger;
|
typedef SMESH_Array1<TColStd_SequenceOfInteger> StdMeshers_Array1OfSequenceOfInteger;
|
||||||
#endif
|
#endif
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : StdMeshers_QuadToTriaAdaptor
|
//function : StdMeshers_QuadToTriaAdaptor
|
||||||
|
|
|
@ -54,6 +54,11 @@
|
||||||
#include <TColgp_SequenceOfPnt2d.hxx>
|
#include <TColgp_SequenceOfPnt2d.hxx>
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
#include <TopoDS.hxx>
|
#include <TopoDS.hxx>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
|
@ -1188,13 +1188,13 @@ void Application::processCmdLineFiles(void)
|
||||||
Application::_pcSingleton->openDocument(File.filePath().c_str());
|
Application::_pcSingleton->openDocument(File.filePath().c_str());
|
||||||
}
|
}
|
||||||
else if (File.hasExtension("fcscript")||File.hasExtension("fcmacro")) {
|
else if (File.hasExtension("fcscript")||File.hasExtension("fcmacro")) {
|
||||||
Base::Interpreter().runFile(File.filePath().c_str(), false);
|
Base::Interpreter().runFile(File.filePath().c_str(), true);
|
||||||
}
|
}
|
||||||
else if (File.hasExtension("py")) {
|
else if (File.hasExtension("py")) {
|
||||||
//FIXME: Does this make any sense? I think we should do the ame as for
|
//FIXME: Does this make any sense? I think we should do the ame as for
|
||||||
// fcmacro or fcscript.
|
// fcmacro or fcscript.
|
||||||
//Base::Interpreter().loadModule(File.fileNamePure().c_str());
|
//Base::Interpreter().loadModule(File.fileNamePure().c_str());
|
||||||
Base::Interpreter().runFile(File.filePath().c_str(), false);
|
Base::Interpreter().runFile(File.filePath().c_str(), true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::vector<std::string> mods = App::GetApplication().getImportModules(Ext.c_str());
|
std::vector<std::string> mods = App::GetApplication().getImportModules(Ext.c_str());
|
||||||
|
@ -1210,8 +1210,7 @@ void Application::processCmdLineFiles(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const Base::SystemExitException&) {
|
catch (const Base::SystemExitException&) {
|
||||||
Base::PyGILStateLocker locker;
|
throw; // re-throw to main() function
|
||||||
Base::Interpreter().systemExit();
|
|
||||||
}
|
}
|
||||||
catch (const Base::Exception& e) {
|
catch (const Base::Exception& e) {
|
||||||
Console().Error("Exception while processing file: %s [%s]\n", File.filePath().c_str(), e.what());
|
Console().Error("Exception while processing file: %s [%s]\n", File.filePath().c_str(), e.what());
|
||||||
|
@ -1220,6 +1219,32 @@ void Application::processCmdLineFiles(void)
|
||||||
Console().Error("Unknown exception while processing file: %s \n", File.filePath().c_str());
|
Console().Error("Unknown exception while processing file: %s \n", File.filePath().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::map<std::string,std::string>& cfg = Application::Config();
|
||||||
|
std::map<std::string,std::string>::const_iterator it = cfg.find("SaveFile");
|
||||||
|
if (it != cfg.end()) {
|
||||||
|
std::string output = it->second;
|
||||||
|
Base::FileInfo fi(output);
|
||||||
|
std::string ext = fi.extension();
|
||||||
|
try {
|
||||||
|
std::vector<std::string> mods = App::GetApplication().getExportModules(ext.c_str());
|
||||||
|
if (!mods.empty()) {
|
||||||
|
Base::Interpreter().loadModule(mods.front().c_str());
|
||||||
|
Base::Interpreter().runStringArg("import %s",mods.front().c_str());
|
||||||
|
Base::Interpreter().runStringArg("%s.export(App.ActiveDocument.Objects, '%s')"
|
||||||
|
,mods.front().c_str(),output.c_str());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Console().Warning("File format not supported: %s \n", output.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const Base::Exception& e) {
|
||||||
|
Console().Error("Exception while saving to file: %s [%s]\n", output.c_str(), e.what());
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
Console().Error("Unknown exception while saving to file: %s \n", output.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::runApplication()
|
void Application::runApplication()
|
||||||
|
@ -1314,7 +1339,7 @@ void Application::LoadParameters(void)
|
||||||
// fix weird error while linking boost (all versions of VC)
|
// fix weird error while linking boost (all versions of VC)
|
||||||
// VS2010: https://sourceforge.net/apps/phpbb/free-cad/viewtopic.php?f=4&t=1886&p=12553&hilit=boost%3A%3Afilesystem%3A%3Aget#p12553
|
// VS2010: https://sourceforge.net/apps/phpbb/free-cad/viewtopic.php?f=4&t=1886&p=12553&hilit=boost%3A%3Afilesystem%3A%3Aget#p12553
|
||||||
namespace boost { namespace program_options { std::string arg="arg"; } }
|
namespace boost { namespace program_options { std::string arg="arg"; } }
|
||||||
#if (defined (BOOST_VERSION) && (BOOST_VERSION == 104100))
|
#if (defined (BOOST_VERSION) && (BOOST_VERSION >= 104100))
|
||||||
namespace boost { namespace program_options {
|
namespace boost { namespace program_options {
|
||||||
const unsigned options_description::m_default_line_length = 80;
|
const unsigned options_description::m_default_line_length = 80;
|
||||||
} }
|
} }
|
||||||
|
@ -1419,9 +1444,14 @@ void Application::ParseOptions(int ac, char ** av)
|
||||||
// in config file, but will not be shown to the user.
|
// in config file, but will not be shown to the user.
|
||||||
boost::program_options::options_description hidden("Hidden options");
|
boost::program_options::options_description hidden("Hidden options");
|
||||||
hidden.add_options()
|
hidden.add_options()
|
||||||
("input-file", boost::program_options::value< vector<string> >(), "input file")
|
("input-file", boost::program_options::value< vector<string> >(), "input file")
|
||||||
|
("output", boost::program_options::value<string>(),"output file")
|
||||||
|
("hidden", "don't show the main window")
|
||||||
// this are to ignore for the window system (QApplication)
|
// this are to ignore for the window system (QApplication)
|
||||||
("style", boost::program_options::value< string >(), "set the application GUI style")
|
("style", boost::program_options::value< string >(), "set the application GUI style")
|
||||||
|
("stylesheet", boost::program_options::value< string >(), "set the application stylesheet")
|
||||||
|
("session", boost::program_options::value< string >(), "restore the application from an earlier session")
|
||||||
|
("reverse", "set the application's layout direction from right to left")
|
||||||
("display", boost::program_options::value< string >(), "set the X-Server")
|
("display", boost::program_options::value< string >(), "set the X-Server")
|
||||||
("geometry ", boost::program_options::value< string >(), "set the X-Window geometry")
|
("geometry ", boost::program_options::value< string >(), "set the X-Window geometry")
|
||||||
("font", boost::program_options::value< string >(), "set the X-Window font")
|
("font", boost::program_options::value< string >(), "set the X-Window font")
|
||||||
|
@ -1444,11 +1474,35 @@ void Application::ParseOptions(int ac, char ** av)
|
||||||
//x11.add_options()
|
//x11.add_options()
|
||||||
// ("display", boost::program_options::value< string >(), "set the X-Server")
|
// ("display", boost::program_options::value< string >(), "set the X-Server")
|
||||||
// ;
|
// ;
|
||||||
|
//0000723: improper handling of qt specific comand line arguments
|
||||||
|
std::vector<std::string> args;
|
||||||
|
bool merge=false;
|
||||||
|
for (int i=1; i<ac; i++) {
|
||||||
|
if (merge) {
|
||||||
|
merge = false;
|
||||||
|
args.back() += "=";
|
||||||
|
args.back() += av[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
args.push_back(av[i]);
|
||||||
|
}
|
||||||
|
if (strcmp(av[i],"-style") == 0) {
|
||||||
|
merge = true;
|
||||||
|
}
|
||||||
|
else if (strcmp(av[i],"-stylesheet") == 0) {
|
||||||
|
merge = true;
|
||||||
|
}
|
||||||
|
else if (strcmp(av[i],"-session") == 0) {
|
||||||
|
merge = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
options_description cmdline_options;
|
// 0000659: SIGABRT on startup in boost::program_options (Boost 1.49)
|
||||||
|
// Add some text to the constructor
|
||||||
|
options_description cmdline_options("Command-line options");
|
||||||
cmdline_options.add(generic).add(config).add(hidden);
|
cmdline_options.add(generic).add(config).add(hidden);
|
||||||
|
|
||||||
boost::program_options::options_description config_file_options;
|
boost::program_options::options_description config_file_options("Config");
|
||||||
config_file_options.add(config).add(hidden);
|
config_file_options.add(config).add(hidden);
|
||||||
|
|
||||||
boost::program_options::options_description visible("Allowed options");
|
boost::program_options::options_description visible("Allowed options");
|
||||||
|
@ -1459,28 +1513,32 @@ void Application::ParseOptions(int ac, char ** av)
|
||||||
|
|
||||||
variables_map vm;
|
variables_map vm;
|
||||||
try {
|
try {
|
||||||
store( boost::program_options::command_line_parser(ac, av).
|
store( boost::program_options::command_line_parser(args).
|
||||||
options(cmdline_options).positional(p).extra_parser(customSyntax).run(), vm);
|
options(cmdline_options).positional(p).extra_parser(customSyntax).run(), vm);
|
||||||
|
|
||||||
std::ifstream ifs("FreeCAD.cfg");
|
std::ifstream ifs("FreeCAD.cfg");
|
||||||
store(parse_config_file(ifs, config_file_options), vm);
|
if (ifs)
|
||||||
|
store(parse_config_file(ifs, config_file_options), vm);
|
||||||
notify(vm);
|
notify(vm);
|
||||||
}
|
}
|
||||||
catch (const std::exception& e) {
|
catch (const std::exception& e) {
|
||||||
cerr << e.what() << endl << endl << visible << endl;
|
std::stringstream str;
|
||||||
exit(1);
|
str << e.what() << endl << endl << visible << endl;
|
||||||
|
throw UnknownProgramOption(str.str());
|
||||||
}
|
}
|
||||||
catch (...) {
|
catch (...) {
|
||||||
cerr << "Wrong or unknown option, bailing out!" << endl << endl << visible << endl;
|
std::stringstream str;
|
||||||
exit(1);
|
str << "Wrong or unknown option, bailing out!" << endl << endl << visible << endl;
|
||||||
|
throw UnknownProgramOption(str.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vm.count("help")) {
|
if (vm.count("help")) {
|
||||||
cout << mConfig["ExeName"] << endl << endl;
|
std::stringstream str;
|
||||||
cout << "For detailed descripton see http://free-cad.sf.net" << endl<<endl;
|
str << mConfig["ExeName"] << endl << endl;
|
||||||
cout << "Usage: " << mConfig["ExeName"] << " [options] File1 File2 ..." << endl << endl;
|
str << "For detailed descripton see http://free-cad.sf.net" << endl<<endl;
|
||||||
cout << visible << endl;
|
str << "Usage: " << mConfig["ExeName"] << " [options] File1 File2 ..." << endl << endl;
|
||||||
exit(0);
|
str << visible << endl;
|
||||||
|
throw Base::ProgramInformation(str.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vm.count("response-file")) {
|
if (vm.count("response-file")) {
|
||||||
|
@ -1488,9 +1546,10 @@ void Application::ParseOptions(int ac, char ** av)
|
||||||
std::ifstream ifs(vm["response-file"].as<string>().c_str());
|
std::ifstream ifs(vm["response-file"].as<string>().c_str());
|
||||||
if (!ifs) {
|
if (!ifs) {
|
||||||
Base::Console().Error("Could no open the response file\n");
|
Base::Console().Error("Could no open the response file\n");
|
||||||
cerr << "Could no open the response file: '"
|
std::stringstream str;
|
||||||
<< vm["response-file"].as<string>() << "'" << endl;
|
str << "Could no open the response file: '"
|
||||||
exit(1);
|
<< vm["response-file"].as<string>() << "'" << endl;
|
||||||
|
throw Base::UnknownProgramOption(str.str());
|
||||||
}
|
}
|
||||||
// Read the whole file into a string
|
// Read the whole file into a string
|
||||||
stringstream ss;
|
stringstream ss;
|
||||||
|
@ -1501,14 +1560,15 @@ void Application::ParseOptions(int ac, char ** av)
|
||||||
vector<string> args;
|
vector<string> args;
|
||||||
copy(tok.begin(), tok.end(), back_inserter(args));
|
copy(tok.begin(), tok.end(), back_inserter(args));
|
||||||
// Parse the file and store the options
|
// Parse the file and store the options
|
||||||
store( boost::program_options::command_line_parser(ac, av).
|
store( boost::program_options::command_line_parser(args).
|
||||||
options(cmdline_options).positional(p).extra_parser(customSyntax).run(), vm);
|
options(cmdline_options).positional(p).extra_parser(customSyntax).run(), vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vm.count("version")) {
|
if (vm.count("version")) {
|
||||||
std::cout << mConfig["ExeName"] << " " << mConfig["ExeVersion"]
|
std::stringstream str;
|
||||||
<< " Revision: " << mConfig["BuildRevision"] << std::endl;
|
str << mConfig["ExeName"] << " " << mConfig["ExeVersion"]
|
||||||
exit(0);
|
<< " Revision: " << mConfig["BuildRevision"] << std::endl;
|
||||||
|
throw Base::ProgramInformation(str.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vm.count("console")) {
|
if (vm.count("console")) {
|
||||||
|
@ -1548,6 +1608,15 @@ void Application::ParseOptions(int ac, char ** av)
|
||||||
mConfig["OpenFileCount"] = buffer.str();
|
mConfig["OpenFileCount"] = buffer.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vm.count("output")) {
|
||||||
|
string file = vm["output"].as<string>();
|
||||||
|
mConfig["SaveFile"] = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vm.count("hidden")) {
|
||||||
|
mConfig["StartHidden"] = "1";
|
||||||
|
}
|
||||||
|
|
||||||
if (vm.count("write-log")) {
|
if (vm.count("write-log")) {
|
||||||
mConfig["LoggingFile"] = "1";
|
mConfig["LoggingFile"] = "1";
|
||||||
//mConfig["LoggingFileName"] = vm["write-log"].as<string>();
|
//mConfig["LoggingFileName"] = vm["write-log"].as<string>();
|
||||||
|
|
|
@ -383,23 +383,36 @@ PyObject* Application::sGetVersion(PyObject * /*self*/, PyObject *args,PyObject
|
||||||
if (!PyArg_ParseTuple(args, "")) // convert args: Python->C
|
if (!PyArg_ParseTuple(args, "")) // convert args: Python->C
|
||||||
return NULL; // NULL triggers exception
|
return NULL; // NULL triggers exception
|
||||||
|
|
||||||
PyObject* pList = PyList_New(5);
|
Py::List list;
|
||||||
PyObject *pItem;
|
const std::map<std::string, std::string>& cfg = Application::Config();
|
||||||
pItem = PyString_FromString(Application::Config()["BuildVersionMajor"].c_str());
|
std::map<std::string, std::string>::const_iterator it;
|
||||||
PyList_SetItem(pList, 0, pItem);
|
|
||||||
pItem = PyString_FromString(Application::Config()["BuildVersionMinor"].c_str());
|
|
||||||
PyList_SetItem(pList, 1, pItem);
|
|
||||||
pItem = PyString_FromString(Application::Config()["BuildRevision"].c_str());
|
|
||||||
PyList_SetItem(pList, 2, pItem);
|
|
||||||
pItem = PyString_FromString(Application::Config()["BuildRepositoryURL"].c_str());
|
|
||||||
PyList_SetItem(pList, 4, pItem);
|
|
||||||
pItem = PyString_FromString(Application::Config()["BuildCurrentDate"].c_str());
|
|
||||||
PyList_SetItem(pList, 6, pItem);
|
|
||||||
|
|
||||||
return pList;
|
it = cfg.find("BuildVersionMajor");
|
||||||
|
list.append(Py::String(it != cfg.end() ? it->second : ""));
|
||||||
|
|
||||||
|
it = cfg.find("BuildVersionMinor");
|
||||||
|
list.append(Py::String(it != cfg.end() ? it->second : ""));
|
||||||
|
|
||||||
|
it = cfg.find("BuildRevision");
|
||||||
|
list.append(Py::String(it != cfg.end() ? it->second : ""));
|
||||||
|
|
||||||
|
it = cfg.find("BuildRepositoryURL");
|
||||||
|
list.append(Py::String(it != cfg.end() ? it->second : ""));
|
||||||
|
|
||||||
|
it = cfg.find("BuildRevisionDate");
|
||||||
|
list.append(Py::String(it != cfg.end() ? it->second : ""));
|
||||||
|
|
||||||
|
it = cfg.find("BuildRevisionBranch");
|
||||||
|
if (it != cfg.end())
|
||||||
|
list.append(Py::String(it->second));
|
||||||
|
|
||||||
|
it = cfg.find("BuildRevisionHash");
|
||||||
|
if (it != cfg.end())
|
||||||
|
list.append(Py::String(it->second));
|
||||||
|
|
||||||
|
return Py::new_reference_to(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PyObject* Application::sAddImportType(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/)
|
PyObject* Application::sAddImportType(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/)
|
||||||
{
|
{
|
||||||
char *psKey,*psMod;
|
char *psKey,*psMod;
|
||||||
|
|
|
@ -52,6 +52,7 @@ recompute path. Also enables more complicated dependencies beyond trees.
|
||||||
#include "PreCompiled.h"
|
#include "PreCompiled.h"
|
||||||
|
|
||||||
#ifndef _PreComp_
|
#ifndef _PreComp_
|
||||||
|
# include <algorithm>
|
||||||
# include <sstream>
|
# include <sstream>
|
||||||
# include <climits>
|
# include <climits>
|
||||||
#endif
|
#endif
|
||||||
|
@ -62,6 +63,7 @@ recompute path. Also enables more complicated dependencies beyond trees.
|
||||||
#include <boost/graph/visitors.hpp>
|
#include <boost/graph/visitors.hpp>
|
||||||
#include <boost/graph/graphviz.hpp>
|
#include <boost/graph/graphviz.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
#include <boost/regex.hpp>
|
||||||
|
|
||||||
|
|
||||||
#include "Document.h"
|
#include "Document.h"
|
||||||
|
@ -845,6 +847,31 @@ unsigned int Document::getMemSize (void) const
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Document::exportGraphviz(std::ostream& out)
|
||||||
|
{
|
||||||
|
std::vector<std::string> names;
|
||||||
|
names.reserve(d->objectMap.size());
|
||||||
|
DependencyList DepList;
|
||||||
|
std::map<DocumentObject*,Vertex> VertexObjectList;
|
||||||
|
|
||||||
|
// Filling up the adjacency List
|
||||||
|
for (std::map<std::string,DocumentObject*>::const_iterator It = d->objectMap.begin(); It != d->objectMap.end();++It) {
|
||||||
|
// add the object as Vertex and remember the index
|
||||||
|
VertexObjectList[It->second] = add_vertex(DepList);
|
||||||
|
names.push_back(It->second->Label.getValue());
|
||||||
|
}
|
||||||
|
// add the edges
|
||||||
|
for (std::map<std::string,DocumentObject*>::const_iterator It = d->objectMap.begin(); It != d->objectMap.end();++It) {
|
||||||
|
std::vector<DocumentObject*> OutList = It->second->getOutList();
|
||||||
|
for (std::vector<DocumentObject*>::const_iterator It2=OutList.begin();It2!=OutList.end();++It2) {
|
||||||
|
if (*It2)
|
||||||
|
add_edge(VertexObjectList[It->second],VertexObjectList[*It2],DepList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::write_graphviz(out, DepList, boost::make_label_writer(&(names[0])));
|
||||||
|
}
|
||||||
|
|
||||||
// Save the document under the name it has been opened
|
// Save the document under the name it has been opened
|
||||||
bool Document::save (void)
|
bool Document::save (void)
|
||||||
{
|
{
|
||||||
|
@ -1452,20 +1479,48 @@ void Document::breakDependency(DocumentObject* pcObject, bool clear)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (pt->second->getTypeId().isDerivedFrom(PropertyLinkSubList::getClassTypeId())) {
|
||||||
|
PropertyLinkSubList* link = static_cast<PropertyLinkSubList*>(pt->second);
|
||||||
|
if (link->getContainer() == pcObject && clear) {
|
||||||
|
link->setValues(std::vector<DocumentObject*>(), std::vector<std::string>());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const std::vector<DocumentObject*>& links = link->getValues();
|
||||||
|
const std::vector<std::string>& sub = link->getSubValues();
|
||||||
|
std::vector<DocumentObject*> newLinks;
|
||||||
|
std::vector<std::string> newSub;
|
||||||
|
|
||||||
|
if (std::find(links.begin(), links.end(), pcObject) != links.end()) {
|
||||||
|
std::vector<DocumentObject*>::const_iterator jt;
|
||||||
|
std::vector<std::string>::const_iterator kt;
|
||||||
|
for (jt = links.begin(),kt = sub.begin(); jt != links.end() && kt != sub.end(); ++jt, ++kt) {
|
||||||
|
if (*jt != pcObject) {
|
||||||
|
newLinks.push_back(*jt);
|
||||||
|
newSub.push_back(*kt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
link->setValues(newLinks, newSub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DocumentObject* Document::_copyObject(DocumentObject* obj, std::map<DocumentObject*,
|
DocumentObject* Document::_copyObject(DocumentObject* obj, std::map<DocumentObject*,
|
||||||
DocumentObject*>& copy_map, bool recursive)
|
DocumentObject*>& copy_map, bool recursive,
|
||||||
|
bool keepdigitsatend)
|
||||||
{
|
{
|
||||||
if (!obj) return 0;
|
if (!obj) return 0;
|
||||||
// remove number from end to avoid lengthy names
|
// remove number from end to avoid lengthy names
|
||||||
std::string objname = obj->getNameInDocument();
|
std::string objname = obj->getNameInDocument();
|
||||||
size_t lastpos = objname.length()-1;
|
if (!keepdigitsatend) {
|
||||||
while (objname[lastpos] >= 48 && objname[lastpos] <= 57)
|
size_t lastpos = objname.length()-1;
|
||||||
lastpos--;
|
while (objname[lastpos] >= 48 && objname[lastpos] <= 57)
|
||||||
objname = objname.substr(0, lastpos+1);
|
lastpos--;
|
||||||
|
objname = objname.substr(0, lastpos+1);
|
||||||
|
}
|
||||||
DocumentObject* copy = addObject(obj->getTypeId().getName(),objname.c_str());
|
DocumentObject* copy = addObject(obj->getTypeId().getName(),objname.c_str());
|
||||||
if (!copy) return 0;
|
if (!copy) return 0;
|
||||||
copy->addDynamicProperties(obj);
|
copy->addDynamicProperties(obj);
|
||||||
|
@ -1485,7 +1540,7 @@ DocumentObject* Document::_copyObject(DocumentObject* obj, std::map<DocumentObje
|
||||||
static_cast<PropertyLink*>(it->second)->setValue(pt->second);
|
static_cast<PropertyLink*>(it->second)->setValue(pt->second);
|
||||||
}
|
}
|
||||||
else if (recursive) {
|
else if (recursive) {
|
||||||
DocumentObject* link_copy = _copyObject(link, copy_map, recursive);
|
DocumentObject* link_copy = _copyObject(link, copy_map, recursive, keepdigitsatend);
|
||||||
copy_map[link] = link_copy;
|
copy_map[link] = link_copy;
|
||||||
static_cast<PropertyLink*>(it->second)->setValue(link_copy);
|
static_cast<PropertyLink*>(it->second)->setValue(link_copy);
|
||||||
}
|
}
|
||||||
|
@ -1504,7 +1559,7 @@ DocumentObject* Document::_copyObject(DocumentObject* obj, std::map<DocumentObje
|
||||||
links_copy.push_back(pt->second);
|
links_copy.push_back(pt->second);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
links_copy.push_back(_copyObject(*jt, copy_map, recursive));
|
links_copy.push_back(_copyObject(*jt, copy_map, recursive, keepdigitsatend));
|
||||||
copy_map[*jt] = links_copy.back();
|
copy_map[*jt] = links_copy.back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1534,10 +1589,10 @@ DocumentObject* Document::_copyObject(DocumentObject* obj, std::map<DocumentObje
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
DocumentObject* Document::copyObject(DocumentObject* obj, bool recursive)
|
DocumentObject* Document::copyObject(DocumentObject* obj, bool recursive, bool keepdigitsatend)
|
||||||
{
|
{
|
||||||
std::map<DocumentObject*, DocumentObject*> copy_map;
|
std::map<DocumentObject*, DocumentObject*> copy_map;
|
||||||
DocumentObject* copy = _copyObject(obj, copy_map, recursive);
|
DocumentObject* copy = _copyObject(obj, copy_map, recursive, keepdigitsatend);
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1663,6 +1718,20 @@ std::vector<DocumentObject*> Document::getObjectsOfType(const Base::Type& typeId
|
||||||
return Objects;
|
return Objects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<DocumentObject*> Document::findObjects(const Base::Type& typeId, const char* objname) const
|
||||||
|
{
|
||||||
|
boost::regex rx(objname);
|
||||||
|
boost::cmatch what;
|
||||||
|
std::vector<DocumentObject*> Objects;
|
||||||
|
for (std::vector<DocumentObject*>::const_iterator it = d->objectArray.begin(); it != d->objectArray.end(); ++it) {
|
||||||
|
if ((*it)->getTypeId().isDerivedFrom(typeId)) {
|
||||||
|
if (boost::regex_match((*it)->getNameInDocument(), what, rx))
|
||||||
|
Objects.push_back(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Objects;
|
||||||
|
}
|
||||||
|
|
||||||
int Document::countObjectsOfType(const Base::Type& typeId) const
|
int Document::countObjectsOfType(const Base::Type& typeId) const
|
||||||
{
|
{
|
||||||
int ct=0;
|
int ct=0;
|
||||||
|
|
|
@ -114,6 +114,7 @@ public:
|
||||||
/// Restore the document from the file in Property Path
|
/// Restore the document from the file in Property Path
|
||||||
void restore (void);
|
void restore (void);
|
||||||
void exportObjects(const std::vector<App::DocumentObject*>&, std::ostream&);
|
void exportObjects(const std::vector<App::DocumentObject*>&, std::ostream&);
|
||||||
|
void exportGraphviz(std::ostream&);
|
||||||
std::vector<App::DocumentObject*> importObjects(std::istream&);
|
std::vector<App::DocumentObject*> importObjects(std::istream&);
|
||||||
/// Opens the document from its file name
|
/// Opens the document from its file name
|
||||||
//void open (void);
|
//void open (void);
|
||||||
|
@ -140,7 +141,7 @@ public:
|
||||||
* are copied as well. By default \a recursive is false.
|
* are copied as well. By default \a recursive is false.
|
||||||
* Returns the copy of the object or 0 if the creation failed.
|
* Returns the copy of the object or 0 if the creation failed.
|
||||||
*/
|
*/
|
||||||
DocumentObject* copyObject(DocumentObject* obj, bool recursive=false);
|
DocumentObject* copyObject(DocumentObject* obj, bool recursive=false, bool keepdigitsatend=false);
|
||||||
/** Move an object from another document to this document
|
/** Move an object from another document to this document
|
||||||
* If \a recursive is true then all objects this object depends on
|
* If \a recursive is true then all objects this object depends on
|
||||||
* are moved as well. By default \a recursive is false.
|
* are moved as well. By default \a recursive is false.
|
||||||
|
@ -161,6 +162,7 @@ public:
|
||||||
/// Returns a list of all Objects
|
/// Returns a list of all Objects
|
||||||
std::vector<DocumentObject*> getObjects() const;
|
std::vector<DocumentObject*> getObjects() const;
|
||||||
std::vector<DocumentObject*> getObjectsOfType(const Base::Type& typeId) const;
|
std::vector<DocumentObject*> getObjectsOfType(const Base::Type& typeId) const;
|
||||||
|
std::vector<DocumentObject*> findObjects(const Base::Type& typeId, const char* objname) const;
|
||||||
/// Returns an array with the correct types already.
|
/// Returns an array with the correct types already.
|
||||||
template<typename T> inline std::vector<T*> getObjectsOfType() const;
|
template<typename T> inline std::vector<T*> getObjectsOfType() const;
|
||||||
int countObjectsOfType(const Base::Type& typeId) const;
|
int countObjectsOfType(const Base::Type& typeId) const;
|
||||||
|
@ -260,7 +262,7 @@ protected:
|
||||||
void _remObject(DocumentObject* pcObject);
|
void _remObject(DocumentObject* pcObject);
|
||||||
void _addObject(DocumentObject* pcObject, const char* pObjectName);
|
void _addObject(DocumentObject* pcObject, const char* pObjectName);
|
||||||
DocumentObject* _copyObject(DocumentObject* obj, std::map<DocumentObject*,
|
DocumentObject* _copyObject(DocumentObject* obj, std::map<DocumentObject*,
|
||||||
DocumentObject*>&, bool recursive=false);
|
DocumentObject*>&, bool recursive=false, bool keepdigitsatend=false);
|
||||||
/// checks if a valid transaction is open
|
/// checks if a valid transaction is open
|
||||||
void _checkTransaction(void);
|
void _checkTransaction(void);
|
||||||
void breakDependency(DocumentObject* pcObject, bool clear);
|
void breakDependency(DocumentObject* pcObject, bool clear);
|
||||||
|
|
|
@ -37,7 +37,7 @@ PROPERTY_SOURCE(App::DocumentObjectGroup, App::DocumentObject)
|
||||||
|
|
||||||
DocumentObjectGroup::DocumentObjectGroup()
|
DocumentObjectGroup::DocumentObjectGroup()
|
||||||
{
|
{
|
||||||
ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_ReadOnly|Prop_Output),"List of referenced objects");
|
ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects");
|
||||||
}
|
}
|
||||||
|
|
||||||
DocumentObjectGroup::~DocumentObjectGroup()
|
DocumentObjectGroup::~DocumentObjectGroup()
|
||||||
|
@ -179,13 +179,13 @@ PyObject *DocumentObjectGroup::getPyObject()
|
||||||
return Py::new_reference_to(PythonObject);
|
return Py::new_reference_to(PythonObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Python Sketcher feature ---------------------------------------------------------
|
// Python feature ---------------------------------------------------------
|
||||||
|
|
||||||
namespace App {
|
namespace App {
|
||||||
/// @cond DOXERR
|
/// @cond DOXERR
|
||||||
PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup)
|
PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup)
|
||||||
template<> const char* App::DocumentObjectGroupPython::getViewProviderName(void) const {
|
template<> const char* App::DocumentObjectGroupPython::getViewProviderName(void) const {
|
||||||
return "Gui::ViewProviderDocumentObjectGroup";
|
return "Gui::ViewProviderDocumentObjectGroupPython";
|
||||||
}
|
}
|
||||||
/// @endcond
|
/// @endcond
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,11 @@
|
||||||
<UserDocu>Restore the document from disc</UserDocu>
|
<UserDocu>Restore the document from disc</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="exportGraphviz">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>Export the dependencies of the objects as graph</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Methode Name="openTransaction">
|
<Methode Name="openTransaction">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Open a new Undo/Redo transaction.</UserDocu>
|
<UserDocu>Open a new Undo/Redo transaction.</UserDocu>
|
||||||
|
|
|
@ -92,6 +92,25 @@ PyObject* DocumentPy::restore(PyObject * args)
|
||||||
Py_Return;
|
Py_Return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* DocumentPy::exportGraphviz(PyObject * args)
|
||||||
|
{
|
||||||
|
char* fn=0;
|
||||||
|
if (!PyArg_ParseTuple(args, "|s",&fn)) // convert args: Python->C
|
||||||
|
return NULL; // NULL triggers exception
|
||||||
|
if (fn) {
|
||||||
|
Base::FileInfo fi(fn);
|
||||||
|
Base::ofstream str(fi);
|
||||||
|
getDocumentPtr()->exportGraphviz(str);
|
||||||
|
str.close();
|
||||||
|
Py_Return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::stringstream str;
|
||||||
|
getDocumentPtr()->exportGraphviz(str);
|
||||||
|
return PyString_FromString(str.str().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PyObject* DocumentPy::addObject(PyObject *args)
|
PyObject* DocumentPy::addObject(PyObject *args)
|
||||||
{
|
{
|
||||||
char *sType,*sName=0;
|
char *sType,*sName=0;
|
||||||
|
@ -163,12 +182,12 @@ PyObject* DocumentPy::removeObject(PyObject *args)
|
||||||
|
|
||||||
PyObject* DocumentPy::copyObject(PyObject *args)
|
PyObject* DocumentPy::copyObject(PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject *obj, *rec=0;
|
PyObject *obj, *rec=0, *keep=0;
|
||||||
if (!PyArg_ParseTuple(args, "O!|O!",&(DocumentObjectPy::Type),&obj,&PyBool_Type,&rec))
|
if (!PyArg_ParseTuple(args, "O!|O!O!",&(DocumentObjectPy::Type),&obj,&PyBool_Type,&rec,&PyBool_Type,&keep))
|
||||||
return NULL; // NULL triggers exception
|
return NULL; // NULL triggers exception
|
||||||
|
|
||||||
DocumentObjectPy* docObj = static_cast<DocumentObjectPy*>(obj);
|
DocumentObjectPy* docObj = static_cast<DocumentObjectPy*>(obj);
|
||||||
DocumentObject* copy = getDocumentPtr()->copyObject(docObj->getDocumentObjectPtr(), rec==Py_True);
|
DocumentObject* copy = getDocumentPtr()->copyObject(docObj->getDocumentObjectPtr(), rec==Py_True, keep==Py_True);
|
||||||
if (copy) {
|
if (copy) {
|
||||||
return copy->getPyObject();
|
return copy->getPyObject();
|
||||||
}
|
}
|
||||||
|
@ -303,16 +322,10 @@ PyObject* DocumentPy::findObjects(PyObject *args)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<DocumentObject*> res;
|
std::vector<DocumentObject*> res;
|
||||||
std::vector<DocumentObject*> objs = getDocumentPtr()->getObjectsOfType(type);
|
|
||||||
|
|
||||||
if (sName) {
|
if (sName) {
|
||||||
try {
|
try {
|
||||||
boost::regex rx(sName);
|
res = getDocumentPtr()->findObjects(type, sName);
|
||||||
boost::cmatch what;
|
|
||||||
for (std::vector<DocumentObject*>::const_iterator It = objs.begin();It != objs.end();++It) {
|
|
||||||
if (boost::regex_match((*It)->getNameInDocument(), what, rx))
|
|
||||||
res.push_back(*It);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (const boost::regex_error& e) {
|
catch (const boost::regex_error& e) {
|
||||||
PyErr_SetString(PyExc_RuntimeError, e.what());
|
PyErr_SetString(PyExc_RuntimeError, e.what());
|
||||||
|
@ -320,7 +333,7 @@ PyObject* DocumentPy::findObjects(PyObject *args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
res = objs;
|
res = getDocumentPtr()->getObjectsOfType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_ssize_t index=0;
|
Py_ssize_t index=0;
|
||||||
|
|
|
@ -257,13 +257,18 @@ void PropertyFileIncluded::setPyObject(PyObject *value)
|
||||||
void PropertyFileIncluded::Save (Base::Writer &writer) const
|
void PropertyFileIncluded::Save (Base::Writer &writer) const
|
||||||
{
|
{
|
||||||
if (writer.isForceXML()) {
|
if (writer.isForceXML()) {
|
||||||
writer.Stream() << writer.ind() << "<FileIncluded file=\"\">" << endl;
|
if (!_cValue.empty()) {
|
||||||
|
Base::FileInfo file(_cValue.c_str());
|
||||||
// write the file in the XML stream
|
writer.Stream() << writer.ind() << "<FileIncluded data=\"" <<
|
||||||
if (!_cValue.empty())
|
file.fileName() << "\">" << std::endl;
|
||||||
|
// write the file in the XML stream
|
||||||
|
writer.incInd();
|
||||||
writer.insertBinFile(_cValue.c_str());
|
writer.insertBinFile(_cValue.c_str());
|
||||||
|
writer.decInd();
|
||||||
writer.Stream() << writer.ind() <<"</FileIncluded>" << endl ;
|
writer.Stream() << writer.ind() <<"</FileIncluded>" << endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
writer.Stream() << writer.ind() << "<FileIncluded data=\"\"/>" << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// instead initiate an extra file
|
// instead initiate an extra file
|
||||||
|
@ -280,23 +285,36 @@ void PropertyFileIncluded::Save (Base::Writer &writer) const
|
||||||
void PropertyFileIncluded::Restore(Base::XMLReader &reader)
|
void PropertyFileIncluded::Restore(Base::XMLReader &reader)
|
||||||
{
|
{
|
||||||
reader.readElement("FileIncluded");
|
reader.readElement("FileIncluded");
|
||||||
string file (reader.getAttribute("file") );
|
if (reader.hasAttribute("file")) {
|
||||||
|
string file (reader.getAttribute("file") );
|
||||||
if (!file.empty()) {
|
if (!file.empty()) {
|
||||||
// initate a file read
|
// initate a file read
|
||||||
reader.addFile(file.c_str(),this);
|
reader.addFile(file.c_str(),this);
|
||||||
|
// is in the document transient path
|
||||||
// is in the document transient path
|
aboutToSetValue();
|
||||||
aboutToSetValue();
|
_cValue = getDocTransientPath() + "/" + file;
|
||||||
_cValue = getDocTransientPath() + "/" + file;
|
_BaseFileName = file;
|
||||||
_BaseFileName = file;
|
hasSetValue();
|
||||||
hasSetValue();
|
}
|
||||||
|
}
|
||||||
|
// section is XML stream
|
||||||
|
else if (reader.hasAttribute("data")) {
|
||||||
|
string file (reader.getAttribute("data") );
|
||||||
|
if (!file.empty()) {
|
||||||
|
// is in the document transient path
|
||||||
|
aboutToSetValue();
|
||||||
|
_cValue = getDocTransientPath() + "/" + file;
|
||||||
|
reader.readBinFile(_cValue.c_str());
|
||||||
|
reader.readEndElement("FileIncluded");
|
||||||
|
_BaseFileName = file;
|
||||||
|
hasSetValue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PropertyFileIncluded::SaveDocFile (Base::Writer &writer) const
|
void PropertyFileIncluded::SaveDocFile (Base::Writer &writer) const
|
||||||
{
|
{
|
||||||
std::ifstream from(_cValue.c_str());
|
Base::ifstream from(Base::FileInfo(_cValue.c_str()));
|
||||||
if (!from)
|
if (!from)
|
||||||
throw Base::Exception("PropertyFileIncluded::SaveDocFile() "
|
throw Base::Exception("PropertyFileIncluded::SaveDocFile() "
|
||||||
"File in document transient dir deleted");
|
"File in document transient dir deleted");
|
||||||
|
@ -311,7 +329,7 @@ void PropertyFileIncluded::SaveDocFile (Base::Writer &writer) const
|
||||||
|
|
||||||
void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader)
|
void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader)
|
||||||
{
|
{
|
||||||
std::ofstream to(_cValue.c_str());
|
Base::ofstream to(Base::FileInfo(_cValue.c_str()));
|
||||||
if (!to)
|
if (!to)
|
||||||
throw Base::Exception("PropertyFileIncluded::RestoreDocFile() "
|
throw Base::Exception("PropertyFileIncluded::RestoreDocFile() "
|
||||||
"File in document transient dir deleted");
|
"File in document transient dir deleted");
|
||||||
|
@ -328,10 +346,10 @@ void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader)
|
||||||
|
|
||||||
Property *PropertyFileIncluded::Copy(void) const
|
Property *PropertyFileIncluded::Copy(void) const
|
||||||
{
|
{
|
||||||
PropertyFileIncluded *p= new PropertyFileIncluded();
|
PropertyFileIncluded *prop = new PropertyFileIncluded();
|
||||||
|
|
||||||
// remember the base name
|
// remember the base name
|
||||||
p->_BaseFileName = _BaseFileName;
|
prop->_BaseFileName = _BaseFileName;
|
||||||
|
|
||||||
if (!_cValue.empty()) {
|
if (!_cValue.empty()) {
|
||||||
Base::FileInfo file(_cValue);
|
Base::FileInfo file(_cValue);
|
||||||
|
@ -343,11 +361,11 @@ Property *PropertyFileIncluded::Copy(void) const
|
||||||
bool done = file.renameFile(NewName.filePath().c_str());
|
bool done = file.renameFile(NewName.filePath().c_str());
|
||||||
assert(done);
|
assert(done);
|
||||||
// remember the new name for the Undo
|
// remember the new name for the Undo
|
||||||
Base::Console().Log("Copy this=%p Befor=%s After=%s\n",p,p->_cValue.c_str(),NewName.filePath().c_str());
|
Base::Console().Log("Copy this=%p Before=%s After=%s\n",prop,prop->_cValue.c_str(),NewName.filePath().c_str());
|
||||||
p->_cValue = NewName.filePath().c_str();
|
prop->_cValue = NewName.filePath().c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
return p;
|
return prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PropertyFileIncluded::Paste(const Property &from)
|
void PropertyFileIncluded::Paste(const Property &from)
|
||||||
|
@ -358,6 +376,9 @@ void PropertyFileIncluded::Paste(const Property &from)
|
||||||
file.deleteFile();
|
file.deleteFile();
|
||||||
const PropertyFileIncluded &fileInc = dynamic_cast<const PropertyFileIncluded&>(from);
|
const PropertyFileIncluded &fileInc = dynamic_cast<const PropertyFileIncluded&>(from);
|
||||||
|
|
||||||
|
// set the base name
|
||||||
|
_BaseFileName = fileInc._BaseFileName;
|
||||||
|
|
||||||
if (!fileInc._cValue.empty()) {
|
if (!fileInc._cValue.empty()) {
|
||||||
// move the saved files back in place
|
// move the saved files back in place
|
||||||
Base::FileInfo NewFile(fileInc._cValue);
|
Base::FileInfo NewFile(fileInc._cValue);
|
||||||
|
|
|
@ -185,6 +185,9 @@ public:
|
||||||
/** This method returns a string representation of the property
|
/** This method returns a string representation of the property
|
||||||
*/
|
*/
|
||||||
const Base::Matrix4D &getValue(void) const;
|
const Base::Matrix4D &getValue(void) const;
|
||||||
|
const char* getEditorName(void) const {
|
||||||
|
return "Gui::PropertyEditor::PropertyMatrixItem";
|
||||||
|
}
|
||||||
|
|
||||||
virtual PyObject *getPyObject(void);
|
virtual PyObject *getPyObject(void);
|
||||||
virtual void setPyObject(PyObject *);
|
virtual void setPyObject(PyObject *);
|
||||||
|
|
|
@ -130,12 +130,18 @@ void PropertyLink::Restore(Base::XMLReader &reader)
|
||||||
assert(getContainer()->getTypeId().isDerivedFrom(App::DocumentObject::getClassTypeId()) );
|
assert(getContainer()->getTypeId().isDerivedFrom(App::DocumentObject::getClassTypeId()) );
|
||||||
|
|
||||||
if (name != "") {
|
if (name != "") {
|
||||||
DocumentObject *pcObject = static_cast<DocumentObject*>(getContainer())->
|
DocumentObject* parent = static_cast<DocumentObject*>(getContainer());
|
||||||
getDocument()->getObject(name.c_str());
|
DocumentObject* object = parent->getDocument()->getObject(name.c_str());
|
||||||
if (!pcObject)
|
if (!object) {
|
||||||
Base::Console().Warning("Lost link to '%s' while loading, maybe "
|
Base::Console().Warning("Lost link to '%s' while loading, maybe "
|
||||||
"an object was not loaded correctly\n",name.c_str());
|
"an object was not loaded correctly\n",name.c_str());
|
||||||
setValue(pcObject);
|
}
|
||||||
|
else if (parent == object) {
|
||||||
|
Base::Console().Warning("Object '%s' links to itself, nullify it\n",name.c_str());
|
||||||
|
object = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
setValue(object);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setValue(0);
|
setValue(0);
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <Base/Console.h>
|
#include <Base/Console.h>
|
||||||
#include <Base/Interpreter.h>
|
#include <Base/Interpreter.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <boost/regex.hpp>
|
||||||
|
|
||||||
using namespace App;
|
using namespace App;
|
||||||
|
|
||||||
|
@ -82,10 +83,20 @@ std::string PropertyPythonObject::toString() const
|
||||||
std::string repr;
|
std::string repr;
|
||||||
Base::PyGILStateLocker lock;
|
Base::PyGILStateLocker lock;
|
||||||
try {
|
try {
|
||||||
Py::Module pickle(PyImport_ImportModule("cPickle"),true);
|
Py::Module pickle(PyImport_ImportModule("json"),true);
|
||||||
Py::Callable method(pickle.getAttr(std::string("dumps")));
|
Py::Callable method(pickle.getAttr(std::string("dumps")));
|
||||||
|
Py::Object dump;
|
||||||
|
if (this->object.hasAttr("__getstate__")) {
|
||||||
|
Py::Tuple args(0);
|
||||||
|
Py::Callable state(this->object.getAttr("__getstate__"));
|
||||||
|
dump = state.apply(args);
|
||||||
|
}
|
||||||
|
else if (this->object.hasAttr("__dict__")) {
|
||||||
|
dump = this->object.getAttr("__dict__");
|
||||||
|
}
|
||||||
|
|
||||||
Py::Tuple args(1);
|
Py::Tuple args(1);
|
||||||
args.setItem(0, this->object);
|
args.setItem(0, dump);
|
||||||
Py::Object res = method.apply(args);
|
Py::Object res = method.apply(args);
|
||||||
Py::String str(res);
|
Py::String str(res);
|
||||||
repr = str.as_std_string();
|
repr = str.as_std_string();
|
||||||
|
@ -102,12 +113,21 @@ void PropertyPythonObject::fromString(const std::string& repr)
|
||||||
{
|
{
|
||||||
Base::PyGILStateLocker lock;
|
Base::PyGILStateLocker lock;
|
||||||
try {
|
try {
|
||||||
Py::Module pickle(PyImport_ImportModule("cPickle"),true);
|
Py::Module pickle(PyImport_ImportModule("json"),true);
|
||||||
Py::Callable method(pickle.getAttr(std::string("loads")));
|
Py::Callable method(pickle.getAttr(std::string("loads")));
|
||||||
Py::Tuple args(1);
|
Py::Tuple args(1);
|
||||||
args.setItem(0, Py::String(repr));
|
args.setItem(0, Py::String(repr));
|
||||||
Py::Object res = method.apply(args);
|
Py::Object res = method.apply(args);
|
||||||
this->object = res;
|
|
||||||
|
if (this->object.hasAttr("__setstate__")) {
|
||||||
|
Py::Tuple args(1);
|
||||||
|
args.setItem(0, res);
|
||||||
|
Py::Callable state(this->object.getAttr("__setstate__"));
|
||||||
|
state.apply(args);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this->object.setAttr("__dict__", res);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Py::Exception&) {
|
catch (Py::Exception&) {
|
||||||
Base::PyException e; // extract the Python error text
|
Base::PyException e; // extract the Python error text
|
||||||
|
@ -115,6 +135,32 @@ void PropertyPythonObject::fromString(const std::string& repr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PropertyPythonObject::loadPickle(const std::string& str)
|
||||||
|
{
|
||||||
|
// find the custom attributes and restore them
|
||||||
|
Base::PyGILStateLocker lock;
|
||||||
|
try {
|
||||||
|
std::string buffer = str;
|
||||||
|
boost::regex pickle("S'(\\w+)'.+S'(\\w+)'\\n");
|
||||||
|
boost::match_results<std::string::const_iterator> what;
|
||||||
|
std::string::const_iterator start, end;
|
||||||
|
start = buffer.begin();
|
||||||
|
end = buffer.end();
|
||||||
|
while (boost::regex_search(start, end, what, pickle)) {
|
||||||
|
std::string key = std::string(what[1].first, what[1].second);
|
||||||
|
std::string val = std::string(what[2].first, what[2].second);
|
||||||
|
this->object.setAttr(key, Py::String(val));
|
||||||
|
buffer = std::string(what[2].second, end);
|
||||||
|
start = buffer.begin();
|
||||||
|
end = buffer.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Py::Exception&) {
|
||||||
|
Base::PyException e; // extract the Python error text
|
||||||
|
Base::Console().Warning("PropertyPythonObject::loadPickle: %s\n", e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::string PropertyPythonObject::encodeValue(const std::string& str) const
|
std::string PropertyPythonObject::encodeValue(const std::string& str) const
|
||||||
{
|
{
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
|
@ -210,7 +256,25 @@ void PropertyPythonObject::Save (Base::Writer &writer) const
|
||||||
repr = Base::base64_encode((const unsigned char*)repr.c_str(), repr.size());
|
repr = Base::base64_encode((const unsigned char*)repr.c_str(), repr.size());
|
||||||
std::string val = /*encodeValue*/(repr);
|
std::string val = /*encodeValue*/(repr);
|
||||||
writer.Stream() << writer.ind() << "<Python value=\"" << val
|
writer.Stream() << writer.ind() << "<Python value=\"" << val
|
||||||
<<"\" encoded=\"yes\"";
|
<< "\" encoded=\"yes\"";
|
||||||
|
|
||||||
|
Base::PyGILStateLocker lock;
|
||||||
|
try {
|
||||||
|
if (this->object.hasAttr("__module__") && this->object.hasAttr("__class__")) {
|
||||||
|
Py::String mod(this->object.getAttr("__module__"));
|
||||||
|
Py::Object cls(this->object.getAttr("__class__"));
|
||||||
|
if (cls.hasAttr("__name__")) {
|
||||||
|
Py::String name(cls.getAttr("__name__"));
|
||||||
|
writer.Stream() << " module=\"" << (std::string)mod << "\""
|
||||||
|
<< " class=\"" << (std::string)name << "\"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Py::Exception&) {
|
||||||
|
Base::PyException e; // extract the Python error text
|
||||||
|
Base::Console().Warning("PropertyPythonObject::Save: %s\n", e.what());
|
||||||
|
}
|
||||||
|
|
||||||
saveObject(writer);
|
saveObject(writer);
|
||||||
writer.Stream() << "/>" << std::endl;
|
writer.Stream() << "/>" << std::endl;
|
||||||
//}
|
//}
|
||||||
|
@ -228,6 +292,8 @@ void PropertyPythonObject::Restore(Base::XMLReader &reader)
|
||||||
reader.addFile(file.c_str(),this);
|
reader.addFile(file.c_str(),this);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
bool load_json=false;
|
||||||
|
bool load_pickle=false;
|
||||||
std::string buffer = reader.getAttribute("value");
|
std::string buffer = reader.getAttribute("value");
|
||||||
if (reader.hasAttribute("encoded") &&
|
if (reader.hasAttribute("encoded") &&
|
||||||
strcmp(reader.getAttribute("encoded"),"yes") == 0) {
|
strcmp(reader.getAttribute("encoded"),"yes") == 0) {
|
||||||
|
@ -237,8 +303,39 @@ void PropertyPythonObject::Restore(Base::XMLReader &reader)
|
||||||
buffer = decodeValue(buffer);
|
buffer = decodeValue(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Base::PyGILStateLocker lock;
|
||||||
|
try {
|
||||||
|
boost::regex pickle("^\\(i(\\w+)\\n(\\w+)\\n");
|
||||||
|
boost::match_results<std::string::const_iterator> what;
|
||||||
|
std::string::const_iterator start, end;
|
||||||
|
start = buffer.begin();
|
||||||
|
end = buffer.end();
|
||||||
|
if (reader.hasAttribute("module") && reader.hasAttribute("class")) {
|
||||||
|
Py::Module mod(PyImport_ImportModule(reader.getAttribute("module")),true);
|
||||||
|
this->object = PyInstance_NewRaw(mod.getAttr(reader.getAttribute("class")).ptr(), 0);
|
||||||
|
load_json = true;
|
||||||
|
}
|
||||||
|
else if (boost::regex_search(start, end, what, pickle)) {
|
||||||
|
std::string nam = std::string(what[1].first, what[1].second);
|
||||||
|
std::string cls = std::string(what[2].first, what[2].second);
|
||||||
|
Py::Module mod(PyImport_ImportModule(nam.c_str()),true);
|
||||||
|
this->object = PyInstance_NewRaw(mod.getAttr(cls).ptr(), 0);
|
||||||
|
load_pickle = true;
|
||||||
|
buffer = std::string(what[2].second, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Py::Exception&) {
|
||||||
|
Base::PyException e; // extract the Python error text
|
||||||
|
Base::Console().Warning("PropertyPythonObject::Restore: %s\n", e.what());
|
||||||
|
}
|
||||||
|
|
||||||
aboutToSetValue();
|
aboutToSetValue();
|
||||||
this->fromString(buffer);
|
if (load_json)
|
||||||
|
this->fromString(buffer);
|
||||||
|
else if (load_pickle)
|
||||||
|
this->loadPickle(buffer);
|
||||||
|
else
|
||||||
|
Base::Console().Warning("PropertyPythonObject::Restore: unsupported serialisation: %s\n", buffer.c_str());
|
||||||
restoreObject(reader);
|
restoreObject(reader);
|
||||||
hasSetValue();
|
hasSetValue();
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,6 +77,7 @@ private:
|
||||||
void restoreObject(Base::XMLReader &reader);
|
void restoreObject(Base::XMLReader &reader);
|
||||||
std::string encodeValue(const std::string& str) const;
|
std::string encodeValue(const std::string& str) const;
|
||||||
std::string decodeValue(const std::string& str) const;
|
std::string decodeValue(const std::string& str) const;
|
||||||
|
void loadPickle(const std::string& str);
|
||||||
Py::Object object;
|
Py::Object object;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -394,9 +394,6 @@ protected:
|
||||||
const Constraints* _ConstStruct;
|
const Constraints* _ConstStruct;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AppExport PropertyFloatList: public PropertyLists
|
class AppExport PropertyFloatList: public PropertyLists
|
||||||
{
|
{
|
||||||
TYPESYSTEM_HEADER();
|
TYPESYSTEM_HEADER();
|
||||||
|
@ -470,10 +467,11 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual ~PropertyString();
|
virtual ~PropertyString();
|
||||||
|
|
||||||
|
|
||||||
void setValue(const char* sString);
|
void setValue(const char* sString);
|
||||||
void setValue(const std::string &sString);
|
void setValue(const std::string &sString);
|
||||||
const char* getValue(void) const;
|
const char* getValue(void) const;
|
||||||
|
const std::string& getStrValue(void) const
|
||||||
|
{ return _cValue; }
|
||||||
bool isEmpty(void){return _cValue.empty();}
|
bool isEmpty(void){return _cValue.empty();}
|
||||||
|
|
||||||
virtual const char* getEditorName(void) const { return "Gui::PropertyEditor::PropertyStringItem"; }
|
virtual const char* getEditorName(void) const { return "Gui::PropertyEditor::PropertyStringItem"; }
|
||||||
|
|
|
@ -192,7 +192,6 @@ PyObject* BoundBoxPy::getIntersectionPoint(PyObject *args)
|
||||||
*(static_cast<Base::VectorPy*>(object2)->getVectorPtr()),
|
*(static_cast<Base::VectorPy*>(object2)->getVectorPtr()),
|
||||||
point, epsilon);
|
point, epsilon);
|
||||||
// IsInBox() doesn't handle border points correctly
|
// IsInBox() doesn't handle border points correctly
|
||||||
BoundBoxPy::PointerType bb = getBoundBoxPtr();
|
|
||||||
if (ok) {
|
if (ok) {
|
||||||
return new VectorPy(point);
|
return new VectorPy(point);
|
||||||
}
|
}
|
||||||
|
@ -209,6 +208,7 @@ PyObject* BoundBoxPy::move(PyObject *args)
|
||||||
{
|
{
|
||||||
double x,y,z;
|
double x,y,z;
|
||||||
PyObject *object;
|
PyObject *object;
|
||||||
|
|
||||||
Base::Vector3d vec;
|
Base::Vector3d vec;
|
||||||
|
|
||||||
if (PyArg_ParseTuple(args, "ddd", &x,&y,&z)) {
|
if (PyArg_ParseTuple(args, "ddd", &x,&y,&z)) {
|
||||||
|
|
|
@ -68,7 +68,7 @@ if(SWIG_FOUND)
|
||||||
add_definitions(-DHAVE_SWIG=1)
|
add_definitions(-DHAVE_SWIG=1)
|
||||||
endif(SWIG_FOUND)
|
endif(SWIG_FOUND)
|
||||||
|
|
||||||
if (EXISTS ${CMAKE_SOURCE_DIR}/src/zipios++ AND NOT FREECAD_BUILD_DEBIAN)
|
if (EXISTS ${CMAKE_SOURCE_DIR}/src/zipios++ AND NOT FREECAD_USE_EXTERNAL_ZIPIOS)
|
||||||
SET(zipios_SRCS
|
SET(zipios_SRCS
|
||||||
../zipios++/backbuffer.h
|
../zipios++/backbuffer.h
|
||||||
../zipios++/basicentry.cpp
|
../zipios++/basicentry.cpp
|
||||||
|
@ -122,12 +122,7 @@ SET(zipios_SRCS
|
||||||
../zipios++/zipoutputstream.h
|
../zipios++/zipoutputstream.h
|
||||||
)
|
)
|
||||||
SOURCE_GROUP("zipios" FILES ${zipios_SRCS})
|
SOURCE_GROUP("zipios" FILES ${zipios_SRCS})
|
||||||
else (EXISTS ${CMAKE_SOURCE_DIR}/src/zipios++ AND NOT FREECAD_BUILD_DEBIAN)
|
endif ()
|
||||||
set(FreeCADBase_LIBS
|
|
||||||
${FreeCADBase_LIBS}
|
|
||||||
-lzipios
|
|
||||||
)
|
|
||||||
endif (EXISTS ${CMAKE_SOURCE_DIR}/src/zipios++ AND NOT FREECAD_BUILD_DEBIAN)
|
|
||||||
|
|
||||||
SET(pycxx_SRCS
|
SET(pycxx_SRCS
|
||||||
../CXX/Config.hxx
|
../CXX/Config.hxx
|
||||||
|
@ -157,6 +152,7 @@ SET(FreeCADBase_XML_SRCS
|
||||||
SOURCE_GROUP("XML" FILES ${FreeCADBase_XML_SRCS})
|
SOURCE_GROUP("XML" FILES ${FreeCADBase_XML_SRCS})
|
||||||
|
|
||||||
set(FreeCADBase_MOC_HDRS
|
set(FreeCADBase_MOC_HDRS
|
||||||
|
Debugger.h
|
||||||
FutureWatcherProgress.h
|
FutureWatcherProgress.h
|
||||||
)
|
)
|
||||||
fc_wrap_cpp(FreeCADBase_MOC_SRCS ${FreeCADBase_MOC_HDRS})
|
fc_wrap_cpp(FreeCADBase_MOC_SRCS ${FreeCADBase_MOC_HDRS})
|
||||||
|
@ -187,6 +183,7 @@ SET(FreeCADBase_CPP_SRCS
|
||||||
BoundBoxPyImp.cpp
|
BoundBoxPyImp.cpp
|
||||||
Builder3D.cpp
|
Builder3D.cpp
|
||||||
Console.cpp
|
Console.cpp
|
||||||
|
Debugger.cpp
|
||||||
Exception.cpp
|
Exception.cpp
|
||||||
Factory.cpp
|
Factory.cpp
|
||||||
FileInfo.cpp
|
FileInfo.cpp
|
||||||
|
@ -239,6 +236,7 @@ SET(FreeCADBase_HPP_SRCS
|
||||||
BoundBox.h
|
BoundBox.h
|
||||||
Builder3D.h
|
Builder3D.h
|
||||||
Console.h
|
Console.h
|
||||||
|
Debugger.h
|
||||||
Exception.h
|
Exception.h
|
||||||
Factory.h
|
Factory.h
|
||||||
FileInfo.h
|
FileInfo.h
|
||||||
|
@ -281,7 +279,6 @@ SET(FreeCADBase_HPP_SRCS
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(FreeCADBase_SRCS
|
SET(FreeCADBase_SRCS
|
||||||
${zipios_SRCS}
|
|
||||||
${pycxx_SRCS}
|
${pycxx_SRCS}
|
||||||
${FreeCADBase_CPP_SRCS}
|
${FreeCADBase_CPP_SRCS}
|
||||||
${FreeCADBase_HPP_SRCS}
|
${FreeCADBase_HPP_SRCS}
|
||||||
|
@ -293,6 +290,27 @@ SET(FreeCADBase_SRCS
|
||||||
PreCompiled.h
|
PreCompiled.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Use external zipios++ if specified.
|
||||||
|
if(FREECAD_USE_EXTERNAL_ZIPIOS)
|
||||||
|
find_library(ZIPIOS_LIBRARY zipios)
|
||||||
|
find_path(ZIPIOS_INCLUDES zipios++/zipios-config.h)
|
||||||
|
if(ZIPIOS_LIBRARY)
|
||||||
|
message(STATUS "Found zipios++: ${ZIPIOS}")
|
||||||
|
endif()
|
||||||
|
if(ZIPIOS_INCLUDES)
|
||||||
|
message(STATUS "Found zipios++ headers.")
|
||||||
|
endif()
|
||||||
|
if(ZIPIOS_LIBRARY AND ZIPIOS_INCLUDES)
|
||||||
|
list(APPEND FreeCADBase_LIBS ${ZIPIOS_LIBRARY})
|
||||||
|
include_directories(${ZIPIOS_INCLUDES})
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Using external zipios++ was specified but was not found.")
|
||||||
|
endif()
|
||||||
|
else(FREECAD_USE_EXTERNAL_ZIPIOS)
|
||||||
|
list(APPEND FreeCADBase_SRCS ${zipios_SRCS})
|
||||||
|
endif(FREECAD_USE_EXTERNAL_ZIPIOS)
|
||||||
|
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions(-D_PreComp_)
|
add_definitions(-D_PreComp_)
|
||||||
ADD_MSVC_PRECOMPILED_HEADER("PreCompiled.h" "PreCompiled.cpp" FreeCADBase_CPP_SRCS)
|
ADD_MSVC_PRECOMPILED_HEADER("PreCompiled.h" "PreCompiled.cpp" FreeCADBase_CPP_SRCS)
|
||||||
|
|
80
src/Base/Debugger.cpp
Normal file
80
src/Base/Debugger.cpp
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (c) 2012 Werner Mayer <wmayer[at]users.sourceforge.net> *
|
||||||
|
* *
|
||||||
|
* This file is part of the FreeCAD CAx development system. *
|
||||||
|
* *
|
||||||
|
* This library is free software; you can redistribute it and/or *
|
||||||
|
* modify it under the terms of the GNU Library General Public *
|
||||||
|
* License as published by the Free Software Foundation; either *
|
||||||
|
* version 2 of the License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This library is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU Library General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU Library General Public *
|
||||||
|
* License along with this library; see the file COPYING.LIB. If not, *
|
||||||
|
* write to the Free Software Foundation, Inc., 51 Franklin Street, *
|
||||||
|
* Fifth Floor, Boston, MA 02110-1301, USA *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "PreCompiled.h"
|
||||||
|
#ifndef _PreComp_
|
||||||
|
# include <QCoreApplication>
|
||||||
|
# include <QEvent>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Debugger.h"
|
||||||
|
#include "Console.h"
|
||||||
|
|
||||||
|
using namespace Base;
|
||||||
|
|
||||||
|
Debugger::Debugger(QObject* parent)
|
||||||
|
: QObject(parent), isAttached(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Debugger::~Debugger()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Debugger::attach()
|
||||||
|
{
|
||||||
|
QCoreApplication::instance()->installEventFilter(this);
|
||||||
|
isAttached = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Debugger::detach()
|
||||||
|
{
|
||||||
|
QCoreApplication::instance()->removeEventFilter(this);
|
||||||
|
isAttached = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Debugger::eventFilter(QObject*, QEvent* event)
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::KeyPress) {
|
||||||
|
if (loop.isRunning()) {
|
||||||
|
loop.quit();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Debugger::exec()
|
||||||
|
{
|
||||||
|
if (isAttached)
|
||||||
|
Base::Console().Message("TO CONTINUE PRESS ANY KEY...\n");
|
||||||
|
return loop.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Debugger::quit()
|
||||||
|
{
|
||||||
|
loop.quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "moc_Debugger.cpp"
|
76
src/Base/Debugger.h
Normal file
76
src/Base/Debugger.h
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (c) 2012 Werner Mayer <wmayer[at]users.sourceforge.net> *
|
||||||
|
* *
|
||||||
|
* This file is part of the FreeCAD CAx development system. *
|
||||||
|
* *
|
||||||
|
* This library is free software; you can redistribute it and/or *
|
||||||
|
* modify it under the terms of the GNU Library General Public *
|
||||||
|
* License as published by the Free Software Foundation; either *
|
||||||
|
* version 2 of the License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This library is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU Library General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU Library General Public *
|
||||||
|
* License along with this library; see the file COPYING.LIB. If not, *
|
||||||
|
* write to the Free Software Foundation, Inc., 51 Franklin Street, *
|
||||||
|
* Fifth Floor, Boston, MA 02110-1301, USA *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef BASE_DEBUGGER_H
|
||||||
|
#define BASE_DEBUGGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QEventLoop>
|
||||||
|
|
||||||
|
namespace Base {
|
||||||
|
/**
|
||||||
|
This is a utility class to break the application at a point to inspect e.g. the result of
|
||||||
|
an algorithm.
|
||||||
|
You usually use it like this
|
||||||
|
\code
|
||||||
|
...
|
||||||
|
Base::Debugger dbg;
|
||||||
|
dbg.attach();
|
||||||
|
dbg.exec();
|
||||||
|
...
|
||||||
|
\endcode
|
||||||
|
Or you can connect it with a button and let the user click it in order to continue.
|
||||||
|
\code
|
||||||
|
QPushButton* btn = new QPushButton();
|
||||||
|
btn->setText("Continue");
|
||||||
|
btn->show();
|
||||||
|
Base::Debugger dbg;
|
||||||
|
connect(btn, SIGNAL(clicked()), &dbg, SLOT(quit()));
|
||||||
|
dbg.exec();
|
||||||
|
\endcode
|
||||||
|
\author Werner Mayer
|
||||||
|
*/
|
||||||
|
class BaseExport Debugger : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
Debugger(QObject* parent=0);
|
||||||
|
~Debugger();
|
||||||
|
|
||||||
|
void attach();
|
||||||
|
void detach();
|
||||||
|
bool eventFilter(QObject*, QEvent*);
|
||||||
|
int exec();
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void quit();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isAttached;
|
||||||
|
QEventLoop loop;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // BASE_DEBUGGER_H
|
|
@ -202,6 +202,40 @@ AbnormalProgramTermination::AbnormalProgramTermination(const AbnormalProgramTerm
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
|
UnknownProgramOption::UnknownProgramOption(const char * sMessage)
|
||||||
|
: Exception(sMessage)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UnknownProgramOption::UnknownProgramOption(const std::string& sMessage)
|
||||||
|
: Exception(sMessage)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UnknownProgramOption::UnknownProgramOption(const UnknownProgramOption &inst)
|
||||||
|
: Exception(inst)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
|
ProgramInformation::ProgramInformation(const char * sMessage)
|
||||||
|
: Exception(sMessage)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgramInformation::ProgramInformation(const std::string& sMessage)
|
||||||
|
: Exception(sMessage)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ProgramInformation::ProgramInformation(const ProgramInformation &inst)
|
||||||
|
: Exception(inst)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined (FC_OS_LINUX)
|
#if defined(__GNUC__) && defined (FC_OS_LINUX)
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
|
@ -174,6 +174,38 @@ public:
|
||||||
virtual ~AbnormalProgramTermination() throw() {}
|
virtual ~AbnormalProgramTermination() throw() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The UnknownProgramOption can be used to indicate an unknown program option.
|
||||||
|
* @author Werner Mayer
|
||||||
|
*/
|
||||||
|
class BaseExport UnknownProgramOption : public Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Construction
|
||||||
|
UnknownProgramOption(const char * sMessage);
|
||||||
|
UnknownProgramOption(const std::string& sMessage);
|
||||||
|
/// Construction
|
||||||
|
UnknownProgramOption(const UnknownProgramOption &inst);
|
||||||
|
/// Destruction
|
||||||
|
virtual ~UnknownProgramOption() throw() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ProgramInformation can be used to show information about the program.
|
||||||
|
* @author Werner Mayer
|
||||||
|
*/
|
||||||
|
class BaseExport ProgramInformation : public Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Construction
|
||||||
|
ProgramInformation(const char * sMessage);
|
||||||
|
ProgramInformation(const std::string& sMessage);
|
||||||
|
/// Construction
|
||||||
|
ProgramInformation(const ProgramInformation &inst);
|
||||||
|
/// Destruction
|
||||||
|
virtual ~ProgramInformation() throw() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
inline void Exception::setMessage(const char * sMessage)
|
inline void Exception::setMessage(const char * sMessage)
|
||||||
{
|
{
|
||||||
|
|
|
@ -190,7 +190,6 @@ void InterpreterSingleton::runInteractiveString(const char *sCmd)
|
||||||
presult = PyRun_String(sCmd, Py_single_input, dict, dict); /* eval direct */
|
presult = PyRun_String(sCmd, Py_single_input, dict, dict); /* eval direct */
|
||||||
if (!presult) {
|
if (!presult) {
|
||||||
if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
|
if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
|
||||||
//systemExit();
|
|
||||||
throw SystemExitException();
|
throw SystemExitException();
|
||||||
}
|
}
|
||||||
/* get latest python exception information */
|
/* get latest python exception information */
|
||||||
|
|
|
@ -587,6 +587,16 @@ void Matrix_invert (Matrix a, Matrix inva)
|
||||||
Matrix_gauss(temp,inva);
|
Matrix_gauss(temp,inva);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Matrix4D::inverseOrthogonal(void)
|
||||||
|
{
|
||||||
|
Base::Vector3d c(dMtrx4D[0][3],dMtrx4D[1][3],dMtrx4D[2][3]);
|
||||||
|
transpose();
|
||||||
|
c = this->operator * (c);
|
||||||
|
dMtrx4D[0][3] = -c.x; dMtrx4D[3][0] = 0;
|
||||||
|
dMtrx4D[1][3] = -c.y; dMtrx4D[3][1] = 0;
|
||||||
|
dMtrx4D[2][3] = -c.z; dMtrx4D[3][2] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void Matrix4D::inverseGauss (void)
|
void Matrix4D::inverseGauss (void)
|
||||||
{
|
{
|
||||||
double matrix [16];
|
double matrix [16];
|
||||||
|
@ -691,3 +701,98 @@ void Matrix4D::fromString(const std::string &str)
|
||||||
input >> dMtrx4D[i][j];
|
input >> dMtrx4D[i][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Analyse the a transformation Matrix and describe the transformation
|
||||||
|
std::string Matrix4D::analyse(void) const
|
||||||
|
{
|
||||||
|
const double eps=1.0e-06;
|
||||||
|
bool hastranslation = (dMtrx4D[0][3] != 0.0 ||
|
||||||
|
dMtrx4D[1][3] != 0.0 || dMtrx4D[2][3] != 0.0);
|
||||||
|
const Base::Matrix4D unityMatrix = Base::Matrix4D();
|
||||||
|
std::string text;
|
||||||
|
if (*this == unityMatrix)
|
||||||
|
{
|
||||||
|
text = "Unity Matrix";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (dMtrx4D[3][0] != 0.0 || dMtrx4D[3][1] != 0.0 ||
|
||||||
|
dMtrx4D[3][2] != 0.0 || dMtrx4D[3][3] != 1.0)
|
||||||
|
{
|
||||||
|
text = "Projection";
|
||||||
|
}
|
||||||
|
else //translation and affine
|
||||||
|
{
|
||||||
|
if (dMtrx4D[0][1] == 0.0 && dMtrx4D[0][2] == 0.0 &&
|
||||||
|
dMtrx4D[1][0] == 0.0 && dMtrx4D[1][2] == 0.0 &&
|
||||||
|
dMtrx4D[2][0] == 0.0 && dMtrx4D[2][1] == 0.0) //scaling
|
||||||
|
{
|
||||||
|
std::ostringstream stringStream;
|
||||||
|
stringStream << "Scale [" << dMtrx4D[0][0] << ", " <<
|
||||||
|
dMtrx4D[1][1] << ", " << dMtrx4D[2][2] << "]";
|
||||||
|
text = stringStream.str();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Base::Matrix4D sub;
|
||||||
|
sub[0][0] = dMtrx4D[0][0]; sub[0][1] = dMtrx4D[0][1];
|
||||||
|
sub[0][2] = dMtrx4D[0][2]; sub[1][0] = dMtrx4D[1][0];
|
||||||
|
sub[1][1] = dMtrx4D[1][1]; sub[1][2] = dMtrx4D[1][2];
|
||||||
|
sub[2][0] = dMtrx4D[2][0]; sub[2][1] = dMtrx4D[2][1];
|
||||||
|
sub[2][2] = dMtrx4D[2][2];
|
||||||
|
|
||||||
|
Base::Matrix4D trp = sub;
|
||||||
|
trp.transpose();
|
||||||
|
trp = trp * sub;
|
||||||
|
bool ortho = true;
|
||||||
|
for (int i=0; i<4 && ortho; i++) {
|
||||||
|
for (int j=0; j<4 && ortho; j++) {
|
||||||
|
if (i != j) {
|
||||||
|
if (fabs(trp[i][j]) > eps) {
|
||||||
|
ortho = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double determinant = sub.determinant();
|
||||||
|
if (ortho)
|
||||||
|
{
|
||||||
|
if (fabs(determinant-1.0)<eps ) //rotation
|
||||||
|
{
|
||||||
|
text = "Rotation Matrix";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (fabs(determinant+1.0)<eps ) //rotation
|
||||||
|
{
|
||||||
|
text = "Rotinversion Matrix";
|
||||||
|
}
|
||||||
|
else //scaling with rotation
|
||||||
|
{
|
||||||
|
std::ostringstream stringStream;
|
||||||
|
stringStream << "Scale and Rotate ";
|
||||||
|
if (determinant<0.0 )
|
||||||
|
stringStream << "and Invert ";
|
||||||
|
stringStream << "[ " <<
|
||||||
|
sqrt(trp[0][0]) << ", " << sqrt(trp[1][1]) << ", " <<
|
||||||
|
sqrt(trp[2][2]) << "]";
|
||||||
|
text = stringStream.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::ostringstream stringStream;
|
||||||
|
stringStream << "Affine with det= " <<
|
||||||
|
determinant;
|
||||||
|
text = stringStream.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hastranslation)
|
||||||
|
text += " with Translation";
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
|
@ -88,6 +88,8 @@ public:
|
||||||
inline const double* operator[] (unsigned short usNdx) const;
|
inline const double* operator[] (unsigned short usNdx) const;
|
||||||
/// Compute the determinant of the matrix
|
/// Compute the determinant of the matrix
|
||||||
double determinant() const;
|
double determinant() const;
|
||||||
|
/// Analyse the transformation
|
||||||
|
std::string analyse(void) const;
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
void getMatrix (double dMtrx[16]) const;
|
void getMatrix (double dMtrx[16]) const;
|
||||||
|
@ -133,6 +135,8 @@ public:
|
||||||
void transform (const Vector3f& rclVct, const Matrix4D& rclMtrx);
|
void transform (const Vector3f& rclVct, const Matrix4D& rclMtrx);
|
||||||
void transform (const Vector3d& rclVct, const Matrix4D& rclMtrx);
|
void transform (const Vector3d& rclVct, const Matrix4D& rclMtrx);
|
||||||
void inverse (void);
|
void inverse (void);
|
||||||
|
/// if matrix is orthogonal a special way of getting the inverse is used
|
||||||
|
void inverseOrthogonal(void);
|
||||||
void inverseGauss (void);
|
void inverseGauss (void);
|
||||||
void transpose (void);
|
void transpose (void);
|
||||||
//@}
|
//@}
|
||||||
|
|
|
@ -125,6 +125,14 @@ Get the sub-matrix. The parameter must be in the range [1,4].
|
||||||
</UserDocu>
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="analyze">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>
|
||||||
|
analyze() -> string
|
||||||
|
Analyzes the type of transformation.
|
||||||
|
</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Attribute Name="A11" ReadOnly="false">
|
<Attribute Name="A11" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>The matrix elements</UserDocu>
|
<UserDocu>The matrix elements</UserDocu>
|
||||||
|
|
|
@ -474,6 +474,18 @@ PyObject* MatrixPy::transpose(PyObject * args)
|
||||||
PY_CATCH;
|
PY_CATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* MatrixPy::analyze(PyObject * args)
|
||||||
|
{
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
PY_TRY {
|
||||||
|
std::string type = getMatrixPtr()->analyse();
|
||||||
|
return PyString_FromString(type.c_str());
|
||||||
|
}
|
||||||
|
PY_CATCH;
|
||||||
|
}
|
||||||
|
|
||||||
Py::Float MatrixPy::getA11(void) const
|
Py::Float MatrixPy::getA11(void) const
|
||||||
{
|
{
|
||||||
double val = (*this->getMatrixPtr())[0][0];
|
double val = (*this->getMatrixPtr())[0][0];
|
||||||
|
|
|
@ -75,6 +75,14 @@ Placement(Base, Axis, Angle) -- define position and rotation
|
||||||
</UserDocu>
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="isNull">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>
|
||||||
|
isNull() -> Bool
|
||||||
|
returns True if the placement has no displacement and no rotation
|
||||||
|
</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Attribute Name="Base" ReadOnly="false">
|
<Attribute Name="Base" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Vector to the Base Position of the Placement</UserDocu>
|
<UserDocu>Vector to the Base Position of the Placement</UserDocu>
|
||||||
|
|
|
@ -169,6 +169,19 @@ PyObject* PlacementPy::inverse(PyObject * args)
|
||||||
return new PlacementPy(new Placement(p));
|
return new PlacementPy(new Placement(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* PlacementPy::isNull(PyObject *args)
|
||||||
|
{
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
Base::Vector3d pos = getPlacementPtr()->getPosition();
|
||||||
|
Base::Rotation rot = getPlacementPtr()->getRotation();
|
||||||
|
Base::Vector3d nullvec(0,0,0);
|
||||||
|
Base::Rotation nullrot(0,0,0,1);
|
||||||
|
Base::Rotation nullrotinv(0,0,0,-1);
|
||||||
|
bool null = (pos == nullvec) & ((rot == nullrot) | (rot == nullrotinv));
|
||||||
|
return Py_BuildValue("O", (null ? Py_True : Py_False));
|
||||||
|
}
|
||||||
|
|
||||||
Py::Object PlacementPy::getBase(void) const
|
Py::Object PlacementPy::getBase(void) const
|
||||||
{
|
{
|
||||||
return Py::Vector(getPlacementPtr()->getPosition());
|
return Py::Vector(getPlacementPtr()->getPosition());
|
||||||
|
|
|
@ -105,6 +105,8 @@
|
||||||
// QtCore
|
// QtCore
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QEvent>
|
||||||
#include <QIODevice>
|
#include <QIODevice>
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QWriteLocker>
|
#include <QWriteLocker>
|
||||||
|
|
|
@ -377,8 +377,10 @@ const char *PP_Init(const char *modname) {
|
||||||
//#ifdef FC_OS_LINUX /* cannot convert `const char *' to `char *' in assignment */
|
//#ifdef FC_OS_LINUX /* cannot convert `const char *' to `char *' in assignment */
|
||||||
if (modname!=NULL) return modname;
|
if (modname!=NULL) return modname;
|
||||||
{ /* we assume here that the caller frees allocated memory */
|
{ /* we assume here that the caller frees allocated memory */
|
||||||
char* __main__=(char *)malloc(sizeof("__main__"));
|
// #0000716: strange assignment and a memory leak
|
||||||
return __main__="__main__";
|
return "__main__";
|
||||||
|
//char* __main__=(char *)malloc(sizeof("__main__"));
|
||||||
|
//return __main__="__main__";
|
||||||
}
|
}
|
||||||
//#else
|
//#else
|
||||||
// return modname == NULL ? "__main__" : modname; /* default to '__main__' */
|
// return modname == NULL ? "__main__" : modname; /* default to '__main__' */
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
/// Here the FreeCAD includes sorted by Base,App,Gui......
|
/// Here the FreeCAD includes sorted by Base,App,Gui......
|
||||||
#include "Reader.h"
|
#include "Reader.h"
|
||||||
|
#include "Base64.h"
|
||||||
#include "Exception.h"
|
#include "Exception.h"
|
||||||
#include "Persistence.h"
|
#include "Persistence.h"
|
||||||
#include "InputSource.h"
|
#include "InputSource.h"
|
||||||
|
@ -79,6 +80,7 @@ Base::XMLReader::XMLReader(const char* FileName, std::istream& str)
|
||||||
//parser->setFeature(XMLUni::fgXercesDynamic, true);
|
//parser->setFeature(XMLUni::fgXercesDynamic, true);
|
||||||
|
|
||||||
parser->setContentHandler(this);
|
parser->setContentHandler(this);
|
||||||
|
parser->setLexicalHandler(this);
|
||||||
parser->setErrorHandler(this);
|
parser->setErrorHandler(this);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -127,7 +129,7 @@ long Base::XMLReader::getAttributeAsInteger(const char* AttrName) const
|
||||||
if (pos != AttrMap.end())
|
if (pos != AttrMap.end())
|
||||||
return atol(pos->second.c_str());
|
return atol(pos->second.c_str());
|
||||||
else
|
else
|
||||||
// wrong name, use hasAttribute if not shure!
|
// wrong name, use hasAttribute if not sure!
|
||||||
assert(0);
|
assert(0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -140,7 +142,7 @@ unsigned long Base::XMLReader::getAttributeAsUnsigned(const char* AttrName) cons
|
||||||
if (pos != AttrMap.end())
|
if (pos != AttrMap.end())
|
||||||
return strtoul(pos->second.c_str(),0,10);
|
return strtoul(pos->second.c_str(),0,10);
|
||||||
else
|
else
|
||||||
// wrong name, use hasAttribute if not shure!
|
// wrong name, use hasAttribute if not sure!
|
||||||
assert(0);
|
assert(0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -153,7 +155,7 @@ double Base::XMLReader::getAttributeAsFloat (const char* AttrName) const
|
||||||
if (pos != AttrMap.end())
|
if (pos != AttrMap.end())
|
||||||
return atof(pos->second.c_str());
|
return atof(pos->second.c_str());
|
||||||
else
|
else
|
||||||
// wrong name, use hasAttribute if not shure!
|
// wrong name, use hasAttribute if not sure!
|
||||||
assert(0);
|
assert(0);
|
||||||
|
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
@ -166,7 +168,7 @@ const char* Base::XMLReader::getAttribute (const char* AttrName) const
|
||||||
if (pos != AttrMap.end())
|
if (pos != AttrMap.end())
|
||||||
return pos->second.c_str();
|
return pos->second.c_str();
|
||||||
else
|
else
|
||||||
// wrong name, use hasAttribute if not shure!
|
// wrong name, use hasAttribute if not sure!
|
||||||
assert(0);
|
assert(0);
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
@ -255,6 +257,22 @@ void Base::XMLReader::readCharacters(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Base::XMLReader::readBinFile(const char* filename)
|
||||||
|
{
|
||||||
|
Base::FileInfo fi(filename);
|
||||||
|
Base::ofstream to(fi, std::ios::out | std::ios::binary);
|
||||||
|
if (!to)
|
||||||
|
throw Base::Exception("XMLReader::readBinFile() Could not open file!");
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
do {
|
||||||
|
ok = read(); if (!ok) break;
|
||||||
|
} while (ReadType != EndCDATA);
|
||||||
|
|
||||||
|
to << Base::base64_decode(Characters);
|
||||||
|
to.close();
|
||||||
|
}
|
||||||
|
|
||||||
void Base::XMLReader::readFiles(zipios::ZipInputStream &zipstream) const
|
void Base::XMLReader::readFiles(zipios::ZipInputStream &zipstream) const
|
||||||
{
|
{
|
||||||
// It's possible that not all objects inside the document could be created, e.g. if a module
|
// It's possible that not all objects inside the document could be created, e.g. if a module
|
||||||
|
@ -370,15 +388,32 @@ void Base::XMLReader::endElement (const XMLCh* const /*uri*/, const XMLCh *cons
|
||||||
ReadType = EndElement;
|
ReadType = EndElement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Base::XMLReader::startCDATA ()
|
||||||
|
{
|
||||||
|
ReadType = StartCDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Base::XMLReader::endCDATA ()
|
||||||
|
{
|
||||||
|
ReadType = EndCDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (XERCES_VERSION_MAJOR == 2)
|
||||||
void Base::XMLReader::characters(const XMLCh* const chars, const unsigned int length)
|
void Base::XMLReader::characters(const XMLCh* const chars, const unsigned int length)
|
||||||
|
#else
|
||||||
|
void Base::XMLReader::characters(const XMLCh* const chars, const XMLSize_t length)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
Characters = StrX(chars).c_str();
|
Characters = StrX(chars).c_str();
|
||||||
ReadType = Chars;
|
ReadType = Chars;
|
||||||
CharacterCount += length;
|
CharacterCount += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (XERCES_VERSION_MAJOR == 2)
|
||||||
void Base::XMLReader::ignorableWhitespace( const XMLCh* const /*chars*/, const unsigned int /*length*/)
|
void Base::XMLReader::ignorableWhitespace( const XMLCh* const /*chars*/, const unsigned int /*length*/)
|
||||||
|
#else
|
||||||
|
void Base::XMLReader::ignorableWhitespace( const XMLCh* const /*chars*/, const XMLSize_t /*length*/)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
//fSpaceCount += length;
|
//fSpaceCount += length;
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,8 @@ public:
|
||||||
void readEndElement(const char* ElementName=0);
|
void readEndElement(const char* ElementName=0);
|
||||||
/// read until characters are found
|
/// read until characters are found
|
||||||
void readCharacters(void);
|
void readCharacters(void);
|
||||||
|
/// read binary file
|
||||||
|
void readBinFile(const char*);
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/** @name Attribute handling */
|
/** @name Attribute handling */
|
||||||
|
@ -171,8 +173,15 @@ protected:
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
virtual void startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const XERCES_CPP_NAMESPACE_QUALIFIER Attributes& attrs);
|
virtual void startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const XERCES_CPP_NAMESPACE_QUALIFIER Attributes& attrs);
|
||||||
virtual void endElement (const XMLCh* const uri, const XMLCh *const localname, const XMLCh *const qname);
|
virtual void endElement (const XMLCh* const uri, const XMLCh *const localname, const XMLCh *const qname);
|
||||||
virtual void characters (const XMLCh* const chars, const unsigned int length);
|
virtual void startCDATA ();
|
||||||
|
virtual void endCDATA ();
|
||||||
|
#if (XERCES_VERSION_MAJOR == 2)
|
||||||
|
virtual void characters (const XMLCh* const chars, const unsigned int length);
|
||||||
virtual void ignorableWhitespace(const XMLCh* const chars, const unsigned int length);
|
virtual void ignorableWhitespace(const XMLCh* const chars, const unsigned int length);
|
||||||
|
#else
|
||||||
|
virtual void characters (const XMLCh* const chars, const XMLSize_t length);
|
||||||
|
virtual void ignorableWhitespace(const XMLCh* const chars, const XMLSize_t length);
|
||||||
|
#endif
|
||||||
virtual void resetDocument();
|
virtual void resetDocument();
|
||||||
|
|
||||||
|
|
||||||
|
@ -198,7 +207,9 @@ protected:
|
||||||
Chars,
|
Chars,
|
||||||
StartElement,
|
StartElement,
|
||||||
StartEndElement,
|
StartEndElement,
|
||||||
EndElement
|
EndElement,
|
||||||
|
StartCDATA,
|
||||||
|
EndCDATA
|
||||||
} ReadType;
|
} ReadType;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,14 @@
|
||||||
</UserDocu>
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="isNull">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>
|
||||||
|
isNull() -> Bool
|
||||||
|
returns True if the rotation equals the unity matrix
|
||||||
|
</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Attribute Name="Q" ReadOnly="false">
|
<Attribute Name="Q" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>The rotation elements (as quaternion)</UserDocu>
|
<UserDocu>The rotation elements (as quaternion)</UserDocu>
|
||||||
|
|
|
@ -144,6 +144,17 @@ PyObject* RotationPy::toEuler(PyObject * args)
|
||||||
return Py::new_reference_to(tuple);
|
return Py::new_reference_to(tuple);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* RotationPy::isNull(PyObject *args)
|
||||||
|
{
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
Base::Rotation rot = * getRotationPtr();
|
||||||
|
Base::Rotation nullrot(0,0,0,1);
|
||||||
|
Base::Rotation nullrotinv(0,0,0,-1);
|
||||||
|
bool null = (rot == nullrot) | (rot == nullrotinv);
|
||||||
|
return Py_BuildValue("O", (null ? Py_True : Py_False));
|
||||||
|
}
|
||||||
|
|
||||||
Py::Tuple RotationPy::getQ(void) const
|
Py::Tuple RotationPy::getQ(void) const
|
||||||
{
|
{
|
||||||
double q0, q1, q2, q3;
|
double q0, q1, q2, q3;
|
||||||
|
|
|
@ -85,6 +85,7 @@ UnitsSchema *UnitsApi::UserPrefSystem = new UnitsSchemaInternal();
|
||||||
|
|
||||||
double UnitsApi::UserPrefFactor [50];
|
double UnitsApi::UserPrefFactor [50];
|
||||||
QString UnitsApi::UserPrefUnit [50];
|
QString UnitsApi::UserPrefUnit [50];
|
||||||
|
int UnitsApi::UserPrefDecimals = 2;
|
||||||
|
|
||||||
UnitsApi::UnitsApi(const char* filter)
|
UnitsApi::UnitsApi(const char* filter)
|
||||||
{
|
{
|
||||||
|
@ -196,6 +197,16 @@ const double UnitsApi::getPrefFactorOf(QuantityType t)
|
||||||
return UserPrefFactor[t];
|
return UserPrefFactor[t];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UnitsApi::setDecimals(int prec)
|
||||||
|
{
|
||||||
|
UserPrefDecimals = prec;
|
||||||
|
}
|
||||||
|
|
||||||
|
int UnitsApi::getDecimals()
|
||||||
|
{
|
||||||
|
return UserPrefDecimals;
|
||||||
|
}
|
||||||
|
|
||||||
void UnitsApi::setDefaults(void)
|
void UnitsApi::setDefaults(void)
|
||||||
{
|
{
|
||||||
setPrefOf( Length ,"mm" );
|
setPrefOf( Length ,"mm" );
|
||||||
|
|
|
@ -101,6 +101,10 @@ public:
|
||||||
static const QString getQuantityName(QuantityType t);
|
static const QString getQuantityName(QuantityType t);
|
||||||
/// get the translation factor for the default unit of a quantity
|
/// get the translation factor for the default unit of a quantity
|
||||||
static const double getPrefFactorOf(QuantityType t);
|
static const double getPrefFactorOf(QuantityType t);
|
||||||
|
// set the number of decimals
|
||||||
|
static void setDecimals(int);
|
||||||
|
// fet the number of decimals
|
||||||
|
static int getDecimals();
|
||||||
/// set the application defaults
|
/// set the application defaults
|
||||||
static void setDefaults(void);
|
static void setDefaults(void);
|
||||||
//@}
|
//@}
|
||||||
|
@ -119,6 +123,8 @@ protected:
|
||||||
static double UserPrefFactor [50] ;
|
static double UserPrefFactor [50] ;
|
||||||
/// name of the unit the user wants to use as quantities
|
/// name of the unit the user wants to use as quantities
|
||||||
static QString UserPrefUnit [50] ;
|
static QString UserPrefUnit [50] ;
|
||||||
|
/// number of decimals for floats
|
||||||
|
static int UserPrefDecimals;
|
||||||
|
|
||||||
// do the real work
|
// do the real work
|
||||||
static double parse(const char*,bool &UsedUnit);
|
static double parse(const char*,bool &UsedUnit);
|
||||||
|
|
|
@ -20,90 +20,127 @@
|
||||||
</Documentation>
|
</Documentation>
|
||||||
<Methode Name="add" Const="true">
|
<Methode Name="add" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>add(Vector) - return the sum of the two vectors</UserDocu>
|
<UserDocu>add(Vector)
|
||||||
|
returns the sum of this and another vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="sub" Const="true">
|
<Methode Name="sub" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>sub(Vector) - return the difference of the two vectors</UserDocu>
|
<UserDocu>sub(Vector)
|
||||||
|
returns the difference of this and another vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="scale">
|
<Methode Name="scale">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>scale(Float,Float,Float) - scale (multiplies) this vector by a factor</UserDocu>
|
<UserDocu>scale(Float,Float,Float)
|
||||||
|
scales (multiplies) this vector by a factor
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="multiply">
|
<Methode Name="multiply">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>multiply(Float) - multiplies (scales) this vector by a single factor</UserDocu>
|
<UserDocu>multiply(Float)
|
||||||
|
multiplies (scales) this vector by a single factor
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="dot" Const="true">
|
<Methode Name="dot" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>dot(Vector) - return the dot product of the two vectors</UserDocu>
|
<UserDocu>dot(Vector)
|
||||||
|
returns the dot product of the this vector with another one
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="cross" Const="true">
|
<Methode Name="cross" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>cross(Vector) - return the cross product of the two vectors</UserDocu>
|
<UserDocu>cross(Vector)
|
||||||
|
returns the cross product between this and another vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="getAngle" Const="true">
|
<Methode Name="getAngle" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>getAngle(Vector) - return the angle in radians between the two vectors</UserDocu>
|
<UserDocu>getAngle(Vector)
|
||||||
|
returns the angle in radians between this and another vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="normalize">
|
<Methode Name="normalize">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Normalize the vector to the length of 1.0</UserDocu>
|
<UserDocu>normalize()
|
||||||
|
normalizes the vector to the length of 1.0
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="projectToLine">
|
<Methode Name="projectToLine">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Deliver the projection point to a given line</UserDocu>
|
<UserDocu>projectToLine(Vector,Vector)
|
||||||
|
projects the vector on a line defined by a base point and a direction
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="projectToPlane">
|
<Methode Name="projectToPlane">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Deliver the projection point to a given plane</UserDocu>
|
<UserDocu>projectToPlane(Vector,Vector)
|
||||||
|
projects the vector on a plane defined by a base point and a normal
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="distanceToLine" Const="true">
|
<Methode Name="distanceToLine" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Deliver the distance of the point to a given line</UserDocu>
|
<UserDocu>distanceToLine(Vector,Vector)
|
||||||
|
returns the distance between this vector and a line defined by
|
||||||
|
a base point and a direction
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="distanceToLineSegment" Const="true">
|
<Methode Name="distanceToLineSegment" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Deliver the distance of the point to a given line segment</UserDocu>
|
<UserDocu>distanceToLineSegment(Vector,Vector)
|
||||||
|
returns the distance between this vector and a line segment defined by
|
||||||
|
a base point and a direction
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Methode Name="distanceToPlane" Const="true">
|
<Methode Name="distanceToPlane" Const="true">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Deliver the distance of the point to a given plane</UserDocu>
|
<UserDocu>distanceToPlane(Vector,Vector)
|
||||||
|
returns the distance between this vector and a plane defined by
|
||||||
|
a base point and a normal
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
<Attribute Name="Length" ReadOnly="false">
|
<Attribute Name="Length" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>To read or modifiy the length of the vector</UserDocu>
|
<UserDocu>Length([Float]) -> Float
|
||||||
|
gets or sets the length of this vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
<Parameter Name="Type" Type="Float" />
|
<Parameter Name="Type" Type="Float" />
|
||||||
</Attribute>
|
</Attribute>
|
||||||
<Attribute Name="x" ReadOnly="false">
|
<Attribute Name="x" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>The X component of the vector</UserDocu>
|
<UserDocu>x([Float]) -> Float
|
||||||
|
gets or sets the X component of this vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
<Parameter Name="x" Type="Float"/>
|
<Parameter Name="x" Type="Float"/>
|
||||||
</Attribute>
|
</Attribute>
|
||||||
<Attribute Name="y" ReadOnly="false">
|
<Attribute Name="y" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>The Y component of the vector</UserDocu>
|
<UserDocu>y([Float]) -> Float
|
||||||
|
gets or sets the Y component of this vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
<Parameter Name="y" Type="Float"/>
|
<Parameter Name="y" Type="Float"/>
|
||||||
</Attribute>
|
</Attribute>
|
||||||
<Attribute Name="z" ReadOnly="false">
|
<Attribute Name="z" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>The Z component of the vector</UserDocu>
|
<UserDocu>z([Float]) -> Float
|
||||||
|
gets or sets the Z component of this vector
|
||||||
|
</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
<Parameter Name="z" Type="Float"/>
|
<Parameter Name="z" Type="Float"/>
|
||||||
</Attribute>
|
</Attribute>
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "Exception.h"
|
#include "Exception.h"
|
||||||
#include "Base64.h"
|
#include "Base64.h"
|
||||||
#include "FileInfo.h"
|
#include "FileInfo.h"
|
||||||
|
#include "Stream.h"
|
||||||
#include "Tools.h"
|
#include "Tools.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -59,32 +60,31 @@ Writer::~Writer()
|
||||||
|
|
||||||
void Writer::insertAsciiFile(const char* FileName)
|
void Writer::insertAsciiFile(const char* FileName)
|
||||||
{
|
{
|
||||||
std::ifstream from(FileName);
|
Base::FileInfo fi(FileName);
|
||||||
if (!from) throw Base::Exception("Writer::insertAsciiFile() Could not open file!");
|
Base::ifstream from(fi);
|
||||||
|
if (!from)
|
||||||
|
throw Base::Exception("Writer::insertAsciiFile() Could not open file!");
|
||||||
|
|
||||||
Stream() << "<![CDATA[" << endl;
|
Stream() << "<![CDATA[";
|
||||||
char ch;
|
char ch;
|
||||||
while (from.get(ch)) Stream().put(ch);
|
while (from.get(ch))
|
||||||
Stream() << endl << "]]>" << endl;
|
Stream().put(ch);
|
||||||
|
Stream() << "]]>" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Writer::insertBinFile(const char* FileName)
|
void Writer::insertBinFile(const char* FileName)
|
||||||
{
|
{
|
||||||
std::ifstream from(FileName);
|
Base::FileInfo fi(FileName);
|
||||||
if (!from) throw Base::Exception("Writer::insertAsciiFile() Could not open file!");
|
Base::ifstream from(fi, std::ios::in | std::ios::binary | std::ios::ate);
|
||||||
|
if (!from)
|
||||||
Stream() << "<![CDATA[" << endl;
|
throw Base::Exception("Writer::insertAsciiFile() Could not open file!");
|
||||||
|
|
||||||
unsigned char buf[60];
|
|
||||||
std::string encoded;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
while (from){
|
|
||||||
for(i=0 ; i<60 && from;i++)
|
|
||||||
buf[i] = from.get();
|
|
||||||
Stream() << Base::base64_encode(buf,i) << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Stream() << "<![CDATA[";
|
||||||
|
std::ifstream::pos_type fileSize = from.tellg();
|
||||||
|
from.seekg(0, std::ios::beg);
|
||||||
|
std::vector<unsigned char> bytes(fileSize);
|
||||||
|
from.read((char*)&bytes[0], fileSize);
|
||||||
|
Stream() << Base::base64_encode(&bytes[0], fileSize);
|
||||||
Stream() << "]]>" << endl;
|
Stream() << "]]>" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,10 @@ if(FREECAD_BUILD_GUI)
|
||||||
configure_file(Doc/freecad.qch ${CMAKE_BINARY_DIR}/doc/freecad.qch COPYONLY)
|
configure_file(Doc/freecad.qch ${CMAKE_BINARY_DIR}/doc/freecad.qch COPYONLY)
|
||||||
endif(FREECAD_BUILD_GUI)
|
endif(FREECAD_BUILD_GUI)
|
||||||
|
|
||||||
|
if(FREECAD_BUILD_TEMPLATE)
|
||||||
|
add_subdirectory(Tools/_TEMPLATE_)
|
||||||
|
endif(FREECAD_BUILD_TEMPLATE)
|
||||||
|
|
||||||
if(FREECAD_MAINTAINERS_BUILD)
|
if(FREECAD_MAINTAINERS_BUILD)
|
||||||
add_subdirectory(Doc)
|
add_subdirectory(Doc)
|
||||||
endif(FREECAD_MAINTAINERS_BUILD)
|
endif(FREECAD_MAINTAINERS_BUILD)
|
||||||
|
|
|
@ -12,10 +12,15 @@ The Draft module offer several convenient functions to work with simple objects.
|
||||||
.. automodule:: DraftSnap
|
.. automodule:: DraftSnap
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
The draftlibs contain two submodules, widely used throughout the Draft module: fcvec, which contains useful methods for dealing with vectors, and fcgeo, which offers many tools for working with Part shape objects.
|
The Draft module also contains two submodules, widely used throughout the Draft and Arch modules: DraftVecUtils, which contains useful methods for dealing with vectors, and DraftGeomUtils, which offers many tools for working with OpenCascade geometry.
|
||||||
|
|
||||||
.. automodule:: draftlibs.fcvec
|
.. automodule:: DraftVecUtils
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. automodule:: draftlibs.fcgeo
|
.. automodule:: DraftGeomUtils
|
||||||
|
:members:
|
||||||
|
|
||||||
|
The Draft module also features a module that contains trackers, special objects made to display 3D temporary geometry in the 3D scene, that have no real existence in the FreeCAD document.
|
||||||
|
|
||||||
|
.. automodule:: DraftTrackers
|
||||||
:members:
|
:members:
|
718
src/Gui/3Dconnexion/GuiApplicationNativeEventAwareWin32.cpp
Normal file
718
src/Gui/3Dconnexion/GuiApplicationNativeEventAwareWin32.cpp
Normal file
|
@ -0,0 +1,718 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
Development tools and related technology provided under license from 3Dconnexion.
|
||||||
|
(c) 1992 - 2012 3Dconnexion. All rights reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Support for Qt added by David Dibben at
|
||||||
|
http://www.codegardening.com/2011/02/using-3dconnexion-mouse-with-qt.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
See also:
|
||||||
|
http://www.3dconnexion.com/forum/viewtopic.php?f=19&t=4968&sid=72c018bdcf0e6edc99a6effb5c0c48d9
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PreCompiled.h"
|
||||||
|
|
||||||
|
#include <QGlobalStatic>
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QWidget>
|
||||||
|
#include <FCConfig.h>
|
||||||
|
#include <Base/Console.h>
|
||||||
|
#include "GuiApplicationNativeEventAware.h"
|
||||||
|
#include "SpaceballEvent.h"
|
||||||
|
|
||||||
|
// Windows dependencies, enumerators and global variables
|
||||||
|
#ifdef _USE_3DCONNEXION_SDK
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define LOGITECH_VENDOR_ID 0x46d
|
||||||
|
#define _CONSTANT_INPUT_PERIOD 0
|
||||||
|
|
||||||
|
#ifndef RIDEV_DEVNOTIFY
|
||||||
|
#define RIDEV_DEVNOTIFY 0x00002000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _TRACE_WM_INPUT_PERIOD 0
|
||||||
|
#define _TRACE_RI_TYPE 0
|
||||||
|
#define _TRACE_RIDI_DEVICENAME 0
|
||||||
|
#define _TRACE_RIDI_DEVICEINFO 0
|
||||||
|
#define _TRACE_RI_RAWDATA 0
|
||||||
|
#define _TRACE_3DINPUT_PERIOD 0
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
typedef unsigned __int64 QWORD;
|
||||||
|
#endif // _WIN64
|
||||||
|
|
||||||
|
static const int kTimeToLive = 5;
|
||||||
|
|
||||||
|
enum e3dconnexion_pid {
|
||||||
|
eSpacePilot = 0xc625,
|
||||||
|
eSpaceNavigator = 0xc626,
|
||||||
|
eSpaceExplorer = 0xc627,
|
||||||
|
eSpaceNavigatorForNotebooks = 0xc628,
|
||||||
|
eSpacePilotPRO = 0xc629
|
||||||
|
};
|
||||||
|
|
||||||
|
enum e3dmouse_virtual_key
|
||||||
|
{
|
||||||
|
V3DK_INVALID=0
|
||||||
|
, V3DK_MENU=1, V3DK_FIT
|
||||||
|
, V3DK_TOP, V3DK_LEFT, V3DK_RIGHT, V3DK_FRONT, V3DK_BOTTOM, V3DK_BACK
|
||||||
|
, V3DK_CW, V3DK_CCW
|
||||||
|
, V3DK_ISO1, V3DK_ISO2
|
||||||
|
, V3DK_1, V3DK_2, V3DK_3, V3DK_4, V3DK_5, V3DK_6, V3DK_7, V3DK_8, V3DK_9, V3DK_10
|
||||||
|
, V3DK_ESC, V3DK_ALT, V3DK_SHIFT, V3DK_CTRL
|
||||||
|
, V3DK_ROTATE, V3DK_PANZOOM, V3DK_DOMINANT
|
||||||
|
, V3DK_PLUS, V3DK_MINUS
|
||||||
|
};
|
||||||
|
|
||||||
|
struct tag_VirtualKeys
|
||||||
|
{
|
||||||
|
e3dconnexion_pid pid;
|
||||||
|
size_t nKeys;
|
||||||
|
e3dmouse_virtual_key *vkeys;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const e3dmouse_virtual_key SpaceExplorerKeys [] =
|
||||||
|
{
|
||||||
|
V3DK_INVALID // there is no button 0
|
||||||
|
, V3DK_1, V3DK_2
|
||||||
|
, V3DK_TOP, V3DK_LEFT, V3DK_RIGHT, V3DK_FRONT
|
||||||
|
, V3DK_ESC, V3DK_ALT, V3DK_SHIFT, V3DK_CTRL
|
||||||
|
, V3DK_FIT, V3DK_MENU
|
||||||
|
, V3DK_PLUS, V3DK_MINUS
|
||||||
|
, V3DK_ROTATE
|
||||||
|
};
|
||||||
|
|
||||||
|
static const e3dmouse_virtual_key SpacePilotKeys [] =
|
||||||
|
{
|
||||||
|
V3DK_INVALID
|
||||||
|
, V3DK_1, V3DK_2, V3DK_3, V3DK_4, V3DK_5, V3DK_6
|
||||||
|
, V3DK_TOP, V3DK_LEFT, V3DK_RIGHT, V3DK_FRONT
|
||||||
|
, V3DK_ESC, V3DK_ALT, V3DK_SHIFT, V3DK_CTRL
|
||||||
|
, V3DK_FIT, V3DK_MENU
|
||||||
|
, V3DK_PLUS, V3DK_MINUS
|
||||||
|
, V3DK_DOMINANT, V3DK_ROTATE
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct tag_VirtualKeys _3dmouseVirtualKeys[]=
|
||||||
|
{
|
||||||
|
eSpacePilot
|
||||||
|
, sizeof(SpacePilotKeys)/sizeof(SpacePilotKeys[0])
|
||||||
|
, const_cast<e3dmouse_virtual_key *>(SpacePilotKeys),
|
||||||
|
eSpaceExplorer
|
||||||
|
, sizeof(SpaceExplorerKeys)/sizeof(SpaceExplorerKeys[0])
|
||||||
|
, const_cast<e3dmouse_virtual_key *>(SpaceExplorerKeys)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Methods for windows events
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Converts a hid device keycode (button identifier) of a pre-2009 3Dconnexion USB device to the standard 3d mouse virtual key definition.
|
||||||
|
|
||||||
|
\a pid USB Product ID (PID) of 3D mouse device
|
||||||
|
\a hidKeyCode Hid keycode as retrieved from a Raw Input packet
|
||||||
|
|
||||||
|
\return The standard 3d mouse virtual key (button identifier) or zero if an error occurs.
|
||||||
|
|
||||||
|
Converts a hid device keycode (button identifier) of a pre-2009 3Dconnexion USB device
|
||||||
|
to the standard 3d mouse virtual key definition.
|
||||||
|
*/
|
||||||
|
|
||||||
|
unsigned short HidToVirtualKey(unsigned long pid, unsigned short hidKeyCode)
|
||||||
|
{
|
||||||
|
unsigned short virtualkey=hidKeyCode;
|
||||||
|
for (size_t i=0; i<sizeof(_3dmouseVirtualKeys)/sizeof(_3dmouseVirtualKeys[0]); ++i)
|
||||||
|
{
|
||||||
|
if (pid == _3dmouseVirtualKeys[i].pid)
|
||||||
|
{
|
||||||
|
if (hidKeyCode < _3dmouseVirtualKeys[i].nKeys)
|
||||||
|
virtualkey = _3dmouseVirtualKeys[i].vkeys[hidKeyCode];
|
||||||
|
else
|
||||||
|
virtualkey = V3DK_INVALID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remaining devices are unchanged
|
||||||
|
return virtualkey;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Gui::GUIApplicationNativeEventAware::RawInputEventFilter(void* msg, long* result)
|
||||||
|
{
|
||||||
|
if (gMouseInput == 0) return false;
|
||||||
|
|
||||||
|
MSG* message = (MSG*)(msg);
|
||||||
|
|
||||||
|
if (message->message == WM_INPUT) {
|
||||||
|
HRAWINPUT hRawInput = reinterpret_cast<HRAWINPUT>(message->lParam);
|
||||||
|
gMouseInput->OnRawInput(RIM_INPUT,hRawInput);
|
||||||
|
if (result != 0) {
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Access the mouse parameters structure
|
||||||
|
*/
|
||||||
|
I3dMouseParam& Gui::GUIApplicationNativeEventAware::MouseParams()
|
||||||
|
{
|
||||||
|
return f3dMouseParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Access the mouse parameters structure
|
||||||
|
*/
|
||||||
|
const I3dMouseParam& Gui::GUIApplicationNativeEventAware::MouseParams() const
|
||||||
|
{
|
||||||
|
return f3dMouseParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Called with the processed motion data when a 3D mouse event is received
|
||||||
|
|
||||||
|
The default implementation emits a Move3d signal with the motion data
|
||||||
|
*/
|
||||||
|
void Gui::GUIApplicationNativeEventAware::Move3d(HANDLE device, std::vector<float>& motionData)
|
||||||
|
{
|
||||||
|
Q_UNUSED(device);
|
||||||
|
|
||||||
|
QWidget *currentWidget = this->focusWidget();
|
||||||
|
if (!currentWidget)
|
||||||
|
currentWidget = mainWindow;
|
||||||
|
|
||||||
|
int x, y, z, rx, ry, rz;
|
||||||
|
x = ceil(motionData[0])*(-1);
|
||||||
|
y = ceil(motionData[1]);
|
||||||
|
z = ceil(motionData[2]);
|
||||||
|
rx = ceil(motionData[3])*(-1);
|
||||||
|
ry = ceil(motionData[4]);
|
||||||
|
rz = ceil(motionData[5]);
|
||||||
|
|
||||||
|
Spaceball::MotionEvent *motionEvent = new Spaceball::MotionEvent();
|
||||||
|
motionEvent->setTranslations(x, y, z);
|
||||||
|
motionEvent->setRotations(rx, ry, rz);
|
||||||
|
this->postEvent(currentWidget, motionEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Called when a 3D mouse key is pressed
|
||||||
|
|
||||||
|
The default implementation emits a On3dmouseKeyDown signal with the key code.
|
||||||
|
*/
|
||||||
|
void Gui::GUIApplicationNativeEventAware::On3dmouseKeyDown(HANDLE device, int virtualKeyCode)
|
||||||
|
{
|
||||||
|
Q_UNUSED(device);
|
||||||
|
|
||||||
|
QWidget *currentWidget = this->focusWidget();
|
||||||
|
if (!currentWidget)
|
||||||
|
currentWidget = mainWindow;
|
||||||
|
|
||||||
|
Spaceball::ButtonEvent *buttonEvent = new Spaceball::ButtonEvent();
|
||||||
|
buttonEvent->setButtonNumber(virtualKeyCode - 1);
|
||||||
|
buttonEvent->setButtonStatus(Spaceball::BUTTON_PRESSED);
|
||||||
|
this->postEvent(currentWidget, buttonEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Called when a 3D mouse key is released
|
||||||
|
|
||||||
|
The default implementation emits a On3dmouseKeyUp signal with the key code.
|
||||||
|
*/
|
||||||
|
void Gui::GUIApplicationNativeEventAware::On3dmouseKeyUp(HANDLE device, int virtualKeyCode)
|
||||||
|
{
|
||||||
|
Q_UNUSED(device);
|
||||||
|
|
||||||
|
QWidget *currentWidget = this->focusWidget();
|
||||||
|
if (!currentWidget)
|
||||||
|
currentWidget = mainWindow;
|
||||||
|
|
||||||
|
Spaceball::ButtonEvent *buttonEvent = new Spaceball::ButtonEvent();
|
||||||
|
buttonEvent->setButtonNumber(virtualKeyCode - 1);
|
||||||
|
buttonEvent->setButtonStatus(Spaceball::BUTTON_RELEASED);
|
||||||
|
this->postEvent(currentWidget, buttonEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Get an initialized array of PRAWINPUTDEVICE for the 3D devices
|
||||||
|
|
||||||
|
pNumDevices returns the number of devices to register. Currently this is always 1.
|
||||||
|
*/
|
||||||
|
static PRAWINPUTDEVICE GetDevicesToRegister(unsigned int* pNumDevices)
|
||||||
|
{
|
||||||
|
// Array of raw input devices to register
|
||||||
|
static RAWINPUTDEVICE sRawInputDevices[] = {
|
||||||
|
{0x01, 0x08, 0x00, 0x00} // Usage Page = 0x01 Generic Desktop Page, Usage Id= 0x08 Multi-axis Controller
|
||||||
|
};
|
||||||
|
|
||||||
|
if (pNumDevices) {
|
||||||
|
*pNumDevices = sizeof(sRawInputDevices) / sizeof(sRawInputDevices[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sRawInputDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Detect the 3D mouse
|
||||||
|
*/
|
||||||
|
bool Gui::GUIApplicationNativeEventAware::Is3dmouseAttached()
|
||||||
|
{
|
||||||
|
unsigned int numDevicesOfInterest = 0;
|
||||||
|
PRAWINPUTDEVICE devicesToRegister = GetDevicesToRegister(&numDevicesOfInterest);
|
||||||
|
|
||||||
|
unsigned int nDevices = 0;
|
||||||
|
|
||||||
|
if (::GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST)) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nDevices == 0) return false;
|
||||||
|
|
||||||
|
std::vector<RAWINPUTDEVICELIST> rawInputDeviceList(nDevices);
|
||||||
|
if (::GetRawInputDeviceList(&rawInputDeviceList[0], &nDevices, sizeof(RAWINPUTDEVICELIST)) == static_cast<unsigned int>(-1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < nDevices; ++i) {
|
||||||
|
RID_DEVICE_INFO rdi = {sizeof(rdi)};
|
||||||
|
unsigned int cbSize = sizeof(rdi);
|
||||||
|
|
||||||
|
if (GetRawInputDeviceInfo(rawInputDeviceList[i].hDevice, RIDI_DEVICEINFO, &rdi, &cbSize) > 0) {
|
||||||
|
//skip non HID and non logitec (3DConnexion) devices
|
||||||
|
if (rdi.dwType != RIM_TYPEHID || rdi.hid.dwVendorId != LOGITECH_VENDOR_ID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if devices matches Multi-axis Controller
|
||||||
|
for (unsigned int j = 0; j < numDevicesOfInterest; ++j) {
|
||||||
|
if (devicesToRegister[j].usUsage == rdi.hid.usUsage
|
||||||
|
&& devicesToRegister[j].usUsagePage == rdi.hid.usUsagePage) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Initialize the window to recieve raw-input messages
|
||||||
|
|
||||||
|
This needs to be called initially so that Windows will send the messages from the 3D mouse to the window.
|
||||||
|
*/
|
||||||
|
bool Gui::GUIApplicationNativeEventAware::InitializeRawInput(HWND hwndTarget)
|
||||||
|
{
|
||||||
|
fWindow = hwndTarget;
|
||||||
|
|
||||||
|
// Simply fail if there is no window
|
||||||
|
if (!hwndTarget) return false;
|
||||||
|
|
||||||
|
unsigned int numDevices = 0;
|
||||||
|
PRAWINPUTDEVICE devicesToRegister = GetDevicesToRegister(&numDevices);
|
||||||
|
|
||||||
|
if (numDevices == 0) return false;
|
||||||
|
|
||||||
|
// Get OS version.
|
||||||
|
OSVERSIONINFO osvi = {sizeof(OSVERSIONINFO),0};
|
||||||
|
::GetVersionEx(&osvi);
|
||||||
|
|
||||||
|
unsigned int cbSize = sizeof (devicesToRegister[0]);
|
||||||
|
for (size_t i = 0; i < numDevices; i++) {
|
||||||
|
// Set the target window to use
|
||||||
|
//devicesToRegister[i].hwndTarget = hwndTarget;
|
||||||
|
|
||||||
|
// If Vista or newer, enable receiving the WM_INPUT_DEVICE_CHANGE message.
|
||||||
|
if (osvi.dwMajorVersion >= 6) {
|
||||||
|
devicesToRegister[i].dwFlags |= RIDEV_DEVNOTIFY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (::RegisterRawInputDevices(devicesToRegister, numDevices, cbSize) != FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Get the raw input data from Windows
|
||||||
|
|
||||||
|
Includes workaround for incorrect alignment of the RAWINPUT structure on x64 os
|
||||||
|
when running as Wow64 (copied directly from 3DConnexion code)
|
||||||
|
*/
|
||||||
|
|
||||||
|
UINT Gui::GUIApplicationNativeEventAware::GetRawInputBuffer(PRAWINPUT pData, PUINT pcbSize, UINT cbSizeHeader)
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
return ::GetRawInputBuffer(pData, pcbSize, cbSizeHeader);
|
||||||
|
#else
|
||||||
|
BOOL bIsWow64 = FALSE;
|
||||||
|
::IsWow64Process(GetCurrentProcess(), &bIsWow64);
|
||||||
|
if (!bIsWow64 || pData==NULL) {
|
||||||
|
return ::GetRawInputBuffer(pData, pcbSize, cbSizeHeader);
|
||||||
|
} else {
|
||||||
|
HWND hwndTarget = fWindow; //fParent->winId();
|
||||||
|
|
||||||
|
size_t cbDataSize=0;
|
||||||
|
UINT nCount=0;
|
||||||
|
PRAWINPUT pri = pData;
|
||||||
|
|
||||||
|
MSG msg;
|
||||||
|
while (PeekMessage(&msg, hwndTarget, WM_INPUT, WM_INPUT, PM_NOREMOVE)) {
|
||||||
|
HRAWINPUT hRawInput = reinterpret_cast<HRAWINPUT>(msg.lParam);
|
||||||
|
size_t cbSize = *pcbSize - cbDataSize;
|
||||||
|
if (::GetRawInputData(hRawInput, RID_INPUT, pri, &cbSize, cbSizeHeader) == static_cast<UINT>(-1)) {
|
||||||
|
if (nCount==0) {
|
||||||
|
return static_cast<UINT>(-1);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++nCount;
|
||||||
|
|
||||||
|
// Remove the message for the data just read
|
||||||
|
PeekMessage(&msg, hwndTarget, WM_INPUT, WM_INPUT, PM_REMOVE);
|
||||||
|
|
||||||
|
pri = NEXTRAWINPUTBLOCK(pri);
|
||||||
|
cbDataSize = reinterpret_cast<ULONG_PTR>(pri) - reinterpret_cast<ULONG_PTR>(pData);
|
||||||
|
if (cbDataSize >= *pcbSize) {
|
||||||
|
cbDataSize = *pcbSize;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nCount;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Process the raw input device data
|
||||||
|
|
||||||
|
On3dmouseInput() does all the preprocessing of the rawinput device data before
|
||||||
|
finally calling the Move3d method.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void Gui::GUIApplicationNativeEventAware::On3dmouseInput()
|
||||||
|
{
|
||||||
|
// Don't do any data processing in background
|
||||||
|
bool bIsForeground = (::GetActiveWindow() != NULL);
|
||||||
|
if (!bIsForeground) {
|
||||||
|
// set all cached data to zero so that a zero event is seen and the cached data deleted
|
||||||
|
for (std::map<HANDLE, TInputData>::iterator it = fDevice2Data.begin(); it != fDevice2Data.end(); it++) {
|
||||||
|
it->second.fAxes.assign(6, .0);
|
||||||
|
it->second.fIsDirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD dwNow = ::GetTickCount(); // Current time;
|
||||||
|
DWORD dwElapsedTime; // Elapsed time since we were last here
|
||||||
|
|
||||||
|
if (0 == fLast3dmouseInputTime) {
|
||||||
|
dwElapsedTime = 10; // System timer resolution
|
||||||
|
} else {
|
||||||
|
dwElapsedTime = dwNow - fLast3dmouseInputTime;
|
||||||
|
if (fLast3dmouseInputTime > dwNow) {
|
||||||
|
dwElapsedTime = ~dwElapsedTime+1;
|
||||||
|
}
|
||||||
|
if (dwElapsedTime<1) {
|
||||||
|
dwElapsedTime=1;
|
||||||
|
} else if (dwElapsedTime > 500) {
|
||||||
|
// Check for wild numbers because the device was removed while sending data
|
||||||
|
dwElapsedTime = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if _TRACE_3DINPUT_PERIOD
|
||||||
|
qDebug("On3DmouseInput() period is %dms\n", dwElapsedTime);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
float mouseData2Rotation;
|
||||||
|
// v = w * r, we don't know r yet so lets assume r=1.)
|
||||||
|
float mouseData2PanZoom;
|
||||||
|
|
||||||
|
// Grab the I3dmouseParam interface
|
||||||
|
I3dMouseParam& i3dmouseParam = f3dMouseParams;
|
||||||
|
// Take a look at the users preferred speed setting and adjust the sensitivity accordingly
|
||||||
|
I3dMouseSensor::ESpeed speedSetting = i3dmouseParam.GetSpeed();
|
||||||
|
// See "Programming for the 3D Mouse", Section 5.1.3
|
||||||
|
float speed = (speedSetting == I3dMouseSensor::kLowSpeed ? 0.25f : speedSetting == I3dMouseSensor::kHighSpeed ? 4.f : 1.f);
|
||||||
|
|
||||||
|
// Multiplying by the following will convert the 3d mouse data to real world units
|
||||||
|
mouseData2PanZoom = speed;
|
||||||
|
mouseData2Rotation = speed;
|
||||||
|
|
||||||
|
std::map<HANDLE, TInputData>::iterator iterator=fDevice2Data.begin();
|
||||||
|
while (iterator != fDevice2Data.end()) {
|
||||||
|
|
||||||
|
// If we have not received data for a while send a zero event
|
||||||
|
if ((--(iterator->second.fTimeToLive)) == 0) {
|
||||||
|
iterator->second.fAxes.assign(6, .0);
|
||||||
|
} else if (/*!t_bPoll3dmouse &&*/ !iterator->second.fIsDirty) {
|
||||||
|
// If we are not polling then only handle the data that was actually received
|
||||||
|
++iterator;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
iterator->second.fIsDirty=false;
|
||||||
|
|
||||||
|
// get a copy of the device
|
||||||
|
HANDLE hdevice = iterator->first;
|
||||||
|
|
||||||
|
// get a copy of the motion vectors and apply the user filters
|
||||||
|
std::vector<float> motionData = iterator->second.fAxes;
|
||||||
|
|
||||||
|
// apply the user filters
|
||||||
|
|
||||||
|
// Pan Zoom filter
|
||||||
|
// See "Programming for the 3D Mouse", Section 5.1.2
|
||||||
|
if (!i3dmouseParam.IsPanZoom()) {
|
||||||
|
// Pan zoom is switched off so set the translation vector values to zero
|
||||||
|
motionData[0] = motionData[1] = motionData[2] = 0.;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotate filter
|
||||||
|
// See "Programming for the 3D Mouse", Section 5.1.1
|
||||||
|
if (!i3dmouseParam.IsRotate()) {
|
||||||
|
// Rotate is switched off so set the rotation vector values to zero
|
||||||
|
motionData[3] = motionData[4] = motionData[5] = 0.;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert the translation vector into physical data
|
||||||
|
for (int axis = 0; axis < 3; axis++) {
|
||||||
|
motionData[axis] *= mouseData2PanZoom;
|
||||||
|
}
|
||||||
|
// convert the directed Rotate vector into physical data
|
||||||
|
// See "Programming for the 3D Mouse", Section 7.2.2
|
||||||
|
for (int axis = 3; axis < 6; axis++) {
|
||||||
|
motionData[axis] *= mouseData2Rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now that the data has had the filters and sensitivty settings applied
|
||||||
|
// calculate the displacements since the last view update
|
||||||
|
for (int axis = 0; axis < 6; axis++) {
|
||||||
|
motionData[axis] *= dwElapsedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Now a bit of book keeping before passing on the data
|
||||||
|
if (iterator->second.IsZero()) {
|
||||||
|
iterator = fDevice2Data.erase(iterator);
|
||||||
|
} else {
|
||||||
|
++iterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Work out which will be the next device
|
||||||
|
HANDLE hNextDevice = 0;
|
||||||
|
if (iterator != fDevice2Data.end()) {
|
||||||
|
hNextDevice = iterator->first;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pass the 3dmouse input to the view controller
|
||||||
|
Move3d(hdevice, motionData);
|
||||||
|
|
||||||
|
// Because we don't know what happened in the previous call, the cache might have
|
||||||
|
// changed so reload the iterator
|
||||||
|
iterator = fDevice2Data.find(hNextDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fDevice2Data.empty()) {
|
||||||
|
fLast3dmouseInputTime = dwNow;
|
||||||
|
} else {
|
||||||
|
fLast3dmouseInputTime = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Called when new raw input data is available
|
||||||
|
*/
|
||||||
|
void Gui::GUIApplicationNativeEventAware::OnRawInput(UINT nInputCode, HRAWINPUT hRawInput)
|
||||||
|
{
|
||||||
|
const size_t cbSizeOfBuffer=1024;
|
||||||
|
BYTE pBuffer[cbSizeOfBuffer];
|
||||||
|
|
||||||
|
PRAWINPUT pRawInput = reinterpret_cast<PRAWINPUT>(pBuffer);
|
||||||
|
UINT cbSize = cbSizeOfBuffer;
|
||||||
|
|
||||||
|
if (::GetRawInputData(hRawInput, RID_INPUT, pRawInput, &cbSize, sizeof(RAWINPUTHEADER)) == static_cast<UINT>(-1)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool b3dmouseInput = TranslateRawInputData(nInputCode, pRawInput);
|
||||||
|
::DefRawInputProc(&pRawInput, 1, sizeof(RAWINPUTHEADER));
|
||||||
|
|
||||||
|
// Check for any buffered messages
|
||||||
|
cbSize = cbSizeOfBuffer;
|
||||||
|
UINT nCount = this->GetRawInputBuffer(pRawInput, &cbSize, sizeof(RAWINPUTHEADER));
|
||||||
|
if (nCount == (UINT)-1) {
|
||||||
|
qDebug ("GetRawInputBuffer returned error %d\n", GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
|
while (nCount>0 && nCount != static_cast<UINT>(-1)) {
|
||||||
|
PRAWINPUT pri = pRawInput;
|
||||||
|
UINT nInput;
|
||||||
|
for (nInput=0; nInput<nCount; ++nInput) {
|
||||||
|
b3dmouseInput |= TranslateRawInputData(nInputCode, pri);
|
||||||
|
// clean the buffer
|
||||||
|
::DefRawInputProc(&pri, 1, sizeof(RAWINPUTHEADER));
|
||||||
|
|
||||||
|
pri = NEXTRAWINPUTBLOCK(pri);
|
||||||
|
}
|
||||||
|
cbSize = cbSizeOfBuffer;
|
||||||
|
nCount = this->GetRawInputBuffer(pRawInput, &cbSize, sizeof(RAWINPUTHEADER));
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have mouse input data for the app then tell tha app about it
|
||||||
|
if (b3dmouseInput) {
|
||||||
|
On3dmouseInput();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool Gui::GUIApplicationNativeEventAware::TranslateRawInputData(UINT nInputCode, PRAWINPUT pRawInput)
|
||||||
|
{
|
||||||
|
bool bIsForeground = (nInputCode == RIM_INPUT);
|
||||||
|
|
||||||
|
#if _TRACE_RI_TYPE
|
||||||
|
qDebug("Rawinput.header.dwType=0x%x\n", pRawInput->header.dwType);
|
||||||
|
#endif
|
||||||
|
// We are not interested in keyboard or mouse data received via raw input
|
||||||
|
if (pRawInput->header.dwType != RIM_TYPEHID) return false;
|
||||||
|
|
||||||
|
#if _TRACE_RIDI_DEVICENAME
|
||||||
|
UINT dwSize=0;
|
||||||
|
if (::GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_DEVICENAME, NULL, &dwSize) == 0) {
|
||||||
|
std::vector<wchar_t> szDeviceName(dwSize+1);
|
||||||
|
if (::GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_DEVICENAME, &szDeviceName[0], &dwSize) >0) {
|
||||||
|
qDebug("Device Name = %s\nDevice handle = 0x%x\n", &szDeviceName[0], pRawInput->header.hDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RID_DEVICE_INFO sRidDeviceInfo;
|
||||||
|
sRidDeviceInfo.cbSize = sizeof(RID_DEVICE_INFO);
|
||||||
|
UINT cbSize = sizeof(RID_DEVICE_INFO);
|
||||||
|
|
||||||
|
if (::GetRawInputDeviceInfo(pRawInput->header.hDevice, RIDI_DEVICEINFO, &sRidDeviceInfo, &cbSize) == cbSize) {
|
||||||
|
#if _TRACE_RIDI_DEVICEINFO
|
||||||
|
switch (sRidDeviceInfo.dwType) {
|
||||||
|
case RIM_TYPEMOUSE:
|
||||||
|
qDebug("\tsRidDeviceInfo.dwType=RIM_TYPEMOUSE\n");
|
||||||
|
break;
|
||||||
|
case RIM_TYPEKEYBOARD:
|
||||||
|
qDebug("\tsRidDeviceInfo.dwType=RIM_TYPEKEYBOARD\n");
|
||||||
|
break;
|
||||||
|
case RIM_TYPEHID:
|
||||||
|
qDebug("\tsRidDeviceInfo.dwType=RIM_TYPEHID\n");
|
||||||
|
qDebug("\tVendor=0x%x\n\tProduct=0x%x\n\tUsagePage=0x%x\n\tUsage=0x%x\n",
|
||||||
|
sRidDeviceInfo.hid.dwVendorId,
|
||||||
|
sRidDeviceInfo.hid.dwProductId,
|
||||||
|
sRidDeviceInfo.hid.usUsagePage,
|
||||||
|
sRidDeviceInfo.hid.usUsage);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (sRidDeviceInfo.hid.dwVendorId == LOGITECH_VENDOR_ID) {
|
||||||
|
if (pRawInput->data.hid.bRawData[0] == 0x01) { // Translation vector
|
||||||
|
|
||||||
|
TInputData& deviceData = fDevice2Data[pRawInput->header.hDevice];
|
||||||
|
deviceData.fTimeToLive = kTimeToLive;
|
||||||
|
if (bIsForeground) {
|
||||||
|
short* pnRawData = reinterpret_cast<short*>(&pRawInput->data.hid.bRawData[1]);
|
||||||
|
// Cache the pan zoom data
|
||||||
|
deviceData.fAxes[0] = static_cast<float>(pnRawData[0]);
|
||||||
|
deviceData.fAxes[1] = static_cast<float>(pnRawData[1]);
|
||||||
|
deviceData.fAxes[2] = static_cast<float>(pnRawData[2]);
|
||||||
|
|
||||||
|
#if _TRACE_RI_RAWDATA
|
||||||
|
qDebug("Pan/Zoom RI Data =\t0x%x,\t0x%x,\t0x%x\n",
|
||||||
|
pnRawData[0], pnRawData[1], pnRawData[2]);
|
||||||
|
#endif
|
||||||
|
if (pRawInput->data.hid.dwSizeHid >= 13) {// Highspeed package
|
||||||
|
// Cache the rotation data
|
||||||
|
deviceData.fAxes[3] = static_cast<float>(pnRawData[3]);
|
||||||
|
deviceData.fAxes[4] = static_cast<float>(pnRawData[4]);
|
||||||
|
deviceData.fAxes[5] = static_cast<float>(pnRawData[5]);
|
||||||
|
deviceData.fIsDirty = true;
|
||||||
|
#if _TRACE_RI_RAWDATA
|
||||||
|
qDebug("Rotation RI Data =\t0x%x,\t0x%x,\t0x%x\n",
|
||||||
|
pnRawData[3], pnRawData[4], pnRawData[5]);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else { // Zero out the data if the app is not in forground
|
||||||
|
deviceData.fAxes.assign(6, 0.f);
|
||||||
|
}
|
||||||
|
} else if (pRawInput->data.hid.bRawData[0] == 0x02) { // Rotation vector
|
||||||
|
// If we are not in foreground do nothing
|
||||||
|
// The rotation vector was zeroed out with the translation vector in the previous message
|
||||||
|
if (bIsForeground) {
|
||||||
|
TInputData& deviceData = fDevice2Data[pRawInput->header.hDevice];
|
||||||
|
deviceData.fTimeToLive = kTimeToLive;
|
||||||
|
|
||||||
|
short* pnRawData = reinterpret_cast<short*>(&pRawInput->data.hid.bRawData[1]);
|
||||||
|
// Cache the rotation data
|
||||||
|
deviceData.fAxes[3] = static_cast<float>(pnRawData[0]);
|
||||||
|
deviceData.fAxes[4] = static_cast<float>(pnRawData[1]);
|
||||||
|
deviceData.fAxes[5] = static_cast<float>(pnRawData[2]);
|
||||||
|
deviceData.fIsDirty = true;
|
||||||
|
|
||||||
|
#if _TRACE_RI_RAWDATA
|
||||||
|
qDebug("Rotation RI Data =\t0x%x,\t0x%x,\t0x%x\n",
|
||||||
|
pnRawData[0], pnRawData[1], pnRawData[2]);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (pRawInput->data.hid.bRawData[0] == 0x03) { // Keystate change
|
||||||
|
// this is a package that contains 3d mouse keystate information
|
||||||
|
// bit0=key1, bit=key2 etc.
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long dwKeystate = *reinterpret_cast<unsigned long*>(&pRawInput->data.hid.bRawData[1]);
|
||||||
|
#if _TRACE_RI_RAWDATA
|
||||||
|
qDebug("ButtonData =0x%x\n", dwKeystate);
|
||||||
|
#endif
|
||||||
|
// Log the keystate changes
|
||||||
|
unsigned long dwOldKeystate = fDevice2Keystate[pRawInput->header.hDevice];
|
||||||
|
if (dwKeystate != 0) {
|
||||||
|
fDevice2Keystate[pRawInput->header.hDevice] = dwKeystate;
|
||||||
|
} else {
|
||||||
|
fDevice2Keystate.erase(pRawInput->header.hDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only call the keystate change handlers if the app is in foreground
|
||||||
|
if (bIsForeground) {
|
||||||
|
unsigned long dwChange = dwKeystate ^ dwOldKeystate;
|
||||||
|
|
||||||
|
|
||||||
|
for (int nKeycode=1; nKeycode<33; nKeycode++) {
|
||||||
|
if (dwChange & 0x01) {
|
||||||
|
int nVirtualKeyCode = HidToVirtualKey(sRidDeviceInfo.hid.dwProductId, nKeycode);
|
||||||
|
if (nVirtualKeyCode) {
|
||||||
|
if (dwKeystate&0x01) {
|
||||||
|
On3dmouseKeyDown(pRawInput->header.hDevice, nVirtualKeyCode);
|
||||||
|
} else {
|
||||||
|
On3dmouseKeyUp(pRawInput->header.hDevice, nVirtualKeyCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dwChange >>=1;
|
||||||
|
dwKeystate >>=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif // _USE_3DCONNEXION_SDK
|
91
src/Gui/3Dconnexion/I3dMouseParams.h
Normal file
91
src/Gui/3Dconnexion/I3dMouseParams.h
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
Development tools and related technology provided under license from 3Dconnexion.
|
||||||
|
(c) 1992 - 2012 3Dconnexion. All rights reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef I3D_MOUSE_PARAMS_H
|
||||||
|
#define I3D_MOUSE_PARAMS_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
Parameters for the 3D mouse based on the SDK from 3Dconnexion
|
||||||
|
*/
|
||||||
|
|
||||||
|
class I3dMouseSensor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum ESpeed {
|
||||||
|
kLowSpeed = 0,
|
||||||
|
kMidSpeed,
|
||||||
|
kHighSpeed
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual bool IsPanZoom() const = 0;
|
||||||
|
virtual bool IsRotate() const = 0;
|
||||||
|
virtual ESpeed GetSpeed() const = 0;
|
||||||
|
|
||||||
|
virtual void SetPanZoom(bool isPanZoom) = 0;
|
||||||
|
virtual void SetRotate(bool isRotate) = 0;
|
||||||
|
virtual void SetSpeed(ESpeed speed) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual ~I3dMouseSensor() {}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class I3dMouseNavigation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum EPivot {
|
||||||
|
kManualPivot = 0,
|
||||||
|
kAutoPivot,
|
||||||
|
kAutoPivotOverride
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ENavigation {
|
||||||
|
kObjectMode = 0,
|
||||||
|
kCameraMode,
|
||||||
|
kFlyMode,
|
||||||
|
kWalkMode,
|
||||||
|
kHelicopterMode
|
||||||
|
};
|
||||||
|
|
||||||
|
enum EPivotVisibility {
|
||||||
|
kHidePivot = 0,
|
||||||
|
kShowPivot,
|
||||||
|
kShowMovingPivot
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
virtual ENavigation GetNavigationMode() const = 0;
|
||||||
|
virtual EPivot GetPivotMode() const = 0;
|
||||||
|
virtual EPivotVisibility GetPivotVisibility() const = 0;
|
||||||
|
virtual bool IsLockHorizon() const = 0;
|
||||||
|
|
||||||
|
virtual void SetLockHorizon(bool bOn) = 0;
|
||||||
|
virtual void SetNavigationMode(ENavigation navigation) = 0;
|
||||||
|
virtual void SetPivotMode(EPivot pivot) = 0;
|
||||||
|
virtual void SetPivotVisibility(EPivotVisibility visibility) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual ~I3dMouseNavigation(){}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class I3dMouseParam : public I3dMouseSensor, public I3dMouseNavigation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual ~I3dMouseParam() {}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // I3D_MOUSE_PARAMS_H
|
||||||
|
|
95
src/Gui/3Dconnexion/MouseParameters.cpp
Normal file
95
src/Gui/3Dconnexion/MouseParameters.cpp
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
Development tools and related technology provided under license from 3Dconnexion.
|
||||||
|
(c) 1992 - 2012 3Dconnexion. All rights reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "PreCompiled.h"
|
||||||
|
#include "MouseParameters.h"
|
||||||
|
|
||||||
|
MouseParameters::MouseParameters(): fNavigation(kObjectMode)
|
||||||
|
, fPivot(kAutoPivot)
|
||||||
|
, fPivotVisibility(kShowPivot)
|
||||||
|
, fIsLockHorizon(true)
|
||||||
|
, fIsPanZoom(true)
|
||||||
|
, fIsRotate(true)
|
||||||
|
, fSpeed(kLowSpeed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseParameters::~MouseParameters()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MouseParameters::IsPanZoom() const
|
||||||
|
{
|
||||||
|
return fIsPanZoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MouseParameters::IsRotate() const
|
||||||
|
{
|
||||||
|
return fIsRotate;
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseParameters::ESpeed MouseParameters::GetSpeed() const
|
||||||
|
{
|
||||||
|
return fSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseParameters::SetPanZoom(bool isPanZoom)
|
||||||
|
{
|
||||||
|
fIsPanZoom=isPanZoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseParameters::SetRotate(bool isRotate)
|
||||||
|
{
|
||||||
|
fIsRotate=isRotate;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseParameters::SetSpeed(ESpeed speed)
|
||||||
|
{
|
||||||
|
fSpeed=speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MouseParameters::ENavigation MouseParameters::GetNavigationMode() const
|
||||||
|
{
|
||||||
|
return fNavigation;
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseParameters::EPivot MouseParameters::GetPivotMode() const
|
||||||
|
{
|
||||||
|
return fPivot;
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseParameters::EPivotVisibility MouseParameters::GetPivotVisibility() const
|
||||||
|
{
|
||||||
|
return fPivotVisibility;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MouseParameters::IsLockHorizon() const
|
||||||
|
{
|
||||||
|
return fIsLockHorizon;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseParameters::SetLockHorizon(bool bOn)
|
||||||
|
{
|
||||||
|
fIsLockHorizon=bOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseParameters::SetNavigationMode(ENavigation navigation)
|
||||||
|
{
|
||||||
|
fNavigation=navigation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseParameters::SetPivotMode(EPivot pivot)
|
||||||
|
{
|
||||||
|
if (fPivot!=kManualPivot || pivot!=kAutoPivotOverride)
|
||||||
|
fPivot = pivot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MouseParameters::SetPivotVisibility(EPivotVisibility visibility)
|
||||||
|
{
|
||||||
|
fPivotVisibility = visibility;
|
||||||
|
}
|
56
src/Gui/3Dconnexion/MouseParameters.h
Normal file
56
src/Gui/3Dconnexion/MouseParameters.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
Development tools and related technology provided under license from 3Dconnexion.
|
||||||
|
(c) 1992 - 2012 3Dconnexion. All rights reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef T3D_MOUSE_PARAMS_H
|
||||||
|
#define T3D_MOUSE_PARAMS_H
|
||||||
|
|
||||||
|
#include "I3dMouseParams.h"
|
||||||
|
|
||||||
|
|
||||||
|
class MouseParameters : public I3dMouseParam
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MouseParameters();
|
||||||
|
~MouseParameters();
|
||||||
|
|
||||||
|
// I3dmouseSensor interface
|
||||||
|
bool IsPanZoom() const;
|
||||||
|
bool IsRotate() const;
|
||||||
|
ESpeed GetSpeed() const;
|
||||||
|
|
||||||
|
void SetPanZoom(bool isPanZoom);
|
||||||
|
void SetRotate(bool isRotate);
|
||||||
|
void SetSpeed(ESpeed speed);
|
||||||
|
|
||||||
|
// I3dmouseNavigation interface
|
||||||
|
ENavigation GetNavigationMode() const;
|
||||||
|
EPivot GetPivotMode() const;
|
||||||
|
EPivotVisibility GetPivotVisibility() const;
|
||||||
|
bool IsLockHorizon() const;
|
||||||
|
|
||||||
|
void SetLockHorizon(bool bOn);
|
||||||
|
void SetNavigationMode(ENavigation navigation);
|
||||||
|
void SetPivotMode(EPivot pivot);
|
||||||
|
void SetPivotVisibility(EPivotVisibility visibility);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
MouseParameters (const MouseParameters&);
|
||||||
|
const MouseParameters& operator =(const MouseParameters&);
|
||||||
|
|
||||||
|
ENavigation fNavigation;
|
||||||
|
EPivot fPivot;
|
||||||
|
EPivotVisibility fPivotVisibility;
|
||||||
|
bool fIsLockHorizon;
|
||||||
|
|
||||||
|
bool fIsPanZoom;
|
||||||
|
bool fIsRotate;
|
||||||
|
ESpeed fSpeed;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // T3D_MOUSE_PARAMS_H
|
||||||
|
|
|
@ -115,14 +115,14 @@
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="3" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QLabel" name="labelPlatform">
|
<widget class="QLabel" name="labelPlatform">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Platform</string>
|
<string>Platform</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QLabel" name="labelBuildPlatform">
|
<widget class="QLabel" name="labelBuildPlatform">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-weight:600;">Unknown</span></p></body></html></string>
|
<string notr="true"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-weight:600;">Unknown</span></p></body></html></string>
|
||||||
|
@ -171,34 +171,48 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QLabel" name="labelBranch">
|
<widget class="QLabel" name="labelBranch">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true">Branch</string>
|
<string notr="true">Branch</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLabel" name="labelBuildBranch">
|
<widget class="QLabel" name="labelBuildBranch">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-weight:600;">Unknown</span></p></body></html></string>
|
<string notr="true"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-weight:600;">Unknown</span></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="7" column="1">
|
||||||
<widget class="QLabel" name="labelBuildHash">
|
<widget class="QLabel" name="labelBuildHash">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-weight:600;">Unknown</span></p></body></html></string>
|
<string notr="true"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-weight:600;">Unknown</span></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QLabel" name="labelHash">
|
<widget class="QLabel" name="labelHash">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true">Hash</string>
|
<string notr="true">Hash</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="labelOS">
|
||||||
|
<property name="text">
|
||||||
|
<string>Operating system</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLabel" name="labelBuildOS">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><span style=" font-weight:600;">Unknown</span></p></body></html></string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
# include <boost/bind.hpp>
|
# include <boost/bind.hpp>
|
||||||
# include <QActionEvent>
|
# include <QActionEvent>
|
||||||
# include <QApplication>
|
# include <QApplication>
|
||||||
|
# include <QDesktopWidget>
|
||||||
# include <QEvent>
|
# include <QEvent>
|
||||||
# include <QMessageBox>
|
# include <QMessageBox>
|
||||||
# include <QToolBar>
|
# include <QToolBar>
|
||||||
|
@ -345,6 +346,18 @@ WorkbenchComboBox::~WorkbenchComboBox()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorkbenchComboBox::showPopup()
|
||||||
|
{
|
||||||
|
int rows = count();
|
||||||
|
if (rows > 0) {
|
||||||
|
int height = view()->sizeHintForRow(0);
|
||||||
|
int maxHeight = QApplication::desktop()->height();
|
||||||
|
view()->setMinimumHeight(qMin(height * rows, maxHeight/2));
|
||||||
|
}
|
||||||
|
|
||||||
|
QComboBox::showPopup();
|
||||||
|
}
|
||||||
|
|
||||||
void WorkbenchComboBox::actionEvent ( QActionEvent* e )
|
void WorkbenchComboBox::actionEvent ( QActionEvent* e )
|
||||||
{
|
{
|
||||||
QAction *action = e->action();
|
QAction *action = e->action();
|
||||||
|
|
|
@ -124,6 +124,7 @@ class GuiExport WorkbenchComboBox : public QComboBox
|
||||||
public:
|
public:
|
||||||
WorkbenchComboBox(WorkbenchGroup* wb, QWidget* parent=0);
|
WorkbenchComboBox(WorkbenchGroup* wb, QWidget* parent=0);
|
||||||
virtual ~WorkbenchComboBox();
|
virtual ~WorkbenchComboBox();
|
||||||
|
void showPopup();
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void onActivated(int);
|
void onActivated(int);
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include <Base/Factory.h>
|
#include <Base/Factory.h>
|
||||||
#include <Base/FileInfo.h>
|
#include <Base/FileInfo.h>
|
||||||
#include <Base/Tools.h>
|
#include <Base/Tools.h>
|
||||||
|
#include <Base/UnitsApi.h>
|
||||||
#include <App/Document.h>
|
#include <App/Document.h>
|
||||||
#include <App/DocumentObjectPy.h>
|
#include <App/DocumentObjectPy.h>
|
||||||
|
|
||||||
|
@ -328,6 +329,10 @@ Application::Application(bool GUIenabled)
|
||||||
Translator::instance()->activateLanguage(hPGrp->GetASCII("Language", (const char*)lang.toAscii()).c_str());
|
Translator::instance()->activateLanguage(hPGrp->GetASCII("Language", (const char*)lang.toAscii()).c_str());
|
||||||
GetWidgetFactorySupplier();
|
GetWidgetFactorySupplier();
|
||||||
|
|
||||||
|
ParameterGrp::handle hUnits = App::GetApplication().GetParameterGroupByPath
|
||||||
|
("User parameter:BaseApp/Preferences/Units");
|
||||||
|
Base::UnitsApi::setDecimals(hUnits->GetInt("Decimals", Base::UnitsApi::getDecimals()));
|
||||||
|
|
||||||
// setting up Python binding
|
// setting up Python binding
|
||||||
Base::PyGILStateLocker lock;
|
Base::PyGILStateLocker lock;
|
||||||
PyObject* module = Py_InitModule3("FreeCADGui", Application::Methods,
|
PyObject* module = Py_InitModule3("FreeCADGui", Application::Methods,
|
||||||
|
@ -341,6 +346,10 @@ Application::Application(bool GUIenabled)
|
||||||
"workbenches.");
|
"workbenches.");
|
||||||
Py::Module(module).setAttr(std::string("ActiveDocument"),Py::None());
|
Py::Module(module).setAttr(std::string("ActiveDocument"),Py::None());
|
||||||
|
|
||||||
|
UiLoaderPy::init_type();
|
||||||
|
Base::Interpreter().addType(UiLoaderPy::type_object(),
|
||||||
|
module,"UiLoader");
|
||||||
|
|
||||||
//insert Selection module
|
//insert Selection module
|
||||||
PyObject* pSelectionModule = Py_InitModule3("Selection", SelectionSingleton::Methods,
|
PyObject* pSelectionModule = Py_InitModule3("Selection", SelectionSingleton::Methods,
|
||||||
"Selection module");
|
"Selection module");
|
||||||
|
@ -860,8 +869,13 @@ void Application::tryClose(QCloseEvent * e)
|
||||||
// ask all documents if closable
|
// ask all documents if closable
|
||||||
std::map<const App::Document*, Gui::Document*>::iterator It;
|
std::map<const App::Document*, Gui::Document*>::iterator It;
|
||||||
for (It = d->documents.begin();It!=d->documents.end();It++) {
|
for (It = d->documents.begin();It!=d->documents.end();It++) {
|
||||||
|
// a document may have several views attached, so ask it directly
|
||||||
|
#if 0
|
||||||
MDIView* active = It->second->getActiveView();
|
MDIView* active = It->second->getActiveView();
|
||||||
e->setAccepted(active->canClose());
|
e->setAccepted(active->canClose());
|
||||||
|
#else
|
||||||
|
e->setAccepted(It->second->canClose());
|
||||||
|
#endif
|
||||||
if (!e->isAccepted())
|
if (!e->isAccepted())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1352,13 +1366,13 @@ void messageHandlerCoin(const SoError * error, void * userdata)
|
||||||
switch (dbg->getSeverity())
|
switch (dbg->getSeverity())
|
||||||
{
|
{
|
||||||
case SoDebugError::INFO:
|
case SoDebugError::INFO:
|
||||||
Base::Console().Message( msg );
|
Base::Console().Message("%s\n", msg);
|
||||||
break;
|
break;
|
||||||
case SoDebugError::WARNING:
|
case SoDebugError::WARNING:
|
||||||
Base::Console().Warning( msg );
|
Base::Console().Warning("%s\n", msg);
|
||||||
break;
|
break;
|
||||||
default: // error
|
default: // error
|
||||||
Base::Console().Error( msg );
|
Base::Console().Error("%s\n", msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef FC_OS_WIN32
|
#ifdef FC_OS_WIN32
|
||||||
|
@ -1415,6 +1429,7 @@ void Application::initTypes(void)
|
||||||
Gui::ViewProviderDocumentObject ::init();
|
Gui::ViewProviderDocumentObject ::init();
|
||||||
Gui::ViewProviderFeature ::init();
|
Gui::ViewProviderFeature ::init();
|
||||||
Gui::ViewProviderDocumentObjectGroup ::init();
|
Gui::ViewProviderDocumentObjectGroup ::init();
|
||||||
|
Gui::ViewProviderDocumentObjectGroupPython ::init();
|
||||||
Gui::ViewProviderGeometryObject ::init();
|
Gui::ViewProviderGeometryObject ::init();
|
||||||
Gui::ViewProviderInventorObject ::init();
|
Gui::ViewProviderInventorObject ::init();
|
||||||
Gui::ViewProviderVRMLObject ::init();
|
Gui::ViewProviderVRMLObject ::init();
|
||||||
|
@ -1442,9 +1457,10 @@ namespace Gui {
|
||||||
*/
|
*/
|
||||||
class GUIApplication : public GUIApplicationNativeEventAware
|
class GUIApplication : public GUIApplicationNativeEventAware
|
||||||
{
|
{
|
||||||
|
int systemExit;
|
||||||
public:
|
public:
|
||||||
GUIApplication(int & argc, char ** argv)
|
GUIApplication(int & argc, char ** argv, int exitcode)
|
||||||
: GUIApplicationNativeEventAware(argc, argv)
|
: GUIApplicationNativeEventAware(argc, argv), systemExit(exitcode)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1465,6 +1481,10 @@ public:
|
||||||
else
|
else
|
||||||
return QApplication::notify(receiver, event);
|
return QApplication::notify(receiver, event);
|
||||||
}
|
}
|
||||||
|
catch (const Base::SystemExitException&) {
|
||||||
|
qApp->exit(systemExit);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
catch (const Base::Exception& e) {
|
catch (const Base::Exception& e) {
|
||||||
Base::Console().Error("Unhandled Base::Exception caught in GUIApplication::notify.\n"
|
Base::Console().Error("Unhandled Base::Exception caught in GUIApplication::notify.\n"
|
||||||
"The error message is: %s\n", e.what());
|
"The error message is: %s\n", e.what());
|
||||||
|
@ -1528,10 +1548,19 @@ void Application::runApplication(void)
|
||||||
Base::Console().Log("Init: Creating Gui::Application and QApplication\n");
|
Base::Console().Log("Init: Creating Gui::Application and QApplication\n");
|
||||||
// if application not yet created by the splasher
|
// if application not yet created by the splasher
|
||||||
int argc = App::Application::GetARGC();
|
int argc = App::Application::GetARGC();
|
||||||
GUIApplication mainApp(argc, App::Application::GetARGV());
|
int systemExit = 1000;
|
||||||
|
GUIApplication mainApp(argc, App::Application::GetARGV(), systemExit);
|
||||||
// set application icon and window title
|
// set application icon and window title
|
||||||
|
const std::map<std::string,std::string>& cfg = App::Application::Config();
|
||||||
|
std::map<std::string,std::string>::const_iterator it;
|
||||||
|
it = cfg.find("Application");
|
||||||
|
if (it != cfg.end()) {
|
||||||
|
mainApp.setApplicationName(QString::fromUtf8(it->second.c_str()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mainApp.setApplicationName(QString::fromUtf8(App::GetApplication().getExecutableName()));
|
||||||
|
}
|
||||||
mainApp.setWindowIcon(Gui::BitmapFactory().pixmap(App::Application::Config()["AppIcon"].c_str()));
|
mainApp.setWindowIcon(Gui::BitmapFactory().pixmap(App::Application::Config()["AppIcon"].c_str()));
|
||||||
mainApp.setApplicationName(QString::fromAscii(App::GetApplication().getExecutableName()));
|
|
||||||
QString plugin;
|
QString plugin;
|
||||||
plugin = QString::fromUtf8(App::GetApplication().GetHomePath());
|
plugin = QString::fromUtf8(App::GetApplication().GetHomePath());
|
||||||
plugin += QLatin1String("/plugins");
|
plugin += QLatin1String("/plugins");
|
||||||
|
@ -1591,8 +1620,6 @@ void Application::runApplication(void)
|
||||||
|
|
||||||
QString home = QString::fromUtf8(App::GetApplication().GetHomePath());
|
QString home = QString::fromUtf8(App::GetApplication().GetHomePath());
|
||||||
|
|
||||||
const std::map<std::string,std::string>& cfg = App::Application::Config();
|
|
||||||
std::map<std::string,std::string>::const_iterator it;
|
|
||||||
it = cfg.find("WindowTitle");
|
it = cfg.find("WindowTitle");
|
||||||
if (it != cfg.end()) {
|
if (it != cfg.end()) {
|
||||||
QString title = QString::fromUtf8(it->second.c_str());
|
QString title = QString::fromUtf8(it->second.c_str());
|
||||||
|
@ -1620,9 +1647,15 @@ void Application::runApplication(void)
|
||||||
logo->setFrameShape(QFrame::NoFrame);
|
logo->setFrameShape(QFrame::NoFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool hidden = false;
|
||||||
|
it = cfg.find("StartHidden");
|
||||||
|
if (it != cfg.end()) {
|
||||||
|
hidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
// show splasher while initializing the GUI
|
// show splasher while initializing the GUI
|
||||||
mw.startSplasher();
|
if (!hidden)
|
||||||
|
mw.startSplasher();
|
||||||
|
|
||||||
// running the GUI init script
|
// running the GUI init script
|
||||||
try {
|
try {
|
||||||
|
@ -1656,8 +1689,10 @@ void Application::runApplication(void)
|
||||||
app.activateWorkbench(start.c_str());
|
app.activateWorkbench(start.c_str());
|
||||||
|
|
||||||
// show the main window
|
// show the main window
|
||||||
Base::Console().Log("Init: Showing main window\n");
|
if (!hidden) {
|
||||||
mw.loadWindowSettings();
|
Base::Console().Log("Init: Showing main window\n");
|
||||||
|
mw.loadWindowSettings();
|
||||||
|
}
|
||||||
|
|
||||||
//initialize spaceball.
|
//initialize spaceball.
|
||||||
mainApp.initSpaceball(&mw);
|
mainApp.initSpaceball(&mw);
|
||||||
|
@ -1687,9 +1722,15 @@ void Application::runApplication(void)
|
||||||
Base::Console().Log("Init: Entering event loop\n");
|
Base::Console().Log("Init: Entering event loop\n");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mainApp.exec();
|
int ret = mainApp.exec();
|
||||||
|
if (ret == systemExit)
|
||||||
|
throw Base::SystemExitException();
|
||||||
}
|
}
|
||||||
catch(...) {
|
catch (const Base::SystemExitException&) {
|
||||||
|
Base::Console().Message("System exit\n");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
// catching nasty stuff coming out of the event loop
|
// catching nasty stuff coming out of the event loop
|
||||||
App::Application::destructObserver();
|
App::Application::destructObserver();
|
||||||
Base::Console().Error("Event loop left through unhandled exception\n");
|
Base::Console().Error("Event loop left through unhandled exception\n");
|
||||||
|
|
|
@ -231,6 +231,8 @@ public:
|
||||||
PYFUNCDEF_S(sActiveDocument);
|
PYFUNCDEF_S(sActiveDocument);
|
||||||
PYFUNCDEF_S(sGetDocument);
|
PYFUNCDEF_S(sGetDocument);
|
||||||
|
|
||||||
|
PYFUNCDEF_S(sDoCommand);
|
||||||
|
|
||||||
static PyMethodDef Methods[];
|
static PyMethodDef Methods[];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#ifndef _PreComp_
|
#ifndef _PreComp_
|
||||||
# include <qfileinfo.h>
|
# include <qfileinfo.h>
|
||||||
# include <qdir.h>
|
# include <qdir.h>
|
||||||
|
# include <QPrinter>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,6 +37,7 @@
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "EditorView.h"
|
#include "EditorView.h"
|
||||||
#include "PythonEditor.h"
|
#include "PythonEditor.h"
|
||||||
|
#include "View3DInventor.h"
|
||||||
#include "WidgetFactory.h"
|
#include "WidgetFactory.h"
|
||||||
#include "Workbench.h"
|
#include "Workbench.h"
|
||||||
#include "WorkbenchManager.h"
|
#include "WorkbenchManager.h"
|
||||||
|
@ -126,6 +128,9 @@ PyMethodDef Application::Methods[] = {
|
||||||
{"getDocument", (PyCFunction) Application::sGetDocument, 1,
|
{"getDocument", (PyCFunction) Application::sGetDocument, 1,
|
||||||
"getDocument(string) -> object\n\n"
|
"getDocument(string) -> object\n\n"
|
||||||
"Get a document by its name"},
|
"Get a document by its name"},
|
||||||
|
{"doCommand", (PyCFunction) Application::sDoCommand, 1,
|
||||||
|
"doCommand(string) -> None\n\n"
|
||||||
|
"Prints the given string in the python console and runs it"},
|
||||||
|
|
||||||
{NULL, NULL} /* Sentinel */
|
{NULL, NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
@ -357,10 +362,33 @@ PyObject* Application::sExport(PyObject * /*self*/, PyObject *args,PyObject * /*
|
||||||
if (ext == QLatin1String("iv") || ext == QLatin1String("wrl") ||
|
if (ext == QLatin1String("iv") || ext == QLatin1String("wrl") ||
|
||||||
ext == QLatin1String("vrml") || ext == QLatin1String("wrz") ||
|
ext == QLatin1String("vrml") || ext == QLatin1String("wrz") ||
|
||||||
ext == QLatin1String("svg") || ext == QLatin1String("idtf")) {
|
ext == QLatin1String("svg") || ext == QLatin1String("idtf")) {
|
||||||
QString cmd = QString::fromLatin1(
|
Gui::Document* gui_doc = Application::Instance->getDocument(doc);
|
||||||
"Gui.getDocument(\"%1\").ActiveView.dump(\"%2\")"
|
std::list<MDIView*> view3d = gui_doc->getMDIViewsOfType(View3DInventor::getClassTypeId());
|
||||||
).arg(QLatin1String(doc->getName())).arg(fi.absoluteFilePath());
|
if (view3d.empty()) {
|
||||||
Base::Interpreter().runString(cmd.toUtf8());
|
PyErr_SetString(PyExc_Exception, "Cannot export to SVG because document doesn't have a 3d view");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QString cmd = QString::fromLatin1(
|
||||||
|
"Gui.getDocument(\"%1\").mdiViewsOfType('Gui::View3DInventor')[0].dump(\"%2\")"
|
||||||
|
).arg(QLatin1String(doc->getName())).arg(fi.absoluteFilePath());
|
||||||
|
Base::Interpreter().runString(cmd.toUtf8());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (ext == QLatin1String("pdf")) {
|
||||||
|
Gui::Document* gui_doc = Application::Instance->getDocument(doc);
|
||||||
|
if (gui_doc) {
|
||||||
|
Gui::MDIView* view = gui_doc->getActiveView();
|
||||||
|
if (view) {
|
||||||
|
View3DInventor* view3d = qobject_cast<View3DInventor*>(view);
|
||||||
|
if (view3d)
|
||||||
|
view3d->viewAll();
|
||||||
|
QPrinter printer(QPrinter::ScreenResolution);
|
||||||
|
printer.setOutputFormat(QPrinter::PdfFormat);
|
||||||
|
printer.setOutputFileName(fileName);
|
||||||
|
view->print(&printer);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} PY_CATCH;
|
} PY_CATCH;
|
||||||
|
@ -748,3 +776,12 @@ PyObject* Application::sRunCommand(PyObject * /*self*/, PyObject *args,PyObject
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* Application::sDoCommand(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/)
|
||||||
|
{
|
||||||
|
char *pstr=0;
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &pstr)) // convert args: Python->C
|
||||||
|
return NULL; // NULL triggers exception
|
||||||
|
Command::doCommand(Command::Doc,pstr);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
|
@ -181,6 +181,7 @@ SbBool BlenderNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
else if (press && (this->currentmode == NavigationStyle::PANNING ||
|
else if (press && (this->currentmode == NavigationStyle::PANNING ||
|
||||||
this->currentmode == NavigationStyle::ZOOMING)) {
|
this->currentmode == NavigationStyle::ZOOMING)) {
|
||||||
newmode = NavigationStyle::DRAGGING;
|
newmode = NavigationStyle::DRAGGING;
|
||||||
|
saveCursorPosition(ev);
|
||||||
this->centerTime = ev->getTime();
|
this->centerTime = ev->getTime();
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -221,6 +222,7 @@ SbBool BlenderNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
if (press && (this->currentmode == NavigationStyle::PANNING ||
|
if (press && (this->currentmode == NavigationStyle::PANNING ||
|
||||||
this->currentmode == NavigationStyle::ZOOMING)) {
|
this->currentmode == NavigationStyle::ZOOMING)) {
|
||||||
newmode = NavigationStyle::DRAGGING;
|
newmode = NavigationStyle::DRAGGING;
|
||||||
|
saveCursorPosition(ev);
|
||||||
this->centerTime = ev->getTime();
|
this->centerTime = ev->getTime();
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -285,6 +287,7 @@ SbBool BlenderNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
else if (this->currentmode == NavigationStyle::DRAGGING) {
|
else if (this->currentmode == NavigationStyle::DRAGGING) {
|
||||||
this->addToLog(event->getPosition(), event->getTime());
|
this->addToLog(event->getPosition(), event->getTime());
|
||||||
this->spin(posn);
|
this->spin(posn);
|
||||||
|
moveCursorPosition();
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -338,6 +341,9 @@ SbBool BlenderNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
newmode = NavigationStyle::PANNING;
|
newmode = NavigationStyle::PANNING;
|
||||||
break;
|
break;
|
||||||
case BUTTON3DOWN:
|
case BUTTON3DOWN:
|
||||||
|
if (newmode != NavigationStyle::DRAGGING) {
|
||||||
|
saveCursorPosition(ev);
|
||||||
|
}
|
||||||
newmode = NavigationStyle::DRAGGING;
|
newmode = NavigationStyle::DRAGGING;
|
||||||
break;
|
break;
|
||||||
case CTRLDOWN|SHIFTDOWN|BUTTON2DOWN:
|
case CTRLDOWN|SHIFTDOWN|BUTTON2DOWN:
|
||||||
|
|
|
@ -210,6 +210,7 @@ SbBool CADNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
else if (press && (this->currentmode == NavigationStyle::PANNING ||
|
else if (press && (this->currentmode == NavigationStyle::PANNING ||
|
||||||
this->currentmode == NavigationStyle::ZOOMING)) {
|
this->currentmode == NavigationStyle::ZOOMING)) {
|
||||||
newmode = NavigationStyle::DRAGGING;
|
newmode = NavigationStyle::DRAGGING;
|
||||||
|
saveCursorPosition(ev);
|
||||||
this->centerTime = ev->getTime();
|
this->centerTime = ev->getTime();
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -250,6 +251,7 @@ SbBool CADNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
if (press && (this->currentmode == NavigationStyle::PANNING ||
|
if (press && (this->currentmode == NavigationStyle::PANNING ||
|
||||||
this->currentmode == NavigationStyle::ZOOMING)) {
|
this->currentmode == NavigationStyle::ZOOMING)) {
|
||||||
newmode = NavigationStyle::DRAGGING;
|
newmode = NavigationStyle::DRAGGING;
|
||||||
|
saveCursorPosition(ev);
|
||||||
this->centerTime = ev->getTime();
|
this->centerTime = ev->getTime();
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -314,6 +316,7 @@ SbBool CADNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
else if (this->currentmode == NavigationStyle::DRAGGING) {
|
else if (this->currentmode == NavigationStyle::DRAGGING) {
|
||||||
this->addToLog(event->getPosition(), event->getTime());
|
this->addToLog(event->getPosition(), event->getTime());
|
||||||
this->spin(posn);
|
this->spin(posn);
|
||||||
|
moveCursorPosition();
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -379,6 +382,9 @@ SbBool CADNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
newmode = NavigationStyle::PANNING;
|
newmode = NavigationStyle::PANNING;
|
||||||
break;
|
break;
|
||||||
case SHIFTDOWN|BUTTON2DOWN:
|
case SHIFTDOWN|BUTTON2DOWN:
|
||||||
|
if (newmode != NavigationStyle::DRAGGING) {
|
||||||
|
saveCursorPosition(ev);
|
||||||
|
}
|
||||||
newmode = NavigationStyle::DRAGGING;
|
newmode = NavigationStyle::DRAGGING;
|
||||||
break;
|
break;
|
||||||
case CTRLDOWN|SHIFTDOWN|BUTTON2DOWN:
|
case CTRLDOWN|SHIFTDOWN|BUTTON2DOWN:
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
add_definitions(-DFCGui -DQIIS_MAKEDLL)
|
add_definitions(-DFCGui -DQIIS_MAKEDLL)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
if (FREECAD_USE_3DCONNEXION)
|
||||||
|
add_definitions(-D_USE_3DCONNEXION_SDK)
|
||||||
|
endif(FREECAD_USE_3DCONNEXION)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
@ -78,6 +81,17 @@ SET(FreeCADGui_XML_SRCS
|
||||||
)
|
)
|
||||||
SOURCE_GROUP("XML" FILES ${FreeCADApp_XML_SRCS})
|
SOURCE_GROUP("XML" FILES ${FreeCADApp_XML_SRCS})
|
||||||
|
|
||||||
|
# The 3D Connexion SDK files
|
||||||
|
if(FREECAD_USE_3DCONNEXION)
|
||||||
|
SET(FreeCADGui_SDK_SRCS
|
||||||
|
3Dconnexion/I3dMouseParams.h
|
||||||
|
3Dconnexion/MouseParameters.cpp
|
||||||
|
3Dconnexion/MouseParameters.h
|
||||||
|
3Dconnexion/GuiApplicationNativeEventAwareWin32.cpp
|
||||||
|
)
|
||||||
|
SOURCE_GROUP("3D connexion SDK" FILES ${FreeCADGui_SDK_SRCS})
|
||||||
|
endif(FREECAD_USE_3DCONNEXION)
|
||||||
|
|
||||||
set(Gui_MOC_HDRS
|
set(Gui_MOC_HDRS
|
||||||
Action.h
|
Action.h
|
||||||
CallTips.h
|
CallTips.h
|
||||||
|
@ -769,6 +783,7 @@ SET(FreeCADGui_SRCS
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(FreeCADGui_SRCS
|
SET(FreeCADGui_SRCS
|
||||||
|
${FreeCADGui_SDK_SRCS}
|
||||||
${FreeCADGui_CPP_SRCS}
|
${FreeCADGui_CPP_SRCS}
|
||||||
${FreeCADGui_XML_SRCS}
|
${FreeCADGui_XML_SRCS}
|
||||||
${iis_MOC_SRCS}
|
${iis_MOC_SRCS}
|
||||||
|
|
|
@ -64,6 +64,8 @@ CombiView::CombiView(Gui::Document* pcDocument, QWidget *parent)
|
||||||
// tree widget
|
// tree widget
|
||||||
tree = new TreeWidget(this);
|
tree = new TreeWidget(this);
|
||||||
//tree->setRootIsDecorated(false);
|
//tree->setRootIsDecorated(false);
|
||||||
|
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/TreeView");
|
||||||
|
tree->setIndentation(hGrp->GetInt("Indentation", tree->indentation()));
|
||||||
splitter->addWidget(tree);
|
splitter->addWidget(tree);
|
||||||
|
|
||||||
// property view
|
// property view
|
||||||
|
|
|
@ -281,6 +281,9 @@ void Command::invoke(int i)
|
||||||
if (isActive())
|
if (isActive())
|
||||||
activated( i );
|
activated( i );
|
||||||
}
|
}
|
||||||
|
catch (const Base::SystemExitException&) {
|
||||||
|
throw;
|
||||||
|
}
|
||||||
catch (Base::PyException &e) {
|
catch (Base::PyException &e) {
|
||||||
e.ReportException();
|
e.ReportException();
|
||||||
Base::Console().Error("Stack Trace: %s\n",e.getStackTrace().c_str());
|
Base::Console().Error("Stack Trace: %s\n",e.getStackTrace().c_str());
|
||||||
|
|
|
@ -24,12 +24,21 @@
|
||||||
#include "PreCompiled.h"
|
#include "PreCompiled.h"
|
||||||
#ifndef _PreComp_
|
#ifndef _PreComp_
|
||||||
# include <QClipboard>
|
# include <QClipboard>
|
||||||
|
# include <QEventLoop>
|
||||||
|
# include <QFileDialog>
|
||||||
|
# include <QGraphicsScene>
|
||||||
|
# include <QGraphicsView>
|
||||||
|
# include <QLabel>
|
||||||
# include <QStatusBar>
|
# include <QStatusBar>
|
||||||
# include <QPointer>
|
# include <QPointer>
|
||||||
|
# include <QProcess>
|
||||||
|
# include <sstream>
|
||||||
|
# include <Inventor/nodes/SoCamera.h>
|
||||||
#endif
|
#endif
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include <Base/Exception.h>
|
#include <Base/Exception.h>
|
||||||
|
#include <Base/FileInfo.h>
|
||||||
#include <Base/Interpreter.h>
|
#include <Base/Interpreter.h>
|
||||||
#include <Base/Sequencer.h>
|
#include <Base/Sequencer.h>
|
||||||
#include <App/Document.h>
|
#include <App/Document.h>
|
||||||
|
@ -192,6 +201,11 @@ void StdCmdImport::activated(int iMsg)
|
||||||
getActiveGuiDocument()->getDocument()->getName(),
|
getActiveGuiDocument()->getDocument()->getName(),
|
||||||
it.value().toAscii());
|
it.value().toAscii());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::list<Gui::MDIView*> views = getActiveGuiDocument()->getMDIViewsOfType(Gui::View3DInventor::getClassTypeId());
|
||||||
|
for (std::list<MDIView*>::iterator it = views.begin(); it != views.end(); ++it) {
|
||||||
|
(*it)->viewAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StdCmdImport::isActive(void)
|
bool StdCmdImport::isActive(void)
|
||||||
|
@ -279,9 +293,9 @@ StdCmdMergeProjects::StdCmdMergeProjects()
|
||||||
|
|
||||||
void StdCmdMergeProjects::activated(int iMsg)
|
void StdCmdMergeProjects::activated(int iMsg)
|
||||||
{
|
{
|
||||||
QString exe = QString::fromUtf8(App::GetApplication().getExecutableName());
|
QString exe = qApp->applicationName();
|
||||||
QString project = QFileDialog::getOpenFileName(Gui::getMainWindow(),
|
QString project = QFileDialog::getOpenFileName(Gui::getMainWindow(),
|
||||||
QString::fromUtf8(QT_TR_NOOP("Merge project")), QString(),
|
QString::fromUtf8(QT_TR_NOOP("Merge project")), QDir::homePath(),
|
||||||
QString::fromUtf8(QT_TR_NOOP("%1 document (*.fcstd)")).arg(exe));
|
QString::fromUtf8(QT_TR_NOOP("%1 document (*.fcstd)")).arg(exe));
|
||||||
if (!project.isEmpty()) {
|
if (!project.isEmpty()) {
|
||||||
App::Document* doc = App::GetApplication().getActiveDocument();
|
App::Document* doc = App::GetApplication().getActiveDocument();
|
||||||
|
@ -294,9 +308,6 @@ void StdCmdMergeProjects::activated(int iMsg)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString dir1 = proj.absoluteDir().filePath(proj.baseName());
|
|
||||||
QString dir2 = info.absoluteDir().filePath(info.baseName());
|
|
||||||
|
|
||||||
Base::FileInfo fi((const char*)project.toUtf8());
|
Base::FileInfo fi((const char*)project.toUtf8());
|
||||||
Base::ifstream str(fi, std::ios::in | std::ios::binary);
|
Base::ifstream str(fi, std::ios::in | std::ios::binary);
|
||||||
MergeDocuments md(doc);
|
MergeDocuments md(doc);
|
||||||
|
@ -309,6 +320,120 @@ bool StdCmdMergeProjects::isActive(void)
|
||||||
return this->hasActiveDocument();
|
return this->hasActiveDocument();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// Std_ExportGraphviz
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
namespace Gui {
|
||||||
|
class ImageView : public MDIView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ImageView(const QPixmap& p, QWidget* parent=0) : MDIView(0, parent)
|
||||||
|
{
|
||||||
|
scene = new QGraphicsScene();
|
||||||
|
scene->addPixmap(p);
|
||||||
|
view = new QGraphicsView(scene, this);
|
||||||
|
view->show();
|
||||||
|
setCentralWidget(view);
|
||||||
|
}
|
||||||
|
~ImageView()
|
||||||
|
{
|
||||||
|
delete scene;
|
||||||
|
delete view;
|
||||||
|
}
|
||||||
|
QGraphicsScene* scene;
|
||||||
|
QGraphicsView* view;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
DEF_STD_CMD_A(StdCmdExportGraphviz);
|
||||||
|
|
||||||
|
StdCmdExportGraphviz::StdCmdExportGraphviz()
|
||||||
|
: Command("Std_ExportGraphviz")
|
||||||
|
{
|
||||||
|
// seting the
|
||||||
|
sGroup = QT_TR_NOOP("Tools");
|
||||||
|
sMenuText = QT_TR_NOOP("Dependency graph...");
|
||||||
|
sToolTipText = QT_TR_NOOP("Show the dependency graph of the objects in the active document");
|
||||||
|
sStatusTip = QT_TR_NOOP("Show the dependency graph of the objects in the active document");
|
||||||
|
sWhatsThis = "Std_ExportGraphviz";
|
||||||
|
eType = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StdCmdExportGraphviz::activated(int iMsg)
|
||||||
|
{
|
||||||
|
App::Document* doc = App::GetApplication().getActiveDocument();
|
||||||
|
std::stringstream str;
|
||||||
|
doc->exportGraphviz(str);
|
||||||
|
|
||||||
|
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Paths");
|
||||||
|
QProcess proc;
|
||||||
|
QStringList args;
|
||||||
|
args << QLatin1String("-Tpng");
|
||||||
|
#ifdef FC_OS_LINUX
|
||||||
|
QString path = QString::fromUtf8(hGrp->GetASCII("Graphviz", "/usr/bin").c_str());
|
||||||
|
#else
|
||||||
|
QString path = QString::fromUtf8(hGrp->GetASCII("Graphviz").c_str());
|
||||||
|
#endif
|
||||||
|
bool pathChanged = false;
|
||||||
|
#ifdef FC_OS_WIN32
|
||||||
|
QString exe = QString::fromAscii("\"%1/dot\"").arg(path);
|
||||||
|
#else
|
||||||
|
QString exe = QString::fromAscii("%1/dot").arg(path);
|
||||||
|
#endif
|
||||||
|
proc.setEnvironment(QProcess::systemEnvironment());
|
||||||
|
do {
|
||||||
|
proc.start(exe, args);
|
||||||
|
if (!proc.waitForStarted()) {
|
||||||
|
int ret = QMessageBox::warning(getMainWindow(),
|
||||||
|
qApp->translate("Std_ExportGraphviz","Graphviz not found"),
|
||||||
|
qApp->translate("Std_ExportGraphviz","Graphviz couldn't be found on your system.\n"
|
||||||
|
"Do you want to specify its installation path if it's already installed?"),
|
||||||
|
QMessageBox::Yes, QMessageBox::No);
|
||||||
|
if (ret == QMessageBox::No)
|
||||||
|
return;
|
||||||
|
path = QFileDialog::getExistingDirectory(Gui::getMainWindow(),
|
||||||
|
qApp->translate("Std_ExportGraphviz","Graphviz installation path"));
|
||||||
|
if (path.isEmpty())
|
||||||
|
return;
|
||||||
|
pathChanged = true;
|
||||||
|
#ifdef FC_OS_WIN32
|
||||||
|
exe = QString::fromAscii("\"%1/dot\"").arg(path);
|
||||||
|
#else
|
||||||
|
exe = QString::fromAscii("%1/dot").arg(path);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (pathChanged)
|
||||||
|
hGrp->SetASCII("Graphviz", (const char*)path.toUtf8());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(true);
|
||||||
|
|
||||||
|
proc.write(str.str().c_str(), str.str().size());
|
||||||
|
proc.closeWriteChannel();
|
||||||
|
if (!proc.waitForFinished())
|
||||||
|
return;
|
||||||
|
|
||||||
|
QPixmap px;
|
||||||
|
if (px.loadFromData(proc.readAll(), "PNG")) {
|
||||||
|
Gui::ImageView* view = new Gui::ImageView(px);
|
||||||
|
view->setWindowTitle(qApp->translate("Std_ExportGraphviz","Dependency graph"));
|
||||||
|
getMainWindow()->addWindow(view);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QMessageBox::warning(getMainWindow(),
|
||||||
|
qApp->translate("Std_ExportGraphviz","Graphviz failed"),
|
||||||
|
qApp->translate("Std_ExportGraphviz","Graphviz failed to create an image file"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StdCmdExportGraphviz::isActive(void)
|
||||||
|
{
|
||||||
|
return (getActiveGuiDocument() ? true : false);
|
||||||
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Std_New
|
// Std_New
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -769,9 +894,9 @@ bool StdCmdPaste::isActive(void)
|
||||||
return getMainWindow()->canInsertFromMimeData(mime);
|
return getMainWindow()->canInsertFromMimeData(mime);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEF_STD_CMD_A(StdCmdDDuplicateSelection);
|
DEF_STD_CMD_A(StdCmdDuplicateSelection);
|
||||||
|
|
||||||
StdCmdDDuplicateSelection::StdCmdDDuplicateSelection()
|
StdCmdDuplicateSelection::StdCmdDuplicateSelection()
|
||||||
:Command("Std_DuplicateSelection")
|
:Command("Std_DuplicateSelection")
|
||||||
{
|
{
|
||||||
sAppModule = "Edit";
|
sAppModule = "Edit";
|
||||||
|
@ -782,7 +907,7 @@ StdCmdDDuplicateSelection::StdCmdDDuplicateSelection()
|
||||||
sStatusTip = QT_TR_NOOP("Put duplicates of the selected objects to the active document");
|
sStatusTip = QT_TR_NOOP("Put duplicates of the selected objects to the active document");
|
||||||
}
|
}
|
||||||
|
|
||||||
void StdCmdDDuplicateSelection::activated(int iMsg)
|
void StdCmdDuplicateSelection::activated(int iMsg)
|
||||||
{
|
{
|
||||||
App::Document* act = App::GetApplication().getActiveDocument();
|
App::Document* act = App::GetApplication().getActiveDocument();
|
||||||
if (!act)
|
if (!act)
|
||||||
|
@ -839,7 +964,7 @@ void StdCmdDDuplicateSelection::activated(int iMsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StdCmdDDuplicateSelection::isActive(void)
|
bool StdCmdDuplicateSelection::isActive(void)
|
||||||
{
|
{
|
||||||
return Gui::Selection().hasSelection();
|
return Gui::Selection().hasSelection();
|
||||||
}
|
}
|
||||||
|
@ -1052,16 +1177,27 @@ void StdCmdAlignment::activated(int iMsg)
|
||||||
model.addGroups(groupMap);
|
model.addGroups(groupMap);
|
||||||
align->setModel(model);
|
align->setModel(model);
|
||||||
Base::Type style = Base::Type::fromName("Gui::CADNavigationStyle");
|
Base::Type style = Base::Type::fromName("Gui::CADNavigationStyle");
|
||||||
|
Base::Vector3d upDir(0,1,0), viewDir(0,0,-1);
|
||||||
Gui::Document* doc = Application::Instance->activeDocument();
|
Gui::Document* doc = Application::Instance->activeDocument();
|
||||||
if (doc) {
|
if (doc) {
|
||||||
View3DInventor* mdi = qobject_cast<View3DInventor*>(doc->getActiveView());
|
View3DInventor* mdi = qobject_cast<View3DInventor*>(doc->getActiveView());
|
||||||
if (mdi) {
|
if (mdi) {
|
||||||
style = mdi->getViewer()->navigationStyle()->getTypeId();
|
View3DInventorViewer* viewer = mdi->getViewer();
|
||||||
|
SoCamera* camera = viewer->getCamera();
|
||||||
|
if (camera) {
|
||||||
|
SbVec3f up(0,1,0), dir(0,0,-1);
|
||||||
|
camera->orientation.getValue().multVec(dir, dir);
|
||||||
|
viewDir.Set(dir[0],dir[1],dir[2]);
|
||||||
|
camera->orientation.getValue().multVec(up, up);
|
||||||
|
upDir.Set(up[0],up[1],up[2]);
|
||||||
|
}
|
||||||
|
style = viewer->navigationStyle()->getTypeId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
align->setMinPoints(1);
|
align->setMinPoints(1);
|
||||||
align->startAlignment(style);
|
align->startAlignment(style);
|
||||||
|
align->setViewingDirections(viewDir,upDir, viewDir,upDir);
|
||||||
Gui::Selection().clearSelection();
|
Gui::Selection().clearSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1081,7 +1217,7 @@ StdCmdEdit::StdCmdEdit()
|
||||||
:Command("Std_Edit")
|
:Command("Std_Edit")
|
||||||
{
|
{
|
||||||
sGroup = QT_TR_NOOP("Edit");
|
sGroup = QT_TR_NOOP("Edit");
|
||||||
sMenuText = QT_TR_NOOP("Toggle &Editmode");
|
sMenuText = QT_TR_NOOP("Toggle &Edit mode");
|
||||||
sToolTipText = QT_TR_NOOP("Toggles the selected object's edit mode");
|
sToolTipText = QT_TR_NOOP("Toggles the selected object's edit mode");
|
||||||
sWhatsThis = "Std_Edit";
|
sWhatsThis = "Std_Edit";
|
||||||
sStatusTip = QT_TR_NOOP("Enters or leaves the selected object's edit mode");
|
sStatusTip = QT_TR_NOOP("Enters or leaves the selected object's edit mode");
|
||||||
|
@ -1124,6 +1260,7 @@ void CreateDocCommands(void)
|
||||||
rcCmdMgr.addCommand(new StdCmdImport());
|
rcCmdMgr.addCommand(new StdCmdImport());
|
||||||
rcCmdMgr.addCommand(new StdCmdExport());
|
rcCmdMgr.addCommand(new StdCmdExport());
|
||||||
rcCmdMgr.addCommand(new StdCmdMergeProjects());
|
rcCmdMgr.addCommand(new StdCmdMergeProjects());
|
||||||
|
rcCmdMgr.addCommand(new StdCmdExportGraphviz());
|
||||||
|
|
||||||
rcCmdMgr.addCommand(new StdCmdSave());
|
rcCmdMgr.addCommand(new StdCmdSave());
|
||||||
rcCmdMgr.addCommand(new StdCmdSaveAs());
|
rcCmdMgr.addCommand(new StdCmdSaveAs());
|
||||||
|
@ -1138,7 +1275,7 @@ void CreateDocCommands(void)
|
||||||
rcCmdMgr.addCommand(new StdCmdCut());
|
rcCmdMgr.addCommand(new StdCmdCut());
|
||||||
rcCmdMgr.addCommand(new StdCmdCopy());
|
rcCmdMgr.addCommand(new StdCmdCopy());
|
||||||
rcCmdMgr.addCommand(new StdCmdPaste());
|
rcCmdMgr.addCommand(new StdCmdPaste());
|
||||||
rcCmdMgr.addCommand(new StdCmdDDuplicateSelection());
|
rcCmdMgr.addCommand(new StdCmdDuplicateSelection());
|
||||||
rcCmdMgr.addCommand(new StdCmdSelectAll());
|
rcCmdMgr.addCommand(new StdCmdSelectAll());
|
||||||
rcCmdMgr.addCommand(new StdCmdDelete());
|
rcCmdMgr.addCommand(new StdCmdDelete());
|
||||||
rcCmdMgr.addCommand(new StdCmdRefresh());
|
rcCmdMgr.addCommand(new StdCmdRefresh());
|
||||||
|
|
|
@ -193,13 +193,7 @@ Action * StdCmdAbout::createAction(void)
|
||||||
{
|
{
|
||||||
Action *pcAction;
|
Action *pcAction;
|
||||||
|
|
||||||
QString exe;
|
QString exe = qApp->applicationName();
|
||||||
std::map<std::string,std::string>& cfg = App::Application::Config();
|
|
||||||
std::map<std::string,std::string>::iterator it = cfg.find("Application");
|
|
||||||
if (it != cfg.end())
|
|
||||||
exe = QString::fromUtf8(it->second.c_str());
|
|
||||||
else
|
|
||||||
exe = QString::fromUtf8(App::GetApplication().getExecutableName());
|
|
||||||
pcAction = new Action(this,getMainWindow());
|
pcAction = new Action(this,getMainWindow());
|
||||||
pcAction->setText(QCoreApplication::translate(
|
pcAction->setText(QCoreApplication::translate(
|
||||||
this->className(), sMenuText, 0,
|
this->className(), sMenuText, 0,
|
||||||
|
@ -235,13 +229,7 @@ void StdCmdAbout::activated(int iMsg)
|
||||||
void StdCmdAbout::languageChange()
|
void StdCmdAbout::languageChange()
|
||||||
{
|
{
|
||||||
if (_pcAction) {
|
if (_pcAction) {
|
||||||
QString exe;
|
QString exe = qApp->applicationName();
|
||||||
std::map<std::string,std::string>& cfg = App::Application::Config();
|
|
||||||
std::map<std::string,std::string>::iterator it = cfg.find("Application");
|
|
||||||
if (it != cfg.end())
|
|
||||||
exe = QString::fromUtf8(it->second.c_str());
|
|
||||||
else
|
|
||||||
exe = QString::fromUtf8(App::GetApplication().getExecutableName());
|
|
||||||
_pcAction->setText(QCoreApplication::translate(
|
_pcAction->setText(QCoreApplication::translate(
|
||||||
this->className(), sMenuText, 0,
|
this->className(), sMenuText, 0,
|
||||||
QCoreApplication::CodecForTr).arg(exe));
|
QCoreApplication::CodecForTr).arg(exe));
|
||||||
|
@ -588,7 +576,7 @@ void CreateStdCommands(void)
|
||||||
rcCmdMgr.addCommand(new StdCmdOnlineHelpWebsite());
|
rcCmdMgr.addCommand(new StdCmdOnlineHelpWebsite());
|
||||||
rcCmdMgr.addCommand(new StdCmdFreeCADWebsite());
|
rcCmdMgr.addCommand(new StdCmdFreeCADWebsite());
|
||||||
rcCmdMgr.addCommand(new StdCmdPythonWebsite());
|
rcCmdMgr.addCommand(new StdCmdPythonWebsite());
|
||||||
rcCmdMgr.addCommand(new StdCmdMeasurementSimple());
|
//rcCmdMgr.addCommand(new StdCmdMeasurementSimple());
|
||||||
//rcCmdMgr.addCommand(new StdCmdDownloadOnlineHelp());
|
//rcCmdMgr.addCommand(new StdCmdDownloadOnlineHelp());
|
||||||
//rcCmdMgr.addCommand(new StdCmdDescription());
|
//rcCmdMgr.addCommand(new StdCmdDescription());
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,8 @@
|
||||||
#include "SceneInspector.h"
|
#include "SceneInspector.h"
|
||||||
#include "DemoMode.h"
|
#include "DemoMode.h"
|
||||||
#include "TextureMapping.h"
|
#include "TextureMapping.h"
|
||||||
|
#include "Utilities.h"
|
||||||
|
#include "NavigationStyle.h"
|
||||||
|
|
||||||
#include <Base/Console.h>
|
#include <Base/Console.h>
|
||||||
#include <Base/Exception.h>
|
#include <Base/Exception.h>
|
||||||
|
@ -450,6 +452,7 @@ void StdCmdFreezeViews::languageChange()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Std_ToggleClipPlane
|
// Std_ToggleClipPlane
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -520,8 +523,8 @@ Gui::Action * StdCmdDrawStyle::createAction(void)
|
||||||
pcAction->setDropDownMenu(true);
|
pcAction->setDropDownMenu(true);
|
||||||
applyCommandData(pcAction);
|
applyCommandData(pcAction);
|
||||||
|
|
||||||
QAction* a0 = pcAction->addAction(QString());
|
pcAction->addAction(QString());
|
||||||
QAction* a1 = pcAction->addAction(QString());
|
pcAction->addAction(QString());
|
||||||
_pcAction = pcAction;
|
_pcAction = pcAction;
|
||||||
languageChange();
|
languageChange();
|
||||||
return pcAction;
|
return pcAction;
|
||||||
|
@ -1171,7 +1174,7 @@ StdViewDockUndockFullscreen::StdViewDockUndockFullscreen()
|
||||||
: Command("Std_ViewDockUndockFullscreen")
|
: Command("Std_ViewDockUndockFullscreen")
|
||||||
{
|
{
|
||||||
sGroup = QT_TR_NOOP("Standard-View");
|
sGroup = QT_TR_NOOP("Standard-View");
|
||||||
sMenuText = QT_TR_NOOP("Display mode");
|
sMenuText = QT_TR_NOOP("Document window");
|
||||||
sToolTipText= QT_TR_NOOP("Display the active view either in fullscreen, in undocked or docked mode");
|
sToolTipText= QT_TR_NOOP("Display the active view either in fullscreen, in undocked or docked mode");
|
||||||
sWhatsThis = "Std_ViewDockUndockFullscreen";
|
sWhatsThis = "Std_ViewDockUndockFullscreen";
|
||||||
sStatusTip = QT_TR_NOOP("Display the active view either in fullscreen, in undocked or docked mode");
|
sStatusTip = QT_TR_NOOP("Display the active view either in fullscreen, in undocked or docked mode");
|
||||||
|
@ -1816,13 +1819,7 @@ void StdViewZoomIn::activated(int iMsg)
|
||||||
View3DInventor* view = qobject_cast<View3DInventor*>(getMainWindow()->activeWindow());
|
View3DInventor* view = qobject_cast<View3DInventor*>(getMainWindow()->activeWindow());
|
||||||
if ( view ) {
|
if ( view ) {
|
||||||
View3DInventorViewer* viewer = view->getViewer();
|
View3DInventorViewer* viewer = view->getViewer();
|
||||||
|
viewer->navigationStyle()->zoomIn();
|
||||||
// send an event to the GL widget to use the internal View3DInventorViewer::zoom() method
|
|
||||||
// do only one step to zoom in
|
|
||||||
SoMouseButtonEvent e;
|
|
||||||
e.setButton(SoMouseButtonEvent::BUTTON5);
|
|
||||||
e.setState(SoMouseButtonEvent::DOWN);
|
|
||||||
viewer->sendSoEvent(&e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1856,12 +1853,7 @@ void StdViewZoomOut::activated(int iMsg)
|
||||||
View3DInventor* view = qobject_cast<View3DInventor*>(getMainWindow()->activeWindow());
|
View3DInventor* view = qobject_cast<View3DInventor*>(getMainWindow()->activeWindow());
|
||||||
if (view) {
|
if (view) {
|
||||||
View3DInventorViewer* viewer = view->getViewer();
|
View3DInventorViewer* viewer = view->getViewer();
|
||||||
// send an event to the GL widget to use the internal View3DInventorViewer::zoom() method
|
viewer->navigationStyle()->zoomOut();
|
||||||
// do only one step to zoom out
|
|
||||||
SoMouseButtonEvent e;
|
|
||||||
e.setButton(SoMouseButtonEvent::BUTTON4);
|
|
||||||
e.setState(SoMouseButtonEvent::DOWN);
|
|
||||||
viewer->sendSoEvent(&e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1900,6 +1892,83 @@ void StdViewBoxZoom::activated(int iMsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
// Std_BoxSelection
|
||||||
|
//===========================================================================
|
||||||
|
DEF_3DV_CMD(StdBoxSelection);
|
||||||
|
|
||||||
|
StdBoxSelection::StdBoxSelection()
|
||||||
|
: Command("Std_BoxSelection")
|
||||||
|
{
|
||||||
|
sGroup = QT_TR_NOOP("Standard-View");
|
||||||
|
sMenuText = QT_TR_NOOP("Box selection");
|
||||||
|
sToolTipText = QT_TR_NOOP("Box selection");
|
||||||
|
sWhatsThis = "Std_ViewBoxZoom";
|
||||||
|
sStatusTip = QT_TR_NOOP("Box selection");
|
||||||
|
#if QT_VERSION >= 0x040200
|
||||||
|
sPixmap = "edit-select-box";
|
||||||
|
#endif
|
||||||
|
sAccel = "Shift+B";
|
||||||
|
eType = AlterSelection;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void selectionCallback(void * ud, SoEventCallback * cb)
|
||||||
|
{
|
||||||
|
Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(cb->getUserData());
|
||||||
|
view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), selectionCallback, ud);
|
||||||
|
std::vector<SbVec2f> picked = view->getGLPolygon();
|
||||||
|
SoCamera* cam = view->getCamera();
|
||||||
|
SbViewVolume vv = cam->getViewVolume();
|
||||||
|
Gui::ViewVolumeProjection proj(vv);
|
||||||
|
Base::Polygon2D polygon;
|
||||||
|
if (picked.size() == 2) {
|
||||||
|
SbVec2f pt1 = picked[0];
|
||||||
|
SbVec2f pt2 = picked[1];
|
||||||
|
polygon.Add(Base::Vector2D(pt1[0], pt1[1]));
|
||||||
|
polygon.Add(Base::Vector2D(pt1[0], pt2[1]));
|
||||||
|
polygon.Add(Base::Vector2D(pt2[0], pt2[1]));
|
||||||
|
polygon.Add(Base::Vector2D(pt2[0], pt1[1]));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (std::vector<SbVec2f>::const_iterator it = picked.begin(); it != picked.end(); ++it)
|
||||||
|
polygon.Add(Base::Vector2D((*it)[0],(*it)[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
App::Document* doc = App::GetApplication().getActiveDocument();
|
||||||
|
if (doc) {
|
||||||
|
cb->setHandled();
|
||||||
|
std::vector<App::GeoFeature*> geom = doc->getObjectsOfType<App::GeoFeature>();
|
||||||
|
for (std::vector<App::GeoFeature*>::iterator it = geom.begin(); it != geom.end(); ++it) {
|
||||||
|
std::vector<App::Property*> props;
|
||||||
|
(*it)->getPropertyList(props);
|
||||||
|
for (std::vector<App::Property*>::iterator jt = props.begin(); jt != props.end(); ++jt) {
|
||||||
|
if ((*jt)->isDerivedFrom(App::PropertyGeometry::getClassTypeId())) {
|
||||||
|
App::PropertyGeometry* prop = static_cast<App::PropertyGeometry*>(*jt);
|
||||||
|
Base::BoundBox3d bbox = prop->getBoundingBox();
|
||||||
|
Base::Vector3d pt2d;
|
||||||
|
pt2d = proj(bbox.CalcCenter());
|
||||||
|
if (polygon.Contains(Base::Vector2D(pt2d.x, pt2d.y))) {
|
||||||
|
Gui::Selection().addSelection(doc->getName(), (*it)->getNameInDocument());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StdBoxSelection::activated(int iMsg)
|
||||||
|
{
|
||||||
|
View3DInventor* view = qobject_cast<View3DInventor*>(getMainWindow()->activeWindow());
|
||||||
|
if ( view ) {
|
||||||
|
View3DInventorViewer* viewer = view->getViewer();
|
||||||
|
if (!viewer->isSelecting()) {
|
||||||
|
viewer->startSelection(View3DInventorViewer::Rectangle);
|
||||||
|
viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), selectionCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Std_TreeSelection
|
// Std_TreeSelection
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -2113,6 +2182,7 @@ void CreateViewStdCommands(void)
|
||||||
rcCmdMgr.addCommand(new StdViewZoomIn());
|
rcCmdMgr.addCommand(new StdViewZoomIn());
|
||||||
rcCmdMgr.addCommand(new StdViewZoomOut());
|
rcCmdMgr.addCommand(new StdViewZoomOut());
|
||||||
rcCmdMgr.addCommand(new StdViewBoxZoom());
|
rcCmdMgr.addCommand(new StdViewBoxZoom());
|
||||||
|
rcCmdMgr.addCommand(new StdBoxSelection());
|
||||||
rcCmdMgr.addCommand(new StdCmdTreeSelection());
|
rcCmdMgr.addCommand(new StdCmdTreeSelection());
|
||||||
rcCmdMgr.addCommand(new StdCmdMeasureDistance());
|
rcCmdMgr.addCommand(new StdCmdMeasureDistance());
|
||||||
rcCmdMgr.addCommand(new StdCmdSceneInspector());
|
rcCmdMgr.addCommand(new StdCmdSceneInspector());
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="textLabel1">
|
<widget class="QLabel" name="textLabel1">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Display mode:</string>
|
<string>Document window:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -175,12 +175,22 @@ void DlgGeneralImp::loadSettings()
|
||||||
ParameterGrp::handle hGrp = WindowParameter::getDefaultParameter()->GetGroup("General");
|
ParameterGrp::handle hGrp = WindowParameter::getDefaultParameter()->GetGroup("General");
|
||||||
QString lang = QLocale::languageToString(QLocale::system().language());
|
QString lang = QLocale::languageToString(QLocale::system().language());
|
||||||
QByteArray language = hGrp->GetASCII("Language", (const char*)lang.toAscii()).c_str();
|
QByteArray language = hGrp->GetASCII("Language", (const char*)lang.toAscii()).c_str();
|
||||||
Languages->addItem(Gui::Translator::tr("English"), QByteArray("English"));
|
|
||||||
int index = 1;
|
int index = 1;
|
||||||
TStringList list = Translator::instance()->supportedLanguages();
|
Languages->addItem(QString::fromAscii("English"), QByteArray("English"));
|
||||||
for (TStringList::iterator it = list.begin(); it != list.end(); ++it, index++) {
|
TStringMap list = Translator::instance()->supportedLocales();
|
||||||
QByteArray lang = it->c_str();
|
for (TStringMap::iterator it = list.begin(); it != list.end(); ++it, index++) {
|
||||||
Languages->addItem(Gui::Translator::tr(lang.constData()), lang);
|
QLocale locale(QString::fromAscii(it->second.c_str()));
|
||||||
|
QByteArray lang = it->first.c_str();
|
||||||
|
QString langname = QString::fromAscii(lang.constData());
|
||||||
|
#if QT_VERSION >= 0x040800
|
||||||
|
QString native = locale.nativeLanguageName();
|
||||||
|
if (!native.isEmpty()) {
|
||||||
|
if (native[0].isLetter())
|
||||||
|
native[0] = native[0].toUpper();
|
||||||
|
langname = native;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Languages->addItem(langname, lang);
|
||||||
if (language == lang) {
|
if (language == lang) {
|
||||||
Languages->setCurrentIndex(index);
|
Languages->setCurrentIndex(index);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#ifndef _PreComp_
|
#ifndef _PreComp_
|
||||||
# include <cstring>
|
# include <cstring>
|
||||||
# include <algorithm>
|
# include <algorithm>
|
||||||
|
# include <QDebug>
|
||||||
# include <QMessageBox>
|
# include <QMessageBox>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -89,6 +90,15 @@ void DlgPreferencesImp::setupPages()
|
||||||
}
|
}
|
||||||
fileName = std::string("preferences-") + fileName;
|
fileName = std::string("preferences-") + fileName;
|
||||||
QPixmap icon = Gui::BitmapFactory().pixmapFromSvg(fileName.c_str(), QSize(96,96));
|
QPixmap icon = Gui::BitmapFactory().pixmapFromSvg(fileName.c_str(), QSize(96,96));
|
||||||
|
if (icon.isNull()) {
|
||||||
|
icon = Gui::BitmapFactory().pixmap(fileName.c_str());
|
||||||
|
if (icon.isNull()) {
|
||||||
|
qWarning() << "No group icon found for " << fileName.c_str();
|
||||||
|
}
|
||||||
|
else if (icon.size() != QSize(96,96)) {
|
||||||
|
qWarning() << "Group icon for " << fileName.c_str() << " is not of size 96x96";
|
||||||
|
}
|
||||||
|
}
|
||||||
item->setIcon(icon);
|
item->setIcon(icon);
|
||||||
item->setTextAlignment(Qt::AlignHCenter);
|
item->setTextAlignment(Qt::AlignHCenter);
|
||||||
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
||||||
|
|
|
@ -1,45 +1,62 @@
|
||||||
<ui version="4.0" >
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<author></author>
|
<ui version="4.0">
|
||||||
<comment></comment>
|
|
||||||
<exportmacro></exportmacro>
|
|
||||||
<class>Gui::Dialog::DlgSettingsMacro</class>
|
<class>Gui::Dialog::DlgSettingsMacro</class>
|
||||||
<widget class="QWidget" name="Gui::Dialog::DlgSettingsMacro" >
|
<widget class="QWidget" name="Gui::Dialog::DlgSettingsMacro">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>384</width>
|
<width>391</width>
|
||||||
<height>388</height>
|
<height>407</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle" >
|
<property name="windowTitle">
|
||||||
<string>Macro</string>
|
<string>Macro</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" >
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
<property name="margin" >
|
<item row="0" column="0">
|
||||||
<number>9</number>
|
<widget class="QGroupBox" name="groupBox">
|
||||||
</property>
|
<property name="title">
|
||||||
<property name="spacing" >
|
<string>General macro settings</string>
|
||||||
<number>6</number>
|
</property>
|
||||||
</property>
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<item row="0" column="0" >
|
<item row="0" column="0">
|
||||||
<widget class="QGroupBox" name="GroupBox6" >
|
<widget class="Gui::PrefCheckBox" name="PrefCheckBox_LocalEnv">
|
||||||
<property name="title" >
|
<property name="text">
|
||||||
|
<string>Run macros in local environment</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="prefEntry" stdset="0">
|
||||||
|
<cstring>LocalEnvironment</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="prefPath" stdset="0">
|
||||||
|
<cstring>Macro</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QGroupBox" name="GroupBox6">
|
||||||
|
<property name="title">
|
||||||
<string>Macro recording settings</string>
|
<string>Macro recording settings</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" >
|
<layout class="QGridLayout">
|
||||||
<property name="margin" >
|
<property name="margin">
|
||||||
<number>9</number>
|
<number>9</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="3" column="0" >
|
<item row="3" column="0">
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" >
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
|
@ -47,56 +64,56 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0" >
|
<item row="2" column="0">
|
||||||
<widget class="QGroupBox" name="groupBox4" >
|
<widget class="QGroupBox" name="groupBox4">
|
||||||
<property name="title" >
|
<property name="title">
|
||||||
<string>Logging Commands</string>
|
<string>Logging Commands</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout">
|
||||||
<property name="margin" >
|
<property name="spacing">
|
||||||
<number>11</number>
|
|
||||||
</property>
|
|
||||||
<property name="spacing" >
|
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>11</number>
|
||||||
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="Gui::PrefCheckBox" name="PConsoleCheckBox" >
|
<widget class="Gui::PrefCheckBox" name="PConsoleCheckBox">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Show script commands in python console</string>
|
<string>Show script commands in python console</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked" >
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefEntry" stdset="0" >
|
<property name="prefEntry" stdset="0">
|
||||||
<cstring>ScriptToPyConsole</cstring>
|
<cstring>ScriptToPyConsole</cstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefPath" stdset="0" >
|
<property name="prefPath" stdset="0">
|
||||||
<cstring>Macro</cstring>
|
<cstring>Macro</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="Gui::PrefCheckBox" name="FileLogCheckBox" >
|
<widget class="Gui::PrefCheckBox" name="FileLogCheckBox">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Log all commands issued by menus to file:</string>
|
<string>Log all commands issued by menus to file:</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefEntry" stdset="0" >
|
<property name="prefEntry" stdset="0">
|
||||||
<cstring>ScriptToFile</cstring>
|
<cstring>ScriptToFile</cstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefPath" stdset="0" >
|
<property name="prefPath" stdset="0">
|
||||||
<cstring>Macro</cstring>
|
<cstring>Macro</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="Gui::PrefFileChooser" name="MacroPath_2" >
|
<widget class="Gui::PrefFileChooser" name="MacroPath_2">
|
||||||
<property name="fileName" >
|
<property name="fileName">
|
||||||
<string>FullScript.FCScript</string>
|
<string>FullScript.FCScript</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefEntry" stdset="0" >
|
<property name="prefEntry" stdset="0">
|
||||||
<cstring>ScriptFile</cstring>
|
<cstring>ScriptFile</cstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefPath" stdset="0" >
|
<property name="prefPath" stdset="0">
|
||||||
<cstring>Macro</cstring>
|
<cstring>Macro</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -104,46 +121,46 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0" >
|
<item row="1" column="0">
|
||||||
<widget class="QGroupBox" name="GroupBox7" >
|
<widget class="QGroupBox" name="GroupBox7">
|
||||||
<property name="title" >
|
<property name="title">
|
||||||
<string>Gui commands</string>
|
<string>Gui commands</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" >
|
<layout class="QGridLayout">
|
||||||
<property name="margin" >
|
<property name="margin">
|
||||||
<number>11</number>
|
<number>11</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0" >
|
<item row="0" column="0">
|
||||||
<widget class="Gui::PrefCheckBox" name="PrefCheckBox_RecordGui" >
|
<widget class="Gui::PrefCheckBox" name="PrefCheckBox_RecordGui">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Recording GUI commands</string>
|
<string>Recording GUI commands</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked" >
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefEntry" stdset="0" >
|
<property name="prefEntry" stdset="0">
|
||||||
<cstring>RecordGui</cstring>
|
<cstring>RecordGui</cstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefPath" stdset="0" >
|
<property name="prefPath" stdset="0">
|
||||||
<cstring>Macro</cstring>
|
<cstring>Macro</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0" >
|
<item row="1" column="0">
|
||||||
<widget class="Gui::PrefCheckBox" name="PrefCheckBox_GuiAsComment" >
|
<widget class="Gui::PrefCheckBox" name="PrefCheckBox_GuiAsComment">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Record as comment</string>
|
<string>Record as comment</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked" >
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefEntry" stdset="0" >
|
<property name="prefEntry" stdset="0">
|
||||||
<cstring>GuiAsComment</cstring>
|
<cstring>GuiAsComment</cstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefPath" stdset="0" >
|
<property name="prefPath" stdset="0">
|
||||||
<cstring>Macro</cstring>
|
<cstring>Macro</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -151,27 +168,27 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" >
|
<item row="0" column="0">
|
||||||
<widget class="QGroupBox" name="GroupBox8" >
|
<widget class="QGroupBox" name="GroupBox8">
|
||||||
<property name="title" >
|
<property name="title">
|
||||||
<string>Macro path</string>
|
<string>Macro path</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" >
|
<layout class="QGridLayout">
|
||||||
<property name="margin" >
|
<property name="margin">
|
||||||
<number>11</number>
|
<number>11</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0" >
|
<item row="0" column="0">
|
||||||
<widget class="Gui::PrefFileChooser" name="MacroPath" >
|
<widget class="Gui::PrefFileChooser" name="MacroPath">
|
||||||
<property name="mode" >
|
<property name="mode">
|
||||||
<enum>Gui::FileChooser::Directory</enum>
|
<enum>Gui::FileChooser::Directory</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefEntry" stdset="0" >
|
<property name="prefEntry" stdset="0">
|
||||||
<cstring>MacroPath</cstring>
|
<cstring>MacroPath</cstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefPath" stdset="0" >
|
<property name="prefPath" stdset="0">
|
||||||
<cstring>Macro</cstring>
|
<cstring>Macro</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -184,21 +201,22 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11" />
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>Gui::PrefCheckBox</class>
|
<class>Gui::FileChooser</class>
|
||||||
<extends>QCheckBox</extends>
|
<extends>QWidget</extends>
|
||||||
<header>Gui/PrefWidgets.h</header>
|
<header>Gui/FileDialog.h</header>
|
||||||
<container>0</container>
|
|
||||||
<pixmap></pixmap>
|
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>Gui::PrefFileChooser</class>
|
<class>Gui::PrefFileChooser</class>
|
||||||
<extends>Gui::FileChooser</extends>
|
<extends>Gui::FileChooser</extends>
|
||||||
<header>Gui/PrefWidgets.h</header>
|
<header>Gui/PrefWidgets.h</header>
|
||||||
<container>0</container>
|
</customwidget>
|
||||||
<pixmap></pixmap>
|
<customwidget>
|
||||||
|
<class>Gui::PrefCheckBox</class>
|
||||||
|
<extends>QCheckBox</extends>
|
||||||
|
<header>Gui/PrefWidgets.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
@ -209,11 +227,11 @@
|
||||||
<receiver>PrefCheckBox_GuiAsComment</receiver>
|
<receiver>PrefCheckBox_GuiAsComment</receiver>
|
||||||
<slot>setEnabled(bool)</slot>
|
<slot>setEnabled(bool)</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel" >
|
<hint type="sourcelabel">
|
||||||
<x>20</x>
|
<x>20</x>
|
||||||
<y>20</y>
|
<y>20</y>
|
||||||
</hint>
|
</hint>
|
||||||
<hint type="destinationlabel" >
|
<hint type="destinationlabel">
|
||||||
<x>20</x>
|
<x>20</x>
|
||||||
<y>20</y>
|
<y>20</y>
|
||||||
</hint>
|
</hint>
|
||||||
|
|
|
@ -54,6 +54,7 @@ DlgSettingsMacroImp::~DlgSettingsMacroImp()
|
||||||
|
|
||||||
void DlgSettingsMacroImp::saveSettings()
|
void DlgSettingsMacroImp::saveSettings()
|
||||||
{
|
{
|
||||||
|
PrefCheckBox_LocalEnv->onSave();
|
||||||
MacroPath->onSave();
|
MacroPath->onSave();
|
||||||
PrefCheckBox_RecordGui->onSave();
|
PrefCheckBox_RecordGui->onSave();
|
||||||
PrefCheckBox_GuiAsComment->onSave();
|
PrefCheckBox_GuiAsComment->onSave();
|
||||||
|
@ -64,6 +65,7 @@ void DlgSettingsMacroImp::saveSettings()
|
||||||
|
|
||||||
void DlgSettingsMacroImp::loadSettings()
|
void DlgSettingsMacroImp::loadSettings()
|
||||||
{
|
{
|
||||||
|
PrefCheckBox_LocalEnv->onRestore();
|
||||||
MacroPath->onRestore();
|
MacroPath->onRestore();
|
||||||
PrefCheckBox_RecordGui->onRestore();
|
PrefCheckBox_RecordGui->onRestore();
|
||||||
PrefCheckBox_GuiAsComment->onRestore();
|
PrefCheckBox_GuiAsComment->onRestore();
|
||||||
|
|
|
@ -66,10 +66,14 @@ void DlgSettingsViewColor::saveSettings()
|
||||||
checkBoxSelection->onSave();
|
checkBoxSelection->onSave();
|
||||||
HighlightColor->onSave();
|
HighlightColor->onSave();
|
||||||
SelectionColor->onSave();
|
SelectionColor->onSave();
|
||||||
|
CursorTextColor->onSave();
|
||||||
EditedEdgeColor->onSave();
|
EditedEdgeColor->onSave();
|
||||||
EditedVertexColor->onSave();
|
EditedVertexColor->onSave();
|
||||||
ConstructionColor->onSave();
|
ConstructionColor->onSave();
|
||||||
FullyConstrainedColor->onSave();
|
FullyConstrainedColor->onSave();
|
||||||
|
DefaultShapeColor->onSave();
|
||||||
|
DefaultShapeLineColor->onSave();
|
||||||
|
DefaultShapeLineWidth->onSave();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DlgSettingsViewColor::loadSettings()
|
void DlgSettingsViewColor::loadSettings()
|
||||||
|
@ -85,10 +89,14 @@ void DlgSettingsViewColor::loadSettings()
|
||||||
checkBoxSelection->onRestore();
|
checkBoxSelection->onRestore();
|
||||||
HighlightColor->onRestore();
|
HighlightColor->onRestore();
|
||||||
SelectionColor->onRestore();
|
SelectionColor->onRestore();
|
||||||
|
CursorTextColor->onRestore();
|
||||||
EditedEdgeColor->onRestore();
|
EditedEdgeColor->onRestore();
|
||||||
EditedVertexColor->onRestore();
|
EditedVertexColor->onRestore();
|
||||||
ConstructionColor->onRestore();
|
ConstructionColor->onRestore();
|
||||||
FullyConstrainedColor->onRestore();
|
FullyConstrainedColor->onRestore();
|
||||||
|
DefaultShapeColor->onRestore();
|
||||||
|
DefaultShapeLineColor->onRestore();
|
||||||
|
DefaultShapeLineWidth->onRestore();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>601</width>
|
<width>601</width>
|
||||||
<height>407</height>
|
<height>445</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -361,7 +361,20 @@
|
||||||
<string>Default colors</string>
|
<string>Default colors</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="colgridLayout">
|
<layout class="QGridLayout" name="colgridLayout">
|
||||||
<item row="0" column="0">
|
<item row="2" column="1">
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
<layout class="QGridLayout" name="_2">
|
<layout class="QGridLayout" name="_2">
|
||||||
<property name="margin">
|
<property name="margin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
|
@ -369,7 +382,7 @@
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="0" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="label">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
|
@ -382,31 +395,31 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Edited vertex color</string>
|
<string>Edited vertex color</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Construction geometry</string>
|
<string>Construction geometry</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Fully constrained geometry</string>
|
<string>Fully constrained geometry</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="Gui::PrefColorButton" name="ConstructionColor">
|
<widget class="Gui::PrefColorButton" name="ConstructionColor">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>The color of construction geometry in editmode</string>
|
<string>The color of construction geometry in edit mode</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="color">
|
<property name="color">
|
||||||
<color>
|
<color>
|
||||||
|
@ -423,10 +436,10 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="Gui::PrefColorButton" name="FullyConstrainedColor">
|
<widget class="Gui::PrefColorButton" name="FullyConstrainedColor">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>The color of fully constrained geometry in editmode</string>
|
<string>The color of fully constrained geometry in edit mode</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="color">
|
<property name="color">
|
||||||
<color>
|
<color>
|
||||||
|
@ -443,7 +456,7 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="Gui::PrefColorButton" name="EditedVertexColor">
|
<widget class="Gui::PrefColorButton" name="EditedVertexColor">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>The color of vertices being edited</string>
|
<string>The color of vertices being edited</string>
|
||||||
|
@ -463,7 +476,7 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="Gui::PrefColorButton" name="EditedEdgeColor">
|
<widget class="Gui::PrefColorButton" name="EditedEdgeColor">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>The color of edges being edited</string>
|
<string>The color of edges being edited</string>
|
||||||
|
@ -483,20 +496,124 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Cursor text color</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="Gui::PrefColorButton" name="CursorTextColor">
|
||||||
|
<property name="color">
|
||||||
|
<color>
|
||||||
|
<red>0</red>
|
||||||
|
<green>0</green>
|
||||||
|
<blue>255</blue>
|
||||||
|
</color>
|
||||||
|
</property>
|
||||||
|
<property name="prefEntry" stdset="0">
|
||||||
|
<cstring>CursorTextColor</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="prefPath" stdset="0">
|
||||||
|
<cstring>View</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="0">
|
||||||
<spacer name="horizontalSpacer">
|
<layout class="QGridLayout" name="_1">
|
||||||
<property name="orientation">
|
<item row="0" column="0">
|
||||||
<enum>Qt::Horizontal</enum>
|
<widget class="QLabel" name="label_6">
|
||||||
</property>
|
<property name="minimumSize">
|
||||||
<property name="sizeHint" stdset="0">
|
<size>
|
||||||
<size>
|
<width>240</width>
|
||||||
<width>40</width>
|
<height>0</height>
|
||||||
<height>20</height>
|
</size>
|
||||||
</size>
|
</property>
|
||||||
</property>
|
<property name="text">
|
||||||
</spacer>
|
<string>Default shape color</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="Gui::PrefColorButton" name="DefaultShapeColor">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>The default color for new shapes</string>
|
||||||
|
</property>
|
||||||
|
<property name="color">
|
||||||
|
<color>
|
||||||
|
<red>204</red>
|
||||||
|
<green>204</green>
|
||||||
|
<blue>204</blue>
|
||||||
|
</color>
|
||||||
|
</property>
|
||||||
|
<property name="prefEntry" stdset="0">
|
||||||
|
<cstring>DefaultShapeColor</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="prefPath" stdset="0">
|
||||||
|
<cstring>View</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<layout class="QGridLayout" name="_5">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_7">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>182</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Default line width and color</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="Gui::PrefColorButton" name="DefaultShapeLineColor">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>The default line color for new shapes</string>
|
||||||
|
</property>
|
||||||
|
<property name="color">
|
||||||
|
<color>
|
||||||
|
<red>25</red>
|
||||||
|
<green>25</green>
|
||||||
|
<blue>25</blue>
|
||||||
|
</color>
|
||||||
|
</property>
|
||||||
|
<property name="prefEntry" stdset="0">
|
||||||
|
<cstring>DefaultShapeLineColor</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="prefPath" stdset="0">
|
||||||
|
<cstring>View</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="Gui::PrefSpinBox" name="DefaultShapeLineWidth">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>The default line thickness for new shapes</string>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string>px</string>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="prefEntry" stdset="0">
|
||||||
|
<cstring>DefaultShapeLineWidth</cstring>
|
||||||
|
</property>
|
||||||
|
<property name="prefPath" stdset="0">
|
||||||
|
<cstring>View</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -509,6 +626,11 @@
|
||||||
<extends>QPushButton</extends>
|
<extends>QPushButton</extends>
|
||||||
<header>Gui/Widgets.h</header>
|
<header>Gui/Widgets.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>Gui::PrefSpinBox</class>
|
||||||
|
<extends>QSpinBox</extends>
|
||||||
|
<header>Gui/PrefWidgets.h</header>
|
||||||
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>Gui::PrefColorButton</class>
|
<class>Gui::PrefColorButton</class>
|
||||||
<extends>Gui::ColorButton</extends>
|
<extends>Gui::ColorButton</extends>
|
||||||
|
@ -530,6 +652,11 @@
|
||||||
<tabstop>checkBoxSelection</tabstop>
|
<tabstop>checkBoxSelection</tabstop>
|
||||||
<tabstop>HighlightColor</tabstop>
|
<tabstop>HighlightColor</tabstop>
|
||||||
<tabstop>SelectionColor</tabstop>
|
<tabstop>SelectionColor</tabstop>
|
||||||
|
<tabstop>CursorTextColor</tabstop>
|
||||||
|
<tabstop>EditedEdgeColor</tabstop>
|
||||||
|
<tabstop>EditedVertexColor</tabstop>
|
||||||
|
<tabstop>ConstructionColor</tabstop>
|
||||||
|
<tabstop>FullyConstrainedColor</tabstop>
|
||||||
<tabstop>radioButtonSimple</tabstop>
|
<tabstop>radioButtonSimple</tabstop>
|
||||||
<tabstop>radioButtonGradient</tabstop>
|
<tabstop>radioButtonGradient</tabstop>
|
||||||
<tabstop>checkMidColor</tabstop>
|
<tabstop>checkMidColor</tabstop>
|
||||||
|
|
|
@ -187,6 +187,9 @@ bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
|
||||||
View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView());
|
View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView());
|
||||||
if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) {
|
if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) {
|
||||||
d->_pcInEdit = p;
|
d->_pcInEdit = p;
|
||||||
|
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
|
||||||
|
if (dlg)
|
||||||
|
dlg->setDocumentName(this->getDocument()->getName());
|
||||||
if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
|
if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
|
||||||
signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit)));
|
signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit)));
|
||||||
}
|
}
|
||||||
|
@ -405,6 +408,9 @@ void Document::slotDeletedObject(const App::DocumentObject& Obj)
|
||||||
|
|
||||||
// cycling to all views of the document
|
// cycling to all views of the document
|
||||||
ViewProvider* viewProvider = getViewProvider(&Obj);
|
ViewProvider* viewProvider = getViewProvider(&Obj);
|
||||||
|
#if 0 // With this we can show child objects again if this method was called by undo
|
||||||
|
viewProvider->onDelete(std::vector<std::string>());
|
||||||
|
#endif
|
||||||
if (viewProvider && viewProvider->getTypeId().isDerivedFrom
|
if (viewProvider && viewProvider->getTypeId().isDerivedFrom
|
||||||
(ViewProviderDocumentObject::getClassTypeId())) {
|
(ViewProviderDocumentObject::getClassTypeId())) {
|
||||||
// go through the views
|
// go through the views
|
||||||
|
@ -504,7 +510,7 @@ bool Document::saveAs(void)
|
||||||
{
|
{
|
||||||
getMainWindow()->statusBar()->showMessage(QObject::tr("Save document under new filename..."));
|
getMainWindow()->statusBar()->showMessage(QObject::tr("Save document under new filename..."));
|
||||||
|
|
||||||
QString exe = QString::fromUtf8(App::GetApplication().getExecutableName());
|
QString exe = qApp->applicationName();
|
||||||
QString fn = QFileDialog::getSaveFileName(getMainWindow(), QObject::tr("Save %1 Document").arg(exe),
|
QString fn = QFileDialog::getSaveFileName(getMainWindow(), QObject::tr("Save %1 Document").arg(exe),
|
||||||
FileDialog::getWorkingDirectory(), QObject::tr("%1 document (*.FCStd)").arg(exe));
|
FileDialog::getWorkingDirectory(), QObject::tr("%1 document (*.FCStd)").arg(exe));
|
||||||
if (!fn.isEmpty()) {
|
if (!fn.isEmpty()) {
|
||||||
|
@ -642,8 +648,13 @@ void Document::RestoreDocFile(Base::Reader &reader)
|
||||||
std::string sMsg = "SetCamera ";
|
std::string sMsg = "SetCamera ";
|
||||||
sMsg += ppReturn;
|
sMsg += ppReturn;
|
||||||
if (strcmp(ppReturn, "") != 0) { // non-empty attribute
|
if (strcmp(ppReturn, "") != 0) { // non-empty attribute
|
||||||
if (d->_pcAppWnd->sendHasMsgToActiveView("SetCamera"))
|
try {
|
||||||
d->_pcAppWnd->sendMsgToActiveView(sMsg.c_str());
|
if (d->_pcAppWnd->sendHasMsgToActiveView("SetCamera"))
|
||||||
|
d->_pcAppWnd->sendMsgToActiveView(sMsg.c_str());
|
||||||
|
}
|
||||||
|
catch (const Base::Exception& e) {
|
||||||
|
Base::Console().Error("%s\n", e.what());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -743,7 +754,7 @@ void Document::exportObjects(const std::vector<App::DocumentObject*>& obj, Base:
|
||||||
<< views.size() <<"\">" << std::endl;
|
<< views.size() <<"\">" << std::endl;
|
||||||
|
|
||||||
bool xml = writer.isForceXML();
|
bool xml = writer.isForceXML();
|
||||||
writer.setForceXML(true);
|
//writer.setForceXML(true);
|
||||||
writer.incInd(); // indention for 'ViewProvider name'
|
writer.incInd(); // indention for 'ViewProvider name'
|
||||||
std::map<const App::DocumentObject*,ViewProvider*>::const_iterator jt;
|
std::map<const App::DocumentObject*,ViewProvider*>::const_iterator jt;
|
||||||
for (jt = views.begin(); jt != views.end(); ++jt) {
|
for (jt = views.begin(); jt != views.end(); ++jt) {
|
||||||
|
@ -826,6 +837,7 @@ void Document::createView(const char* sType)
|
||||||
.arg(QString::fromUtf8(name)).arg(d->_iWinCount++);
|
.arg(QString::fromUtf8(name)).arg(d->_iWinCount++);
|
||||||
|
|
||||||
view3D->setWindowTitle(title);
|
view3D->setWindowTitle(title);
|
||||||
|
view3D->setWindowModified(this->isModified());
|
||||||
view3D->setWindowIcon(QApplication::windowIcon());
|
view3D->setWindowIcon(QApplication::windowIcon());
|
||||||
view3D->resize(400, 300);
|
view3D->resize(400, 300);
|
||||||
getMainWindow()->addWindow(view3D);
|
getMainWindow()->addWindow(view3D);
|
||||||
|
@ -921,13 +933,16 @@ bool Document::canClose ()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (!Gui::Control().isAllowedAlterDocument()) {
|
else if (!Gui::Control().isAllowedAlterDocument()) {
|
||||||
QMessageBox::warning(getActiveView(),
|
std::string name = Gui::Control().activeDialog()->getDocumentName();
|
||||||
QObject::tr("Document not closable"),
|
if (name == this->getDocument()->getName()) {
|
||||||
QObject::tr("The document is in editing mode and thus cannot be closed for the moment.\n"
|
QMessageBox::warning(getActiveView(),
|
||||||
"You either have to finish or cancel the editing in the task panel."));
|
QObject::tr("Document not closable"),
|
||||||
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
|
QObject::tr("The document is in editing mode and thus cannot be closed for the moment.\n"
|
||||||
if (dlg) Gui::Control().showDialog(dlg);
|
"You either have to finish or cancel the editing in the task panel."));
|
||||||
return false;
|
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
|
||||||
|
if (dlg) Gui::Control().showDialog(dlg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isModified())
|
if (!isModified())
|
||||||
|
@ -967,6 +982,19 @@ std::list<MDIView*> Document::getMDIViews() const
|
||||||
return views;
|
return views;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::list<MDIView*> Document::getMDIViewsOfType(const Base::Type& typeId) const
|
||||||
|
{
|
||||||
|
std::list<MDIView*> views;
|
||||||
|
for (std::list<BaseView*>::const_iterator it = d->baseViews.begin();
|
||||||
|
it != d->baseViews.end(); ++it) {
|
||||||
|
MDIView* view = dynamic_cast<MDIView*>(*it);
|
||||||
|
if (view && view->isDerivedFrom(typeId))
|
||||||
|
views.push_back(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
return views;
|
||||||
|
}
|
||||||
|
|
||||||
/// send messages to the active view
|
/// send messages to the active view
|
||||||
bool Document::sendMsgToViews(const char* pMsg)
|
bool Document::sendMsgToViews(const char* pMsg)
|
||||||
{
|
{
|
||||||
|
@ -1006,9 +1034,9 @@ MDIView* Document::getActiveView(void) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// the active view is not part of this document, just use the first view
|
// the active view is not part of this document, just use the last view
|
||||||
if (!ok && !mdis.empty())
|
if (!ok && !mdis.empty())
|
||||||
active = mdis.front();
|
active = mdis.back();
|
||||||
|
|
||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,6 +140,8 @@ public:
|
||||||
void onRelabel(void);
|
void onRelabel(void);
|
||||||
/// returns a list of all attached MDI views
|
/// returns a list of all attached MDI views
|
||||||
std::list<MDIView*> getMDIViews() const;
|
std::list<MDIView*> getMDIViews() const;
|
||||||
|
/// returns a list of all MDI views of a certain type
|
||||||
|
std::list<MDIView*> getMDIViewsOfType(const Base::Type& typeId) const;
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/** @name View provider handling */
|
/** @name View provider handling */
|
||||||
|
|
|
@ -68,6 +68,21 @@
|
||||||
<UserDocu>deprecated -- use ActiveView</UserDocu>
|
<UserDocu>deprecated -- use ActiveView</UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="mdiViewsOfType" Const="true">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>Return a list if mdi views of a given type</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
|
<Methode Name="sendMsgToViews">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>Send a message to all views of the document</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
|
<Methode Name="mergeProject">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu>Merges this document with another project file</UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Attribute Name="ActiveObject" ReadOnly="false">
|
<Attribute Name="ActiveObject" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>The active object of the document</UserDocu>
|
<UserDocu>The active object of the document</UserDocu>
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <App/Document.h>
|
#include <App/Document.h>
|
||||||
|
|
||||||
#include "Document.h"
|
#include "Document.h"
|
||||||
|
#include "MergeDocuments.h"
|
||||||
#include "ViewProviderExtern.h"
|
#include "ViewProviderExtern.h"
|
||||||
|
|
||||||
// inclusion of the generated files (generated out of DocumentPy.xml)
|
// inclusion of the generated files (generated out of DocumentPy.xml)
|
||||||
|
@ -201,6 +202,55 @@ PyObject* DocumentPy::activeView(PyObject *args)
|
||||||
} PY_CATCH;
|
} PY_CATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* DocumentPy::mdiViewsOfType(PyObject *args)
|
||||||
|
{
|
||||||
|
char* sType;
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &sType)) // convert args: Python->C
|
||||||
|
return NULL; // NULL triggers exception
|
||||||
|
|
||||||
|
Base::Type type = Base::Type::fromName(sType);
|
||||||
|
if (type == Base::Type::badType()) {
|
||||||
|
PyErr_Format(PyExc_Exception, "'%s' is not a valid type", sType);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PY_TRY {
|
||||||
|
std::list<Gui::MDIView*> views = getDocumentPtr()->getMDIViewsOfType(type);
|
||||||
|
Py::List list;
|
||||||
|
for (std::list<Gui::MDIView*>::iterator it = views.begin(); it != views.end(); ++it)
|
||||||
|
list.append(Py::asObject((*it)->getPyObject()));
|
||||||
|
return Py::new_reference_to(list);
|
||||||
|
} PY_CATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject* DocumentPy::sendMsgToViews(PyObject *args)
|
||||||
|
{
|
||||||
|
char* msg;
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &msg)) // convert args: Python->C
|
||||||
|
return NULL; // NULL triggers exception
|
||||||
|
|
||||||
|
PY_TRY {
|
||||||
|
getDocumentPtr()->sendMsgToViews(msg);
|
||||||
|
Py_Return;
|
||||||
|
} PY_CATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject* DocumentPy::mergeProject(PyObject *args)
|
||||||
|
{
|
||||||
|
char* filename;
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &filename)) // convert args: Python->C
|
||||||
|
return NULL; // NULL triggers exception
|
||||||
|
|
||||||
|
PY_TRY {
|
||||||
|
Base::FileInfo fi(filename);
|
||||||
|
Base::ifstream str(fi, std::ios::in | std::ios::binary);
|
||||||
|
App::Document* doc = getDocumentPtr()->getDocument();
|
||||||
|
MergeDocuments md(doc);
|
||||||
|
md.importObjects(str);
|
||||||
|
Py_Return;
|
||||||
|
} PY_CATCH;
|
||||||
|
}
|
||||||
|
|
||||||
Py::Object DocumentPy::getActiveObject(void) const
|
Py::Object DocumentPy::getActiveObject(void) const
|
||||||
{
|
{
|
||||||
App::DocumentObject *object = getDocumentPtr()->getDocument()->getActiveObject();
|
App::DocumentObject *object = getDocumentPtr()->getDocument()->getActiveObject();
|
||||||
|
|
|
@ -74,6 +74,7 @@ public:
|
||||||
void print ();
|
void print ();
|
||||||
void printPdf();
|
void printPdf();
|
||||||
void printPreview();
|
void printPreview();
|
||||||
|
void print(QPrinter*);
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
QStringList undoActions() const;
|
QStringList undoActions() const;
|
||||||
|
@ -88,7 +89,6 @@ private Q_SLOTS:
|
||||||
void contentsChange(int position, int charsRemoved, int charsAdded);
|
void contentsChange(int position, int charsRemoved, int charsAdded);
|
||||||
void undoAvailable(bool);
|
void undoAvailable(bool);
|
||||||
void redoAvailable(bool);
|
void redoAvailable(bool);
|
||||||
void print(QPrinter*);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setCurrentFileName(const QString &fileName);
|
void setCurrentFileName(const QString &fileName);
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
* *
|
* *
|
||||||
* You should have received a copy of the GNU Library General Public *
|
* You should have received a copy of the GNU Library General Public *
|
||||||
* License along with this library; see the file COPYING.LIB. If not, *
|
* License along with this library; see the file COPYING.LIB. If not, *
|
||||||
* write to the Free Software Foundation, Inc., 59 Temple Place, *
|
* write to the Free Software Foundation, Inc., 51 Franklin Street, *
|
||||||
* Suite 330, Boston, MA 02111-1307, USA *
|
* Fifth Floor, Boston, MA 02110-1301, USA *
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,7 @@ FreeCAD.addExportType("Inventor V2.1 (*.iv)","FreeCADGui")
|
||||||
FreeCAD.addExportType("VRML V2.0 (*.wrl *.vrml *.wrz *.wrl.gz)","FreeCADGui")
|
FreeCAD.addExportType("VRML V2.0 (*.wrl *.vrml *.wrz *.wrl.gz)","FreeCADGui")
|
||||||
#FreeCAD.addExportType("IDTF (for 3D PDF) (*.idtf)","FreeCADGui")
|
#FreeCAD.addExportType("IDTF (for 3D PDF) (*.idtf)","FreeCADGui")
|
||||||
FreeCAD.addExportType("3D View (*.svg)","FreeCADGui")
|
FreeCAD.addExportType("3D View (*.svg)","FreeCADGui")
|
||||||
|
FreeCAD.addExportType("Portable Document Format (*.pdf)","FreeCADGui")
|
||||||
|
|
||||||
del(InitApplications)
|
del(InitApplications)
|
||||||
del(NoneWorkbench)
|
del(NoneWorkbench)
|
||||||
|
|
|
@ -40,11 +40,10 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_WS_WIN
|
#ifdef _USE_3DCONNEXION_SDK
|
||||||
#include <windows.h>
|
Gui::GUIApplicationNativeEventAware* Gui::GUIApplicationNativeEventAware::gMouseInput = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
Gui::GUIApplicationNativeEventAware::GUIApplicationNativeEventAware(int &argc, char *argv[]) :
|
Gui::GUIApplicationNativeEventAware::GUIApplicationNativeEventAware(int &argc, char *argv[]) :
|
||||||
QApplication (argc, argv), spaceballPresent(false)
|
QApplication (argc, argv), spaceballPresent(false)
|
||||||
{
|
{
|
||||||
|
@ -59,11 +58,18 @@ Gui::GUIApplicationNativeEventAware::~GUIApplicationNativeEventAware()
|
||||||
else
|
else
|
||||||
Base::Console().Log("Disconnected from spacenav daemon\n");
|
Base::Console().Log("Disconnected from spacenav daemon\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _USE_3DCONNEXION_SDK
|
||||||
|
if (gMouseInput == this) {
|
||||||
|
gMouseInput = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gui::GUIApplicationNativeEventAware::initSpaceball(QMainWindow *window)
|
void Gui::GUIApplicationNativeEventAware::initSpaceball(QMainWindow *window)
|
||||||
{
|
{
|
||||||
mainWindow = window;
|
mainWindow = window;
|
||||||
|
|
||||||
#ifdef SPNAV_FOUND
|
#ifdef SPNAV_FOUND
|
||||||
if (spnav_x11_open(QX11Info::display(), window->winId()) == -1)
|
if (spnav_x11_open(QX11Info::display(), window->winId()) == -1)
|
||||||
Base::Console().Log("Couldn't connect to spacenav daemon\n");
|
Base::Console().Log("Couldn't connect to spacenav daemon\n");
|
||||||
|
@ -74,6 +80,19 @@ void Gui::GUIApplicationNativeEventAware::initSpaceball(QMainWindow *window)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _USE_3DCONNEXION_SDK
|
||||||
|
spaceballPresent = Is3dmouseAttached();
|
||||||
|
|
||||||
|
if (spaceballPresent) {
|
||||||
|
fLast3dmouseInputTime = 0;
|
||||||
|
|
||||||
|
if (InitializeRawInput(mainWindow->winId())){
|
||||||
|
gMouseInput = this;
|
||||||
|
qApp->setEventFilter(Gui::GUIApplicationNativeEventAware::RawInputEventFilter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // _USE_3DCONNEXION_SDK
|
||||||
|
|
||||||
Spaceball::MotionEvent::MotionEventType = QEvent::registerEventType();
|
Spaceball::MotionEvent::MotionEventType = QEvent::registerEventType();
|
||||||
Spaceball::ButtonEvent::ButtonEventType = QEvent::registerEventType();
|
Spaceball::ButtonEvent::ButtonEventType = QEvent::registerEventType();
|
||||||
}
|
}
|
||||||
|
@ -146,15 +165,8 @@ bool Gui::GUIApplicationNativeEventAware::x11EventFilter(XEvent *event)
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif // SPNAV_FOUND
|
||||||
}
|
}
|
||||||
#endif
|
#endif // Q_WS_X11
|
||||||
|
|
||||||
#ifdef Q_WS_WIN
|
|
||||||
bool Gui::GUIApplicationNativeEventAware::winEventFilter(MSG *msg, long *result)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "moc_GuiApplicationNativeEventAware.cpp"
|
#include "moc_GuiApplicationNativeEventAware.cpp"
|
||||||
|
|
|
@ -29,6 +29,19 @@
|
||||||
|
|
||||||
class QMainWindow;
|
class QMainWindow;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _USE_3DCONNEXION_SDK
|
||||||
|
#include "3Dconnexion/MouseParameters.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
// #define _WIN32_WINNT 0x0501 //target at least windows XP
|
||||||
|
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#endif // _USE_3DCONNEXION_SDK
|
||||||
|
|
||||||
namespace Gui
|
namespace Gui
|
||||||
{
|
{
|
||||||
class GUIApplicationNativeEventAware : public QApplication
|
class GUIApplicationNativeEventAware : public QApplication
|
||||||
|
@ -38,18 +51,65 @@ namespace Gui
|
||||||
GUIApplicationNativeEventAware(int &argc, char *argv[]);
|
GUIApplicationNativeEventAware(int &argc, char *argv[]);
|
||||||
~GUIApplicationNativeEventAware();
|
~GUIApplicationNativeEventAware();
|
||||||
void initSpaceball(QMainWindow *window);
|
void initSpaceball(QMainWindow *window);
|
||||||
|
bool isSpaceballPresent() const {return spaceballPresent;}
|
||||||
bool processSpaceballEvent(QObject *object, QEvent *event);
|
bool processSpaceballEvent(QObject *object, QEvent *event);
|
||||||
#ifdef Q_WS_X11
|
|
||||||
bool x11EventFilter(XEvent *event);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef Q_WS_WIN
|
|
||||||
bool winEventFilter(MSG *msg, long *result);
|
|
||||||
#endif
|
|
||||||
bool isSpaceballPresent(){return spaceballPresent;}
|
|
||||||
private:
|
private:
|
||||||
bool spaceballPresent;
|
bool spaceballPresent;
|
||||||
QMainWindow *mainWindow;
|
QMainWindow *mainWindow;
|
||||||
|
|
||||||
|
// For X11
|
||||||
|
#ifdef Q_WS_X11
|
||||||
|
public:
|
||||||
|
bool x11EventFilter(XEvent *event);
|
||||||
|
#endif // Q_WS_X11
|
||||||
|
|
||||||
|
// For Windows
|
||||||
|
#ifdef _USE_3DCONNEXION_SDK
|
||||||
|
public:
|
||||||
|
static bool Is3dmouseAttached();
|
||||||
|
|
||||||
|
I3dMouseParam& MouseParams();
|
||||||
|
const I3dMouseParam& MouseParams() const;
|
||||||
|
|
||||||
|
virtual void Move3d(HANDLE device, std::vector<float>& motionData);
|
||||||
|
virtual void On3dmouseKeyDown(HANDLE device, int virtualKeyCode);
|
||||||
|
virtual void On3dmouseKeyUp(HANDLE device, int virtualKeyCode);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool InitializeRawInput(HWND hwndTarget);
|
||||||
|
static bool RawInputEventFilter(void* msg, long* result);
|
||||||
|
void OnRawInput(UINT nInputCode, HRAWINPUT hRawInput);
|
||||||
|
UINT GetRawInputBuffer(PRAWINPUT pData, PUINT pcbSize, UINT cbSizeHeader);
|
||||||
|
bool TranslateRawInputData(UINT nInputCode, PRAWINPUT pRawInput);
|
||||||
|
void On3dmouseInput();
|
||||||
|
|
||||||
|
class TInputData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TInputData() : fAxes(6) {}
|
||||||
|
|
||||||
|
bool IsZero() {
|
||||||
|
return (0.==fAxes[0] && 0.==fAxes[1] && 0.==fAxes[2] &&
|
||||||
|
0.==fAxes[3] && 0.==fAxes[4] && 0.==fAxes[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int fTimeToLive; // For telling if the device was unplugged while sending data
|
||||||
|
bool fIsDirty;
|
||||||
|
std::vector<float> fAxes;
|
||||||
|
};
|
||||||
|
|
||||||
|
HWND fWindow;
|
||||||
|
|
||||||
|
// Data cache to handle multiple rawinput devices
|
||||||
|
std::map< HANDLE, TInputData> fDevice2Data;
|
||||||
|
std::map< HANDLE, unsigned long> fDevice2Keystate;
|
||||||
|
// 3dmouse parameters
|
||||||
|
MouseParameters f3dMouseParams; // Rotate, Pan Zoom etc.
|
||||||
|
// use to calculate distance traveled since last event
|
||||||
|
DWORD fLast3dmouseInputTime;
|
||||||
|
static Gui::GUIApplicationNativeEventAware* gMouseInput;
|
||||||
|
#endif // _USE_3DCONNEXION_SDK
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // GUIAPPLICATIONNATIVEEVENTAWARE_H
|
#endif // GUIAPPLICATIONNATIVEEVENTAWARE_H
|
||||||
|
|
|
@ -56,8 +56,10 @@ EXTRA_DIST = \
|
||||||
edit-copy.svg \
|
edit-copy.svg \
|
||||||
edit-cut.svg \
|
edit-cut.svg \
|
||||||
edit-delete.svg \
|
edit-delete.svg \
|
||||||
|
edit-edit.svg \
|
||||||
edit-paste.svg \
|
edit-paste.svg \
|
||||||
edit-select-all.svg \
|
edit-select-all.svg \
|
||||||
|
edit-select-box.svg \
|
||||||
edit-redo.svg \
|
edit-redo.svg \
|
||||||
edit-undo.svg \
|
edit-undo.svg \
|
||||||
preferences-system.svg \
|
preferences-system.svg \
|
||||||
|
|
497
src/Gui/Icons/edit-select-all.svg
Normal file → Executable file
497
src/Gui/Icons/edit-select-all.svg
Normal file → Executable file
|
@ -1,347 +1,264 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
xmlns:cc="http://web.resource.org/cc/"
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
width="48px"
|
width="64px"
|
||||||
height="48px"
|
height="64px"
|
||||||
id="svg4198"
|
id="svg2980"
|
||||||
sodipodi:version="0.32"
|
sodipodi:version="0.32"
|
||||||
inkscape:version="0.43+devel"
|
inkscape:version="0.48.3.1 r9886"
|
||||||
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
|
sodipodi:docname="edit-select-all.svg"
|
||||||
sodipodi:docname="edit-select-all.svg">
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||||
|
version="1.1">
|
||||||
<defs
|
<defs
|
||||||
id="defs4200">
|
id="defs2982">
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient5060"
|
|
||||||
id="radialGradient5031"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
|
|
||||||
cx="605.71429"
|
|
||||||
cy="486.64789"
|
|
||||||
fx="605.71429"
|
|
||||||
fy="486.64789"
|
|
||||||
r="117.14286" />
|
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
id="linearGradient4590">
|
||||||
id="linearGradient5060">
|
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:black;stop-opacity:1;"
|
style="stop-color:#0073ff;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop5062" />
|
id="stop4592" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:black;stop-opacity:0;"
|
style="stop-color:#5cd4f5;stop-opacity:1;"
|
||||||
offset="1"
|
offset="1"
|
||||||
id="stop5064" />
|
id="stop4594" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3811">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3813" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#bfbfbf;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3815" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3864">
|
||||||
|
<stop
|
||||||
|
id="stop3866"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#71b2f8;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop3868"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#002795;stop-opacity:1;" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<radialGradient
|
<radialGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient5060"
|
xlink:href="#linearGradient3864"
|
||||||
id="radialGradient5029"
|
id="radialGradient3850"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
|
gradientTransform="matrix(0.6028459,1.0471639,-1.9794021,1.1395295,127.9588,-74.456907)"
|
||||||
cx="605.71429"
|
cx="51.328892"
|
||||||
cy="486.64789"
|
cy="31.074146"
|
||||||
fx="605.71429"
|
fx="51.328892"
|
||||||
fy="486.64789"
|
fy="31.074146"
|
||||||
r="117.14286" />
|
r="19.571428" />
|
||||||
<linearGradient
|
<inkscape:perspective
|
||||||
id="linearGradient5048">
|
sodipodi:type="inkscape:persp3d"
|
||||||
<stop
|
inkscape:vp_x="0 : 32 : 1"
|
||||||
style="stop-color:black;stop-opacity:0;"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
offset="0"
|
inkscape:vp_z="64 : 32 : 1"
|
||||||
id="stop5050" />
|
inkscape:persp3d-origin="32 : 21.333333 : 1"
|
||||||
<stop
|
id="perspective2988" />
|
||||||
id="stop5056"
|
<inkscape:perspective
|
||||||
offset="0.5"
|
id="perspective2872"
|
||||||
style="stop-color:black;stop-opacity:1;" />
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
<stop
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
style="stop-color:black;stop-opacity:0;"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
offset="1"
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
id="stop5052" />
|
sodipodi:type="inkscape:persp3d" />
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient5048"
|
|
||||||
id="linearGradient5027"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
|
|
||||||
x1="302.85715"
|
|
||||||
y1="366.64789"
|
|
||||||
x2="302.85715"
|
|
||||||
y2="609.50507" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient3558">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#000000;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3560" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#000000;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3562" />
|
|
||||||
</linearGradient>
|
|
||||||
<radialGradient
|
<radialGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient3558"
|
xlink:href="#linearGradient3864"
|
||||||
id="radialGradient3564"
|
id="radialGradient2890"
|
||||||
cx="22.571428"
|
gradientUnits="userSpaceOnUse"
|
||||||
cy="30.857143"
|
gradientTransform="matrix(0.58019421,1.0078171,-1.9050269,1.0967121,-8.5316607,-197.0902)"
|
||||||
fx="22.571428"
|
cx="51.328892"
|
||||||
fy="30.857143"
|
cy="31.074146"
|
||||||
r="15.571428"
|
fx="51.328892"
|
||||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.638648e-15,10.75754)"
|
fy="31.074146"
|
||||||
gradientUnits="userSpaceOnUse" />
|
r="19.571428" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective2902"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective2902-9"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient15218">
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3811"
|
||||||
|
id="linearGradient3817"
|
||||||
|
x1="36.870125"
|
||||||
|
y1="30.196993"
|
||||||
|
x2="3.3695574"
|
||||||
|
y2="39.373768"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.27764843,-1.1190823,1.1190823,0.27764843,-10.424279,50.285999)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3811-9"
|
||||||
|
id="linearGradient3817-3"
|
||||||
|
x1="6.0684204"
|
||||||
|
y1="37.207146"
|
||||||
|
x2="39.480068"
|
||||||
|
y2="37.207146"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.27764843,-1.1190823,1.1190823,0.27764843,-9.674279,55.785999)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3811-9">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#f8f8f7;stop-opacity:1;"
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop15220" />
|
id="stop3813-8" />
|
||||||
<stop
|
<stop
|
||||||
id="stop2269"
|
style="stop-color:#bfbfbf;stop-opacity:1;"
|
||||||
offset="0.59928656"
|
|
||||||
style="stop-color:#e8e8e8;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#e2e2de;stop-opacity:1;"
|
|
||||||
offset="1"
|
offset="1"
|
||||||
id="stop15222" />
|
id="stop3815-7" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient15218"
|
xlink:href="#linearGradient4590"
|
||||||
id="linearGradient2240"
|
id="linearGradient4596"
|
||||||
|
x1="34.54903"
|
||||||
|
y1="1.8738226"
|
||||||
|
x2="28.02536"
|
||||||
|
y2="43.593124"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(1.342704,0,0,1.235378,-8.219611,-7.549457)"
|
gradientTransform="translate(0,8)" />
|
||||||
x1="20.794008"
|
<linearGradient
|
||||||
y1="18.378813"
|
id="linearGradient4590-3">
|
||||||
x2="35.596001"
|
<stop
|
||||||
y2="39.60046" />
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4592-5" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5cd4f5;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4594-6" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
y2="43.593124"
|
||||||
|
x2="28.02536"
|
||||||
|
y1="1.8738226"
|
||||||
|
x1="34.54903"
|
||||||
|
gradientTransform="translate(-1.4917871,-0.74277437)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient4621"
|
||||||
|
xlink:href="#linearGradient4590-3"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4590-8"
|
||||||
|
id="linearGradient4596-5"
|
||||||
|
x1="34.54903"
|
||||||
|
y1="1.8738226"
|
||||||
|
x2="28.02536"
|
||||||
|
y2="43.593124"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(0,8)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4590-8">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#0073ff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4592-3" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5cd4f5;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4594-1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
y2="43.593124"
|
||||||
|
x2="28.02536"
|
||||||
|
y1="1.8738226"
|
||||||
|
x1="34.54903"
|
||||||
|
gradientTransform="translate(-0.9673922,-0.2183795)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient3795"
|
||||||
|
xlink:href="#linearGradient4590-8"
|
||||||
|
inkscape:collect="always" />
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
pagecolor="#ffffff"
|
pagecolor="#ffffff"
|
||||||
bordercolor="#bebebe"
|
bordercolor="#666666"
|
||||||
borderopacity="1.0000000"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="2"
|
||||||
inkscape:cx="90.3276"
|
inkscape:cx="17.364725"
|
||||||
inkscape:cy="8.4634153"
|
inkscape:cy="3.8561862"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer1"
|
||||||
showgrid="false"
|
showgrid="true"
|
||||||
inkscape:grid-bbox="true"
|
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
|
inkscape:grid-bbox="true"
|
||||||
inkscape:window-width="1280"
|
inkscape:window-width="1280"
|
||||||
inkscape:window-height="949"
|
inkscape:window-height="758"
|
||||||
inkscape:window-x="26"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="69"
|
inkscape:window-y="19"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:window-maximized="0" />
|
||||||
fill="#729fcf" />
|
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata4203">
|
id="metadata2985">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
<cc:Work
|
<cc:Work
|
||||||
rdf:about="">
|
rdf:about="">
|
||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title>Select All</dc:title>
|
<dc:title />
|
||||||
<dc:date />
|
|
||||||
<dc:creator>
|
|
||||||
<cc:Agent>
|
|
||||||
<dc:title>Andreas Nilsson</dc:title>
|
|
||||||
</cc:Agent>
|
|
||||||
</dc:creator>
|
|
||||||
<dc:subject>
|
|
||||||
<rdf:Bag>
|
|
||||||
<rdf:li>select</rdf:li>
|
|
||||||
<rdf:li>all</rdf:li>
|
|
||||||
</rdf:Bag>
|
|
||||||
</dc:subject>
|
|
||||||
<cc:license
|
|
||||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
<cc:License
|
|
||||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
|
||||||
<cc:permits
|
|
||||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
|
||||||
<cc:requires
|
|
||||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
|
||||||
</cc:License>
|
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
<g
|
<g
|
||||||
id="layer1"
|
id="layer1"
|
||||||
inkscape:label="Layer 1"
|
inkscape:label="Layer 1"
|
||||||
inkscape:groupmode="layer">
|
inkscape:groupmode="layer">
|
||||||
<g
|
<path
|
||||||
style="display:inline"
|
style="opacity:0.54166667;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.95121026;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
id="g5022"
|
d="m 5.6060431,13.580595 0,41.676631 45.3656379,0 11.036532,-8.201181 0,-33.475449 -56.4021699,0 z"
|
||||||
transform="matrix(2.382811e-2,0,0,1.448788e-2,44.94353,43.77878)">
|
id="rect3005-1"
|
||||||
<rect
|
inkscape:connector-curvature="0" />
|
||||||
y="-150.69685"
|
<path
|
||||||
x="-1559.2523"
|
style="color:#000000;fill:url(#linearGradient4596);fill-opacity:1;fill-rule:evenodd;stroke:#00429a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
height="478.35718"
|
d="m 2.4673922,9.7183795 0,41.6766315 45.3656378,0 11.036532,-8.201181 0,-33.4754505 -56.4021698,0 z"
|
||||||
width="1339.6335"
|
id="rect3005"
|
||||||
id="rect4173"
|
inkscape:connector-curvature="0" />
|
||||||
style="opacity:0.40206185;color:black;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
|
<path
|
||||||
<path
|
style="opacity:0.54166667;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.95121026;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
sodipodi:nodetypes="cccc"
|
d="m 26.976451,51.516804 7.134956,-6.038369 15.610921,17.475008 8.5659,-7.652164 -15.610923,-17.475007 7.696597,-6.49637 -30.16213,-11.283345 6.764679,31.470247 z"
|
||||||
id="path5058"
|
id="rect2925-8"
|
||||||
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
|
sodipodi:nodetypes="cccccccc"
|
||||||
style="opacity:0.40206185;color:black;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="opacity:0.40206185;color:black;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
style="color:#000000;fill:url(#linearGradient4596-5);fill-opacity:1;fill-rule:evenodd;stroke:#00429a;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
|
d="m 58.694952,43.504249 c 0.160894,-1.443027 -0.62697,-3.448369 -4.966718,-4.52326 0,0 -1.330371,7.361384 -5.232791,11.884645 z"
|
||||||
id="path5018"
|
id="path3778"
|
||||||
sodipodi:nodetypes="cccc" />
|
inkscape:connector-curvature="0"
|
||||||
</g>
|
sodipodi:nodetypes="cccc" />
|
||||||
<rect
|
<path
|
||||||
style="opacity:1;fill:url(#linearGradient2240);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="color:#000000;fill:url(#linearGradient3817);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.30602169000000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
id="rect4238"
|
d="m 26.405839,44.367917 7.134956,-6.038369 15.610921,17.475008 8.5659,-7.652164 L 42.106693,30.677385 49.80329,24.181015 19.64116,12.89767 26.405839,44.367917 z"
|
||||||
width="38.996792"
|
id="rect2925"
|
||||||
height="45.003101"
|
sodipodi:nodetypes="cccccccc"
|
||||||
x="4.5016017"
|
inkscape:connector-curvature="0" />
|
||||||
y="0.52462721"
|
|
||||||
rx="0.56650788"
|
|
||||||
ry="0.56650823" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:#999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect4248"
|
|
||||||
width="14"
|
|
||||||
height="2"
|
|
||||||
x="22"
|
|
||||||
y="9.0277271" />
|
|
||||||
<rect
|
|
||||||
y="15.027727"
|
|
||||||
x="22"
|
|
||||||
height="2"
|
|
||||||
width="12"
|
|
||||||
id="rect4250"
|
|
||||||
style="opacity:1;color:black;fill:#999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:#999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect4252"
|
|
||||||
width="22.971531"
|
|
||||||
height="2"
|
|
||||||
x="9"
|
|
||||||
y="21.027727" />
|
|
||||||
<rect
|
|
||||||
y="27.027727"
|
|
||||||
x="9"
|
|
||||||
height="2"
|
|
||||||
width="27"
|
|
||||||
id="rect4254"
|
|
||||||
style="opacity:1;color:black;fill:#999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:#999;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect4256"
|
|
||||||
width="17"
|
|
||||||
height="2"
|
|
||||||
x="9"
|
|
||||||
y="33.027748" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
id="rect2245"
|
|
||||||
width="37.000019"
|
|
||||||
height="43.022316"
|
|
||||||
x="5.4997153"
|
|
||||||
y="1.5274456"
|
|
||||||
rx="0"
|
|
||||||
ry="0" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;fill:#999;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
id="rect4837"
|
|
||||||
width="11"
|
|
||||||
height="10"
|
|
||||||
x="9"
|
|
||||||
y="9.0277271" />
|
|
||||||
<rect
|
|
||||||
style="opacity:0.5;color:black;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect1323"
|
|
||||||
width="29"
|
|
||||||
height="6"
|
|
||||||
x="8"
|
|
||||||
y="13.027727" />
|
|
||||||
<rect
|
|
||||||
style="opacity:0.5;color:black;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2198"
|
|
||||||
width="31"
|
|
||||||
height="6"
|
|
||||||
x="8"
|
|
||||||
y="7.0277271" />
|
|
||||||
<rect
|
|
||||||
style="opacity:0.5;color:black;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2200"
|
|
||||||
width="25"
|
|
||||||
height="6"
|
|
||||||
x="8"
|
|
||||||
y="19.027727" />
|
|
||||||
<rect
|
|
||||||
style="opacity:0.5;color:black;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2202"
|
|
||||||
width="29"
|
|
||||||
height="6"
|
|
||||||
x="8"
|
|
||||||
y="25.027727" />
|
|
||||||
<rect
|
|
||||||
style="opacity:0.5;color:black;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2204"
|
|
||||||
width="19"
|
|
||||||
height="6"
|
|
||||||
x="8"
|
|
||||||
y="31.027727" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2206"
|
|
||||||
width="1"
|
|
||||||
height="7"
|
|
||||||
x="28"
|
|
||||||
y="31.027727" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2208"
|
|
||||||
width="1"
|
|
||||||
height="1"
|
|
||||||
x="27"
|
|
||||||
y="30.027727" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2210"
|
|
||||||
width="1"
|
|
||||||
height="1"
|
|
||||||
x="29"
|
|
||||||
y="30.027727" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2212"
|
|
||||||
width="1"
|
|
||||||
height="1"
|
|
||||||
x="29"
|
|
||||||
y="38.027748" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;color:black;fill:black;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
|
||||||
id="rect2214"
|
|
||||||
width="1"
|
|
||||||
height="1"
|
|
||||||
x="27"
|
|
||||||
y="38.027748" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 9.6 KiB |
221
src/Gui/Icons/edit-select-box.svg
Executable file
221
src/Gui/Icons/edit-select-box.svg
Executable file
|
@ -0,0 +1,221 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="64px"
|
||||||
|
height="64px"
|
||||||
|
id="svg2980"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:version="0.48.3.1 r9886"
|
||||||
|
sodipodi:docname="Select_all.svg"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||||
|
version="1.1">
|
||||||
|
<defs
|
||||||
|
id="defs2982">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4590">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4592" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5cd4f5;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4594" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3811">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3813" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#bfbfbf;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3815" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3864">
|
||||||
|
<stop
|
||||||
|
id="stop3866"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#71b2f8;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop3868"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#002795;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3864"
|
||||||
|
id="radialGradient3850"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.6028459,1.0471639,-1.9794021,1.1395295,127.9588,-74.456907)"
|
||||||
|
cx="51.328892"
|
||||||
|
cy="31.074146"
|
||||||
|
fx="51.328892"
|
||||||
|
fy="31.074146"
|
||||||
|
r="19.571428" />
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="0 : 32 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_z="64 : 32 : 1"
|
||||||
|
inkscape:persp3d-origin="32 : 21.333333 : 1"
|
||||||
|
id="perspective2988" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective2872"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3864"
|
||||||
|
id="radialGradient2890"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.58019421,1.0078171,-1.9050269,1.0967121,-8.5316607,-197.0902)"
|
||||||
|
cx="51.328892"
|
||||||
|
cy="31.074146"
|
||||||
|
fx="51.328892"
|
||||||
|
fy="31.074146"
|
||||||
|
r="19.571428" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective2902"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<inkscape:perspective
|
||||||
|
id="perspective2902-9"
|
||||||
|
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||||
|
inkscape:vp_z="1 : 0.5 : 1"
|
||||||
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
|
inkscape:vp_x="0 : 0.5 : 1"
|
||||||
|
sodipodi:type="inkscape:persp3d" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3811"
|
||||||
|
id="linearGradient3817"
|
||||||
|
x1="36.870125"
|
||||||
|
y1="30.196993"
|
||||||
|
x2="3.3695574"
|
||||||
|
y2="39.373768"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.27764843,-1.1190823,1.1190823,0.27764843,-10.424279,50.285999)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3811-9"
|
||||||
|
id="linearGradient3817-3"
|
||||||
|
x1="6.0684204"
|
||||||
|
y1="37.207146"
|
||||||
|
x2="39.480068"
|
||||||
|
y2="37.207146"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.27764843,-1.1190823,1.1190823,0.27764843,-9.674279,55.785999)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3811-9">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3813-8" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#bfbfbf;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3815-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4590"
|
||||||
|
id="linearGradient4596"
|
||||||
|
x1="34.54903"
|
||||||
|
y1="1.8738226"
|
||||||
|
x2="28.02536"
|
||||||
|
y2="43.593124"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(0,8)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient4590-3">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4592-5" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5cd4f5;stop-opacity:1;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4594-6" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="4"
|
||||||
|
inkscape:cx="42.774418"
|
||||||
|
inkscape:cy="24.13006"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:grid-bbox="true"
|
||||||
|
inkscape:window-width="1280"
|
||||||
|
inkscape:window-height="758"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="19"
|
||||||
|
inkscape:window-maximized="0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata2985">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer">
|
||||||
|
<rect
|
||||||
|
style="opacity:0.60250005;color:#000000;fill:none;stroke:#000000;stroke-width:7;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:14, 7;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="rect4714-0"
|
||||||
|
width="47"
|
||||||
|
height="44.75"
|
||||||
|
x="9"
|
||||||
|
y="7.375" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0095d6;stroke-width:7;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:14,7;stroke-dashoffset:0"
|
||||||
|
id="rect4714"
|
||||||
|
width="47"
|
||||||
|
height="44.75"
|
||||||
|
x="5.5"
|
||||||
|
y="4.5" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.54166667;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.95121026;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
d="m 26.976451,51.516804 7.134956,-6.038369 15.610921,17.475008 8.5659,-7.652164 -15.610923,-17.475007 7.696597,-6.49637 -30.16213,-11.283345 6.764679,31.470247 z"
|
||||||
|
id="rect2925-8"
|
||||||
|
sodipodi:nodetypes="cccccccc"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;fill:url(#linearGradient3817);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.30602169000000012;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
d="m 26.405839,44.367917 7.134956,-6.038369 15.610921,17.475008 8.5659,-7.652164 L 42.106693,30.677385 49.80329,24.181015 19.64116,12.89767 26.405839,44.367917 z"
|
||||||
|
id="rect2925"
|
||||||
|
sodipodi:nodetypes="cccccccc"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.7 KiB |
|
@ -43,6 +43,7 @@
|
||||||
<file>edit-delete.svg</file>
|
<file>edit-delete.svg</file>
|
||||||
<file>edit-paste.svg</file>
|
<file>edit-paste.svg</file>
|
||||||
<file>edit-select-all.svg</file>
|
<file>edit-select-all.svg</file>
|
||||||
|
<file>edit-select-box.svg</file>
|
||||||
<file>edit-redo.svg</file>
|
<file>edit-redo.svg</file>
|
||||||
<file>edit-undo.svg</file>
|
<file>edit-undo.svg</file>
|
||||||
<file>edit-edit.svg</file>
|
<file>edit-edit.svg</file>
|
||||||
|
|
|
@ -275,6 +275,13 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setPosition(const Base::Vector3f& v)
|
||||||
|
{
|
||||||
|
this->xPos->setValue(v.x);
|
||||||
|
this->yPos->setValue(v.y);
|
||||||
|
this->zPos->setValue(v.z);
|
||||||
|
}
|
||||||
|
|
||||||
Base::Vector3f getPosition() const
|
Base::Vector3f getPosition() const
|
||||||
{
|
{
|
||||||
return Base::Vector3f((float)this->xPos->value(),
|
return Base::Vector3f((float)this->xPos->value(),
|
||||||
|
|
|
@ -279,6 +279,7 @@ SbBool InventorNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
else if (this->currentmode == NavigationStyle::DRAGGING) {
|
else if (this->currentmode == NavigationStyle::DRAGGING) {
|
||||||
this->addToLog(event->getPosition(), event->getTime());
|
this->addToLog(event->getPosition(), event->getTime());
|
||||||
this->spin(posn);
|
this->spin(posn);
|
||||||
|
moveCursorPosition();
|
||||||
processed = TRUE;
|
processed = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -316,6 +317,9 @@ SbBool InventorNavigationStyle::processSoEvent(const SoEvent * const ev)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BUTTON1DOWN:
|
case BUTTON1DOWN:
|
||||||
|
if (newmode != NavigationStyle::DRAGGING) {
|
||||||
|
saveCursorPosition(ev);
|
||||||
|
}
|
||||||
newmode = NavigationStyle::DRAGGING;
|
newmode = NavigationStyle::DRAGGING;
|
||||||
break;
|
break;
|
||||||
case BUTTON3DOWN:
|
case BUTTON3DOWN:
|
||||||
|
|
|
@ -63,6 +63,44 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::ActionSelector</name>
|
||||||
|
<message>
|
||||||
|
<source>Available:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Selected:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Add</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Remove</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Move up</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Move down</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::AlignmentView</name>
|
||||||
|
<message>
|
||||||
|
<source>Movable object</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Fixed object</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::BlenderNavigationStyle</name>
|
<name>Gui::BlenderNavigationStyle</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -160,6 +198,10 @@
|
||||||
<source>License...</source>
|
<source>License...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy to clipboard</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::ButtonModel</name>
|
<name>Gui::Dialog::ButtonModel</name>
|
||||||
|
@ -708,10 +750,6 @@ Please define another shortcut.</source>
|
||||||
<source>Viewing mode</source>
|
<source>Viewing mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>Display mode:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Plot mode:</source>
|
<source>Plot mode:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
|
@ -736,6 +774,10 @@ Please define another shortcut.</source>
|
||||||
<source>Color plot:</source>
|
<source>Color plot:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Document window:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgEditorSettings</name>
|
<name>Gui::Dialog::DlgEditorSettings</name>
|
||||||
|
@ -1482,6 +1524,14 @@ Specify another directory, please.</source>
|
||||||
<source>Invert zoom</source>
|
<source>Invert zoom</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Zoom at cursor</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Zoom step</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgSettings3DViewImp</name>
|
<name>Gui::Dialog::DlgSettings3DViewImp</name>
|
||||||
|
@ -1722,6 +1772,10 @@ Specify another directory, please.</source>
|
||||||
<source>Items</source>
|
<source>Items</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Current line highlight</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgSettingsImage</name>
|
<name>Gui::Dialog::DlgSettingsImage</name>
|
||||||
|
@ -1956,6 +2010,14 @@ Specify another directory, please.</source>
|
||||||
<source>Macro path</source>
|
<source>Macro path</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>General macro settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Run macros in local environment</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgSettingsUnits</name>
|
<name>Gui::Dialog::DlgSettingsUnits</name>
|
||||||
|
@ -2046,14 +2108,6 @@ Specify another directory, please.</source>
|
||||||
<source>Fully constrained geometry</source>
|
<source>Fully constrained geometry</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>The color of construction geometry in editmode</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>The color of fully constrained geometry in editmode</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>The color of vertices being edited</source>
|
<source>The color of vertices being edited</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
|
@ -2062,6 +2116,42 @@ Specify another directory, please.</source>
|
||||||
<source>The color of edges being edited</source>
|
<source>The color of edges being edited</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The color of construction geometry in edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The color of fully constrained geometry in edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cursor text color</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Default shape color</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The default color for new shapes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Default line width and color</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The default line color for new shapes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The default line thickness for new shapes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>px</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgTipOfTheDay</name>
|
<name>Gui::Dialog::DlgTipOfTheDay</name>
|
||||||
|
@ -2124,7 +2214,39 @@ Specify another directory, please.</source>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DownloadDialog</name>
|
<name>Gui::Dialog::DownloadDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Canceled.</source>
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cancel</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>There already exists a file called %1 in the current directory. Overwrite?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Unable to save the file %1: %2.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Downloading %1.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download canceled.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download failed: %1.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Downloaded %1 to current directory.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
@ -2162,6 +2284,13 @@ Specify another directory, please.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::Dialog::LicenseDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>Copyright</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::MouseButtons</name>
|
<name>Gui::Dialog::MouseButtons</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -2847,6 +2976,25 @@ Do you want to save your changes?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::LocationWidget</name>
|
||||||
|
<message>
|
||||||
|
<source>X:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Y:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Z:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Direction:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::MacroCommand</name>
|
<name>Gui::MacroCommand</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -2877,6 +3025,88 @@ Do you want to save your changes?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::ManualAlignment</name>
|
||||||
|
<message>
|
||||||
|
<source>Manual alignment</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment is already in progress.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Alignment[*]</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please, select at least one point in the left and the right view</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please, select at least %1 points in the left and the right view</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please pick points in the left and right view</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment has finished</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment has been canceled</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Too few points picked in the left view. At least %1 points are needed.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Too few points picked in the right view. At least %1 points are needed.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Different number of points picked in left and right view.
|
||||||
|
On the left view %1 points are picked,
|
||||||
|
on the right view %2 points are picked.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Try to align group of views</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment failed.
|
||||||
|
How do you want to proceed?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Retry</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Ignore</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Abort</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Different number of points picked in left and right view. On the left view %1 points are picked, on the right view %2 points are picked.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Point picked at (%1,%2,%3)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No point was picked</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::NetworkRetriever</name>
|
<name>Gui::NetworkRetriever</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -3020,6 +3250,10 @@ Do you want to exit without saving your data?</source>
|
||||||
<source>Select All</source>
|
<source>Select All</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Clear console</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::PythonEditor</name>
|
<name>Gui::PythonEditor</name>
|
||||||
|
@ -3158,10 +3392,6 @@ Do you want to specify another directory?</source>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::TaskView::TaskAppearance</name>
|
<name>Gui::TaskView::TaskAppearance</name>
|
||||||
<message>
|
|
||||||
<source>Display mode:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Plot mode:</source>
|
<source>Plot mode:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
|
@ -3182,6 +3412,10 @@ Do you want to specify another directory?</source>
|
||||||
<source>Appearance</source>
|
<source>Appearance</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Document window:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::TaskView::TaskEditControl</name>
|
<name>Gui::TaskView::TaskEditControl</name>
|
||||||
|
@ -3206,9 +3440,21 @@ Do you want to specify another directory?</source>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Translator</name>
|
<name>Gui::TouchpadNavigationStyle</name>
|
||||||
<message>
|
<message>
|
||||||
<source>English</source>
|
<source>Press left mouse button</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Press SHIFT button</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Press ALT button</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Press PgUp/PgDown button</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
@ -3464,14 +3710,6 @@ Do you want to specify another directory?</source>
|
||||||
<source>A general error occurred while loading the workbench</source>
|
<source>A general error occurred while loading the workbench</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
|
||||||
<source>File not found</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Cannot open file %1</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
<message>
|
||||||
<source>Save views...</source>
|
<source>Save views...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
|
@ -3769,6 +4007,17 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdBoxSelection</name>
|
||||||
|
<message>
|
||||||
|
<source>Standard-View</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Box selection</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdAbout</name>
|
<name>StdCmdAbout</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -3829,6 +4078,21 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdAlignment</name>
|
||||||
|
<message>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Alignment...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Align the selected objects</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdArrangeIcons</name>
|
<name>StdCmdArrangeIcons</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -3945,21 +4209,6 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>StdCmdDDuplicateSelection</name>
|
|
||||||
<message>
|
|
||||||
<source>Edit</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Duplicate selection</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Put duplicates of the selected objects to the active document</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdDelete</name>
|
<name>StdCmdDelete</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -4106,6 +4355,40 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdDuplicateSelection</name>
|
||||||
|
<message>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Duplicate selection</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Put duplicates of the selected objects to the active document</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdEdit</name>
|
||||||
|
<message>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle &Edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggles the selected object's edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enters or leaves the selected object's edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdExport</name>
|
<name>StdCmdExport</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -4121,7 +4404,26 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Supported formats</source>
|
<source>No selection</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please select first the objects you want to export.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdExportGraphviz</name>
|
||||||
|
<message>
|
||||||
|
<source>Tools</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Dependency graph...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Show the dependency graph of the objects in the active document</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
@ -4297,11 +4599,11 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Mesure distance</source>
|
<source>Measures distance between two selected objects</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Measures distance between two selected objects</source>
|
<source>Measure distance</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
@ -4354,21 +4656,6 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
|
||||||
<name>StdCmdOnlineHelpPython</name>
|
|
||||||
<message>
|
|
||||||
<source>Help</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Python Manuals</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<source>Show the Python documentation</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdOnlineHelpWebsite</name>
|
<name>StdCmdOnlineHelpWebsite</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -5183,6 +5470,36 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdViewRotateLeft</name>
|
||||||
|
<message>
|
||||||
|
<source>Standard-View</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate Left</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate the view by 90° counter-clockwise</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdViewRotateRight</name>
|
||||||
|
<message>
|
||||||
|
<source>Standard-View</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate Right</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate the view by 90° clockwise</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdViewTop</name>
|
<name>StdCmdViewTop</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -5302,7 +5619,7 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Display mode</source>
|
<source>Document window</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
@ -5366,6 +5683,34 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Std_ExportGraphviz</name>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz not found</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz couldn't be found on your system.
|
||||||
|
Do you want to specify its installation path if it's already installed?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz installation path</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Dependency graph</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz failed</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz failed to create an image file</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Workbench</name>
|
<name>Workbench</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -23,35 +23,35 @@
|
||||||
<source>Angle Snap</source>
|
<source>Angle Snap</source>
|
||||||
<translation>Einrastwinkel</translation>
|
<translation>Einrastwinkel</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>1 °</source>
|
<source>1 °</source>
|
||||||
<translation>1 °</translation>
|
<translation>1 °</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>2 °</source>
|
<source>2 °</source>
|
||||||
<translation>2 °</translation>
|
<translation>2 °</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>5 °</source>
|
<source>5 °</source>
|
||||||
<translation>5 °</translation>
|
<translation>5 °</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>10 °</source>
|
<source>10 °</source>
|
||||||
<translation>10 °</translation>
|
<translation>10 °</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>20 °</source>
|
<source>20 °</source>
|
||||||
<translation>20 °</translation>
|
<translation>20 °</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>45 °</source>
|
<source>45 °</source>
|
||||||
<translation>45 °</translation>
|
<translation>45 °</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>90 °</source>
|
<source>90 °</source>
|
||||||
<translation>90 °</translation>
|
<translation>90 °</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>180 °</source>
|
<source>180 °</source>
|
||||||
<translation>180 °</translation>
|
<translation>180 °</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -63,6 +63,44 @@
|
||||||
<translation>kein</translation>
|
<translation>kein</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::ActionSelector</name>
|
||||||
|
<message>
|
||||||
|
<source>Available:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Selected:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Add</source>
|
||||||
|
<translation type="unfinished">Hinzufügen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Remove</source>
|
||||||
|
<translation type="unfinished">Entfernen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Move up</source>
|
||||||
|
<translation type="unfinished">Noch oben verschieben</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Move down</source>
|
||||||
|
<translation type="unfinished">Nache unten verschieben</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::AlignmentView</name>
|
||||||
|
<message>
|
||||||
|
<source>Movable object</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Fixed object</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::BlenderNavigationStyle</name>
|
<name>Gui::BlenderNavigationStyle</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -160,6 +198,10 @@
|
||||||
<source>License...</source>
|
<source>License...</source>
|
||||||
<translation>Lizenz...</translation>
|
<translation>Lizenz...</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy to clipboard</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::ButtonModel</name>
|
<name>Gui::Dialog::ButtonModel</name>
|
||||||
|
@ -213,11 +255,11 @@
|
||||||
<source>Angle</source>
|
<source>Angle</source>
|
||||||
<translation>Winkel</translation>
|
<translation>Winkel</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>90°</source>
|
<source>90°</source>
|
||||||
<translation>90°</translation>
|
<translation>90°</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>-90°</source>
|
<source>-90°</source>
|
||||||
<translation>-90 °</translation>
|
<translation>-90 °</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -711,7 +753,7 @@ Wählen Sie bitte eine andere Tastenkombination.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Display mode:</source>
|
<source>Display mode:</source>
|
||||||
<translation>Anzeigemodus:</translation>
|
<translation type="obsolete">Anzeigemodus:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Plot mode:</source>
|
<source>Plot mode:</source>
|
||||||
|
@ -737,6 +779,10 @@ Wählen Sie bitte eine andere Tastenkombination.</translation>
|
||||||
<source>Color plot:</source>
|
<source>Color plot:</source>
|
||||||
<translation>Farb-Plot:</translation>
|
<translation>Farb-Plot:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Document window:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgEditorSettings</name>
|
<name>Gui::Dialog::DlgEditorSettings</name>
|
||||||
|
@ -1486,6 +1532,14 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
<source>Invert zoom</source>
|
<source>Invert zoom</source>
|
||||||
<translation>Zoom umkehren</translation>
|
<translation>Zoom umkehren</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Zoom at cursor</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Zoom step</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgSettings3DViewImp</name>
|
<name>Gui::Dialog::DlgSettings3DViewImp</name>
|
||||||
|
@ -1727,6 +1781,10 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
<source>Items</source>
|
<source>Items</source>
|
||||||
<translation>Elemente</translation>
|
<translation>Elemente</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Current line highlight</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgSettingsImage</name>
|
<name>Gui::Dialog::DlgSettingsImage</name>
|
||||||
|
@ -1850,11 +1908,11 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
<source>QSXGA 2560 x 2048</source>
|
<source>QSXGA 2560 x 2048</source>
|
||||||
<translation>QSXGA 2560 x 2024</translation>
|
<translation>QSXGA 2560 x 2024</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>QUXGA 3200 × 2400</source>
|
<source>QUXGA 3200 × 2400</source>
|
||||||
<translation>QUXGA 3200 x 2400</translation>
|
<translation>QUXGA 3200 x 2400</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message utf8="true">
|
||||||
<source>HUXGA 6400 × 4800</source>
|
<source>HUXGA 6400 × 4800</source>
|
||||||
<translation>HUXGA 6400 x 4800</translation>
|
<translation>HUXGA 6400 x 4800</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1961,6 +2019,14 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
<source>Macro path</source>
|
<source>Macro path</source>
|
||||||
<translation>Makro-Zielpfad</translation>
|
<translation>Makro-Zielpfad</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>General macro settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Run macros in local environment</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgSettingsUnits</name>
|
<name>Gui::Dialog::DlgSettingsUnits</name>
|
||||||
|
@ -2053,11 +2119,11 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>The color of construction geometry in editmode</source>
|
<source>The color of construction geometry in editmode</source>
|
||||||
<translation>Die Farbe der Konstruktionsgeometrien im Editier-Modus</translation>
|
<translation type="obsolete">Die Farbe der Konstruktionsgeometrien im Editier-Modus</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>The color of fully constrained geometry in editmode</source>
|
<source>The color of fully constrained geometry in editmode</source>
|
||||||
<translation>Die Farbe der komplett festgelegten Geometrien im Editier-Modus</translation>
|
<translation type="obsolete">Die Farbe der komplett festgelegten Geometrien im Editier-Modus</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>The color of vertices being edited</source>
|
<source>The color of vertices being edited</source>
|
||||||
|
@ -2067,6 +2133,42 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
<source>The color of edges being edited</source>
|
<source>The color of edges being edited</source>
|
||||||
<translation>Die Farbe der zu bearbeitenden Kanten</translation>
|
<translation>Die Farbe der zu bearbeitenden Kanten</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The color of construction geometry in edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The color of fully constrained geometry in edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cursor text color</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Default shape color</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The default color for new shapes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Default line width and color</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The default line color for new shapes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The default line thickness for new shapes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>px</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::DlgTipOfTheDay</name>
|
<name>Gui::Dialog::DlgTipOfTheDay</name>
|
||||||
|
@ -2131,7 +2233,43 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
<name>Gui::Dialog::DownloadDialog</name>
|
<name>Gui::Dialog::DownloadDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Canceled.</source>
|
<source>Canceled.</source>
|
||||||
<translation>Abgebrochen.</translation>
|
<translation type="obsolete">Abgebrochen.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cancel</source>
|
||||||
|
<translation type="unfinished">Abbrechen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close</source>
|
||||||
|
<translation type="unfinished">Schließen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>There already exists a file called %1 in the current directory. Overwrite?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Unable to save the file %1: %2.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Downloading %1.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download canceled.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download failed: %1.</source>
|
||||||
|
<translation type="unfinished">Download fehlgeschlagen: %1.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Downloaded %1 to current directory.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
@ -2168,6 +2306,13 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
|
||||||
<translation>OK</translation>
|
<translation>OK</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::Dialog::LicenseDialog</name>
|
||||||
|
<message>
|
||||||
|
<source>Copyright</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Dialog::MouseButtons</name>
|
<name>Gui::Dialog::MouseButtons</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -2856,6 +3001,25 @@ Sollen die Änderungen gespeichert werden?</translation>
|
||||||
<translation>Benutzerdefiniert...</translation>
|
<translation>Benutzerdefiniert...</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::LocationWidget</name>
|
||||||
|
<message>
|
||||||
|
<source>X:</source>
|
||||||
|
<translation type="unfinished">X:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Y:</source>
|
||||||
|
<translation type="unfinished">Y:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Z:</source>
|
||||||
|
<translation type="unfinished">Z:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Direction:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::MacroCommand</name>
|
<name>Gui::MacroCommand</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -2886,6 +3050,88 @@ Sollen die Änderungen gespeichert werden?</translation>
|
||||||
<translation>Alles schließen</translation>
|
<translation>Alles schließen</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::ManualAlignment</name>
|
||||||
|
<message>
|
||||||
|
<source>Manual alignment</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment is already in progress.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Alignment[*]</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please, select at least one point in the left and the right view</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please, select at least %1 points in the left and the right view</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please pick points in the left and right view</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment has finished</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment has been canceled</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Too few points picked in the left view. At least %1 points are needed.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Too few points picked in the right view. At least %1 points are needed.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Different number of points picked in left and right view.
|
||||||
|
On the left view %1 points are picked,
|
||||||
|
on the right view %2 points are picked.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Try to align group of views</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The alignment failed.
|
||||||
|
How do you want to proceed?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Retry</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Ignore</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Abort</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Different number of points picked in left and right view. On the left view %1 points are picked, on the right view %2 points are picked.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Point picked at (%1,%2,%3)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No point was picked</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::NetworkRetriever</name>
|
<name>Gui::NetworkRetriever</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -3031,6 +3277,10 @@ Wollen Sie sie beenden, ohne Ihre Daten zu speichern?</translation>
|
||||||
<source>Select All</source>
|
<source>Select All</source>
|
||||||
<translation>Alles auswählen</translation>
|
<translation>Alles auswählen</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Clear console</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::PythonEditor</name>
|
<name>Gui::PythonEditor</name>
|
||||||
|
@ -3175,7 +3425,7 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
|
||||||
<name>Gui::TaskView::TaskAppearance</name>
|
<name>Gui::TaskView::TaskAppearance</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Display mode:</source>
|
<source>Display mode:</source>
|
||||||
<translation>Anzeigemodus:</translation>
|
<translation type="obsolete">Anzeigemodus:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Plot mode:</source>
|
<source>Plot mode:</source>
|
||||||
|
@ -3197,6 +3447,10 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
|
||||||
<source>Appearance</source>
|
<source>Appearance</source>
|
||||||
<translation>Erscheinungsbild</translation>
|
<translation>Erscheinungsbild</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Document window:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::TaskView::TaskEditControl</name>
|
<name>Gui::TaskView::TaskEditControl</name>
|
||||||
|
@ -3220,11 +3474,30 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
|
||||||
<translation>Selektion bearbeiten</translation>
|
<translation>Selektion bearbeiten</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Gui::TouchpadNavigationStyle</name>
|
||||||
|
<message>
|
||||||
|
<source>Press left mouse button</source>
|
||||||
|
<translation type="unfinished">Drücken Sie die linke Maustaste</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Press SHIFT button</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Press ALT button</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Press PgUp/PgDown button</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Gui::Translator</name>
|
<name>Gui::Translator</name>
|
||||||
<message>
|
<message>
|
||||||
<source>English</source>
|
<source>English</source>
|
||||||
<translation>Englisch</translation>
|
<translation type="obsolete">Englisch</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
@ -3481,11 +3754,11 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>File not found</source>
|
<source>File not found</source>
|
||||||
<translation>Datei nicht gefunden</translation>
|
<translation type="obsolete">Datei nicht gefunden</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Cannot open file %1</source>
|
<source>Cannot open file %1</source>
|
||||||
<translation>Kann Datei %1 nicht öffnen</translation>
|
<translation type="obsolete">Kann Datei %1 nicht öffnen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Save views...</source>
|
<source>Save views...</source>
|
||||||
|
@ -3792,6 +4065,17 @@ You either have to finish or cancel the editing in the task panel.</source>
|
||||||
Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufgabenfensters abbrechen.</translation>
|
Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufgabenfensters abbrechen.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdBoxSelection</name>
|
||||||
|
<message>
|
||||||
|
<source>Standard-View</source>
|
||||||
|
<translation type="unfinished">Standardansicht</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Box selection</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdAbout</name>
|
<name>StdCmdAbout</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -3852,6 +4136,21 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
<translation>Vorheriges Fenster aktivieren</translation>
|
<translation>Vorheriges Fenster aktivieren</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdAlignment</name>
|
||||||
|
<message>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished">Bearbeiten</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Alignment...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Align the selected objects</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdArrangeIcons</name>
|
<name>StdCmdArrangeIcons</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -3972,15 +4271,15 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
<name>StdCmdDDuplicateSelection</name>
|
<name>StdCmdDDuplicateSelection</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Edit</source>
|
<source>Edit</source>
|
||||||
<translation>Bearbeiten</translation>
|
<translation type="obsolete">Bearbeiten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Duplicate selection</source>
|
<source>Duplicate selection</source>
|
||||||
<translation>Auswahl duplizieren</translation>
|
<translation type="obsolete">Auswahl duplizieren</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Put duplicates of the selected objects to the active document</source>
|
<source>Put duplicates of the selected objects to the active document</source>
|
||||||
<translation>Duplikate der selektierten Objekte in aktives Dokument einfügen</translation>
|
<translation type="obsolete">Duplikate der selektierten Objekte in aktives Dokument einfügen</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
@ -4129,6 +4428,40 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
<translation>Zeichenstil</translation>
|
<translation>Zeichenstil</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdDuplicateSelection</name>
|
||||||
|
<message>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished">Bearbeiten</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Duplicate selection</source>
|
||||||
|
<translation type="unfinished">Auswahl duplizieren</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Put duplicates of the selected objects to the active document</source>
|
||||||
|
<translation type="unfinished">Duplikate der selektierten Objekte in aktives Dokument einfügen</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdEdit</name>
|
||||||
|
<message>
|
||||||
|
<source>Edit</source>
|
||||||
|
<translation type="unfinished">Bearbeiten</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle &Edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggles the selected object's edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enters or leaves the selected object's edit mode</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdExport</name>
|
<name>StdCmdExport</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -4145,7 +4478,30 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Supported formats</source>
|
<source>Supported formats</source>
|
||||||
<translation>Unterstützte Formate</translation>
|
<translation type="obsolete">Unterstützte Formate</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>No selection</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please select first the objects you want to export.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdExportGraphviz</name>
|
||||||
|
<message>
|
||||||
|
<source>Tools</source>
|
||||||
|
<translation type="unfinished">Werkzeuge</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Dependency graph...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Show the dependency graph of the objects in the active document</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
@ -4321,12 +4677,16 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Mesure distance</source>
|
<source>Mesure distance</source>
|
||||||
<translation>Abstand messen</translation>
|
<translation type="obsolete">Abstand messen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Measures distance between two selected objects</source>
|
<source>Measures distance between two selected objects</source>
|
||||||
<translation>Misst die Distanz zwischen zwei ausgewählten Objekten</translation>
|
<translation>Misst die Distanz zwischen zwei ausgewählten Objekten</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Measure distance</source>
|
||||||
|
<translation type="unfinished">Abstand messen</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdMergeProjects</name>
|
<name>StdCmdMergeProjects</name>
|
||||||
|
@ -4381,15 +4741,15 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
<name>StdCmdOnlineHelpPython</name>
|
<name>StdCmdOnlineHelpPython</name>
|
||||||
<message>
|
<message>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>Hilfe</translation>
|
<translation type="obsolete">Hilfe</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Python Manuals</source>
|
<source>Python Manuals</source>
|
||||||
<translation>Python-Handbuch</translation>
|
<translation type="obsolete">Python-Handbuch</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Show the Python documentation</source>
|
<source>Show the Python documentation</source>
|
||||||
<translation>Python-Dokumentation anzeigen</translation>
|
<translation type="obsolete">Python-Dokumentation anzeigen</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
@ -5206,6 +5566,36 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
<translation>Rechtsansicht</translation>
|
<translation>Rechtsansicht</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdViewRotateLeft</name>
|
||||||
|
<message>
|
||||||
|
<source>Standard-View</source>
|
||||||
|
<translation type="unfinished">Standardansicht</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate Left</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate the view by 90° counter-clockwise</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StdCmdViewRotateRight</name>
|
||||||
|
<message>
|
||||||
|
<source>Standard-View</source>
|
||||||
|
<translation type="unfinished">Standardansicht</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate Right</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Rotate the view by 90° clockwise</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>StdCmdViewTop</name>
|
<name>StdCmdViewTop</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -5325,8 +5715,8 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
<translation>Standardansicht</translation>
|
<translation>Standardansicht</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Display mode</source>
|
<source>Document window</source>
|
||||||
<translation>Anzeige-Modus</translation>
|
<translation>Dokumentfenster</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Display the active view either in fullscreen, in undocked or docked mode</source>
|
<source>Display the active view either in fullscreen, in undocked or docked mode</source>
|
||||||
|
@ -5389,6 +5779,34 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
|
||||||
<translation>Drahtgitter-Modus</translation>
|
<translation>Drahtgitter-Modus</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Std_ExportGraphviz</name>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz not found</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz couldn't be found on your system.
|
||||||
|
Do you want to specify its installation path if it's already installed?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz installation path</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Dependency graph</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz failed</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Graphviz failed to create an image file</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Workbench</name>
|
<name>Workbench</name>
|
||||||
<message>
|
<message>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user