Merge branch 'v0.8.0' into ifcmax/initial-refresh

# Conflicts:
#	src/ifcmax/CMakeLists.txt
This commit is contained in:
Josef Wienerroither
2025-12-25 08:29:52 +01:00
55 changed files with 42289 additions and 42089 deletions
+11
View File
@@ -0,0 +1,11 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/BlankSpruce/gersemi/0.24.0/gersemi/configuration.schema.json
# Needed for gersemi to detect custom functions and macros.
definitions: ["./cmake"]
disable_formatting: false
extensions: []
indent: 4
line_length: 120
list_expansion: favour-inlining
unsafe: false
warn_about_unknown_commands: true
+4
View File
@@ -6,3 +6,7 @@ updates:
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
+108 -68
View File
@@ -18,16 +18,16 @@
################################################################################
cmake_minimum_required(VERSION 3.21)
if (NOT DEFINED CMAKE_CXX_STANDARD)
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
endif()
if (CMAKE_CXX_STANDARD LESS 17)
if(CMAKE_CXX_STANDARD LESS 17)
message(FATAL_ERROR "C++17 or newer is required.")
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON) # not necessary, but encouraged
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if (VERSION_OVERRIDE)
if(VERSION_OVERRIDE)
file(READ "../VERSION" "RELEASE_VERSION_")
string(STRIP "${RELEASE_VERSION_}" RELEASE_VERSION)
message(STATUS "Detected version '${RELEASE_VERSION}'")
@@ -35,12 +35,11 @@ else()
set(RELEASE_VERSION "0.8.0")
endif()
project(IfcOpenShell VERSION ${RELEASE_VERSION})
add_definitions(-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR)
if(POLICY CMP0141) # 3.25+
cmake_policy(SET CMP0141 NEW) # Support for `CMAKE_MSVC_DEBUG_INFORMATION_FORMAT`.
# Has to be set before `project` to take effect.
cmake_policy(SET CMP0141 NEW) # Support for `CMAKE_MSVC_DEBUG_INFORMATION_FORMAT`.
endif()
if(POLICY CMP0144) # 3.27
cmake_policy(SET CMP0144 NEW) # find_package() uses upper-case <PACKAGENAME>_ROOT variables.
@@ -49,6 +48,8 @@ if(POLICY CMP0167) # 3.30
cmake_policy(SET CMP0167 OLD)
endif()
project(IfcOpenShell VERSION ${RELEASE_VERSION})
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
@@ -64,7 +65,11 @@ endif()
option(MINIMAL_BUILD "The build is to make a minimal version of IFC converter from OCCT into IFC." OFF)
option(WASM_BUILD "Build a WebAssembly binary." OFF)
option(ENABLE_BUILD_OPTIMIZATIONS "Enable certain compiler and linker optimizations on RelWithDebInfo and Release builds." OFF)
option(
ENABLE_BUILD_OPTIMIZATIONS
"Enable certain compiler and linker optimizations on RelWithDebInfo and Release builds."
OFF
)
option(BUILD_SHARED_LIBS "Build IfcParse and IfcGeom as shared libs (SO/DLL)." OFF)
option(MSVC_PARALLEL_BUILD "Multi-threaded compilation in Microsoft Visual Studio (/MP)" OFF)
option(USE_VLD "Use Visual Leak Detector for debugging memory leaks, MSVC-only." OFF)
@@ -83,9 +88,11 @@ option(BUILD_PACKAGE "" OFF)
# Most users probably need just common schemas,
# but we're keeping it `OFF` by default to avoid disruption
# (e.g. all Python distribution would need to adapt this option to be set).
option(BUILD_ONLY_COMMON_SCHEMAS
option(
BUILD_ONLY_COMMON_SCHEMAS
"Build only common IFC schemas (2x3, 4, 4x3_add2). By default all schemas will be built."
OFF)
OFF
)
option(SCHEMA_VERSIONS "Explicitly specify schemas to build." "")
option(WITH_OPENCASCADE "Enable geometry interpretation using Open CASCADE" ON)
@@ -103,12 +110,16 @@ option(WITH_ZSTD "Use Zstd compression in RocksDB writes" OFF)
option(USERSPACE_PYTHON_PREFIX "Installs IfcPython for the current user only instead of system-wide." OFF)
option(USE_DEBUG_PYTHON "Use debug binaries when building Debug IfcPython on Windows." OFF)
option(ADD_COMMIT_SHA "Add commit sha and branch in version number, requires git" OFF)
option(VERSION_OVERRIDE "Override the version defined in buildinfo.cpp with the file VERSION in the repository root" OFF)
option(
VERSION_OVERRIDE
"Override the version defined in buildinfo.cpp with the file VERSION in the repository root"
OFF
)
option(USE_CCACHE "Enable use of ccache if it's available from PATH." ON)
set(
PYTHON_MODULE_INSTALL_DIR
"" CACHE PATH
set(PYTHON_MODULE_INSTALL_DIR
""
CACHE PATH
"Directory to install IfcPython package to. By default package is installed in found Python's site-packages."
)
@@ -127,7 +138,7 @@ if(MINIMAL_BUILD)
set(USD_SUPPORT OFF)
endif()
if((BUILD_CONVERT OR BUILD_GEOMSERVER OR BUILD_IFCPYTHON) AND(NOT BUILD_IFCGEOM))
if((BUILD_CONVERT OR BUILD_GEOMSERVER OR BUILD_IFCPYTHON) AND (NOT BUILD_IFCGEOM))
message(STATUS "'IfcGeom' is required with current outputs")
set(BUILD_IFCGEOM ON)
endif()
@@ -142,14 +153,8 @@ if(USE_CCACHE AND CCACHE_FOUND)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$<CONFIG:Debug,RelWithDebInfo>:Embedded>")
# Not needed for Ninja.
if(CMAKE_GENERATOR MATCHES "Visual Studio")
file(COPY_FILE
${CCACHE_FOUND} ${CMAKE_BINARY_DIR}/cl.exe
ONLY_IF_DIFFERENT)
set(CMAKE_VS_GLOBALS
"CLToolExe=cl.exe"
"CLToolPath=${CMAKE_BINARY_DIR}"
"UseMultiToolTask=true"
)
file(COPY_FILE ${CCACHE_FOUND} ${CMAKE_BINARY_DIR}/cl.exe ONLY_IF_DIFFERENT)
set(CMAKE_VS_GLOBALS "CLToolExe=cl.exe" "CLToolPath=${CMAKE_BINARY_DIR}" "UseMultiToolTask=true")
endif()
endif()
endif()
@@ -183,7 +188,10 @@ endif()
if(BUILD_SHARED_LIBS)
add_definitions(-DIFC_SHARED_BUILD)
if(MSVC)
message(WARNING "Building DLLs against the static VC run-time. This is not recommended if the DLLs are to be redistributed.")
message(
WARNING
"Building DLLs against the static VC run-time. This is not recommended if the DLLs are to be redistributed."
)
# C4521: 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
# There will be couple hundreds of these so suppress them away, https://msdn.microsoft.com/en-us/library/esew7y1w.aspx
add_definitions(-wd4251)
@@ -206,7 +214,6 @@ foreach(option_flag IN LISTS option_flags)
convert_env_var_to_bool("${option_flag}")
endforeach()
if(BUILD_IFCGEOM AND WITH_OPENCASCADE)
find_package(OpenCASCADE REQUIRED)
add_definitions(-DIFOPSH_WITH_OPENCASCADE)
@@ -230,7 +237,7 @@ if(USD_SUPPORT)
endif(USD_SUPPORT)
set(ROCKSDB_LIBRARIES "")
if (WITH_ROCKSDB)
if(WITH_ROCKSDB)
# Temporaily mess with CMAKE_FIND_PACKAGE_PREFER_CONFIG to help RocksDB
# find it's zstd dependency on Windows.
# Only do it on Windows, otherwise it might create problems as
@@ -250,9 +257,12 @@ if (WITH_ROCKSDB)
set(ROCKSDB_LIBRARIES "IFCOPENSHELL_RocksDB")
target_compile_definitions(IFCOPENSHELL_RocksDB INTERFACE IFOPSH_WITH_ROCKSDB)
set(SWIG_DEFINES ${SWIG_DEFINES} -DIFOPSH_WITH_ROCKSDB)
target_link_libraries(IFCOPENSHELL_RocksDB INTERFACE $<IF:$<TARGET_EXISTS:RocksDB::rocksdb-shared>,RocksDB::rocksdb-shared,RocksDB::rocksdb>)
target_link_libraries(
IFCOPENSHELL_RocksDB
INTERFACE $<IF:$<TARGET_EXISTS:RocksDB::rocksdb-shared>,RocksDB::rocksdb-shared,RocksDB::rocksdb>
)
if (WITH_ZSTD)
if(WITH_ZSTD)
# @todo do we actually need the zstd include dir or rather just pass
# the libzstd.a along with the rocksdb library when needed and feature
# detect based on rocksdb API?
@@ -262,8 +272,7 @@ if (WITH_ROCKSDB)
target_link_libraries(IFCOPENSHELL_RocksDB INTERFACE zstd::libzstd_static)
endif()
install(TARGETS IFCOPENSHELL_RocksDB
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
install(TARGETS IFCOPENSHELL_RocksDB EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
endif()
# Find Boost: On win32 the (hardcoded) default is to use static libraries and
@@ -299,7 +308,14 @@ if(WASM_BUILD)
else()
# @todo review this, shouldn't this be all possible header-only now?
# ... or rewritten using C++17 features?
set(BOOST_COMPONENTS system program_options regex thread date_time iostreams)
set(BOOST_COMPONENTS
system
program_options
regex
thread
date_time
iostreams
)
endif()
if(USE_MMAP)
@@ -405,7 +421,7 @@ if(MSVC)
endif()
# Enforce standards-conformance on VS > 2015, older Boost versions fail to compile with this
if(MSVC_VERSION GREATER 1900 AND(Boost_MAJOR_VERSION GREATER 1 OR Boost_MINOR_VERSION GREATER 66))
if(MSVC_VERSION GREATER 1900 AND (Boost_MAJOR_VERSION GREATER 1 OR Boost_MINOR_VERSION GREATER 66))
add_definitions(-permissive-)
endif()
@@ -424,11 +440,11 @@ if(MSVC)
# endforeach()
# endif()
add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)
# See #5158.
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.40)
add_definitions(-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR)
endif()
add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)
# See #5158.
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.40)
add_definitions(-D_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR)
endif()
else()
add_definitions(-Wall -Wextra)
@@ -438,7 +454,10 @@ else()
add_definitions(-Wno-maybe-uninitialized)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.0 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 9.0))
if(
CMAKE_CXX_COMPILER_ID MATCHES "GNU"
AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.0 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 9.0)
)
# OpenCascade spews a lot of deprecated-copy warnings
add_definitions(-Wno-deprecated-copy)
endif()
@@ -449,16 +468,23 @@ else()
endif()
endif(MSVC)
include_directories(${OPENCOLLADA_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS} ${HDF5_INCLUDE_DIR}
)
include_directories(${OPENCOLLADA_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${HDF5_INCLUDE_DIR})
if(NOT SCHEMA_VERSIONS)
# `WASM_BUILD` - super arbitrarily try to keep size down at least a little bit
if(BUILD_ONLY_COMMON_SCHEMAS OR WASM_BUILD)
set(SCHEMA_VERSIONS "2x3" "4" "4x3_add2")
else()
set(SCHEMA_VERSIONS "2x3" "4" "4x1" "4x2" "4x3" "4x3_tc1" "4x3_add1" "4x3_add2")
set(SCHEMA_VERSIONS
"2x3"
"4"
"4x1"
"4x2"
"4x3"
"4x3_tc1"
"4x3_add1"
"4x3_add2"
)
endif()
endif()
@@ -477,7 +503,10 @@ if(COMPILE_SCHEMA)
find_package(PythonInterp)
if(NOT PYTHONINTERP_FOUND)
message(FATAL_ERROR "A Python interpreter is necessary when COMPILE_SCHEMA is enabled. Disable COMPILE_SCHEMA or fix Python paths to proceed.")
message(
FATAL_ERROR
"A Python interpreter is necessary when COMPILE_SCHEMA is enabled. Disable COMPILE_SCHEMA or fix Python paths to proceed."
)
endif()
set(IFC_RELEASE_NOT_USED ${SCHEMA_VERSIONS})
@@ -497,7 +526,10 @@ if(COMPILE_SCHEMA)
if("${PYPARSING_FOUND}" STREQUAL "-1")
message(STATUS "Installing pyparsing")
execute_process(COMMAND ${PYTHON_EXECUTABLE} -m pip "install" --user pyparsing RESULT_VARIABLE SUCCESS)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -m pip "install" --user pyparsing
RESULT_VARIABLE SUCCESS
)
if(NOT "${SUCCESS}" STREQUAL "0")
execute_process(COMMAND pip "install" --user pyparsing RESULT_VARIABLE SUCCESS)
@@ -512,19 +544,23 @@ if(COMPILE_SCHEMA)
# Bootstrap the parser
message(STATUS "Compiling schema, this will take a while...")
execute_process(COMMAND ${PYTHON_EXECUTABLE} bootstrap.py express.bnf
execute_process(
COMMAND ${PYTHON_EXECUTABLE} bootstrap.py express.bnf
WORKING_DIRECTORY ../src/ifcexpressparser
OUTPUT_FILE express_parser.py
RESULT_VARIABLE SUCCESS)
RESULT_VARIABLE SUCCESS
)
if(NOT "${SUCCESS}" STREQUAL "0")
message(FATAL_ERROR "Failed to bootstrap parser. Make sure pyparsing is installed")
endif()
# Generate code
execute_process(COMMAND ${PYTHON_EXECUTABLE} ../ifcexpressparser/express_parser.py ../../${COMPILE_SCHEMA}
execute_process(
COMMAND ${PYTHON_EXECUTABLE} ../ifcexpressparser/express_parser.py ../../${COMPILE_SCHEMA}
WORKING_DIRECTORY ../src/ifcparse
OUTPUT_VARIABLE COMPILED_SCHEMA_NAME)
OUTPUT_VARIABLE COMPILED_SCHEMA_NAME
)
# Prevent the schema that had just been compiled from being excluded
foreach(schema ${SCHEMA_VERSIONS})
@@ -568,8 +604,8 @@ if(ADD_COMMIT_SHA)
endif()
if(GIT_FOUND)
if (VERSION_OVERRIDE)
set (git_branch ${RELEASE_VERSION})
if(VERSION_OVERRIDE)
set(git_branch ${RELEASE_VERSION})
else()
message("git found: ${GIT_EXECUTABLE} with version ${GIT_VERSION_STRING}")
execute_process(
@@ -581,8 +617,8 @@ if(ADD_COMMIT_SHA)
string(REPLACE "\n" ";" git_branch_list "${git_branches}")
foreach(git_branch_candidate IN ITEMS ${git_branch_list})
string(REPLACE "*" "" git_branch_candidate_temp "${git_branch_candidate}")
string(STRIP "${git_branch_candidate_temp}" git_branch_candidate_2)
string(REPLACE "*" "" git_branch_candidate_temp "${git_branch_candidate}")
string(STRIP "${git_branch_candidate_temp}" git_branch_candidate_2)
if(NOT git_branch_candidate_2 MATCHES "^HEAD$")
string(REPLACE "/" ";" git_branch_candidate_2_list "${git_branch_candidate_2}")
list(GET git_branch_candidate_2_list -1 git_branch)
@@ -600,13 +636,13 @@ if(ADD_COMMIT_SHA)
message(STATUS "IfcOpenShell branch: \"${git_branch}\"")
message(STATUS "IfcOpenShell commit: \"${git_sha}\"")
if ("${git_branch}" STREQUAL "" OR "${git_sha}" STREQUAL "")
if("${git_branch}" STREQUAL "" OR "${git_sha}" STREQUAL "")
message(FATAL_ERROR "Unable to determine commit sha and/or branch")
endif()
target_compile_definitions(IfcParse PRIVATE
-DIFCOPENSHELL_BRANCH=${git_branch}
-DIFCOPENSHELL_COMMIT=${git_sha}
target_compile_definitions(
IfcParse
PRIVATE -DIFCOPENSHELL_BRANCH=${git_branch} -DIFCOPENSHELL_COMMIT=${git_sha}
)
endif()
endif(ADD_COMMIT_SHA)
@@ -649,23 +685,23 @@ if(NOT TARGET uninstall)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
IMMEDIATE
@ONLY
)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
# Packaging
list(APPEND CPACK_SOURCE_IGNORE_FILES
"/\\\\.git"
"/build/"
"/.pytest_cache/"
"/__pycache__/"
)
list(APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git" "/build/" "/.pytest_cache/" "/__pycache__/")
set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_SOURCE_DIR}/..;/")
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${EXTRA_VERSION}")
set(CPACK_PACKAGE_NAME
"${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${EXTRA_VERSION}"
)
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}${EXTRA_VERSION}")
SET(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${EXTRA_VERSION}-${CMAKE_SYSTEM_NAME}")
set(CPACK_PACKAGE_FILE_NAME
"${PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${EXTRA_VERSION}-${CMAKE_SYSTEM_NAME}"
)
set(CPACK_PACKAGE_DIRECTORY "${PROJECT_BINARY_DIR}/assets")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "IfcOpenShell")
set(CPACK_PACKAGE_DESCRIPTION "IfcOpenShell.")
@@ -686,12 +722,16 @@ endforeach(COMPONENT)
set(CPACK_DEBIAN_PACKAGE_NAME "${PROJECT_NAME}")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${CPACK_PACKAGE_CONTACT}")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "python3, libxml2, libocct-foundation-dev, libocct-modeling-algorithms-dev, libocct-modeling-data-dev, libocct-ocaf-dev, libocct-visualization-dev, libocct-data-exchange-dev, libhdf5-serial-dev, libpython3-dev, python3-pytest ${BOOST_DEPS}")
set(CPACK_DEBIAN_PACKAGE_DEPENDS
"python3, libxml2, libocct-foundation-dev, libocct-modeling-algorithms-dev, libocct-modeling-data-dev, libocct-ocaf-dev, libocct-visualization-dev, libocct-data-exchange-dev, libhdf5-serial-dev, libpython3-dev, python3-pytest ${BOOST_DEPS}"
)
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION_SUMMARY "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION}")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_PACKAGE_SECTION "science")
set(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}${EXTRA_VERSION}")
set(CPACK_DEBIAN_PACKAGE_VERSION
"${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}${EXTRA_VERSION}"
)
set(CPACK_DEBIAN_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}")
# set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/cmake/debian/postinst")
+1 -2
View File
@@ -65,5 +65,4 @@ add_library(IFCOPENSHELL_CGAL INTERFACE)
target_link_libraries(IFCOPENSHELL_CGAL INTERFACE CGAL::CGAL)
target_compile_definitions(IFCOPENSHELL_CGAL INTERFACE IFOPSH_WITH_CGAL)
set(SWIG_DEFINES ${SWIG_DEFINES} -DIFOPSH_WITH_CGAL)
install(TARGETS IFCOPENSHELL_CGAL
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
install(TARGETS IFCOPENSHELL_CGAL EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
-1
View File
@@ -55,7 +55,6 @@ if(HDF5_LIBRARY_DIR)
"${HDF5_LIBRARY_DIR}/libsz${debug_postfix}.${lib_ext}"
"${HDF5_LIBRARY_DIR}/libaec${debug_postfix}.${lib_ext}"
)
else()
message(STATUS "Packaging hdf5 and zlib for conda distribution")
+5 -5
View File
@@ -33,15 +33,15 @@ else()
set_property(TARGET LibXml2::LibXml2 PROPERTY IMPORTED_LOCATION)
get_release_variant(LIBXML2_RELEASE_LIB "${LIBXML2_LIBRARIES}" "d")
get_debug_variant(LIBXML2_DEBUG_LIB "${LIBXML2_LIBRARIES}" "d")
set_target_properties(LibXml2::LibXml2
set_target_properties(
LibXml2::LibXml2
PROPERTIES
IMPORTED_CONFIGURATIONS "Release;Debug"
IMPORTED_LOCATION_RELEASE "${LIBXML2_RELEASE_LIB}"
IMPORTED_LOCATION_DEBUG "${LIBXML2_DEBUG_LIB}"
IMPORTED_CONFIGURATIONS "Release;Debug"
IMPORTED_LOCATION_RELEASE "${LIBXML2_RELEASE_LIB}"
IMPORTED_LOCATION_DEBUG "${LIBXML2_DEBUG_LIB}"
)
endif()
endif()
# Restore module path.
list(PREPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR})
+46 -27
View File
@@ -22,7 +22,6 @@ if(OCC_LIBRARY_DIR)
message(STATUS "Looking for Open CASCADE library files in: ${OCC_LIBRARY_DIR}")
endif()
if(NOT OCC_INCLUDE_DIR AND NOT OCC_LIBRARY_DIR)
# OCE is not supported for find_package, because it's using a different name (`oce`)
# and also has an odd directory structure (install/lib/oce-0.18/*.cmake).
@@ -41,9 +40,7 @@ if(NOT OCC_INCLUDE_DIR AND NOT OCC_LIBRARY_DIR)
if(OpenCASCADE_VERSION VERSION_LESS "7.7.0")
# cmake configs < 7.7.0 were not adding include directories to targets automatically.
set_target_properties(TKernel PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${OpenCASCADE_INCLUDE_DIR}"
)
set_target_properties(TKernel PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OpenCASCADE_INCLUDE_DIR}")
endif()
if(OpenCASCADE_VERSION VERSION_LESS "7.9.0" AND WIN32)
@@ -62,17 +59,11 @@ if(OCC_INCLUDE_DIR AND OCC_LIBRARY_DIR)
"and OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}')."
)
# Parse OCC_VERSION_STRING.
file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAJOR
REGEX "#define OCC_VERSION_MAJOR.*"
)
file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAJOR REGEX "#define OCC_VERSION_MAJOR.*")
string(REGEX MATCH "[0-9]+" OCC_MAJOR ${OCC_MAJOR})
file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MINOR
REGEX "#define OCC_VERSION_MINOR.*"
)
file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MINOR REGEX "#define OCC_VERSION_MINOR.*")
string(REGEX MATCH "[0-9]+" OCC_MINOR ${OCC_MINOR})
file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAINT
REGEX "#define OCC_VERSION_MAINTENANCE.*"
)
file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAINT REGEX "#define OCC_VERSION_MAINTENANCE.*")
string(REGEX MATCH "[0-9]+" OCC_MAINT ${OCC_MAINT})
set(OCC_VERSION_STRING "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
else()
@@ -86,17 +77,37 @@ else()
)
endif()
set(
OpenCASCADE_LIBRARIES
TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO
TKFillet TKXSBase TKOffset TKHLR
set(OpenCASCADE_LIBRARIES
TKernel
TKMath
TKBRep
TKGeomBase
TKGeomAlgo
TKG3d
TKG2d
TKShHealing
TKTopAlgo
TKMesh
TKPrim
TKBool
TKBO
TKFillet
TKXSBase
TKOffset
TKHLR
# @todo investigate the exact conditions when this is necessary
TKBin
)
if(OCC_VERSION_STRING VERSION_LESS 7.8.0)
list(APPEND OpenCASCADE_LIBRARIES TKIGES TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP)
list(
APPEND OpenCASCADE_LIBRARIES
TKIGES
TKSTEPBase
TKSTEPAttr
TKSTEP209
TKSTEP
)
else(OCC_VERSION_STRING VERSION_LESS 7.8.0)
list(APPEND OpenCASCADE_LIBRARIES TKDESTEP TKDEIGES)
endif(OCC_VERSION_STRING VERSION_LESS 7.8.0)
@@ -106,10 +117,7 @@ find_library(libTKernel NAMES TKernel TKerneld PATHS ${OCC_LIBRARY_DIR} NO_DEFAU
if(libTKernel)
message(STATUS "Required Open Cascade Library files found")
else()
message(
FATAL_ERROR
"Unable to find Open Cascade library files in OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}'), aborting"
)
message(FATAL_ERROR "Unable to find Open Cascade library files in OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}'), aborting")
endif()
if(MSVC)
@@ -138,9 +146,21 @@ if(OCCT_STATIC)
# OpenCASCADE_LIBRARIES repeated N times below in order to fix cyclic dependencies
# tfk: --start-group ... --end-group didn't work on the apple linker when last tested
if(APPLE)
set(OpenCASCADE_LIBRARIES ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
set(OpenCASCADE_LIBRARIES
${OpenCASCADE_LIBRARIES}
${OpenCASCADE_LIBRARIES}
${OpenCASCADE_LIBRARIES}
${OpenCASCADE_LIBRARIES}
${OpenCASCADE_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
)
else()
set(OpenCASCADE_LIBRARIES -Wl,--start-group ${OpenCASCADE_LIBRARIES} -Wl,--end-group ${CMAKE_THREAD_LIBS_INIT})
set(OpenCASCADE_LIBRARIES
-Wl,--start-group
${OpenCASCADE_LIBRARIES}
-Wl,--end-group
${CMAKE_THREAD_LIBS_INIT}
)
endif()
endif()
@@ -157,5 +177,4 @@ target_include_directories(OpenCASCADE_INTERFACE INTERFACE "${OCC_INCLUDE_DIR}")
target_link_libraries(OpenCASCADE_INTERFACE INTERFACE ${OpenCASCADE_LIBRARIES})
target_link_directories(OpenCASCADE_INTERFACE INTERFACE "${OCC_LIBRARY_DIR}")
set(OpenCASCADE_LIBRARIES OpenCASCADE_INTERFACE)
install(TARGETS OpenCASCADE_INTERFACE
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
install(TARGETS OpenCASCADE_INTERFACE EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
+39 -13
View File
@@ -1,4 +1,3 @@
#
# Input variables:
# - `OPENCOLLADA_INCLUDE_DIR`
@@ -41,23 +40,37 @@ if(NOT OpenCOLLADA_DIR)
if("${OPENCOLLADA_LIBRARY_DIR}" STREQUAL "")
message(STATUS "No OpenCOLLADA library directory specified")
find_library(OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework
PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib)
find_library(
OPENCOLLADA_FRAMEWORK_LIB
NAMES OpenCOLLADAFramework
PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib
)
get_filename_component(OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_FRAMEWORK_LIB} PATH)
endif()
find_library(OpenCOLLADAFramework NAMES OpenCOLLADAFramework OpenCOLLADAFrameworkd PATHS ${OPENCOLLADA_LIBRARY_DIR} NO_DEFAULT_PATH)
find_library(
OpenCOLLADAFramework
NAMES OpenCOLLADAFramework OpenCOLLADAFrameworkd
PATHS ${OPENCOLLADA_LIBRARY_DIR}
NO_DEFAULT_PATH
)
if(OpenCOLLADAFramework)
message(STATUS "OpenCOLLADA library files found")
else()
message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA libraries. "
"Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed.")
message(
FATAL_ERROR
"COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA libraries. "
"Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed."
)
endif()
set(OPENCOLLADA_LIBRARY_DIR "${OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files")
set(OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter")
set(OPENCOLLADA_INCLUDE_DIRS
"${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils"
"${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter"
)
find_file(COLLADASWStreamWriter_h "COLLADASWStreamWriter.h" ${OPENCOLLADA_INCLUDE_DIRS})
@@ -66,8 +79,15 @@ if(NOT OpenCOLLADA_DIR)
set(OPENCOLLADA_FOUND TRUE)
set(OPENCOLLADA_LIBRARY_NAMES
GeneratedSaxParser MathMLSolver OpenCOLLADABaseUtils OpenCOLLADAFramework OpenCOLLADASaxFrameworkLoader
OpenCOLLADAStreamWriter UTF buffer ftoa
GeneratedSaxParser
MathMLSolver
OpenCOLLADABaseUtils
OpenCOLLADAFramework
OpenCOLLADASaxFrameworkLoader
OpenCOLLADAStreamWriter
UTF
buffer
ftoa
)
# Use the found OpenCOLLADAFramework as a template for all other OpenCOLLADA libraries
@@ -100,16 +120,22 @@ if(NOT OpenCOLLADA_DIR)
list(APPEND OPENCOLLADA_LIBRARIES "${pcre_library}")
endif()
else()
message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find PCRE. "
"Disable COLLADA_SUPPORT or fix PCRE_LIBRARY_DIR path to proceed.")
message(
FATAL_ERROR
"COLLADA_SUPPORT enabled, but unable to find PCRE. "
"Disable COLLADA_SUPPORT or fix PCRE_LIBRARY_DIR path to proceed."
)
endif()
if(MSVC)
add_debug_variants(OPENCOLLADA_LIBRARIES "${OPENCOLLADA_LIBRARIES}" d)
endif()
else()
message(FATAL_ERROR "COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA headers. "
"Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed.")
message(
FATAL_ERROR
"COLLADA_SUPPORT enabled, but unable to find OpenCOLLADA headers. "
"Disable COLLADA_SUPPORT or fix OpenCOLLADA paths to proceed."
)
endif()
endif(NOT OpenCOLLADA_DIR)
+3 -11
View File
@@ -19,20 +19,14 @@ if((NOT PROJ_INCLUDE_DIR AND NOT PROJ_LIBRARIES))
find_package(PROJ QUIET CONFIG)
if(NOT PROJ_FOUND)
find_path(PROJ_INCLUDE_DIR proj.h
PATHS
/usr/include/proj
REQUIRED
)
find_path(PROJ_INCLUDE_DIR proj.h PATHS /usr/include/proj REQUIRED)
if(PROJ_INCLUDE_DIR)
message(STATUS "Found PROJ include files in: ${PROJ_INCLUDE_DIR}")
else()
message(FATAL_ERROR "Unable to find PROJ include directory, specify PROJ_INCLUDE_DIR manually.")
endif()
find_library(PROJ_LIBRARY
NAMES proj
PATHS /usr/lib/x86_64-linux-gnu)
find_library(PROJ_LIBRARY NAMES proj PATHS /usr/lib/x86_64-linux-gnu)
if(PROJ_LIBRARY)
message(STATUS "PROJ libraries ${PROJ_LIBRARY} found in: ${PROJ_LIBRARY_DIR}")
set(PROJ_LIBRARIES ${PROJ_LIBRARY})
@@ -46,9 +40,7 @@ if((NOT PROJ_INCLUDE_DIR AND NOT PROJ_LIBRARIES))
target_link_directories(PROJ::proj INTERFACE "${PROJ_LIBRARY}")
endif()
else()
find_library(PROJ_LIBRARY
NAMES proj
PATHS ${PROJ_LIBRARY_DIR})
find_library(PROJ_LIBRARY NAMES proj PATHS ${PROJ_LIBRARY_DIR})
if(PROJ_LIBRARY)
message(STATUS "PROJ libraries ${PROJ_LIBRARY} found in: ${PROJ_LIBRARY_DIR}")
set(PROJ_LIBRARIES ${PROJ_LIBRARY})
+27 -50
View File
@@ -16,7 +16,6 @@ UNIFY_ENVVARS_AND_CACHE(USD_LIBRARY_DIR)
UNIFY_ENVVARS_AND_CACHE(TBB_INCLUDE_DIR)
UNIFY_ENVVARS_AND_CACHE(TBB_LIBRARY_DIR)
if(NOT USD_LIBRARY_DIR AND NOT USD_INCLUDE_DIR)
find_package(pxr CONFIG)
if(pxr_FOUND)
@@ -29,12 +28,7 @@ if(NOT USD_LIBRARY_DIR AND NOT USD_INCLUDE_DIR)
endif()
if(NOT USD_INCLUDE_DIR)
find_path(USD_INCLUDE_DIR pxr.h
PATHS
/usr/include/pxr
/usr/local/include/pxr
REQUIRED
)
find_path(USD_INCLUDE_DIR pxr.h PATHS /usr/include/pxr /usr/local/include/pxr REQUIRED)
if(USD_INCLUDE_DIR)
message(STATUS "Found USD include files in: ${USD_INCLUDE_DIR}")
else()
@@ -46,30 +40,28 @@ else()
endif()
set(USD_LIBRARIES
usd_usd
usd_usdGeom
usd_usdShade
usd_usdLux
usd_vt
usd_sdf
usd_tf
usd_gf
usd_kind
usd_pcp
usd_arch
usd_ar
usd_plug
usd_js
usd_sdr
usd_work
usd_trace
usd_ndr
usd_ts
)
usd_usd
usd_usdGeom
usd_usdShade
usd_usdLux
usd_vt
usd_sdf
usd_tf
usd_gf
usd_kind
usd_pcp
usd_arch
usd_ar
usd_plug
usd_js
usd_sdr
usd_work
usd_trace
usd_ndr
usd_ts
)
find_library(USD_LIBRARY
NAMES ${USD_LIBRARIES}
PATHS ${USD_LIBRARY_DIR})
find_library(USD_LIBRARY NAMES ${USD_LIBRARIES} PATHS ${USD_LIBRARY_DIR})
if(USD_LIBRARY)
message(STATUS "USD libraries ${USD_LIBRARIES} found in: ${USD_LIBRARY_DIR}")
link_directories(${USD_LIBRARY_DIR})
@@ -78,32 +70,17 @@ else()
endif()
add_library(pxr::USD INTERFACE IMPORTED)
target_link_directories(pxr::USD
INTERFACE
${USD_LIBRARY_DIR} ${TBB_LIBRARY_DIR}
)
target_include_directories(pxr::USD
INTERFACE
${USD_INCLUDE_DIR} ${TBB_INCLUDE_DIR}
)
target_link_directories(pxr::USD INTERFACE ${USD_LIBRARY_DIR} ${TBB_LIBRARY_DIR})
target_include_directories(pxr::USD INTERFACE ${USD_INCLUDE_DIR} ${TBB_INCLUDE_DIR})
# We don't link TBB libraries - on Windows they're provided using `pragma(lib)`.
# On Unix there's no `pragma(lib)`, so in theory it will break.
target_link_libraries(pxr::USD
INTERFACE
${USD_LIBRARIES}
)
target_link_libraries(pxr::USD INTERFACE ${USD_LIBRARIES})
if(MSVC)
target_link_libraries(pxr::USD
INTERFACE
debug DbgHelp.lib
)
target_link_libraries(pxr::USD INTERFACE debug DbgHelp.lib)
endif()
target_compile_definitions(pxr::USD
INTERFACE
PXR_STATIC WITH_USD
)
target_compile_definitions(pxr::USD INTERFACE PXR_STATIC WITH_USD)
set(SWIG_DEFINES ${SWIG_DEFINES} -DWITH_USD)
+6 -19
View File
@@ -6,30 +6,17 @@ set(CONFIG_PACKAGE_INPUT "${PROJECT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in")
set(CONFIG_PACKAGE_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake")
# Allow linking against build directory.
export(
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
FILE ${CONFIG_TARGETS_FILENAME}
NAMESPACE ${CONFIG_NAMESPACE}::
)
install(
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
NAMESPACE ${CONFIG_NAMESPACE}::
DESTINATION "${CONFIG_PACKAGE_LOCATION}"
)
export(EXPORT ${IFCOPENSHELL_EXPORT_TARGETS} FILE ${CONFIG_TARGETS_FILENAME} NAMESPACE ${CONFIG_NAMESPACE}::)
install(EXPORT ${IFCOPENSHELL_EXPORT_TARGETS} NAMESPACE ${CONFIG_NAMESPACE}:: DESTINATION "${CONFIG_PACKAGE_LOCATION}")
include(CMakePackageConfigHelpers)
write_basic_package_version_file(${CONFIG_VERSION_OUTPUT}
COMPATIBILITY ExactVersion)
write_basic_package_version_file(${CONFIG_VERSION_OUTPUT} COMPATIBILITY ExactVersion)
configure_package_config_file(${CONFIG_PACKAGE_INPUT}
configure_package_config_file(
${CONFIG_PACKAGE_INPUT}
${CONFIG_PACKAGE_OUTPUT}
INSTALL_DESTINATION ${CONFIG_PACKAGE_LOCATION}
)
install(FILES
"${CONFIG_PACKAGE_OUTPUT}"
"${CONFIG_VERSION_OUTPUT}"
DESTINATION ${CONFIG_PACKAGE_LOCATION}
)
install(FILES "${CONFIG_PACKAGE_OUTPUT}" "${CONFIG_VERSION_OUTPUT}" DESTINATION ${CONFIG_PACKAGE_LOCATION})
+1 -14
View File
@@ -349,14 +349,13 @@ dependency_tree: "dict[str, tuple[str, ...]]" = {
"boost": (),
"libxml2": (),
"python": (),
"occ": ("freetype",),
"occ": (),
"pcre": (),
"pcre2": (),
"json": (),
"hdf5": (),
"cgal": (),
"eigen": (),
"freetype": (),
"rocksdb": ("zstd",),
"zstd": (),
# 'usd': ('boost', 'oneTBB')
@@ -951,17 +950,6 @@ if "swig" in targets:
revision=f"v{SWIG_VERSION}",
)
if "freetype" in targets:
build_dependency(
name=f"freetype",
mode="cmake",
build_tool_args=[f"-DCMAKE_INSTALL_PREFIX={DEPS_DIR}/install/freetype"],
download_url="https://github.com/freetype/freetype",
download_name="freetype2",
download_tool=download_tool_git,
revision="VER-2-14-0",
)
if USE_OCCT and "occ" in targets:
patches = []
if OCCT_VERSION < "7.4":
@@ -996,7 +984,6 @@ if USE_OCCT and "occ" in targets:
f"-DUSE_FREETYPE=OFF",
f"-DUSE_OPENGL=OFF",
f"-DUSE_GLES2=OFF",
f"-D3RDPARTY_FREETYPE_DIR={DEPS_DIR}/install/freetype",
f"-DCMAKE_POLICY_VERSION_MINIMUM=3.5",
*MAC_CROSS_COMPILE_INTEL_ARGS,
],
+12
View File
@@ -1,3 +1,13 @@
[project]
name = "IfcOpenShell"
version = "0.0.0"
dependencies = [
"black==25.12",
"ruff==0.14.10",
"poethepoet",
"gersemi==0.24",
]
[tool.black]
line-length = 120
include = '''
@@ -71,3 +81,5 @@ ruff.sequence = ["ruff-main", "ruff-old"]
black = "black ."
format.sequence = ["black", "ruff-main", "ruff-old"]
cmake-format = "gersemi cmake src --in-place"
@@ -1062,10 +1062,15 @@ class LoadProject(bpy.types.Operator, IFCFileSelector, ImportHelper):
and not self.is_advanced
):
filepath = self.get_filepath()
metadata_path = Path(str(filepath) + ".metadata.blend")
suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix
if str(filepath).lower().endswith(".ifc"):
metadata_path = Path(str(filepath)[:-4] + suffix)
else:
metadata_path = Path(str(filepath) + suffix)
if metadata_path.exists() and metadata_path.is_file():
try:
bpy.ops.bim.load_blend_metadata_and_ifc(filepath=filepath)
self.report({"INFO"}, f"Loaded metadata file: {metadata_path.name}")
return {"FINISHED"}
except Exception as e:
self.report({"WARNING"}, f"Failed to load metadata file, using regular load: {e}")
@@ -1763,7 +1768,11 @@ class ExportIFC(bpy.types.Operator, ExportHelper):
if tool.Blender.get_addon_preferences().save_metadata_blend_file:
try:
bpy.ops.bim.save_blend_metadata_file()
blendmetadata_path = output_file + ".metadata.blend"
suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix
if output_file.lower().endswith(".ifc"):
blendmetadata_path = output_file[:-4] + suffix
else:
blendmetadata_path = output_file + suffix
self.report(
{"INFO"},
f'IFC Project "{os.path.basename(output_file)}" And Metadata File Saved to: {os.path.basename(blendmetadata_path)}',
+5 -1
View File
@@ -332,10 +332,14 @@ class BIM_PT_project(Panel):
row.operator("bim.select_ifc_file", icon="FILE_FOLDER", text="")
if tool.Blender.get_addon_preferences().save_metadata_blend_file:
suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix
if props.ifc_file.lower().endswith(".ifc"):
metadata_filename = os.path.basename(props.ifc_file)[:-4] + suffix
else:
metadata_filename = os.path.basename(props.ifc_file) + suffix
row = self.layout.row(align=True)
col = row.column()
col.enabled = False
metadata_filename = os.path.basename(props.ifc_file) + ".metadata.blend"
col.label(text=f"Saving session data to: {metadata_filename}")
+14 -4
View File
@@ -260,10 +260,14 @@ class SaveBlendMetadataFile(bpy.types.Operator):
self.report({"WARNING"}, "No IFC file path set.")
return {"CANCELLED"}
blendmetadata_path = ifc_file + ".metadata.blend"
suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix
if ifc_file.lower().endswith(".ifc"):
blendmetadata_path = ifc_file[:-4] + suffix
else:
blendmetadata_path = ifc_file + suffix
# Save a temporary copy of the current blend file
temp_path = bpy.path.abspath("//__temp_blendmetadata.blend")
ifc_dir = os.path.dirname(ifc_file)
temp_path = os.path.join(ifc_dir, "__temp_blendmetadata.blend")
bpy.ops.wm.save_as_mainfile(filepath=temp_path, copy=True)
cleanup_script = f"""
@@ -331,12 +335,14 @@ except Exception:
bpy.ops.wm.save_as_mainfile(filepath=r'{blendmetadata_path}')
"""
import tempfile
with tempfile.NamedTemporaryFile("w", suffix=".py", delete=False) as script_file:
script_file.write(cleanup_script)
script_path = script_file.name
blender_exe = bpy.app.binary_path
import subprocess
result = subprocess.run(
[blender_exe, temp_path, "--background", "--python", script_path], capture_output=True, text=True
)
@@ -374,7 +380,11 @@ class LoadBlendMetadataAndIFC(bpy.types.Operator):
self.report({"WARNING"}, "No IFC file path set.")
return {"CANCELLED"}
metadata_path = ifc_file + ".metadata.blend"
suffix = tool.Blender.get_addon_preferences().metadata_blend_file_suffix
if ifc_file.lower().endswith(".ifc"):
metadata_path = ifc_file[:-4] + suffix
else:
metadata_path = ifc_file + suffix
# Open the metadata blend file
bpy.ops.wm.open_mainfile(filepath=metadata_path)
# After loading metadata, clear blend warning (no geometry loaded yet)
+17 -3
View File
@@ -715,13 +715,18 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
)
save_metadata_blend_file: BoolProperty(
name="Save non ifc data to .metadata.blend File",
description="Save session data (window layout, settings) to a .metadata.blend file alongside the IFC file. This file is automatically loaded when opening the project.",
name="Save non ifc data to metadata blend File",
description="Save session data (window layout, settings) to a metadata blend file alongside the IFC file. This file is automatically loaded when opening the project.",
default=False,
)
metadata_blend_file_suffix: StringProperty(
name="Metadata File Suffix",
description="Custom suffix for the metadata blend file. Will be appended to the filename (without .ifc).",
default=".ifc.metadata.blend",
)
user_ui_customization: BoolProperty(
name="User UI Customization",
description="Enable user interface customization features (hide/show tabs and panels, bookmark panels) and save the session settings as part of the .metadata.blend file",
description="Enable user interface customization features (hide/show tabs and panels, bookmark panels) and save the session settings as part of the metadata blend file",
default=False,
)
@@ -958,6 +963,9 @@ class BIM_ADDON_preferences(bpy.types.AddonPreferences):
row.operator("bim.open_uri", text="", icon="HELP").uri = "https://community.osarch.org/discussion/comment/27030"
layout.prop(self, "save_metadata_blend_file")
if self.save_metadata_blend_file:
row = layout.row()
row.separator()
row.prop(self, "metadata_blend_file_suffix")
row = layout.row()
row.separator()
row.prop(self, "user_ui_customization")
@@ -1633,6 +1641,8 @@ class BIM_PT_tab_representations(Panel):
def poll(cls, context):
if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context):
return False
if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get():
return True
return tool.Blender.is_tab(context, "BOOKMARK")
def draw(self, context):
@@ -1675,6 +1685,8 @@ class BIM_PT_tab_parametric_geometry(Panel):
def poll(cls, context):
if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context):
return False
if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get():
return True
return tool.Blender.is_tab(context, "BOOKMARK")
def draw(self, context):
@@ -1694,6 +1706,8 @@ class BIM_PT_tab_object_materials(Panel):
def poll(cls, context):
if not should_show_panel(cls.bl_idname, cls.bim_tab_name, context):
return False
if tool.Blender.is_tab(context, cls.bim_tab_name) and tool.Ifc.get():
return True
return tool.Blender.is_tab(context, "BOOKMARK")
def draw(self, context):
+7 -7
View File
@@ -488,28 +488,28 @@ def sync_references(
for element in potential_reference_elements:
# Skip spatial elements - their IFC placement is the source of truth
if element.is_a("IfcSpatialElement"):
if element.is_a("IfcSpatialElement"):
continue
# Skip grids - their IFC placement is the source of truth
if element.is_a("IfcGrid") or element.is_a("IfcGridAxis"):
continue
if (obj := ifc.get_object(element)) and ifc.is_moved(obj):
drawing_tool.sync_object_placement(obj)
for element in drawing_tool.get_group_elements(group):
if not drawing_tool.is_auto_annotation(element):
continue
# Skip spatial elements - should never sync their placement
if element.is_a("IfcSpatialElement"):
continue
# Skip grids
if element.is_a("IfcGrid") or element.is_a("IfcGridAxis"):
continue
continue
if (obj := ifc.get_object(element)) and ifc.is_moved(obj):
drawing_tool.sync_object_placement(obj)
if not (reference_element := drawing_tool.get_assigned_product(element)):
+6
View File
@@ -387,6 +387,12 @@ class Blender(bonsai.core.tool.Blender):
@classmethod
def copy_node_graph(cls, material_to: bpy.types.Material, material_from: bpy.types.Material) -> None:
temp_override = cls.get_shader_editor_context()
if (
not temp_override
or any(k not in temp_override for k in ("area", "space", "screen"))
or temp_override.get("window") is None
):
return
shader_editor = temp_override["space"]
# remove all nodes from the current material
+1 -1
View File
@@ -52,7 +52,7 @@ if(SCHEMA_VERSIONS MATCHES "2x3")
add_executable(IfcAdvancedHouse IfcAdvancedHouse.cpp)
add_library(IfcHouseInterface INTERFACE)
if (STANDALONE_PROJECT)
if(STANDALONE_PROJECT)
target_link_libraries(IfcHouseInterface INTERFACE IfcOpenShell::IfcParse IfcOpenShell::geometry_serializer)
else()
target_link_libraries(IfcHouseInterface INTERFACE IfcParse geometry_serializer)
+12 -7
View File
@@ -9,13 +9,18 @@ endif()
set(IFCCONVERT_FILES ${IFCCONVERT_CPP_FILES} ${IFCCONVERT_H_FILES})
add_executable(IfcConvert ${IFCCONVERT_FILES})
target_link_libraries(IfcConvert
target_link_libraries(
IfcConvert
PRIVATE
IfcGeom IfcParse Serializers
${OpenCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${HDF5_LIBRARIES} ${USD_LIBRARIES}
${CGAL_LIBRARIES} ${GLTF_LIBRARIES}
IfcGeom
IfcParse
Serializers
${OpenCASCADE_LIBRARIES}
${Boost_LIBRARIES}
${HDF5_LIBRARIES}
${USD_LIBRARIES}
${CGAL_LIBRARIES}
${GLTF_LIBRARIES}
)
install(TARGETS IfcConvert
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
)
install(TARGETS IfcConvert EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
+14 -9
View File
@@ -14,12 +14,13 @@ file(GLOB SCHEMA_AGNOSTIC_CPP_FILES *.cpp)
set(SCHEMA_AGNOSTIC_FILES ${SCHEMA_AGNOSTIC_H_FILES} ${SCHEMA_AGNOSTIC_CPP_FILES})
add_library(IfcGeom ${SCHEMA_AGNOSTIC_FILES})
set_target_properties(IfcGeom
set_target_properties(
IfcGeom
PROPERTIES
COMPILE_FLAGS -DIFC_GEOM_EXPORTS
VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
PUBLIC_HEADER "${SCHEMA_AGNOSTIC_H_FILES}"
COMPILE_FLAGS -DIFC_GEOM_EXPORTS
VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
PUBLIC_HEADER "${SCHEMA_AGNOSTIC_H_FILES}"
)
if(UNIX)
@@ -28,16 +29,20 @@ endif()
find_package(Eigen3 REQUIRED)
target_link_libraries(IfcGeom
${kernel_libraries} ${mapping_libraries}
${CMAKE_THREAD_LIBS_INIT} "Eigen3::Eigen"
target_link_libraries(
IfcGeom
${kernel_libraries}
${mapping_libraries}
${CMAKE_THREAD_LIBS_INIT}
"Eigen3::Eigen"
${CGAL_LIBRARIES}
)
if(NOT WASM_BUILD)
target_link_libraries(IfcGeom IfcParse)
endif()
install(TARGETS IfcGeom
install(
TARGETS IfcGeom
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ifcgeom"
)
+5 -4
View File
@@ -3,15 +3,16 @@ add_subdirectory(schema)
add_library(geometry_serializer STATIC Serialization.cpp)
file(GLOB IFCGEOM_SERIALIZATION_H_FILE *.h)
set_target_properties(geometry_serializer PROPERTIES
COMPILE_FLAGS "-DIFC_GEOMSERIALIZATION_EXPORTS"
PUBLIC_HEADER "${IFCGEOM_SERIALIZATION_H_FILE}"
set_target_properties(
geometry_serializer
PROPERTIES COMPILE_FLAGS "-DIFC_GEOMSERIALIZATION_EXPORTS" PUBLIC_HEADER "${IFCGEOM_SERIALIZATION_H_FILE}"
)
target_link_libraries(geometry_serializer ${geometry_serializer_libraries} IfcParse)
set(IFCOPENSHELL_LIBRARIES ${IFCOPENSHELL_LIBRARIES} "geometry_serializer" ${geometry_serializer_libraries})
set(IFCOPENSHELL_LIBRARIES ${IFCOPENSHELL_LIBRARIES} PARENT_SCOPE)
install(TARGETS geometry_serializer ${geometry_serializer_libraries}
install(
TARGETS geometry_serializer ${geometry_serializer_libraries}
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ifcgeom/Serialization"
)
@@ -1,7 +1,10 @@
foreach(schema ${SCHEMA_VERSIONS})
add_library(geometry_serializer_ifc${schema} STATIC Serialization.cpp)
target_link_libraries(geometry_serializer_ifc${schema} ${OpenCASCADE_LIBRARIES})
set_target_properties(geometry_serializer_ifc${schema} PROPERTIES COMPILE_FLAGS "-DIFC_GEOMSERIALIZATION_EXPORTS -DIfcSchema=Ifc${schema}")
set_target_properties(
geometry_serializer_ifc${schema}
PROPERTIES COMPILE_FLAGS "-DIFC_GEOMSERIALIZATION_EXPORTS -DIfcSchema=Ifc${schema}"
)
list(APPEND geometry_serializer_libraries geometry_serializer_ifc${schema})
endforeach()
set(geometry_serializer_libraries ${geometry_serializer_libraries} PARENT_SCOPE)
set(geometry_serializer_libraries ${geometry_serializer_libraries} PARENT_SCOPE)
+10 -8
View File
@@ -9,13 +9,14 @@ foreach(kernel ${GEOMETRY_KERNELS})
set(KERNEL_TARGET "geometry_kernel_${kernel}")
add_library(${KERNEL_TARGET} OBJECT ${IFCGEOM_FILES})
set_target_properties(${KERNEL_TARGET} PROPERTIES
COMPILE_FLAGS "-DIFC_GEOM_EXPORTS"
PUBLIC_HEADER "${IFCGEOM_H_FILES}"
set_target_properties(
${KERNEL_TARGET}
PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS" PUBLIC_HEADER "${IFCGEOM_H_FILES}"
)
list(APPEND kernel_libraries ${KERNEL_TARGET})
target_link_libraries(${KERNEL_TARGET} ${${KERNEL_UPPER}_LIBRARIES} Eigen3::Eigen)
install(TARGETS ${KERNEL_TARGET}
install(
TARGETS ${KERNEL_TARGET}
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ifcgeom/kernels/${kernel}"
)
@@ -27,13 +28,14 @@ foreach(kernel ${GEOMETRY_KERNELS})
set(KERNEL_TARGET_SIMPLE "${KERNEL_TARGET}_simple")
add_library(${KERNEL_TARGET_SIMPLE} OBJECT ${IFCGEOM_FILES})
set_target_properties(${KERNEL_TARGET_SIMPLE} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIFOPSH_SIMPLE_KERNEL -DCGAL_HAS_THREADS")
set_target_properties(
${KERNEL_TARGET_SIMPLE}
PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIFOPSH_SIMPLE_KERNEL -DCGAL_HAS_THREADS"
)
list(APPEND kernel_libraries ${KERNEL_TARGET_SIMPLE})
target_link_libraries(${KERNEL_TARGET_SIMPLE} ${${KERNEL_UPPER}_LIBRARIES} Eigen3::Eigen)
target_link_libraries(${KERNEL_TARGET_SIMPLE} IFCOPENSHELL_CGAL)
install(TARGETS ${KERNEL_TARGET_SIMPLE}
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
)
install(TARGETS ${KERNEL_TARGET_SIMPLE} EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
elseif(${kernel} STREQUAL "opencascade")
target_link_libraries(${KERNEL_TARGET} ${OpenCASCADE_LIBRARIES})
endif()
+6 -5
View File
@@ -7,13 +7,14 @@ foreach(schema ${SCHEMA_VERSIONS})
set(IFCGEOM_FILES ${IFCGEOM_CPP_FILES} ${IFCGEOM_H_FILES} ${IFCGEOM_I_FILES})
add_library(geometry_mapping_ifc${schema} OBJECT ${IFCGEOM_FILES})
set_target_properties(geometry_mapping_ifc${schema} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIfcSchema=Ifc${schema}")
target_link_libraries(geometry_mapping_ifc${schema} IfcParse Eigen3::Eigen)
set_target_properties(
geometry_mapping_ifc${schema}
PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIfcSchema=Ifc${schema}"
)
target_link_libraries(geometry_mapping_ifc${schema} IfcParse Eigen3::Eigen)
list(APPEND mapping_libraries geometry_mapping_ifc${schema})
install(TARGETS geometry_mapping_ifc${schema}
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
)
install(TARGETS geometry_mapping_ifc${schema} EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
endforeach()
set(mapping_libraries ${mapping_libraries} PARENT_SCOPE)
+1 -3
View File
@@ -5,6 +5,4 @@ set(SOURCE_FILES ${CPP_FILES})
add_executable(IfcGeomServer ${SOURCE_FILES})
target_link_libraries(IfcGeomServer IfcGeom ${kernel_libraries} ${OpenCASCADE_LIBRARIES})
install(TARGETS IfcGeomServer
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
)
install(TARGETS IfcGeomServer EXPORT ${IFCOPENSHELL_EXPORT_TARGETS})
+30 -90
View File
@@ -18,20 +18,9 @@
################################################################################
# check for 3ds Max SDK
set(valid_max_years 2027 2026 2025 2024 2023 2022 2021 2020 2019 2018 2017)
# might be dangerous to use tools 143 for all max versions
set(max_toolset_versions_143 "2017" "2018" "2019" "2020" "2021" "2022" "2023" "2024" "2025" "2026" "2027" )
# set(max_toolset_versions_143 "2025" "2026" "2027" )
# set(max_toolset_versions_142 "2022" "2023" "2024" )
# set(max_toolset_versions_141 "2020" "2021" )
# set(max_toolset_versions_140 "2017" "2018" "2019" )
# set(max_toolset_versions_110 "2015" "2016" )
# set(max_toolset_versions_100 "2013" "2014" )
# set(max_toolset_versions_90 "2010" "2011" "2012" )
foreach(max_year ${valid_max_years})
foreach(max_year RANGE 2014 2030)
set(max_sdk "$ENV{ADSK_3DSMAX_SDK_${max_year}}")
if(NOT "${max_sdk}" STREQUAL "")
message(STATUS "Autodesk 3ds Max SDK ${max_year} found at ${max_sdk}")
list(APPEND FOUND_MAX_YEARS ${max_year})
@@ -40,44 +29,35 @@ foreach(max_year ${valid_max_years})
endif()
endforeach()
message(STATUS)
if(HAS_MAX)
# set depenency include and link directoris outside of MaxSDK loop
include_directories(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS} ${ICU_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} )
link_directories(${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OCC_LIBRARY_DIR} ${OPENCOLLADA_LIBRARY_DIR} ${ICU_LIBRARY_DIR} ${Boost_LIBRARY_DIRS} )
# Specify individual source files
set(MAX_SOURCES
IfcMax.h
IfcMax.cpp
IfcMax.rc
resource.h
# IfcHelper.h
# IfcHelper.cpp
# MaxUtils.h
# MaxUtils.cpp
)
# build library for each found 3ds Max SDK
# build libraray for each found 3ds Max SDK
foreach(max_year max_sdk IN ZIP_LISTS FOUND_MAX_YEARS FOUND_MAX_SDKS)
message(STATUS "Building IFCMax library for Autodesk 3ds Max SDK ${max_year}")
# skip 3ds Max versions that do not match the vs toolset
if( NOT ${max_year} IN_LIST max_toolset_versions_${MSVC_TOOLSET_VERSION} )
continue()
endif()
include_directories(
${INCLUDE_DIRECTORIES}
${OPENCOLLADA_INCLUDE_DIRS}
${ICU_INCLUDE_DIR}
${Boost_INCLUDE_DIRS}
${max_sdk}/include
)
message(STATUS "Adding build target: IFCMax for 3ds Max SDK ${max_year}, Tier: ${BUILD_TIER_NAME}")
# All recent versions of 3ds Max (2014 and newer) are 64-bit only so assume lib/x64 directory
link_directories(
${LINK_DIRECTORIES}
${IfcOpenShell_BINARY_DIR}
${OPENCOLLADA_LIBRARY_DIR}
${ICU_LIBRARY_DIR}
${Boost_LIBRARY_DIRS}
${max_sdk}/lib/x64/Release
)
add_library(IfcMax_${max_year} SHARED ${MAX_SOURCES})
target_include_directories(IfcMax_${max_year} PRIVATE ${max_sdk}/include)
# All recent versions of 3ds Max (2014 and newer) are 64-bit only so assume lib/x64 directory
target_link_directories(IfcMax_${max_year} PRIVATE ${max_sdk}/lib/x64/Release)
add_library(IfcMax_${max_year} SHARED IfcMax.h IfcMax.cpp)
# TODO: find the minimal subset of 3dsmax libraries to reference
target_link_libraries(IfcMax_${max_year} ${IFCOPENSHELL_LIBRARIES}
target_link_libraries(
IfcMax_${max_year}
${IFCOPENSHELL_LIBRARIES}
bmm.lib
Comctl32.lib
core.lib
@@ -93,6 +73,8 @@ if(HAS_MAX)
maxnet.lib
Maxscrpt.lib
maxutil.lib
MenuMan.lib
menus.lib
mesh.lib
MNMath.lib
Paramblk2.lib
@@ -101,56 +83,14 @@ if(HAS_MAX)
RenderUtil.lib
tessint.lib
viewfile.lib
${OPENCASCADE_LIBRARIES}
)
# Note: libraries build by same major vs toolset versions are binary compatible. so v14x builds can be intermixed
# Older Max versions using v110 or older require dependencies being build using the according toolset version ( most likely )
if( ${max_year} IN_LIST max_toolset_versions_143 )
set_target_properties( IfcMax_${max_year} PROPERTIES VS_PLATFORM_TOOLSET v143)
elseif( ${max_year} IN_LIST max_toolset_versions_142 )
set_target_properties( IfcMax_${max_year} PROPERTIES VS_PLATFORM_TOOLSET v142)
elseif( ${max_year} IN_LIST max_toolset_versions_141 )
set_target_properties( IfcMax_${max_year} PROPERTIES VS_PLATFORM_TOOLSET v141)
elseif( ${max_year} IN_LIST max_toolset_versions_140 )
set_target_properties( IfcMax_${max_year} PROPERTIES VS_PLATFORM_TOOLSET v140)
elseif( ${max_year} IN_LIST max_toolset_versions_110 )
set_target_properties( IfcMax_${max_year} PROPERTIES VS_PLATFORM_TOOLSET v110)
elseif( ${max_year} IN_LIST max_toolset_versions_100 )
set_target_properties( IfcMax_${max_year} PROPERTIES VS_PLATFORM_TOOLSET v100)
elseif( ${max_year} IN_LIST max_toolset_versions_90 )
set_target_properties( IfcMax_${max_year} PROPERTIES VS_PLATFORM_TOOLSET v90)
endif()
zlibdll.lib
${OpenCASCADE_LIBRARIES}
)
# prevent minmax macro clashes occuring with ifcOpenShell v0.8
target_compile_definitions(IfcMax_${max_year} PRIVATE NOMINMAX)
# fix 3ds Max 2020 SDK's "/permissive-" flag incompatibility / disables C++ language conformance mode
if( ${max_year} EQUAL 2020 )
set_source_files_properties( "IfcMax.cpp" PROPERTIES COMPILE_FLAGS "/permissive")
endif()
# C++17 required for 3ds Max SDK 2025 and higher
if( ${max_year} GREATER_EQUAL 2025 )
set_target_properties(IfcMax_${max_year} PROPERTIES CXX_STANDARD 17)
endif()
set_target_properties(IfcMax_${max_year} PROPERTIES SUFFIX ".dli")
if(BUILD_TIER_NAME)
target_compile_definitions(IfcMax_${max_year} PRIVATE BUILD_${BUILD_TIER_NAME}_TIER)
string(TOLOWER "${BUILD_TIER_NAME}" BUILD_TIER_lower)
if(BUILD_TIER_lower STREQUAL "free")
set_target_properties(IfcMax_${max_year} PROPERTIES OUTPUT_NAME "IfcMax_Free_${max_year}")
endif()
endif()
install(TARGETS IfcMax_${max_year} RUNTIME DESTINATION ${BINDIR})
install(TARGETS IfcMax_${max_year})
endforeach()
message(STATUS)
else()
message(STATUS "Autodesk 3ds Max SDK not found, is required to build IFCMax.")
endif()
@@ -738,7 +738,7 @@ class AttributeGetattrTransformer(ast.NodeTransformer):
while n := getattr(n, "parent", 0):
parents.append(n)
custom_funcs = "is_entity", "usedin", "express_len", "express_getitem", "typeof"
custom_funcs = "is_entity", "usedin", "express_len", "express_getitem", "typeof", "express_getattr"
function_defs = [p.name for p in parents if isinstance(p, ast.FunctionDef)]
if any(fn in function_defs for fn in custom_funcs):
return node
@@ -755,7 +755,7 @@ class AttributeGetattrTransformer(ast.NodeTransformer):
# Replace the Attribute node with a call to the built-in `getattr` function
return ast.copy_location(
ast.Call(
func=ast.Name(id="getattr", ctx=ast.Load()),
func=ast.Name(id="express_getattr", ctx=ast.Load()),
args=[
new_value,
ast.Str(s=node.attr),
@@ -772,7 +772,7 @@ class AttributeGetattrTransformer(ast.NodeTransformer):
while n := getattr(n, "parent", 0):
parents.append(n)
custom_funcs = "is_entity", "usedin", "express_len", "express_getitem", "typeof"
custom_funcs = "is_entity", "usedin", "express_len", "express_getitem", "typeof", "express_getattr"
function_defs = [p.name for p in parents if isinstance(p, ast.FunctionDef)]
if any(fn in function_defs for fn in custom_funcs):
return node
@@ -937,6 +937,14 @@ def express_getitem(aggr, idx, default):
except IndexError as e: return None
def express_getattr(aggr, name, default):
v = getattr(aggr, name, default)
if v is None:
return default
else:
return v
EXPRESS_ONE_BASED_INDEXING = 1
@@ -9,7 +9,7 @@ from codegen import indent
def reverse_compile(s):
return re.sub(
return re.sub(r'\bself\b', 'SELF', re.sub(
r"\s*\-\s*EXPRESS_ONE_BASED_INDEXING",
"",
re.sub(
@@ -22,11 +22,11 @@ def reverse_compile(s):
.replace("len(", "SIZEOF(")
.replace("assert ", "")
.replace(" is not False", "")
.replace("getattr(", "")
.replace("express_getattr(", "")
.replace("express_getitem(", ""),
)[::-1],
)[::-1],
)
))
@dataclass
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,10 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2025-12-24T14:25:45',(''),(''),'IfcOpenShell 0.8.0','IfcOpenShell 0.8.0','');
FILE_SCHEMA(('IFC4X3_ADD2'));
ENDSEC;
DATA;
#1=IFCPROPERTYLISTVALUE('Test',$,(IFCLABEL('test1'),IFCINTEGER(2)),$);
ENDSEC;
END-ISO-10303-21;
@@ -0,0 +1,10 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2025-12-24T14:25:45',(''),(''),'IfcOpenShell 0.8.0','IfcOpenShell 0.8.0','');
FILE_SCHEMA(('IFC4X3_ADD2'));
ENDSEC;
DATA;
#1=IFCPROPERTYLISTVALUE('Test',$,(IFCLABEL('test1'),IFCLABEL('test2')),$);
ENDSEC;
END-ISO-10303-21;
@@ -0,0 +1,10 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2025-12-24T14:25:45',(''),(''),'IfcOpenShell 0.8.0','IfcOpenShell 0.8.0','');
FILE_SCHEMA(('IFC4X3_ADD2'));
ENDSEC;
DATA;
#1=IFCPROPERTYLISTVALUE('Test',$,$,$);
ENDSEC;
END-ISO-10303-21;
+10 -14
View File
@@ -18,26 +18,21 @@ foreach(file ${IFCPARSE_CPP_FILES_ALL})
endforeach()
foreach(schema ${SCHEMA_VERSIONS})
list(APPEND IFCPARSE_H_FILES
Ifc${schema}.h
Ifc${schema}-definitions.h
)
list(APPEND IFCPARSE_CPP_FILES
Ifc${schema}.cpp
Ifc${schema}-schema.cpp
)
list(APPEND IFCPARSE_H_FILES Ifc${schema}.h Ifc${schema}-definitions.h)
list(APPEND IFCPARSE_CPP_FILES Ifc${schema}.cpp Ifc${schema}-schema.cpp)
endforeach()
set(IFCPARSE_FILES ${IFCPARSE_CPP_FILES} ${IFCPARSE_H_FILES})
add_library(IfcParse ${IFCPARSE_FILES})
target_compile_definitions(IfcParse PUBLIC ${SCHEMA_DEFINITIONS})
set_target_properties(IfcParse
set_target_properties(
IfcParse
PROPERTIES
COMPILE_FLAGS -DIFC_PARSE_EXPORTS
VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
PUBLIC_HEADER "${IFCPARSE_H_FILES}"
COMPILE_FLAGS -DIFC_PARSE_EXPORTS
VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
PUBLIC_HEADER "${IFCPARSE_H_FILES}"
)
if(IFCXML_SUPPORT)
@@ -56,7 +51,8 @@ endif()
target_link_libraries(IfcParse ${ROCKSDB_LIBRARIES})
install(TARGETS IfcParse
install(
TARGETS IfcParse
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/ifcparse"
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
+70 -83
View File
@@ -24,27 +24,27 @@ if(POLICY CMP0177) # 3.31
cmake_policy(SET CMP0177 OLD)
endif()
FIND_PACKAGE(SWIG)
IF(NOT SWIG_FOUND)
MESSAGE(
find_package(SWIG)
if(NOT SWIG_FOUND)
message(
FATAL_ERROR
"BUILD_IFCPYTHON enabled, but unable to find SWIG. Disable BUILD_IFCPYTHON or fix SWIG paths to proceed. "
"Likely SWIG_EXECUTABLE is missing (current value - '${SWIG_EXECUTABLE}')."
)
ENDIF()
endif()
include(GNUInstallDirs)
INCLUDE(${SWIG_USE_FILE})
include(${SWIG_USE_FILE})
IF(NOT "${PYTHON_INCLUDE_DIR}" STREQUAL "")
if(NOT "${PYTHON_INCLUDE_DIR}" STREQUAL "")
# Hint for FindPython where to find Python_INCLUDE_DIRS.
set(Python_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}")
MESSAGE(STATUS "Looking for Python header files in: ${Python_INCLUDE_DIR}")
ENDIF()
IF(NOT "${PYTHON_LIBRARY}" STREQUAL "")
message(STATUS "Looking for Python header files in: ${Python_INCLUDE_DIR}")
endif()
if(NOT "${PYTHON_LIBRARY}" STREQUAL "")
# Hint for FindPython where to find Python_LIBRARIES.
set(Python_LIBRARY "${PYTHON_LIBRARY}")
MESSAGE(STATUS "Looking for Python library file in: ${Python_LIBRARY}")
ENDIF()
message(STATUS "Looking for Python library file in: ${Python_LIBRARY}")
endif()
# Development.Module = headers on Unix, headers+libraries on Windows.
# Required variables:
@@ -53,31 +53,29 @@ ENDIF()
# Unfortunately all paths must be always provided explicitly, not by prefixing PATH.
# Otherwise FindPython will break on newer Python versions (list of supported versions is hardcoded).
find_package(Python COMPONENTS Development.Module)
IF(NOT Python_Development.Module_FOUND)
MESSAGE(FATAL_ERROR "BUILD_IFCPYTHON enabled, but unable to find Python lib or header. Disable BUILD_IFCPYTHON or fix Python paths to proceed.")
ENDIF()
if(NOT Python_Development.Module_FOUND)
message(
FATAL_ERROR
"BUILD_IFCPYTHON enabled, but unable to find Python lib or header. Disable BUILD_IFCPYTHON or fix Python paths to proceed."
)
endif()
# Ensure version is saved here, from wasm libraries,
# not from Python interpreter that might be unrelated to pyodide Python version.
set(_python_libs_version "${Python_VERSION_MAJOR}${Python_VERSION_MINOR}")
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR})
SET(CMAKE_SWIG_FLAGS ${SWIG_DEFINES})
set(CMAKE_SWIG_FLAGS ${SWIG_DEFINES})
if (WITH_CGAL)
if(WITH_CGAL)
set(LIBSVGFILL svgfill)
endif()
SET_SOURCE_FILES_PROPERTIES(IfcPython.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties(IfcPython.i PROPERTIES CPLUSPLUS ON)
# Rebuild on changes in other .i files.
SET_PROPERTY(
SOURCE IfcPython.i
PROPERTY DEPENDS
IfcGeomWrapper.i
IfcParseWrapper.i
utils/type_conversion.i
utils/typemaps_in.i
utils/typemaps_out.i
set_property(
SOURCE IfcPython.i
PROPERTY DEPENDS IfcGeomWrapper.i IfcParseWrapper.i utils/type_conversion.i utils/typemaps_in.i utils/typemaps_out.i
)
# On Windows there is '_d' prefix for debug builds - e.g. `_d.cp311-win_amd64.pyd`.
@@ -92,20 +90,18 @@ endif()
# But debug mode is still might be needed - e.g. Blender's Python is using it, if you're running debug build.
if(NOT USE_DEBUG_PYTHON)
set(Python_DEBUG_POSTFIX "")
add_compile_definitions(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
add_compile_definitions(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
if(Python_LIBRARY_DEBUG)
# If debug libraries were found, then override them with release ones.
get_target_property(IMPORTED_IMPLIB Python::Module IMPORTED_IMPLIB_RELEASE)
get_target_property(IMPORTED_LOCATION Python::Module IMPORTED_LOCATION_RELEASE)
set_target_properties(
Python::Module
PROPERTIES
IMPORTED_IMPLIB_DEBUG "${IMPORTED_IMPLIB}"
IMPORTED_LOCATION_DEBUG "${IMPORTED_LOCATION}"
PROPERTIES IMPORTED_IMPLIB_DEBUG "${IMPORTED_IMPLIB}" IMPORTED_LOCATION_DEBUG "${IMPORTED_LOCATION}"
)
endif()
endif()
if (CMAKE_VERSION VERSION_GREATER_EQUAL "4.2")
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.2")
# `DEBUG_POSTFIX` argument was added in 4.2.
swig_add_library(ifcopenshell_wrapper LANGUAGE python SOURCES IfcPython.i DEBUG_POSTFIX "${Python_DEBUG_POSTFIX}")
else()
@@ -113,15 +109,12 @@ else()
# swig py wrapper will try to import `_ifcopenshell_wrapper_d` module and would fail.
set(SWIG_MODULE_ifcopenshell_wrapper_EXTRA_FLAGS "-interface" "_ifcopenshell_wrapper")
swig_add_library(ifcopenshell_wrapper LANGUAGE python SOURCES IfcPython.i)
set_target_properties(
ifcopenshell_wrapper PROPERTIES
DEBUG_POSTFIX "${Python_DEBUG_POSTFIX}"
)
set_target_properties(ifcopenshell_wrapper PROPERTIES DEBUG_POSTFIX "${Python_DEBUG_POSTFIX}")
endif()
target_link_libraries(ifcopenshell_wrapper PRIVATE Python::Module)
SET_PROPERTY(TARGET ifcopenshell_wrapper PROPERTY SWIG_DEPENDS ${IFCOPENSHELL_LIBRARIES})
if (WASM_BUILD)
set_property(TARGET ifcopenshell_wrapper PROPERTY SWIG_DEPENDS ${IFCOPENSHELL_LIBRARIES})
if(WASM_BUILD)
# SIDE_MODULE=1 - add to .so all symbols from linked archives (default used by pyodide).
# Since currently libIfcGeom.a seems to be linked twice it results in duplicated symbols and compilation errors.
# Possibly in the future we can clean up linked libs and try `=1`.
@@ -130,11 +123,7 @@ if (WASM_BUILD)
if(CMAKE_GENERATOR MATCHES "Makefile" AND CMAKE_VERSION VERSION_LESS "4.2")
# Accomodate bug in cmake makefile generator (fixed in 4.2+).
# https://gitlab.kitware.com/cmake/cmake/-/issues/27326
string(
REPLACE "SIDE_MODULE=1" "SIDE_MODULE=2"
CMAKE_MODULE_LINKER_FLAGS
"${CMAKE_MODULE_LINKER_FLAGS}"
)
string(REPLACE "SIDE_MODULE=1" "SIDE_MODULE=2" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
endif()
target_link_options(
ifcopenshell_wrapper
@@ -142,13 +131,16 @@ if (WASM_BUILD)
)
endif()
if("$ENV{LDFLAGS}" MATCHES ".undefined.suppress")
# On osx there is some state in the python dylib. With `-Wl,undefined,suppress` we can ignore the missing symbols at compile time.
target_link_libraries(ifcopenshell_wrapper PRIVATE ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${LIBSVGFILL})
# On osx there is some state in the python dylib. With `-Wl,undefined,suppress` we can ignore the missing symbols at compile time.
target_link_libraries(
ifcopenshell_wrapper
PRIVATE ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${LIBSVGFILL}
)
else()
target_link_libraries(ifcopenshell_wrapper PRIVATE ${IFCOPENSHELL_LIBRARIES} ${LIBSVGFILL})
target_link_libraries(ifcopenshell_wrapper PRIVATE ${IFCOPENSHELL_LIBRARIES} ${LIBSVGFILL})
endif()
target_link_libraries(ifcopenshell_wrapper PRIVATE ${CGAL_LIBRARIES})
if ((NOT WIN32) AND BUILD_SHARED_LIBS)
if((NOT WIN32) AND BUILD_SHARED_LIBS)
SET_INSTALL_RPATHS(ifcopenshell_wrapper "${IFCDIRS};${OCC_LIBRARY_DIR}")
endif()
@@ -156,10 +148,10 @@ endif()
# directory in which the wrapper can be installed.
if(NOT ${PYTHON_EXECUTABLE} STREQUAL "")
set(Python_EXECUTABLE "${PYTHON_EXECUTABLE}")
MESSAGE(STATUS "Looking for Python interpreter in: ${PYTHON_EXECUTABLE}")
message(STATUS "Looking for Python interpreter in: ${PYTHON_EXECUTABLE}")
endif()
FIND_PACKAGE(Python COMPONENTS Interpreter)
IF(Python_Interpreter_FOUND OR PYTHON_MODULE_INSTALL_DIR)
find_package(Python COMPONENTS Interpreter)
if(Python_Interpreter_FOUND OR PYTHON_MODULE_INSTALL_DIR)
# Python_SOABI example value is 'cp311-win_amd64'.
if(WASM_BUILD)
# For WASM we usually don't provide interpreter,
@@ -172,48 +164,43 @@ IF(Python_Interpreter_FOUND OR PYTHON_MODULE_INSTALL_DIR)
else()
set(PYTHON_EXTENSION_SUFFIX ".${Python_SOABI}.so")
endif()
set_target_properties(
ifcopenshell_wrapper PROPERTIES
SUFFIX ${PYTHON_EXTENSION_SUFFIX}
)
if (PYTHON_MODULE_INSTALL_DIR)
set(python_package_dir "${PYTHON_MODULE_INSTALL_DIR}")
set_target_properties(ifcopenshell_wrapper PROPERTIES SUFFIX ${PYTHON_EXTENSION_SUFFIX})
if(PYTHON_MODULE_INSTALL_DIR)
set(python_package_dir "${PYTHON_MODULE_INSTALL_DIR}")
else()
IF (USERSPACE_PYTHON_PREFIX)
EXECUTE_PROCESS(
if(USERSPACE_PYTHON_PREFIX)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c "import sys; import site; sys.stdout.write(site.USER_SITE)"
OUTPUT_VARIABLE python_package_dir
)
ELSE ()
else()
set(python_package_dir "${Python_SITEARCH}")
ENDIF()
if (BUILD_PACKAGE)
endif()
if(BUILD_PACKAGE)
set(python_package_dir ${CMAKE_INSTALL_LIBDIR}/python${PYTHON_VERSION_MAJOR}/dist-packages/)
endif()
endif()
IF("${python_package_dir}" STREQUAL "")
MESSAGE(WARNING "Unable to locate Python site-package directory, unable to install the Python wrapper")
ELSE()
if("${python_package_dir}" STREQUAL "")
message(WARNING "Unable to locate Python site-package directory, unable to install the Python wrapper")
else()
message(STATUS "Python wrapper will be installed to '${python_package_dir}'.")
FILE(GLOB_RECURSE sourcefiles
"${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/*"
)
FOREACH(file ${sourcefiles})
FILE(RELATIVE_PATH relative "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/" "${file}")
GET_FILENAME_COMPONENT(dir "${relative}" DIRECTORY)
file(GLOB_RECURSE sourcefiles "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/*")
foreach(file ${sourcefiles})
file(RELATIVE_PATH relative "${CMAKE_CURRENT_SOURCE_DIR}/../ifcopenshell-python/ifcopenshell/" "${file}")
get_filename_component(dir "${relative}" DIRECTORY)
if(NOT IS_DIRECTORY "${file}")
INSTALL(FILES "${file}"
DESTINATION "${python_package_dir}/ifcopenshell/${dir}")
install(FILES "${file}" DESTINATION "${python_package_dir}/ifcopenshell/${dir}")
endif()
ENDFOREACH()
INSTALL(FILES "${CMAKE_BINARY_DIR}/ifcwrap/ifcopenshell_wrapper.py"
DESTINATION "${python_package_dir}/ifcopenshell")
INSTALL(TARGETS ifcopenshell_wrapper
DESTINATION "${python_package_dir}/ifcopenshell")
if (MSVC)
INSTALL(FILES $<TARGET_PDB_FILE:ifcopenshell_wrapper> DESTINATION bin OPTIONAL)
endif()
ENDIF()
ELSE()
MESSAGE(WARNING "No Python interpreter found, unable to install the Python wrapper")
ENDIF()
endforeach()
install(
FILES "${CMAKE_BINARY_DIR}/ifcwrap/ifcopenshell_wrapper.py"
DESTINATION "${python_package_dir}/ifcopenshell"
)
install(TARGETS ifcopenshell_wrapper DESTINATION "${python_package_dir}/ifcopenshell")
if(MSVC)
install(FILES $<TARGET_PDB_FILE:ifcopenshell_wrapper> DESTINATION bin OPTIONAL)
endif()
endif()
else()
message(WARNING "No Python interpreter found, unable to install the Python wrapper")
endif()
+19 -18
View File
@@ -21,7 +21,15 @@ message("Running CMakeLists.txt in /src/qtviewer")
# Specify the Qt version and components to use
set(QT_VERSION 6 CACHE STRING "Qt version")
set(QT_COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets CACHE STRING "Qt components")
set(QT_COMPONENTS
Core
Gui
OpenGL
OpenGLWidgets
Widgets
CACHE STRING
"Qt components"
)
find_package(Qt${QT_VERSION} COMPONENTS ${QT_COMPONENTS} REQUIRED PATHS ${QT_DIR})
@@ -45,10 +53,7 @@ set(targetName "QtViewer")
# Scan for .qrc files and add to build process
set(CMAKE_AUTORCC ON)
set(RESOURCE_FILES
resources/qt_resources.qrc
resources/qt_res.rc
)
set(RESOURCE_FILES resources/qt_resources.qrc resources/qt_res.rc)
# The MACOSX_BUNDLE_ICON_FILE variable is added to the Info.plist
# generated by CMake. This variable contains the .icns file name,
@@ -57,10 +62,10 @@ set(MACOSX_BUNDLE_ICON_FILE ifcosLogo.icns)
# The following tells CMake where to find and install the file itself.
set(app_icon_macos "resources/ifcosLogo.icns")
set_source_files_properties(${app_icon_macos} PROPERTIES
MACOSX_PACKAGE_LOCATION "Resources")
set_source_files_properties(${app_icon_macos} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
add_executable(${targetName}
add_executable(
${targetName}
MessageLogger.h
IfcViewerWidget.h
IfcViewerWidget.cpp
@@ -73,14 +78,13 @@ add_executable(${targetName}
${app_icon_macos}
)
set_target_properties(${targetName} PROPERTIES
AUTOMOC On
WIN32_EXECUTABLE ON
MACOSX_BUNDLE ON
RESOURCE "${RESOURCE_FILES}"
set_target_properties(
${targetName}
PROPERTIES AUTOMOC On WIN32_EXECUTABLE ON MACOSX_BUNDLE ON RESOURCE "${RESOURCE_FILES}"
)
target_link_libraries(${targetName}
target_link_libraries(
${targetName}
${IFCOPENSHELL_LIBRARIES}
${OpenCASCADE_LIBRARIES}
${OPENSCENEGRAPH_LIBRARIES}
@@ -91,10 +95,7 @@ target_link_libraries(${targetName}
Qt${QT_VERSION}::Widgets
)
target_include_directories(${targetName} PUBLIC
${QT_DIR}/include
${OPENSCENEGRAPH_INCLUDE_DIRS}
)
target_include_directories(${targetName} PUBLIC ${QT_DIR}/include ${OPENSCENEGRAPH_INCLUDE_DIRS})
get_target_property(targetIncludeDirs ${targetName} INCLUDE_DIRECTORIES)
message(STATUS "target_include_directories: ${targetIncludeDirs}")
+18 -13
View File
@@ -5,10 +5,12 @@ file(GLOB SERIALIZERS_CPP_FILES *.cpp)
set(SERIALIZERS_FILES ${SERIALIZERS_H_FILES} ${SERIALIZERS_CPP_FILES})
add_library(Serializers ${SERIALIZERS_FILES})
set_target_properties(Serializers PROPERTIES
COMPILE_FLAGS "-DSERIALIZERS_EXPORTS"
VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
set_target_properties(
Serializers
PROPERTIES
COMPILE_FLAGS "-DSERIALIZERS_EXPORTS"
VERSION "${PROJECT_VERSION}"
SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
)
set(SERIALIZER_SCHEMA_LIBRARIES Serializers ${SERIALIZER_SCHEMA_LIBRARIES} PARENT_SCOPE)
@@ -21,18 +23,21 @@ if(WITH_PROJ)
target_link_libraries(Serializers PRIVATE PROJ::proj)
endif()
target_link_libraries(Serializers
target_link_libraries(
Serializers
PRIVATE
${SERIALIZER_SCHEMA_LIBRARIES} ${OPENCOLLADA_LIBRARIES} ${USD_LIBRARIES} ${GLTF_LIBRARIES}
IfcGeom ${OpenCASCADE_LIBRARIES} ${kernel_libraries} IfcParse
${SERIALIZER_SCHEMA_LIBRARIES}
${OPENCOLLADA_LIBRARIES}
${USD_LIBRARIES}
${GLTF_LIBRARIES}
IfcGeom
${OpenCASCADE_LIBRARIES}
${kernel_libraries}
IfcParse
)
install(TARGETS Serializers)
# Can't use `PUBLIC_HEADER` since we need two folders.
install(FILES ${SERIALIZERS_H_FILES}
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/serializers/"
)
install(FILES ${SERIALIZERS_S_H_FILES}
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/serializers/schema_dependent"
)
install(FILES ${SERIALIZERS_H_FILES} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/serializers/")
install(FILES ${SERIALIZERS_S_H_FILES} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/serializers/schema_dependent")
@@ -5,12 +5,14 @@ set(SERIALIZERS_S_FILES ${SERIALIZERS_S_H_FILES} ${SERIALIZERS_S_CPP_FILES})
foreach(schema ${SCHEMA_VERSIONS})
add_library(Serializers_ifc${schema} OBJECT ${SERIALIZERS_S_FILES})
set(SERIALIZER_SCHEMA_LIBRARIES ${SERIALIZER_SCHEMA_LIBRARIES} Serializers_ifc${schema})
set_target_properties(Serializers_ifc${schema} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIfcSchema=Ifc${schema}")
set_target_properties(
Serializers_ifc${schema}
PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIfcSchema=Ifc${schema}"
)
target_link_libraries(Serializers_ifc${schema} ${HDF5_LIBRARIES} ${GLTF_LIBRARIES})
if(NOT WASM_BUILD)
target_link_libraries(Serializers_ifc${schema} IfcGeom ${OpenCASCADE_LIBRARIES})
endif()
endforeach()
set(SERIALIZER_SCHEMA_LIBRARIES ${SERIALIZER_SCHEMA_LIBRARIES} PARENT_SCOPE)
+1
View File
@@ -0,0 +1 @@
disable_formatting: true
+18 -23
View File
@@ -1,20 +1,19 @@
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project (svgfill)
project(svgfill)
if (POLICY CMP0144) # 3.27
if(POLICY CMP0144) # 3.27
cmake_policy(SET CMP0144 NEW) # find_package() uses upper-case <PACKAGENAME>_ROOT variables.
endif()
if(POLICY CMP0167) # 3.30 find_package(Boost) to use BoostConfig instead of FindBoost.
cmake_policy(SET CMP0167 OLD)
endif()
if(WIN32 AND NOT DEFINED ENV{CONDA_BUILD})
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
if (USE_STATIC_MSVC_RUNTIME)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
if(USE_STATIC_MSVC_RUNTIME)
set(Boost_USE_STATIC_RUNTIME ON)
endif()
else()
@@ -28,8 +27,8 @@ else()
endif()
endif()
if (MSVC)
add_definitions(-bigobj)
if(MSVC)
add_definitions(-bigobj)
endif()
find_package(Boost)
@@ -37,35 +36,31 @@ message(STATUS "Boost include files found in ${Boost_INCLUDE_DIRS}")
find_package(LibXml2 REQUIRED)
find_package(CGAL REQUIRED)
include_directories(${Boost_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/svgpp/include
)
include_directories(${Boost_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/svgpp/include)
file(GLOB LIB_H_FILES src/*.h)
file(GLOB LIB_CPP_FILES src/svgfill.cpp src/arrange_polygons.cpp)
set(LIB_SRC_FILES ${LIB_H_FILES} ${LIB_CPP_FILES})
add_library(svgfill ${LIB_SRC_FILES})
target_link_libraries(svgfill ${Boost_LIBRARIES} ${BCRYPT_LIBRARIES} LibXml2::LibXml2 IFCOPENSHELL_CGAL)
set_target_properties(svgfill PROPERTIES
PUBLIC_HEADER "${LIB_H_FILES}"
)
set_target_properties(svgfill PROPERTIES PUBLIC_HEADER "${LIB_H_FILES}")
add_executable(svgfill_exe src/main.cpp)
target_link_libraries(svgfill_exe svgfill)
set_property(TARGET svgfill_exe PROPERTY OUTPUT_NAME svgfill)
if(WIN32)
# both the library and the executable now result in a file with basename svgfill,
# on linux the the library is prefixed with lib as libsvgfill.a. Windows does not
# have this mechanism, so on windows the linker would be created an import library
# for the executable, also named svgfill.lib. This naming conflict results in:
# LINK : fatal error LNK1149: output filename matches input filename
# This flag tells the linker not to generate an import library and therefore no
# conflict occurs.
# both the library and the executable now result in a file with basename svgfill,
# on linux the the library is prefixed with lib as libsvgfill.a. Windows does not
# have this mechanism, so on windows the linker would be created an import library
# for the executable, also named svgfill.lib. This naming conflict results in:
# LINK : fatal error LNK1149: output filename matches input filename
# This flag tells the linker not to generate an import library and therefore no
# conflict occurs.
target_link_options(svgfill_exe PRIVATE "/NOIMPLIB")
endif()
install(TARGETS svgfill_exe svgfill
install(
TARGETS svgfill_exe svgfill
EXPORT ${IFCOPENSHELL_EXPORT_TARGETS}
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/svgfill"
)
+56 -113
View File
@@ -98,7 +98,8 @@ IF NOT DEFINED IFCOS_NUM_BUILD_PROCS set IFCOS_NUM_BUILD_PROCS=%NUMBER_OF_PROCES
:: For subroutines
REM /clp:ErrorsOnly;WarningsOnly
:: Note BUILD_TYPE not passed, Clean e.g. wouldn't delete the installed files.
set MSBUILD_CMD=MSBuild.exe /nologo /m:%IFCOS_NUM_BUILD_PROCS%
set MSBUILD_MULTIPROC=/m /p:CL_MPCount=%IFCOS_NUM_BUILD_PROCS% /p:UseMultiToolTask=true /p:EnforceProcessCountAcrossBuilds=true
set MSBUILD_CMD=MSBuild.exe /nologo %MSBUILD_MULTIPROC%
echo.
@@ -281,7 +282,7 @@ call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\proj-9.2.1" ^
-DBUILD_SHARED_LIBS=Off ^
-DBUILD_TESTING=Off
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\PROJ.sln" %BUILD_CFG%
call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -378,7 +379,7 @@ call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\%HDF5_INSTALL_NAME%" ^
-DHDF5_BUILD_TOOLS=OFF -DHDF5_BUILD_EXAMPLES=OFF -DBUILD_SHARED_LIBS=OFF -DHDF5_BUILD_UTILS=OFF ^
-DHDF5_BUILD_CPP_LIB=ON
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\HDF5.sln" %DEBUG_OR_RELEASE%
call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %DEBUG_OR_RELEASE%
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %DEBUG_OR_RELEASE%
IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -465,7 +466,7 @@ call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\%DEPENDENCY_INSTALL_NAME%"
-DLIBXML2_LIBRARIES="" -DLIBXML2_INCLUDE_DIR="" -DPCRE_INCLUDE_DIR="" -DPCRE_LIBRARIES=""
IF NOT %ERRORLEVEL%==0 GOTO :Error
REM IF NOT EXIST "%DEPS_DIR%\OpenCOLLADA\%BUILD_DIR%\lib\%DEBUG_OR_RELEASE%\OpenCOLLADASaxFrameworkLoader.lib".
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\OPENCOLLADA.sln" %DEBUG_OR_RELEASE%
call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %DEBUG_OR_RELEASE%
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %DEBUG_OR_RELEASE%
IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -487,25 +488,6 @@ echo OCC_INSTALL_DIR=%DEPENDENCY_INSTALL_DIR%>>"%~dp0\%BUILD_DEPS_CACHE_PATH%"
call :CheckInstallation
if %ERRORLEVEL%==200 GOTO %NEXT_DEPENDENCY_LABEL%
:: OCCT has many dependencies but FreeType is the only mandatory
set DEPENDENCY_NAME=FreeType
set DEPENDENCY_DIR=%DEPS_DIR%\freetype-2.7.1
set FREETYPE_ZIP=VER-2-7-1.zip
cd "%DEPS_DIR%"
call :DownloadFile https://github.com/freetype/freetype/archive/refs/tags/%FREETYPE_ZIP% "%DEPS_DIR%" %FREETYPE_ZIP%
if not %ERRORLEVEL%==0 goto :Error
call :ExtractArchive %FREETYPE_ZIP% "%DEPS_DIR%" "%DEPENDENCY_DIR%"
if not %ERRORLEVEL%==0 goto :Error
if exist "%DEPS_DIR%\freetype-VER-2-7-1" ren "%DEPS_DIR%\freetype-VER-2-7-1" "freetype-2.7.1"
cd "%DEPENDENCY_DIR%"
:: NOTE FreeType is built as a static library by default
call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\freetype"
if not %ERRORLEVEL%==0 goto :Error
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\freetype.sln" %BUILD_CFG%
if not %ERRORLEVEL%==0 goto :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
if not %ERRORLEVEL%==0 goto :Error
set DEPENDENCY_NAME=Open CASCADE %OCCT_VERSION%
set DEPENDENCY_DIR=%DEPS_DIR%\occt_git
set DEPENDENCY_INSTALL_NAME=%OCCT_DEPENDENCY_INSTALL_NAME%
@@ -528,7 +510,7 @@ cd "%DEPENDENCY_DIR%"
:: Temporarily explicitly set `CMAKE_DEBUG_POSTFIX` to empty to override it's perviously being set to `d`.
:: OCCT don't need it, since it's layout is separating debug and release build by different folders.
call :RunCMake -DINSTALL_DIR="%DEPENDENCY_INSTALL_DIR%" -DBUILD_LIBRARY_TYPE="Static" -DCMAKE_DEBUG_POSTFIX="" ^
-DBUILD_MODULE_Draw=0 -D3RDPARTY_FREETYPE_DIR="%INSTALL_DIR%\freetype" ^
-DBUILD_MODULE_Draw=0 -DUSE_FREETYPE=OFF ^
-DBUILD_USE_PCH=ON
if not %ERRORLEVEL%==0 goto :Error
@@ -539,7 +521,7 @@ IF %ARCH_BITS%==32 (
)
)
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\OCCT.sln" %BUILD_CFG%
call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
if not %ERRORLEVEL%==0 goto :Error
:: If `inc` is present in installation folder, then installation takes much longer
@@ -626,7 +608,7 @@ call :RunCMake -DCMAKE_INSTALL_PREFIX="%DEPENDENCY_INSTALL_DIR%" ^
-DWITH_PCRE=OFF ^
-DBISON_EXECUTABLE="%DEPS_DIR%\%WIN_FLEX_BISON%\win_bison.exe"
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\swig.sln" Release
call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" Release
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" Release
IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -649,7 +631,7 @@ git apply --ignore-whitespace "%~dp0patches\cgal_no_zlib.patch"
call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\cgal" ^
-DCGAL_HEADER_ONLY=On
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\CGAL.sln" %BUILD_CFG%
call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -685,7 +667,7 @@ IF NOT %ERRORLEVEL%==0 GOTO :Error
cd "%DEPENDENCY_DIR%"\build\cmake
call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\zstd" -DZSTD_BUILD_STATIC=ON -DZSTD_BUILD_SHARED=OFF
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :BuildSolution "%DEPENDENCY_DIR%\build\cmake\%BUILD_DIR%\zstd.sln" %BUILD_CFG%
call :BuildCMakeProject "%DEPENDENCY_DIR%\build\cmake\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\build\cmake\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -726,7 +708,7 @@ call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\%DEPENDENCY_INSTALL_NAME%"
-DPORTABLE=1 ^
-DCMAKE_DEBUG_POSTFIX="_d"
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\rocksdb.sln" %BUILD_CFG%
call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -741,7 +723,7 @@ call :MarkInstallation
:: call :RunCMake -DCMAKE_INSTALL_PREFIX="%INSTALL_DIR%\tbb" ^
:: -DBUILD_SHARED_LIBS=Off
:: IF NOT %ERRORLEVEL%==0 GOTO :Error
:: call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\TBB.sln" %BUILD_CFG%
:: call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
:: IF NOT %ERRORLEVEL%==0 GOTO :Error
:: call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
:: IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -765,7 +747,7 @@ call :MarkInstallation
:: -DPXR_BUILD_TESTS=FALSE ^
:: -DBUILD_SHARED_LIBS=Off ^
:: IF NOT %ERRORLEVEL%==0 GOTO :Error
:: call :BuildSolution "%DEPENDENCY_DIR%\%BUILD_DIR%\USD.sln" %BUILD_CFG%
:: call :BuildCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
:: IF NOT %ERRORLEVEL%==0 GOTO :Error
:: call :InstallCMakeProject "%DEPENDENCY_DIR%\%BUILD_DIR%" %BUILD_CFG%
:: IF NOT %ERRORLEVEL%==0 GOTO :Error
@@ -811,76 +793,31 @@ exit %IFCOS_SCRIPT_RET%
:: DownloadFile - Downloads a file using PowerShell
:: Params: %1 url, %2 destinationDir, %3 filename
:: Required vars:
:: - DEPENDENCY_NAME
:DownloadFile
mkdir "%2"
pushd "%2"
if not exist "%~3". (
call cecho.cmd 0 13 "Downloading %DEPENDENCY_NAME% into %~2."
powershell -Command "[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; $webClient = new-object System.Net.WebClient; $webClient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; $webClient.DownloadFile('%1', '%3')"
REM Old wget version in case someone has problem with PowerShell: wget --no-check-certificate %1
) else (
call cecho.cmd 0 13 "%DEPENDENCY_NAME% already downloaded. Skipping."
)
set RET=%ERRORLEVEL%
set LAST_ACTION=DownloadFile '%DEPENDENCY_NAME%'.
popd
exit /b %RET%
%PWSH_TOOLS% download_file "%DEPENDENCY_NAME%" "%1" "%2" "%3"
IF NOT %ERRORLEVEL%==0 GOTO :Error
exit /b 0
:: ExtractArchive - Extracts an archive file using 7-zip
:: Params: %1 filename, %2 destinationDir, %3 dirAfterExtraction
:: Required vars:
:: - DEPENDENCY_NAME
:ExtractArchive
if not exist "%~3". (
call cecho.cmd 0 13 "Extracting %DEPENDENCY_NAME% into %~2 from %1"
7za x %1 -y -o%2 > nul
) else (
call cecho.cmd 0 13 "%DEPENDENCY_NAME% already extracted into %~3. Skipping."
)
set RET=%ERRORLEVEL%
set LAST_ACTION=ExtractArchive '%DEPENDENCY_NAME%'.
exit /b %RET%
:: GitCloneOrPullRepository - Clones or pulls (if repository already cloned) a Git repository
:: Params: %1 gitUrl, %2 destDir
:: F.ex. call :GitCloneRepository https://github.com/KhronosGroup/OpenCOLLADA.git "%DEPS_DIR%\OpenCOLLADA\"
:GitCloneOrPullRepository
if not exist "%~2". (
call cecho.cmd 0 13 "Cloning %DEPENDENCY_NAME% into %~2."
pushd "%DEPS_DIR%"
call git clone %1 %2
set RET=!ERRORLEVEL!
) else (
call cecho.cmd 0 13 "%DEPENDENCY_NAME% already cloned. Pulling latest changes."
git reset --hard
pushd %2
call git pull
set RET=0
)
popd
exit /b %RET%
%PWSH_TOOLS% extract_file "%DEPENDENCY_NAME%" "%1" "%2" "%3"
IF NOT %ERRORLEVEL%==0 GOTO :Error
exit /b 0
:: GitCloneAndCheckoutRevision - Clones a Git repository and checks out a specific revision or tag
:: Params: %1 gitUrl, %2 destDir, %3 revision
:: F.ex. call :GitCloneAndCheckoutRevision https://github.com/KhronosGroup/OpenCOLLADA.git "%DEPENDENCY_DIR%" 064a60b65c2c31b94f013820856bc84fb1937cc6
:: Required vars:
:: - DEPENDENCY_NAME
:GitCloneAndCheckoutRevision
if not exist "%~2". (
call cecho.cmd 0 13 "Cloning %DEPENDENCY_NAME% into %~2."
pushd "%DEPS_DIR%"
call git clone %1 %2
set RET=!ERRORLEVEL!
if not "!RET!"=="0" exit /b !RET!
popd
) else (
call cecho.cmd 0 13 "%DEPENDENCY_NAME% already cloned."
set RET=0
)
pushd "%2"
call git fetch
call cecho.cmd 0 13 "Checking out %DEPENDENCY_NAME% revision %3."
call git reset --hard
call git checkout %3
set RET=%ERRORLEVEL%
popd
exit /b %RET%
%PWSH_TOOLS% git_clone_and_checkout_revision "%DEPENDENCY_NAME%" "%1" "%2" "%3"
IF NOT %ERRORLEVEL%==0 GOTO :Error
exit /b 0
:: RunCMake - Runs CMake for a CMake-based project
:: Params: %* cmakeOptions
@@ -894,20 +831,36 @@ pushd %BUILD_DIR%
:: cache always e.g. when we've had new changes in the repository.
IF %BUILD_TYPE%==Rebuild IF EXIST CMakeCache.txt. del CMakeCache.txt
set VS_TOOLSET_CMAKE_ARG=
IF NOT "%VS_TOOLSET_HOST%"=="" (
cmake .. -G %GENERATOR% -A %VS_PLATFORM% -T %VS_TOOLSET_HOST% %*
) ELSE (
cmake .. -G %GENERATOR% -A %VS_PLATFORM% %*
set VS_TOOLSET_CMAKE_ARG=-T %VS_TOOLSET_HOST%
)
set COMMAND=cmake .. -G %GENERATOR% -A %VS_PLATFORM% %VS_TOOLSET_CMAKE_ARG% %*
echo %COMMAND%
%COMMAND%
set RET=%ERRORLEVEL%
popd
exit /b %RET%
:: TODO add BuildCMakeProject which utilizes cmake --build
:: Params: %1 buildDir, %2 configuration
:: Required vars:
:: - DEPENDENCY_NAME
:BuildCMakeProject
pushd %1
call cecho.cmd 0 13 "Building %DEPENDENCY_NAME%. Please be patient, this will take a while."
set COMPILE_WITH_WPO_SETTING=
IF NOT %COMPILE_WITH_WPO%==FALSE (
set COMPILE_WITH_WPO_SETTING=;WholeProgramOptimization=TRUE
)
set COMMAND=cmake --build . --config %2 -- %MSBUILD_MULTIPROC%
echo %COMMAND%
%COMMAND%
set RET=%ERRORLEVEL%
popd
exit /b %RET%
:: BuildSolution - Builds/Rebuilds/Cleans a solution using MSBuild
:: Params: %1 solutioName, %2 configuration
:: Params: %1 solutionName, %2 configuration
:BuildSolution
IF [%~3]==[] (
set TARGET=%BUILD_TYPE%
@@ -929,23 +882,13 @@ IF NOT %COMPILE_WITH_WPO%==FALSE (
%MSBUILD_CMD% %1 /p:configuration=%2;platform=%VS_PLATFORM%%COMPILE_WITH_WPO_SETTING% /t:"%TARGET%"
exit /b %ERRORLEVEL%
:: InstallCMakeProject - Builds the INSTALL project of CMake-based project
:: Params: %1 buildDir, %2 == configuration
:: NOTE the actual install dir is set during cmake run.
:: TODO Utilize cmake --build --target INSTALL
:: Params: %1 buildDir, %2 configuration
:: Required vars:
:: - DEPENDENCY_NAME
:InstallCMakeProject
pushd %1
call cecho.cmd 0 13 "Installing %2 %DEPENDENCY_NAME%. Please be patient, this will take a while."
:: whole program optimization avoids Visual C++ hanging when compiling 32-bit release OCCT up to version 7.4.0
set COMPILE_WITH_WPO_SETTING=
IF NOT %COMPILE_WITH_WPO%==FALSE (
set COMPILE_WITH_WPO_SETTING=;WholeProgramOptimization=TRUE
)
%MSBUILD_CMD% INSTALL.%VCPROJ_FILE_EXT% /p:configuration=%2;platform=%VS_PLATFORM%%COMPILE_WITH_WPO_SETTING%
set RET=%ERRORLEVEL%
popd
exit /b %RET%
%PWSH_TOOLS% install_cmake_project "%DEPENDENCY_NAME%" "%1" "%2"
IF NOT %ERRORLEVEL%==0 GOTO :Error
exit /b 0
:: Checks whether a dependency is already installed for the specified config
:: Doesn't work for dependencies, only for those that need separate Debug/Release installs.
+2 -1
View File
@@ -58,7 +58,8 @@ call cecho.cmd 0 13 "* IFCOS_NUM_BUILD_PROCS`t= %IFCOS_NUM_BUILD_PROCS%"
echo.
call cecho.cmd 0 13 "Installing %VS_PLATFORM% %BUILD_CFG% %PROJECT_NAME%"
cmake --build ..\%BUILD_DIR% --target INSTALL -- /nologo /m:%IFCOS_NUM_BUILD_PROCS% /p:Platform=%VS_PLATFORM% ^
set MSBUILD_MULTIPROC=/m /p:CL_MPCount=%IFCOS_NUM_BUILD_PROCS% /p:UseMultiToolTask=true /p:EnforceProcessCountAcrossBuilds=true
cmake --build ..\%BUILD_DIR% --target INSTALL -- /nologo %MSBUILD_MULTIPROC% /p:Platform=%VS_PLATFORM% ^
/p:Configuration=%BUILD_CFG% %3 %4 %5 %6 %7 %8 %9
IF NOT %ERRORLEVEL%==0 GOTO :Error
+98 -2
View File
@@ -18,7 +18,7 @@ function mark {
if (Test-Path -Path $marker_filepath) {
return
}
echo "Marking installation in '$installation_dir' with '$ENV:MARKER_FILE'."
cecho.cmd 0 13 "Marking installation in '$installation_dir' with '$ENV:MARKER_FILE'."
New-Item -Path $marker_filepath -ItemType File | Out-Null
}
@@ -76,7 +76,7 @@ function mark_based_on_artifacts {
if (Test-Path -Path $marker_filepath) {
return
}
echo "Found artifact '$artifact' for dependency '$dependency_name' $env:BUILD_CFG."
cecho.cmd 0 13 "Found artifact '$artifact' for dependency '$dependency_name' $env:BUILD_CFG."
& mark $installation_dir
}
@@ -125,6 +125,102 @@ function setup_build_cfg {
}
}
function extract_file {
param(
[Parameter(Mandatory = $true)]
[string]$dependency_name,
[Parameter(Mandatory = $true)]
[string]$filename,
[Parameter(Mandatory = $true)]
[string]$destination_dir,
[Parameter(Mandatory = $true)]
[string]$dir_after_extraction
)
if (Test-Path -Path "$dir_after_extraction") {
cecho.cmd 0 13 "$dependency_name already extracted into '$dir_after_extraction'. Skipping."
exit 0
}
cecho.cmd 0 13 "Extracting $dependency_name into '$destination_dir' from '$filename'."
7za x "$filename" -o"$destination_dir"
exit 0
}
function download_file {
param(
[Parameter(Mandatory = $true)]
[string]$dependency_name,
[Parameter(Mandatory = $true)]
[string]$url,
[Parameter(Mandatory = $true)]
[string]$destination_dir,
[Parameter(Mandatory = $true)]
[string]$filename
)
mkdir "$destination_dir" -Force | Out-Null
pushd "$destination_dir"
if (Test-Path -Path "$filename") {
cecho.cmd 0 13 "$dependency_name already downloaded. Skipping."
exit 0
}
cecho.cmd 0 13 "Downloading $dependency_name into '$destination_dir'"
Invoke-WebRequest $url -OutFile $filename
exit 0
}
# Required env variables:
# - DEPS_DIR
function git_clone_and_checkout_revision {
param(
[Parameter(Mandatory = $true)]
[string]$dependency_name,
[Parameter(Mandatory = $true)]
[string]$git_url,
[Parameter(Mandatory = $true)]
[string]$dest_dir,
[Parameter(Mandatory = $false)]
[string]$revision
)
if (Test-Path -Path "$dest_dir") {
cecho.cmd 0 13 "Cloning $dependency_name is already cloned."
exit 0
}
cecho.cmd 0 13 "Cloning $dependency_name into '$dest_dir'."
pushd "$env:DEPS_DIR"
git clone $git_url $dest_dir
popd
pushd "$dest_dir"
git fetch
cecho.cmd 0 13 "Checking out $dependency_name revision $revision."
git reset --hard
git checkout $revision
popd
exit 0
}
function install_cmake_project {
param(
[Parameter(Mandatory = $true)]
[string]$dependency_name,
[Parameter(Mandatory = $true)]
[string]$build_dir,
[Parameter(Mandatory = $true)]
[string]$configuration
)
pushd "$build_dir"
cecho.cmd 0 13 "Installing $dependency_name ($configuration). Please be patient, this may take a while."
$command = "cmake --install . --config $configuration"
cecho.cmd 0 13 "$command"
Invoke-Expression $command
popd
exit 0
}
function main {
& setup_build_cfg
# Dispatch command.