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)


Reply via email to