Hello community, here is the log from the commit of package libSavitar for openSUSE:Factory checked in at 2019-07-11 13:13:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libSavitar (Old) and /work/SRC/openSUSE:Factory/.libSavitar.new.4615 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libSavitar" Thu Jul 11 13:13:21 2019 rev:4 rq:712875 version:4.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/libSavitar/libSavitar.changes 2019-02-25 17:53:46.446518356 +0100 +++ /work/SRC/openSUSE:Factory/.libSavitar.new.4615/libSavitar.changes 2019-07-11 13:13:23.494873717 +0200 @@ -1,0 +2,7 @@ +Wed Jun 26 07:17:06 UTC 2019 - Adrian Schröter <[email protected]> + +- update to version 4.1.0 + * https://ultimaker.com/en/products/ultimaker-cura-software/release-notes +- enable test cases + +------------------------------------------------------------------- Old: ---- libSavitar-3.6.0.obscpio New: ---- libSavitar-4.1.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libSavitar.spec ++++++ --- /var/tmp/diff_new_pack.ttgF9L/_old 2019-07-11 13:13:25.010873092 +0200 +++ /var/tmp/diff_new_pack.ttgF9L/_new 2019-07-11 13:13:25.010873092 +0200 @@ -1,7 +1,7 @@ # # spec file for package libSavitar # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %define sover 0 Name: libSavitar -Version: 3.6.0 +Version: 4.1.0 Release: 0 Summary: C++ implementation of 3mf loading with SIP python bindings License: LGPL-3.0-only @@ -28,6 +28,8 @@ # PATCH-FIX-OPENSUSE -- Use system libraries instead of embedded ones. Patch0: use-system-libs.patch BuildRequires: cmake >= 2.8.12 +BuildRequires: gmock +BuildRequires: gtest BuildRequires: pugixml-devel >= 1.8 BuildRequires: python3-sip-devel @@ -55,17 +57,24 @@ %autosetup -p1 %build -%cmake -DUSE_SYSTEM_LIBS=TRUE +%cmake -DUSE_SYSTEM_LIBS=TRUE \ + -DBUILD_TESTS=TRUE \ + -DLIB_SUFFIX=64 make %{?_smp_mflags} %install %cmake_install +%check +cd build +export LD_LIBRARY_PATH=$PWD +# we don't use "make test" to get the output on failure +/usr/bin/ctest --force-new-ctest-process --output-on-failure + %post -n %{name}%{sover} -p /sbin/ldconfig %postun -n %{name}%{sover} -p /sbin/ldconfig %files devel -%license LICENSE %{_includedir}/Savitar/ %{_libdir}/cmake/Savitar/ %{_libdir}/libSavitar.so @@ -74,6 +83,6 @@ %license LICENSE %doc README.md %{_libdir}/libSavitar.so.* -%{python3_sitearch}/Savitar.so +%{python3_sitelib}/Savitar.so %changelog ++++++ _service ++++++ --- /var/tmp/diff_new_pack.ttgF9L/_old 2019-07-11 13:13:25.038873081 +0200 +++ /var/tmp/diff_new_pack.ttgF9L/_new 2019-07-11 13:13:25.038873081 +0200 @@ -2,8 +2,8 @@ <service name="obs_scm" mode="disabled"> <param name="url">git://github.com/Ultimaker/libSavitar.git</param> <param name="scm">git</param> - <param name="revision">3.6.0</param> - <param name="version">3.6.0</param> + <param name="revision">4.1.0</param> + <param name="version">4.1.0</param> </service> <service mode="disabled" name="set_version" /> ++++++ libSavitar-3.6.0.obscpio -> libSavitar-4.1.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/.gitlab-ci.yml new/libSavitar-4.1.0/.gitlab-ci.yml --- old/libSavitar-3.6.0/.gitlab-ci.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.1.0/.gitlab-ci.yml 2019-04-17 16:58:53.000000000 +0200 @@ -0,0 +1,12 @@ +image: registry.gitlab.com/ultimaker/cura/cura-build-environment:centos7 + +stages: + - build + +build-and-test: + stage: build + script: + - docker/build.sh + artifacts: + paths: + - build/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/.idea/vcs.xml new/libSavitar-4.1.0/.idea/vcs.xml --- old/libSavitar-3.6.0/.idea/vcs.xml 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/.idea/vcs.xml 1970-01-01 01:00:00.000000000 +0100 @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$" vcs="Git" /> - </component> -</project> \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/CMakeLists.txt new/libSavitar-4.1.0/CMakeLists.txt --- old/libSavitar-3.6.0/CMakeLists.txt 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/CMakeLists.txt 2019-04-17 16:58:53.000000000 +0200 @@ -1,41 +1,49 @@ project(savitar) -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.6) include(GNUInstallDirs) include(CMakePackageConfigHelpers) option(BUILD_PYTHON "Build " ON) option(BUILD_STATIC "Build as a static library" OFF) +option(BUILD_TESTS "Building the test-suite" OFF) +if(BUILD_TESTS) + message(STATUS "Building with tests...") + find_package(GTest REQUIRED) + find_package(Threads QUIET) +endif() add_subdirectory(pugixml) if(BUILD_PYTHON) - set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) + list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) + + # FIXME: Remove the code for CMake <3.12 once we have switched over completely. + # FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. + if(${CMAKE_VERSION} VERSION_LESS 3.12) + # Use FindPythonInterp and FindPythonLibs for CMake <3.12 + find_package(PythonInterp 3.4 REQUIRED) + find_package(PythonLibs 3.4 REQUIRED) + else() + # Use FindPython3 for CMake >=3.12 + find_package(Python3 3.4 REQUIRED COMPONENTS Interpreter Development) + endif() + find_package(SIP REQUIRED) if(NOT DEFINED LIB_SUFFIX) set(LIB_SUFFIX "") endif() - if(EXISTS /etc/debian_version) - # Running on a debian-based system, which requires special handling for python modules. - set(PYTHON_SITE_PACKAGES_DIR lib${LIB_SUFFIX}/python3/dist-packages CACHE STRING "Directory to install Python bindings to") - else() - set(PYTHON_SITE_PACKAGES_DIR lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages CACHE STRING "Directory to install Python bindings to") - endif() - include_directories(python/ src/ ${SIP_INCLUDE_DIR} ${PYTHON_INCLUDE_DIR}) -endif() -if(NOT ${CMAKE_VERSION} VERSION_LESS 3.1) - set(CMAKE_CXX_STANDARD 11) -else() - set(CMAKE_CXX_FLAGS "-std=c++11") + include_directories(python/ src/ ${SIP_INCLUDE_DIRS} ${Python3_INCLUDE_DIRS}) endif() +set(CMAKE_CXX_STANDARD 11) + if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() - set(savitar_SRCS src/ThreeMFParser.cpp src/SceneNode.cpp @@ -56,7 +64,7 @@ src/SavitarExport.h ) -set(SAVITAR_VERSION 0.1.0) +set(SAVITAR_VERSION 0.1.1) set(SAVITAR_SOVERSION 0) set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR}) @@ -67,13 +75,16 @@ add_library(Savitar SHARED ${savitar_SRCS}) endif() -target_link_libraries(Savitar PUBLIC pugixml) +set(Savitar_LINK_LIBRARIES pugixml) +if(CMAKE_USE_PTHREADS_INIT) + list(APPEND Savitar_LINK_LIBRARIES pthread) +endif() +target_link_libraries(Savitar PUBLIC ${Savitar_LINK_LIBRARIES}) if(NOT WIN32 OR CMAKE_COMPILER_IS_GNUCXX) set_target_properties(Savitar PROPERTIES COMPILE_FLAGS -fPIC) endif() - if(BUILD_PYTHON) set(SIP_EXTRA_FILES_DEPEND python/Types.sip python/MeshData.sip python/SceneNode.sip python/Scene.sip) #set(SIP_EXTRA_SOURCE_FILES python/Types.cpp) @@ -115,6 +126,30 @@ configure_package_config_file(SavitarConfig.cmake.in ${CMAKE_BINARY_DIR}/SavitarConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Savitar) write_basic_package_version_file(${CMAKE_BINARY_DIR}/SavitarConfigVersion.cmake VERSION ${SAVITAR_VERSION} COMPATIBILITY SameMajorVersion) +# List of tests. For each test there must be a file tests/${NAME}.cpp. +set(savitar_TEST + ThreeMFParserTest + MeshDataTest +) + +# Compiling the test environment. +if (BUILD_TESTS) + include_directories(${GTEST_INCLUDE_DIR}) + + enable_testing() + + #To make sure that the tests are built before running them, add the building of these tests as an additional test. + add_custom_target(build_all_tests) + add_test(BuildTests "${CMAKE_COMMAND}" --build ${CMAKE_CURRENT_BINARY_DIR} --target build_all_tests) + + foreach (test ${savitar_TEST}) + add_executable(${test} tests/main.cpp tests/${test}.cpp) + target_link_libraries(${test} Savitar ${GTEST_BOTH_LIBRARIES}) + add_test(${test} ${test}) + add_dependencies(build_all_tests ${test}) #Make sure that this gets built as part of the build_all_tests target. + endforeach() +endif() + install(FILES ${CMAKE_BINARY_DIR}/SavitarConfig.cmake ${CMAKE_BINARY_DIR}/SavitarConfigVersion.cmake diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/cmake/FindSIP.cmake new/libSavitar-4.1.0/cmake/FindSIP.cmake --- old/libSavitar-3.6.0/cmake/FindSIP.cmake 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/cmake/FindSIP.cmake 2019-04-17 16:58:53.000000000 +0200 @@ -8,17 +8,12 @@ # # This file defines the following variables: # -# SIP_VERSION - The version of SIP found expressed as a 6 digit hex number -# suitable for comparision as a string. +# SIP_VERSION - SIP version. # -# SIP_VERSION_STR - The version of SIP found as a human readable string. +# SIP_EXECUTABLE - Path to the SIP executable. # -# SIP_BINARY_PATH - Path and filename of the SIP command line executable. +# SIP_INCLUDE_DIRS - The SIP include directories. # -# SIP_INCLUDE_DIR - Directory holding the SIP C++ header file. -# -# SIP_DEFAULT_SIP_DIR - Default directory where .sip files should be installed -# into. # Copyright (c) 2007, Simon Edwards <[email protected]> # Redistribution and use is allowed according to the terms of the BSD license. @@ -29,41 +24,61 @@ set(CMAKE_FIND_FRAMEWORK LAST) endif() -find_package(PythonInterp 3.4.0 REQUIRED) -find_package(PythonLibs 3.4.0 REQUIRED) +# FIXME: Remove the code for CMake <3.12 once we have switched over completely. +# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. +if(${CMAKE_VERSION} VERSION_LESS 3.12) + # Use FindPythonInterp and FindPythonLibs for CMake <3.12 + find_package(PythonInterp 3.4 REQUIRED) + find_package(PythonLibs 3.4 REQUIRED) + + # Define variables that are available in FindPython3, so there's no need to branch off in the later part. + set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) + set(Python3_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS}) + set(Python3_LIBRARIES ${PYTHON_LIBRARIES}) + + execute_process( + COMMAND ${Python3_EXECUTABLE} -c + "import distutils.sysconfig; print(distutils.sysconfig.get_python_lib(plat_specific=False,standard_lib=False))" + RESULT_VARIABLE _process_status + OUTPUT_VARIABLE _process_output + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(${_process_status} EQUAL 0) + string(STRIP ${_process_output} Python3_SITELIB) + else() + message(FATAL_ERROR "Failed to get Python3_SITELIB. Error: ${_process_output}") + endif() +else() + # Use FindPython3 for CMake >=3.12 + find_package(Python3 3.4 REQUIRED COMPONENTS Interpreter Development) +endif() + +get_filename_component(_python_binary_path ${Python3_EXECUTABLE} DIRECTORY) -IF(SIP_VERSION) - # Already in cache, be silent - SET(SIP_FOUND TRUE) -ELSE(SIP_VERSION) - - FIND_FILE(_find_sip_py FindSIP.py PATHS ${CMAKE_MODULE_PATH}) - - SET(ENV{PYTHONPATH} ${CMAKE_INSTALL_PREFIX}/${PYTHON_SITE_PACKAGES_DIR}) - EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_sip_py} - OUTPUT_VARIABLE sip_config - RESULT_VARIABLE sip_config_returncode) - IF(sip_config_returncode EQUAL 0) - STRING(REGEX REPLACE "^sip_version:([^\n]+).*$" "\\1" SIP_VERSION ${sip_config}) - STRING(REGEX REPLACE ".*\nsip_version_num:([^\n]+).*$" "\\1" SIP_VERSION_NUM ${sip_config}) - STRING(REGEX REPLACE ".*\nsip_version_str:([^\n]+).*$" "\\1" SIP_VERSION_STR ${sip_config}) - STRING(REGEX REPLACE ".*\nsip_bin:([^\n]+).*$" "\\1" SIP_BINARY_PATH ${sip_config}) - STRING(REGEX REPLACE ".*\ndefault_sip_dir:([^\n]+).*$" "\\1" SIP_DEFAULT_SIP_DIR ${sip_config}) - STRING(REGEX REPLACE ".*\nsip_inc_dir:([^\n]+).*$" "\\1" SIP_INCLUDE_DIR ${sip_config}) - SET(SIP_FOUND TRUE) - ENDIF(sip_config_returncode EQUAL 0) - - IF(SIP_FOUND) - IF(NOT SIP_FIND_QUIETLY) - MESSAGE(STATUS "Found SIP version: ${SIP_VERSION_STR}") - ENDIF(NOT SIP_FIND_QUIETLY) - - include(${CMAKE_MODULE_PATH}/SIPMacros.cmake) - ELSE(SIP_FOUND) - IF(SIP_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find SIP") - ENDIF(SIP_FIND_REQUIRED) - ENDIF(SIP_FOUND) +find_program(SIP_EXECUTABLE sip + HINTS ${CMAKE_PREFIX_PATH}/bin ${CMAKE_INSTALL_PATH}/bin ${_python_binary_path} ${Python3_SITELIB}/PyQt5 +) + +find_path(SIP_INCLUDE_DIRS sip.h + HINTS ${CMAKE_PREFIX_PATH}/include ${CMAKE_INSTALL_PATH}/include ${Python3_INCLUDE_DIRS} ${Python3_SITELIB}/PyQt5 +) + +execute_process( + COMMAND ${Python3_EXECUTABLE} -c "import sip; print(sip.SIP_VERSION_STR)" + RESULT_VARIABLE _process_status + OUTPUT_VARIABLE _process_output + OUTPUT_STRIP_TRAILING_WHITESPACE +) -ENDIF(SIP_VERSION) +if(${_process_status} EQUAL 0) + string(STRIP ${_process_output} SIP_VERSION) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SIP REQUIRED_VARS SIP_EXECUTABLE SIP_INCLUDE_DIRS VERSION_VAR SIP_VERSION) + +if(SIP_FOUND) + include(${CMAKE_CURRENT_LIST_DIR}/SIPMacros.cmake) +endif() +mark_as_advanced(SIP_EXECUTABLE SIP_INCLUDE_DIRS SIP_VERSION) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/cmake/FindSIP.py new/libSavitar-4.1.0/cmake/FindSIP.py --- old/libSavitar-3.6.0/cmake/FindSIP.py 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/cmake/FindSIP.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,62 +0,0 @@ -# FindSIP.py -# -# Copyright (c) 2007, Simon Edwards <[email protected]> -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -import sys -import os.path - -def fail(msg="Unable to determine your sip configuration."): - print(msg) - sys.exit(1) - -try: - # Try the old sipconfig. Many Linux distros still ship this in their packages. - import sipconfig - sipcfg = sipconfig.Configuration() - - sip_version = sipcfg.sip_version - sip_version = sipcfg.sip_version - sip_version_str = sipcfg.sip_version_str - sip_bin = sipcfg.sip_bin - default_sip_dir = sipcfg.default_sip_dir - sip_inc_dir = sipcfg.sip_inc_dir - -except ImportError: - try: - if sys.platform == "win32": - # Collect the info from the sip module and guess the rest. - import sip - from distutils import sysconfig - - sip_version = sip.SIP_VERSION - sip_version_str = sip.SIP_VERSION_STR - - exe = sys.executable - if exe is None: - fail() - base_path = os.path.dirname(exe) - sip_bin = os.path.join(base_path, "Lib\\site-packages\\PyQt5\\sip.exe") - if not os.path.exists(sip_bin): - fail() - - sip_inc_dir = os.path.join(base_path, "Lib\\site-packages\\PyQt5\\include\\") - if not os.path.exists(sip_inc_dir): - fail() - - default_sip_dir = os.path.join(base_path, "Lib\\site-packages\\PyQt5\\sip\\") - if not os.path.exists(default_sip_dir): - fail() - else: - fail("Unable to import sipconfig and determine your sip configuration.") - - except ImportError: - fail("Unable to import sipconfig and determine your sip configuration.") - -print("sip_version:%06.0x" % sip_version) -print("sip_version_num:%d" % sip_version) -print("sip_version_str:%s" % sip_version_str) -print("sip_bin:%s" % sip_bin) -print("default_sip_dir:%s" % default_sip_dir) -print("sip_inc_dir:%s" % sip_inc_dir) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/cmake/SIPMacros.cmake new/libSavitar-4.1.0/cmake/SIPMacros.cmake --- old/libSavitar-3.6.0/cmake/SIPMacros.cmake 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/cmake/SIPMacros.cmake 2019-04-17 16:58:53.000000000 +0200 @@ -19,7 +19,7 @@ # The behaviour of the ADD_SIP_PYTHON_MODULE macro can be controlled by a # number of variables: # -# SIP_INCLUDES - List of directories which SIP will scan through when looking +# SIP_INCLUDE_DIRS - List of directories which SIP will scan through when looking # for included .sip files. (Corresponds to the -I option for SIP.) # # SIP_TAGS - List of tags to define when running SIP. (Corresponds to the -t @@ -35,7 +35,7 @@ # SIP_EXTRA_OPTIONS - Extra command line options which should be passed on to # SIP. -SET(SIP_INCLUDES) +SET(SIP_INCLUDE_DIRS) SET(SIP_TAGS) SET(SIP_CONCAT_PARTS 8) SET(SIP_DISABLE_FEATURES) @@ -102,7 +102,7 @@ OUTPUT ${_sip_output_files} COMMAND ${CMAKE_COMMAND} -E echo ${message} COMMAND ${CMAKE_COMMAND} -E touch ${_sip_output_files} - COMMAND ${SIP_BINARY_PATH} ${_sip_tags} ${_sip_x} ${SIP_EXTRA_OPTIONS} -j ${SIP_CONCAT_PARTS} -c ${CMAKE_CURRENT_BINARY_DIR}/${_module_path} ${_sip_includes} ${_abs_module_sip} + COMMAND ${SIP_EXECUTABLE} ${_sip_tags} ${_sip_x} ${SIP_EXTRA_OPTIONS} -j ${SIP_CONCAT_PARTS} -c ${CMAKE_CURRENT_BINARY_DIR}/${_module_path} ${_sip_includes} ${_abs_module_sip} DEPENDS ${_abs_module_sip} ${SIP_EXTRA_FILES_DEPEND} ) # not sure if type MODULE could be uses anywhere, limit to cygwin for now @@ -112,7 +112,7 @@ ADD_LIBRARY(${_logical_name} SHARED ${_sip_output_files} ${SIP_EXTRA_SOURCE_FILES}) ENDIF (CYGWIN OR APPLE) IF (NOT APPLE) - TARGET_LINK_LIBRARIES(${_logical_name} ${PYTHON_LIBRARIES}) + TARGET_LINK_LIBRARIES(${_logical_name} ${Python3_LIBRARIES}) ENDIF (NOT APPLE) TARGET_LINK_LIBRARIES(${_logical_name} ${EXTRA_LINK_LIBRARIES}) IF (APPLE) @@ -121,10 +121,9 @@ SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES PREFIX "" OUTPUT_NAME ${_child_module_name}) IF (WIN32) - SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES SUFFIX ".pyd" IMPORT_PREFIX "_") + SET_TARGET_PROPERTIES(${_logical_name} PROPERTIES SUFFIX ".pyd" IMPORT_PREFIX "_") ENDIF (WIN32) - INSTALL(TARGETS ${_logical_name} DESTINATION "${PYTHON_SITE_PACKAGES_DIR}/${_parent_module_path}") + INSTALL(TARGETS ${_logical_name} DESTINATION "${Python3_SITELIB}/${_parent_module_path}") ENDMACRO(ADD_SIP_PYTHON_MODULE) - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/docker/build.sh new/libSavitar-4.1.0/docker/build.sh --- old/libSavitar-3.6.0/docker/build.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.1.0/docker/build.sh 2019-04-17 16:58:53.000000000 +0200 @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -e + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +PROJECT_DIR="$( cd "${SCRIPT_DIR}/.." && pwd )" + +# Make sure that environment variables are set properly +source /opt/rh/devtoolset-7/enable +export PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}" +export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}" + +cd "${PROJECT_DIR}" + +mkdir build +cd build +cmake3 \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_PREFIX_PATH="${CURA_BUILD_ENV_PATH}" \ + -DBUILD_TESTS=ON \ + .. +make +ctest3 --output-on-failure -T Test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/pugixml/CMakeLists.txt new/libSavitar-4.1.0/pugixml/CMakeLists.txt --- old/libSavitar-3.6.0/pugixml/CMakeLists.txt 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/pugixml/CMakeLists.txt 2019-04-17 16:58:53.000000000 +0200 @@ -68,13 +68,3 @@ configure_file(scripts/pugixml.pc.in ${PROJECT_BINARY_DIR}/pugixml.pc @ONLY) install(FILES ${PROJECT_BINARY_DIR}/pugixml.pc DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig) endif() - -if(BUILD_TESTS) - file(GLOB TEST_SOURCES tests/*.cpp) - file(GLOB FUZZ_SOURCES tests/fuzz_*.cpp) - list(REMOVE_ITEM TEST_SOURCES ${FUZZ_SOURCES}) - - add_executable(check ${TEST_SOURCES}) - target_link_libraries(check pugixml) - add_custom_command(TARGET check POST_BUILD COMMAND check WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) -endif() \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/src/MeshData.cpp new/libSavitar-4.1.0/src/MeshData.cpp --- old/libSavitar-3.6.0/src/MeshData.cpp 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/src/MeshData.cpp 2019-04-17 16:58:53.000000000 +0200 @@ -18,7 +18,9 @@ #include "MeshData.h" #include "../pugixml/src/pugixml.hpp" +#include <cstring> #include <iostream> +#include <stdexcept> //For std::runtime_error. using namespace Savitar; @@ -32,6 +34,16 @@ } +float parse_float(const pugi::xml_attribute& attribute) +{ + if(std::strchr(attribute.value(), ',') != nullptr) + { + // Until the implementation of more robust error-handling, it'll have to be done this way: + throw std::runtime_error("Comma's should not be used as decimal separators, locale should be set to \"C\" for .3MF files."); + } + return attribute.as_float(); +} + void MeshData::fillByXMLNode(pugi::xml_node xml_node) { this->vertices.clear(); @@ -42,7 +54,7 @@ pugi::xml_node xml_vertices = xml_node.child("vertices"); for(pugi::xml_node vertex = xml_vertices.child("vertex"); vertex; vertex = vertex.next_sibling("vertex")) { - Vertex temp_vertex = Vertex(vertex.attribute("x").as_float(), vertex.attribute("y").as_float(), vertex.attribute("z").as_float()); + Vertex temp_vertex = Vertex(parse_float(vertex.attribute("x")), parse_float(vertex.attribute("y")), parse_float(vertex.attribute("z"))); this->vertices.push_back(temp_vertex); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/src/SceneNode.cpp new/libSavitar-4.1.0/src/SceneNode.cpp --- old/libSavitar-3.6.0/src/SceneNode.cpp 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/src/SceneNode.cpp 2019-04-17 16:58:53.000000000 +0200 @@ -76,13 +76,36 @@ mesh_data.clear(); mesh_data.fillByXMLNode(xml_node.child("mesh")); } - pugi::xml_node settings_node = xml_node.child("settings"); + + // Read settings the old way -which didn't conform to the 3MF standard- for backwards compat.: + const pugi::xml_node settings_node = xml_node.child("settings"); if(settings_node) { for(pugi::xml_node setting = settings_node.child("setting"); setting; setting = setting.next_sibling("setting")) { - std::string key = setting.attribute("key").as_string(); - std::string value = setting.text().as_string(); + const std::string key = setting.attribute("key").as_string(); + const std::string value = setting.text().as_string(); + settings[key] = value; + } + } + + // Read settings the conformant way: + const pugi::xml_node metadatagroup_node = xml_node.child("metadatagroup"); + if (metadatagroup_node) + { + for (pugi::xml_node setting = metadatagroup_node.child("metadata"); setting; setting = setting.next_sibling("metadata")) + { + std::string key = setting.attribute("name").as_string(); + const size_t pos = key.find_first_of(':'); + + // Other namespaces can be in the metadata, not just Cura's, don't load those: + if (key.substr(0, pos).compare("cura") != 0) + { + continue; + } + + key = (pos != std::string::npos) ? key.substr(pos + 1) : key; + const std::string value = setting.text().as_string(); settings[key] = value; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/src/ThreeMFParser.cpp new/libSavitar-4.1.0/src/ThreeMFParser.cpp --- old/libSavitar-3.6.0/src/ThreeMFParser.cpp 2017-11-06 02:24:59.000000000 +0100 +++ new/libSavitar-4.1.0/src/ThreeMFParser.cpp 2019-04-17 16:58:53.000000000 +0200 @@ -56,6 +56,7 @@ model_node.append_attribute("unit") = scene.getUnit().c_str(); model_node.append_attribute("xmlns") = "http://schemas.microsoft.com/3dmanufacturing/core/2015/02"; + model_node.append_attribute("xmlns:cura") = "http://software.ultimaker.com/xml/cura/3mf/2015/10"; model_node.append_attribute("xml:lang") ="en-US"; for(int i = 0; i < scene.getAllSceneNodes().size(); i++) @@ -80,12 +81,14 @@ std::map<std::string, std::string> per_object_settings = scene_node->getSettings(); if(!per_object_settings.empty()) { - pugi::xml_node settings = object.append_child("settings"); + pugi::xml_node settings = object.append_child("metadatagroup"); for(const std::pair<std::string, std::string> setting_pair: per_object_settings) { - pugi::xml_node setting = settings.append_child("setting"); - setting.append_attribute("key") = setting_pair.first.c_str(); + pugi::xml_node setting = settings.append_child("metadata"); + setting.append_attribute("name") = (std::string("cura:") + setting_pair.first).c_str(); setting.text().set(setting_pair.second.c_str()); + setting.append_attribute("preserve") = "true"; + setting.append_attribute("type") = "xs:string"; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/tests/MeshDataTest.cpp new/libSavitar-4.1.0/tests/MeshDataTest.cpp --- old/libSavitar-3.6.0/tests/MeshDataTest.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.1.0/tests/MeshDataTest.cpp 2019-04-17 16:58:53.000000000 +0200 @@ -0,0 +1,170 @@ +//Copyright (c) 2019 Ultimaker B.V. +//libSavitar is released under the terms of the AGPLv3 or higher. + +#include "../src/MeshData.h" + +#include <array> +#include <fstream> +#include <gtest/gtest.h> +#include <iostream> +#include <iterator> +#include <string> + +#include "../pugixml/src/pugixml.hpp" + +namespace Savitar +{ + +constexpr int NUM_COORDS = 12; +constexpr int NUM_INDICES = 6; +const std::array<float, NUM_COORDS> vertices = +{ + 2.f, 2.f, -1.f, + 4.f, 2.f, 1.f, + 4.f, 4.f, -1.f, + 2.f, 4.f, 1.f +}; +const std::array<int, NUM_INDICES> faces = +{ + 0, 1, 2, + 2, 1, 3 +}; + + +/* + * Fixture with some settings and testing mesh data to test with. + */ +class MeshDataTest : public testing::Test +{ +public: + const uint8_t* vertex_bytes; + const uint8_t* face_bytes; + + pugi::xml_node node; + MeshData* mesh_data; + + void SetUp() + { + mesh_data = new MeshData(); + + vertex_bytes = reinterpret_cast<const uint8_t*>(vertices.data()); + face_bytes = reinterpret_cast<const uint8_t*>(faces.data()); + + std::vector<uint8_t> vertex_vector; + for (int i_byte = 0; i_byte < NUM_COORDS * sizeof(float); ++i_byte) + { + vertex_vector.push_back(vertex_bytes[i_byte]); + } + + std::vector<uint8_t> face_vector; + for (int i_byte = 0; i_byte < NUM_INDICES * sizeof(int); ++i_byte) + { + face_vector.push_back(face_bytes[i_byte]); + } + + mesh_data->setVerticesFromBytes(vertex_vector); + mesh_data->setFacesFromBytes(face_vector); + } + + void TearDown() + { + delete mesh_data; + } +}; + +TEST_F(MeshDataTest, toXmlNode) +{ + pugi::xml_document document; + node = document.append_child("mesh"); + mesh_data->toXmlNode(node); + + pugi::xml_node vertices_node = node.child("vertices"); + ASSERT_TRUE(vertices_node); + ASSERT_FALSE(vertices_node.next_sibling("vertices")); + + int i_coord = 0; + for (pugi::xml_node vertex_node : vertices_node.children("vertex")) + { + EXPECT_LT(i_coord, NUM_COORDS); + + pugi::xml_attribute x_attr = vertex_node.attribute("x"); + pugi::xml_attribute y_attr = vertex_node.attribute("y"); + pugi::xml_attribute z_attr = vertex_node.attribute("z"); + EXPECT_TRUE(x_attr); + EXPECT_TRUE(y_attr); + EXPECT_TRUE(z_attr); + + float x, y, z; + EXPECT_NO_THROW(x = x_attr.as_float()); + EXPECT_NO_THROW(y = y_attr.as_float()); + EXPECT_NO_THROW(z = z_attr.as_float()); + + EXPECT_EQ(x, vertices[i_coord]); + EXPECT_EQ(y, vertices[i_coord + 1]); + EXPECT_EQ(z, vertices[i_coord + 2]); + + i_coord += 3; + } + EXPECT_EQ(i_coord, NUM_COORDS); + + pugi::xml_node triangles_node = node.child("triangles"); + ASSERT_TRUE(triangles_node); + EXPECT_FALSE(triangles_node.next_sibling("triangles")); + + int i_poly = 0; + for (pugi::xml_node vertex_node : triangles_node.children("triangle")) + { + EXPECT_LT(i_poly, NUM_INDICES); + + pugi::xml_attribute v1_attr = vertex_node.attribute("v1"); + pugi::xml_attribute v2_attr = vertex_node.attribute("v2"); + pugi::xml_attribute v3_attr = vertex_node.attribute("v3"); + EXPECT_TRUE(v1_attr); + EXPECT_TRUE(v2_attr); + EXPECT_TRUE(v3_attr); + + int v1, v2, v3; + EXPECT_NO_THROW(v1 = v1_attr.as_int()); + EXPECT_NO_THROW(v2 = v2_attr.as_int()); + EXPECT_NO_THROW(v3 = v3_attr.as_int()); + + EXPECT_EQ(v1, faces[i_poly]); + EXPECT_EQ(v2, faces[i_poly + 1]); + EXPECT_EQ(v3, faces[i_poly + 2]); + + i_poly += 3; + } + EXPECT_EQ(i_poly, NUM_INDICES); + + mesh_data->clear(); +} + +TEST_F(MeshDataTest, fromXmlNode) +{ + pugi::xml_document document; + node = document.append_child("mesh"); + mesh_data->toXmlNode(node); + mesh_data->clear(); + + mesh_data->fillByXMLNode(node); + + const bytearray got_vertex_bytes = mesh_data->getVerticesAsBytes(); + ASSERT_EQ(got_vertex_bytes.size(), sizeof(float) * vertices.size()); + + int i_vertex_byte = -1; + for (const uint8_t& byte : got_vertex_bytes) + { + EXPECT_EQ(byte, vertex_bytes[++i_vertex_byte]); + } + + const bytearray got_face_bytes = mesh_data->getFacesAsBytes(); + ASSERT_EQ(got_face_bytes.size(), sizeof(int) * faces.size()); + + int i_face_byte = -1; + for (const uint8_t& byte : got_face_bytes) + { + EXPECT_EQ(byte, face_bytes[++i_face_byte]); + } +} + +} // namespace Savitar diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/tests/ThreeMFParserTest.cpp new/libSavitar-4.1.0/tests/ThreeMFParserTest.cpp --- old/libSavitar-3.6.0/tests/ThreeMFParserTest.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.1.0/tests/ThreeMFParserTest.cpp 2019-04-17 16:58:53.000000000 +0200 @@ -0,0 +1,130 @@ +//Copyright (c) 2019 Ultimaker B.V. +//libSavitar is released under the terms of the AGPLv3 or higher. + +#include "../src/Scene.h" +#include "../src/SceneNode.h" +#include "../src/ThreeMFParser.h" + +#include <fstream> +#include <gtest/gtest.h> +#include <iostream> +#include <iterator> +#include <map> +#include <string> + +namespace Savitar +{ + +/* + * Fixture that loads a testing XML model and gives an instance of the parser to + * test with. + */ +class ThreeMFParserTest : public testing::Test +{ +public: + std::string xml_string; + ThreeMFParser* parser; + + void SetUp() + { + xml_string = ""; + std::ifstream test_model_file("../tests/test_model.xml"); + if (test_model_file.is_open()) + { + xml_string = std::string(std::istreambuf_iterator<char>{test_model_file}, {}); + } + + parser = new ThreeMFParser(); + } + + void TearDown() + { + delete parser; + } +}; + +TEST_F(ThreeMFParserTest, parse) +{ + ASSERT_FALSE(xml_string.empty()); + + Scene scene; + ASSERT_NO_THROW(scene = parser->parse(xml_string)); + + std::vector<SceneNode*> nodes = scene.getSceneNodes(); + ASSERT_FALSE(nodes.empty()); + ASSERT_EQ(nodes.size(), 4UL); + + std::array<size_t, 4> expected_verts = {36UL, 8UL, 0UL, 0UL}; + std::array<size_t, 4> expected_tris = { 144UL, 144UL, 0UL, 0UL}; + std::array<size_t, 4> expected_child = { 0UL, 0UL, 1UL, 1UL}; + int i = -1; + for (SceneNode* node : nodes) + { + ++i; + MeshData& data = node->getMeshData(); + + const std::vector<Vertex>& verts = data.getVertices(); + EXPECT_EQ(verts.size(), expected_verts[i]); + + const bytearray& tris = data.getFacesAsBytes(); + EXPECT_EQ(tris.size(), expected_tris[i]); + + const std::vector<SceneNode*>& children = node->getAllChildren(); + ASSERT_EQ(children.size(), expected_child[i]); + for (SceneNode* child : children) + { + data = child->getMeshData(); + EXPECT_FALSE(data.getVertices().empty()); + EXPECT_FALSE(data.getFacesAsBytes().empty()); + } + } + // NOTE: To/from for content of vertices/triangles is tested in MeshDataTest. + + std::map<std::string, std::string> settings; + + settings = nodes[0]->getSettings(); + EXPECT_NE(settings.find("extruder_nr"), settings.end()); + EXPECT_EQ(settings["extruder_nr"].compare("0"), 0); + EXPECT_NE(settings.find("bottom_layers"), settings.end()); + EXPECT_EQ(settings["bottom_layers"].compare("20"), 0); + EXPECT_EQ(settings.find("infill_pattern"), settings.end()); + + settings = nodes[1]->getSettings(); + EXPECT_TRUE(settings.empty()); + + settings = nodes[2]->getSettings(); + EXPECT_NE(settings.find("extruder_nr"), settings.end()); + EXPECT_EQ(settings["extruder_nr"].compare("1"), 0); + EXPECT_EQ(settings.find("bottom_layers"), settings.end()); + EXPECT_NE(settings.find("infill_pattern"), settings.end()); + EXPECT_EQ(settings["infill_pattern"].compare("concentric"), 0); + + EXPECT_EQ(nodes[1]->getId().compare("2"), 0); + EXPECT_FALSE(nodes[1]->getTransformation().empty()); +} + +TEST_F(ThreeMFParserTest, sceneToString) +{ + ASSERT_FALSE(xml_string.empty()); + Scene scene = parser->parse(xml_string); + + const std::string scene_string = parser->sceneToString(scene); + EXPECT_FALSE(scene_string.empty()); +} + +TEST_F(ThreeMFParserTest, decimalSeparatorTest) +{ + // Don't accept a model that uses ','s for decimal separators. + std::string xml_string_septest = ""; + std::ifstream test_model_file("../tests/problem_model.xml"); + if (test_model_file.is_open()) + { + xml_string_septest = std::string(std::istreambuf_iterator<char>{test_model_file}, {}); + } + ThreeMFParser parser_septest; + + Scene scene; + ASSERT_THROW(scene = parser_septest.parse(xml_string_septest), std::runtime_error); +} + +} // namespace Savitar diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/tests/main.cpp new/libSavitar-4.1.0/tests/main.cpp --- old/libSavitar-3.6.0/tests/main.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.1.0/tests/main.cpp 2019-04-17 16:58:53.000000000 +0200 @@ -0,0 +1,14 @@ +//Copyright (c) 2019 Ultimaker B.V. +//libSavitar is released under the terms of the AGPLv3 or higher. + +#include <gtest/gtest.h> + +/*! + * \brief Runs the test cases. + */ +int main(int argc,char** argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/tests/problem_model.xml new/libSavitar-4.1.0/tests/problem_model.xml --- old/libSavitar-3.6.0/tests/problem_model.xml 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.1.0/tests/problem_model.xml 2019-04-17 16:58:53.000000000 +0200 @@ -0,0 +1,38 @@ +<?xml version="1.0"?> +<model unit="millimeter" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02" xml:lang="en-US"> + <!-- this file uses Dutch style commas for the decimal-indicator, instead of international/US points --> + <!-- this should either be read or fail fast, but should definitely not just silently ignore the part after the comma--> + <resources> + <object id="1" type="model"> + <mesh> + <vertices> + <vertex x="-2,5" y="2,5" z="-2,5" /> + <vertex x="2,5" y="2,5" z="2,5" /> + <vertex x="2,5" y="2,5" z="-2,5" /> + <vertex x="-2,5" y="2,5" z="2,5" /> + <vertex x="-2,5" y="-2,5" z="2,5" /> + <vertex x="2,5" y="-2,5" z="-2,5" /> + <vertex x="2,5" y="-2,5" z="2,5" /> + <vertex x="-2,5" y="-2,5" z="-2,5" /> + </vertices> + <triangles> + <triangle v1="0" v2="1" v3="2" /> + <triangle v1="1" v2="0" v3="3" /> + <triangle v1="4" v2="5" v3="6" /> + <triangle v1="5" v2="4" v3="7" /> + <triangle v1="4" v2="1" v3="3" /> + <triangle v1="1" v2="4" v3="6" /> + <triangle v1="1" v2="5" v3="2" /> + <triangle v1="5" v2="1" v3="6" /> + <triangle v1="5" v2="0" v3="2" /> + <triangle v1="0" v2="5" v3="7" /> + <triangle v1="4" v2="0" v3="7" /> + <triangle v1="0" v2="4" v3="3" /> + </triangles> + </mesh> + </object> + </resources> + <build> + <item objectid="1" transform="1,0 0,0 0,0 0,0 0,0 1,0 0,0 -1,0 0,0 62,02284753322601 107,5 20,0" /> + </build> +</model> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libSavitar-3.6.0/tests/test_model.xml new/libSavitar-4.1.0/tests/test_model.xml --- old/libSavitar-3.6.0/tests/test_model.xml 1970-01-01 01:00:00.000000000 +0100 +++ new/libSavitar-4.1.0/tests/test_model.xml 2019-04-17 16:58:53.000000000 +0200 @@ -0,0 +1,118 @@ +<?xml version="1.0"?> +<model unit="millimeter" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02" xml:lang="en-US"> + <resources> + <object id="1" type="model"> + <!-- normal mesh with 3 unique vert-refs per triangle --> + <mesh> + <vertices> + <vertex x="-20" y="20" z="-20" /> + <vertex x="20" y="20" z="20" /> + <vertex x="20" y="20" z="-20" /> + <vertex x="20" y="20" z="20" /> + <vertex x="-20" y="20" z="-20" /> + <vertex x="-20" y="20" z="20" /> + <vertex x="-20" y="-20" z="20" /> + <vertex x="20" y="-20" z="-20" /> + <vertex x="20" y="-20" z="20" /> + <vertex x="20" y="-20" z="-20" /> + <vertex x="-20" y="-20" z="20" /> + <vertex x="-20" y="-20" z="-20" /> + <vertex x="-20" y="-20" z="20" /> + <vertex x="20" y="20" z="20" /> + <vertex x="-20" y="20" z="20" /> + <vertex x="20" y="20" z="20" /> + <vertex x="-20" y="-20" z="20" /> + <vertex x="20" y="-20" z="20" /> + <vertex x="20" y="20" z="20" /> + <vertex x="20" y="-20" z="-20" /> + <vertex x="20" y="20" z="-20" /> + <vertex x="20" y="-20" z="-20" /> + <vertex x="20" y="20" z="20" /> + <vertex x="20" y="-20" z="20" /> + <vertex x="20" y="-20" z="-20" /> + <vertex x="-20" y="20" z="-20" /> + <vertex x="20" y="20" z="-20" /> + <vertex x="-20" y="20" z="-20" /> + <vertex x="20" y="-20" z="-20" /> + <vertex x="-20" y="-20" z="-20" /> + <vertex x="-20" y="-20" z="20" /> + <vertex x="-20" y="20" z="-20" /> + <vertex x="-20" y="-20" z="-20" /> + <vertex x="-20" y="20" z="-20" /> + <vertex x="-20" y="-20" z="20" /> + <vertex x="-20" y="20" z="20" /> + </vertices> + <triangles> + <triangle v1="0" v2="1" v3="2" /> + <triangle v1="3" v2="4" v3="5" /> + <triangle v1="6" v2="7" v3="8" /> + <triangle v1="9" v2="10" v3="11" /> + <triangle v1="12" v2="13" v3="14" /> + <triangle v1="15" v2="16" v3="17" /> + <triangle v1="18" v2="19" v3="20" /> + <triangle v1="21" v2="22" v3="23" /> + <triangle v1="24" v2="25" v3="26" /> + <triangle v1="27" v2="28" v3="29" /> + <triangle v1="30" v2="31" v3="32" /> + <triangle v1="33" v2="34" v3="35" /> + </triangles> + </mesh> + <!-- old style settings --> + <settings> + <setting key="bottom_layers">20</setting> + <setting key="extruder_nr">0</setting> + <setting key="support_enable">True</setting> + </settings> + </object> + <object id="2" type="model"> + <!-- normal mesh with non-unique vertex references --> + <mesh> + <vertices> + <vertex x="-20" y="20" z="-20" /> + <vertex x="20" y="20" z="20" /> + <vertex x="20" y="20" z="-20" /> + <vertex x="-20" y="20" z="20" /> + <vertex x="-20" y="-20" z="20" /> + <vertex x="20" y="-20" z="-20" /> + <vertex x="20" y="-20" z="20" /> + <vertex x="-20" y="-20" z="-20" /> + </vertices> + <triangles> + <triangle v1="0" v2="1" v3="2" /> + <triangle v1="1" v2="0" v3="3" /> + <triangle v1="4" v2="5" v3="6" /> + <triangle v1="5" v2="4" v3="7" /> + <triangle v1="4" v2="1" v3="3" /> + <triangle v1="1" v2="4" v3="6" /> + <triangle v1="1" v2="5" v3="2" /> + <triangle v1="5" v2="1" v3="6" /> + <triangle v1="5" v2="0" v3="2" /> + <triangle v1="0" v2="5" v3="7" /> + <triangle v1="4" v2="0" v3="7" /> + <triangle v1="0" v2="4" v3="3" /> + </triangles> + </mesh> + <!-- no settings --> + </object> + <object id="3" type="model"> + <!-- object created by reference to other object --> + <components> + <component objectid="2"/> + </components> + <!-- new-style 'following .3mf spec more closely' settings --> + <metadatagroup> + <metadata name="cura:extruder_nr" preserve="true" type="xs:string">1</metadata> + <metadata name="cura:infill_pattern" preserve="true" type="xs:string">concentric</metadata> + <metadata name="cura:support_mesh" preserve="true" type="xs:string">True</metadata> + <!-- NOTE: yes, everything is types as a string --> + </metadatagroup> + </object> + </resources> + <build> + <item objectid="1" transform="1.0 0.0 0.0 0.0 0.0 1.0 0.0 -1.0 0.0 62.02284753322601 107.5 20.0" /> + <item objectid="2" transform="1.0 0.0 0.0 0.0 0.0 1.0 0.0 -1.0 0.0 116.50000131130219 107.5 20.0" /> + <item objectid="3" transform="1.0 0.0 0.0 0.0 0.0 1.0 0.0 -1.0 0.0 162.50000131130219 107.5 20.0" /> + <!-- repeat an object: --> + <item objectid="3" transform="1.0 0.0 0.0 0.0 0.0 1.0 0.0 -1.0 0.0 216.50000131130219 107.5 20.0" /> + </build> +</model> ++++++ libSavitar.obsinfo ++++++ --- /var/tmp/diff_new_pack.ttgF9L/_old 2019-07-11 13:13:25.146873036 +0200 +++ /var/tmp/diff_new_pack.ttgF9L/_new 2019-07-11 13:13:25.150873034 +0200 @@ -1,5 +1,5 @@ name: libSavitar -version: 3.6.0 -mtime: 1509931499 -commit: 62dd545c36648e1f1f8f298d450cd3e3b230fb13 +version: 4.1.0 +mtime: 1555513133 +commit: ab1ce1c75eb98329b52ad01864e3aa32014eecb6 ++++++ use-system-libs.patch ++++++ --- /var/tmp/diff_new_pack.ttgF9L/_old 2019-07-11 13:13:25.158873031 +0200 +++ /var/tmp/diff_new_pack.ttgF9L/_new 2019-07-11 13:13:25.158873031 +0200 @@ -1,14 +1,19 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 5e991a7..e0b42f8 100644 +index 5630612..b15654b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -6,9 +6,13 @@ include(CMakePackageConfigHelpers) - +@@ -7,6 +7,7 @@ include(CMakePackageConfigHelpers) option(BUILD_PYTHON "Build " ON) option(BUILD_STATIC "Build as a static library" OFF) + option(BUILD_TESTS "Building the test-suite" OFF) +option(USE_SYSTEM_LIBS "Use the system libraries if available" OFF) -- + if(BUILD_TESTS) + message(STATUS "Building with tests...") +@@ -14,7 +15,11 @@ if(BUILD_TESTS) + find_package(Threads QUIET) + endif() + -add_subdirectory(pugixml) +if(USE_SYSTEM_LIBS) + find_package(pugixml CONFIG REQUIRED) @@ -17,4 +22,4 @@ +endif() if(BUILD_PYTHON) - set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) + list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
