diff --git a/0001-find-openmpi2-include-files.patch b/0001-find-openmpi2-include-files.patch
new file mode 100644
index 0000000..24d6e78
--- /dev/null
+++ b/0001-find-openmpi2-include-files.patch
@@ -0,0 +1,13 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 3ecfe23a6..1db9bf33e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -717,7 +717,7 @@ endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ add_compile_options(${OPENMPI_CFLAGS})
+ link_directories(${OPENMPI_LIBRARY_DIRS})
+ link_libraries(${OPENMPI_LIBRARIES})
+- find_file(MpidotH mpi.h PATHS ${OPENMPI_INCLUDE_DIRS} NO_DEFAULT_PATH)
++ find_file(MpidotH mpi.h PATHS ${OPENMPI_INCLUDE_DIRS} /usr/lib64/mpi/gcc/openmpi2/include NO_DEFAULT_PATH)
+ if(NOT MpidotH)
+ message( WARNING "mpi.h was not found. Check for error above.")
+ endif()
diff --git a/FreeCAD-0.16.6712.obscpio b/FreeCAD-0.16.6712.obscpio
deleted file mode 100644
index b9e04f0..0000000
--- a/FreeCAD-0.16.6712.obscpio
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:66891dd8a208daa48024216e1dca6627b8ec90c6105cce7d33eaffc066b307ef
-size 241548815
diff --git a/FreeCAD-0.17.obscpio b/FreeCAD-0.17.obscpio
new file mode 100644
index 0000000..21a2831
--- /dev/null
+++ b/FreeCAD-0.17.obscpio
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:15bf621edb984b0914fd7e5c1ce2e2469b3f031fbb4d2bd1f86c90f634e0829b
+size 385050127
diff --git a/FreeCAD.changes b/FreeCAD.changes
index d0c0ca1..3abbc23 100644
--- a/FreeCAD.changes
+++ b/FreeCAD.changes
@@ -1,3 +1,38 @@
+-------------------------------------------------------------------
+Tue May 8 06:33:56 UTC 2018 - adrian@suse.de
+
+- temporary disable FEM module
+ * it works fine, but requires hdf5 version 1.8 via med-tools,
+ which currently conflicts in openSUSE distro.
+- Fix draft module crash
+ (got merged upstream for 0.18 fix-draft-module-with-python3.patch)
+
+-------------------------------------------------------------------
+Fri Apr 27 12:55:30 UTC 2018 - adrian@suse.de
+
+- apply current 0.17 branch (branch_update.patch)
+ In first place for occt 7.2 fixes
+
+-------------------------------------------------------------------
+Tue Apr 17 06:46:23 UTC 2018 - adrian@suse.de
+
+- fix crash in Draft module with python 3
+
+-------------------------------------------------------------------
+Mon Apr 16 06:51:06 UTC 2018 - adrian@suse.de
+
+- cleanup python qt deps (pyside2 only now)
+
+-------------------------------------------------------------------
+Tue Apr 10 11:33:35 UTC 2018 - adrian@suse.de
+
+- update to version 0.17
+ 2 years of work: https://www.freecadweb.org/wiki/Release_notes_0.17
+- switching to Qt5
+ (fix-build.diff 0001-find-openmpi2-include-files.patch)
+ (the old 0.16 fork had obsolete temporary patches remove-qtwebkit.patch and
+ remove-webgui.patch)
+
-------------------------------------------------------------------
Thu Jan 4 15:36:57 UTC 2018 - wbauer@tmo.at
diff --git a/FreeCAD.obsinfo b/FreeCAD.obsinfo
index 6f1f41d..7e08a1c 100644
--- a/FreeCAD.obsinfo
+++ b/FreeCAD.obsinfo
@@ -1,5 +1,5 @@
name: FreeCAD
-version: 0.16.6712
-mtime: 1500312467
-commit: da2d364457257a7a8c6fb2137cea12c45becd71a
+version: 0.17
+mtime: 1523004517
+commit: 0258808ccb6ba3bd5ea9312f79cd023f1a8671b7
diff --git a/FreeCAD.sh b/FreeCAD.sh
new file mode 100644
index 0000000..99a0bc5
--- /dev/null
+++ b/FreeCAD.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+# let Python pick up /usr/lib64/FreeCAD/bin/PySide
+cd /usr/lib64/FreeCAD/bin
+# temporary workaround for a bug somewhere around python3 in Factory leading to memory corruption
+LC_ALL=C ./FreeCAD $@
diff --git a/FreeCAD.spec b/FreeCAD.spec
index 1cbc7cb..579d57f 100644
--- a/FreeCAD.spec
+++ b/FreeCAD.spec
@@ -1,7 +1,7 @@
#
# spec file for package FreeCAD
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 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
@@ -19,20 +19,33 @@
%define x_prefix %{_libdir}/%{name}
Name: FreeCAD
-Version: 0.16.6712
+Version: 0.17
Release: 0
Summary: General Purpose 3D CAD Modeler
-License: LGPL-2.0+ and GPL-2.0+
+License: LGPL-2.0-or-later AND GPL-2.0-or-later
Group: Productivity/Graphics/CAD
Url: http://www.freecadweb.org/
-Source0: %{name}-%{version}.tar.xz
-Source2: FreeCAD_shared_mimeinfo
-# PATCH-FIX-OPENSUSE remove-qtwebkit.patch -- fix build without QtWebKit
-Patch0: remove-qtwebkit.patch
-# PATCH-FIX-OPENSUSE remove-webgui.patch -- remove browser view that would need QtWebKit
-Patch1: remove-webgui.patch
+Source0: %{name}-%version.tar.xz
+Source1: FreeCAD.sh
+Source2: FreeCADCmd.sh
+Source3: FreeCAD_shared_mimeinfo
+Patch0: branch_update.patch
+# python3 and generic compile fixes
+Patch1: fix-build.diff
+# support for openmpi2 suse package
+Patch2: 0001-find-openmpi2-include-files.patch
+# runtime fix, submitted upstream
+Patch3: fix-draft-module-with-python3.patch
BuildRequires: Coin-devel
-BuildRequires: SoQt-devel
+#BuildRequires: SoQt-devel
+#BuildRequires: libmed-devel # needed for FEM module, but requires older hdf5 lib
+# we use upstream OpenCASCADE instead of oce atm
+BuildRequires: occt-devel
+BuildRequires: vtk-devel
+BuildRequires: vtk-java
+BuildRequires: vtk-tcl
+#BuildRequires: smesh-devel
+
%if 0%{?suse_version} >= 1330
BuildRequires: libboost_filesystem-devel >= 1.55
BuildRequires: libboost_graph-devel >= 1.55
@@ -45,6 +58,7 @@ BuildRequires: libboost_thread-devel >= 1.55
%else
BuildRequires: boost-devel >= 1.55
%endif
+
BuildRequires: cmake
BuildRequires: dos2unix
BuildRequires: doxygen
@@ -53,46 +67,74 @@ BuildRequires: fdupes
BuildRequires: freeglut-devel
BuildRequires: gcc-fortran
BuildRequires: git
-BuildRequires: hdf5-devel
BuildRequires: libXerces-c-devel
-BuildRequires: libeigen3-devel
-BuildRequires: libqt4-devel
+BuildRequires: pkg-config
+
+# reported to break FreeCAD here
+# https://forum.freecadweb.org/viewtopic.php?t=24610
+Conflicts: python-pivy
+
+%if 0%{?suse_version} >= 1330
+# Qt5 & python3
+BuildRequires: openmpi2-devel
+BuildRequires: python3-devel
+BuildRequires: python3-matplotlib
+BuildRequires: python3-pyside2-devel
+BuildRequires: python3-vtk
+BuildRequires: python3-xml
+BuildRequires: pkgconfig(Qt5Concurrent)
+BuildRequires: pkgconfig(Qt5OpenGL)
+BuildRequires: pkgconfig(Qt5PrintSupport)
+BuildRequires: pkgconfig(Qt5ScriptTools)
+BuildRequires: pkgconfig(Qt5Svg)
+BuildRequires: pkgconfig(Qt5UiTools)
+BuildRequires: pkgconfig(Qt5WebKit)
+BuildRequires: pkgconfig(Qt5WebKitWidgets)
+Requires: python3-pyside2
+# For Arch & Draft workbench
+Requires: python3-pivy
+# core dump if PySide is installed
+Conflicts: python3-pyside
+Conflicts: python-pyside
+%else
BuildRequires: libshiboken-devel
-BuildRequires: libspnav-devel
-BuildRequires: oce-devel
-BuildRequires: opencv-devel
-BuildRequires: pkgconfig
BuildRequires: python-CXX-devel
BuildRequires: python-devel
BuildRequires: python-matplotlib
-BuildRequires: python-pyside
BuildRequires: python-pyside-devel
BuildRequires: python-pyside-tools
+BuildRequires: pkgconfig(QtWebKit)
+%if 0%{?suse_version} > 0
+# Qt4 & python2
+BuildRequires: libqt4-devel
BuildRequires: python-xml
+%endif
+%endif
+%if 0%{?fedora} > 18
+BuildRequires: eigen3-devel
+BuildRequires: qt5-qtbase-devel
+%endif
+
+BuildRequires: libspnav-devel
+BuildRequires: opencv-devel
BuildRequires: swig
+%if 0%{?suse_version}
+BuildRequires: libeigen3-devel
+BuildRequires: update-desktop-files
+%endif
+BuildRequires: dos2unix
+BuildRequires: make
BuildRequires: unzip
BuildRequires: update-desktop-files
BuildRequires: zlib-devel
-%if 0%{?suse_version} < 1500
-BuildRequires: pkgconfig(QtWebKit)
-%endif
-Requires: python-CXX
-Requires: python-pyside
-%if 0%{?suse_version} <= 1320
Requires(post): shared-mime-info
Requires(postun): shared-mime-info
-%endif
-Recommends: python-pivy
+
+Recommends: ccx
%description
-Note: This package contains the current development version and thus might
-be unstable!
+FreeCAD is a parametric 3D modeler made primarily to design real-life objects of any size. Parametric modeling allows you to easily modify your design by going back into your model history and changing its parameters. FreeCAD is open-source and highly customizable, scriptable and extensible.
-FreeCAD is a general purpose 3D CAD modeler. The development will be completely
-Open Source. As with many modern 3D CAD modelers it will have a 2D component in
-order to extract design detail from the 3D model to create 2D production
-drawings, although 2D (e.g. AutoCAD LT) is not the focus, neither are animation
-and organic shapes (e.g. Maya, 3D StudioMAX and Cinema 4D).
%package devel
Summary: Development Files for %{name}
@@ -104,15 +146,18 @@ This package contains the files needed for development with FreeCAD.
%prep
%setup -q
-
-%if 0%{?suse_version} >= 1500
%patch0 -p1
%patch1 -p1
-%endif
+%patch2 -p1
+%patch3 -p1
+
+# fix env-script-interpreter
+sed -i '1c#!%{__python2}' \
+ src/Mod/Test/testmakeWireString.py \
+ src/Mod/Test/unittestgui.py
# Fix "wrong-file-end-of-line-encoding" rpmlint warning
sed -i 's/\r$//' ChangeLog.txt
-sed -i 's/\r$//' copying.lib
# Fix "wrong-script-end-of-line-encoding" rpmlint warning
sed -i 's/\r$//' src/Mod/PartDesign/Scripts/Spring.py
@@ -122,36 +167,41 @@ sed -i 's/\r$//' src/Mod/Robot/MovieTool.py
rm src/3rdparty/Pivy -fr
rm src/3rdparty/Pivy-0.5 -fr
-# fix env-script-interpreter
-sed -i '1c#!%{__python2}' \
- src/Mod/Test/testmakeWireString.py \
- src/Mod/Test/unittestgui.py
-
%build
mkdir build && cd build
# cmake macro would set standard libdir
-# it needs an older specific zipios version -DFREECAD_USE_EXTERNAL_ZIPIOS=TRUE
+# it needs an older specific zipios version -DFREECAD_USE_EXTERNAL_ZIPIOS=TRUE
+
+# -fpermissive should become $RPM_OPT_FLAGS , but bugs ...
+printenv
cmake \
-DCMAKE_INSTALL_PREFIX=%{_libdir}/%{name} \
-DCMAKE_INSTALL_DATADIR=%{_datadir}/%{name} \
-DCMAKE_INSTALL_DOCDIR=%{_docdir}/%{name} \
-DCMAKE_INSTALL_INCLUDEDIR=%{_includedir}/%{name} \
-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \
- -DOCC_INCLUDE_DIR=%{_includedir}/oce \
+ -DOCC_INCLUDE_DIR=%{_includedir}/opencascade \
-DRESOURCEDIR=%{_datadir}/%{name} \
-DCMAKE_BUILD_TYPE=Release \
-%if %{with netgen}
- -DBUILD_FEM_NETGEN=ON \
+ -DCMAKE_CXX_FLAGS="-fpermissive -fno-strict-aliasing" \
+%if 0%{?suse_version} >= 1330
+ -DPYTHON_EXECUTABLE=/usr/bin/python3 \
+ -DSHIBOKEN_INCLUDE_DIR=/usr/include/shiboken2/ \
+ -DPYSIDE_INCLUDE_DIR=/usr/include/PySide2/ \
+ -DBUILD_QT5=ON \
%else
- -DBUILD_FEM_NETGEN=OFF \
+ -DPYCXX_INCLUDE_DIR:PATH=%{_includedir}/python2.7 \
+ -DPYCXX_SOURCE_DIR:PATH=%{_datadir}/python2.7/CXX \
%endif
-%if 0%{?suse_version} >= 1500
- -DBUILD_START=OFF \
- -DBUILD_WEB=OFF \
-%endif
- ../
+ -DFREECAD_USE_EXTERNAL_PIVY:BOOL=TRUE \
+ -DBUILD_MESH_PART:BOOL=ON \
+ -DBUILD_OPENSCAD:BOOL=ON \
+ -DBUILD_FEM:BOOL=OFF \
+ -DBUILD_FEM_NETGEN:BOOL=OFF \
+ -DFREECAD_USE_EXTERNAL_SMESH=OFF \
+ ..
-make VERBOSE=1 %{?_smp_mflags} all
+make VERBOSE=1 %{?_smp_mflags} all || make VERBOSE=1 all
# # Build documentation last, somehow
# # this triggers a rebuild
@@ -182,9 +232,6 @@ popd
# nice make VERBOSE=1 %%{?_smp_mflags} install DESTDIR=%%{buildroot}
# popd
-# Install the Qt plugin
-#install -Dpm 0755 src/Tools/plugins/widget/libFreeCAD_widgets.so %%{buildroot}/usr/%%{_lib}/qt4/plugins/designer/libFreeCAD_widgets.so
-
# Fix "non-executable-script" rpmlint warning
chmod 755 %{buildroot}%{x_prefix}/Mod/Robot/MovieTool.py \
%{buildroot}%{x_prefix}/Mod/Test/testmakeWireString.py \
@@ -195,12 +242,12 @@ mkdir -p %{buildroot}%{_datadir}/pixmaps
mv %{buildroot}%{_datadir}/%{name}/freecad.xpm %{buildroot}%{_datadir}/pixmaps/freecad.xpm
# Install additional documentation files
-install -pm 0644 ChangeLog.txt copying.lib %{buildroot}%{_docdir}/%{name}/
+#install -pm 0644 ChangeLog.txt copying.lib %{buildroot}%{_docdir}/%{name}/
%suse_update_desktop_file -c %{name} "%{name}" "3D CAD Modeler" %{name} "freecad" Education Engineering
# Install mime type
-install -Dpm 0644 %{SOURCE2} %{buildroot}/%{_datadir}/mime/packages/%{name}.xml
+install -Dpm 0644 %{SOURCE3} %{buildroot}/usr/share/mime/packages/%{name}.xml
# Remove unneeded files
find %{buildroot} -type f -name "*.la" -delete -print
@@ -219,9 +266,17 @@ dos2unix %{buildroot}%{x_prefix}/Mod/Test/unittestgui.py
dos2unix %{buildroot}%{x_prefix}/Mod/Part/MakeBottle.py
# Link binaries
-mkdir -p %{buildroot}%{_bindir}
-ln -s -t %{buildroot}%{_bindir} %{x_prefix}/bin/FreeCAD
-ln -s -t %{buildroot}%{_bindir} %{x_prefix}/bin/FreeCADCmd
+mkdir -p %{buildroot}/usr/bin
+%if 0%{?suse_version} >= 91330
+# disabled, hopefully not anymore needed
+cp %{S:1} %{buildroot}/usr/bin/FreeCAD
+chmod +x %{buildroot}/usr/bin/FreeCAD
+cp %{S:2} %{buildroot}/usr/bin/FreeCADCmd
+chmod +x %{buildroot}/usr/bin/FreeCADCmd
+%else
+ln -s -t %{buildroot}/usr/bin %{x_prefix}/bin/FreeCAD
+ln -s -t %{buildroot}/usr/bin %{x_prefix}/bin/FreeCADCmd
+%endif
%fdupes -s %{buildroot}
diff --git a/FreeCADCmd.sh b/FreeCADCmd.sh
new file mode 100644
index 0000000..ce9b4aa
--- /dev/null
+++ b/FreeCADCmd.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+# let Python pick up /usr/lib64/FreeCAD/bin/PySide
+cd /usr/lib64/FreeCAD/bin
+./FreeCADCmd
diff --git a/_service b/_service
index faf275c..c8a1f9b 100644
--- a/_service
+++ b/_service
@@ -2,8 +2,8 @@
https://github.com/FreeCAD/FreeCAD.git
git
- releases/FreeCAD-0-16
- 0.16.6712
+ 0.17
+ 0.17
diff --git a/branch_update.patch b/branch_update.patch
new file mode 100644
index 0000000..49487fb
--- /dev/null
+++ b/branch_update.patch
@@ -0,0 +1,554 @@
+diff --git a/src/App/Expression.cpp b/src/App/Expression.cpp
+index 6f6fb6cba..471c07428 100644
+--- a/src/App/Expression.cpp
++++ b/src/App/Expression.cpp
+@@ -897,16 +897,13 @@ Expression * FunctionExpression::evalAggregate() const
+ throw Exception("Invalid property type for aggregate");
+ } while (range.next());
+ }
+- else if (args[i]->isDerivedFrom(App::VariableExpression::getClassTypeId())) {
++ else {
+ std::unique_ptr e(args[i]->eval());
+ NumberExpression * n(freecad_dynamic_cast(e.get()));
+
+ if (n)
+ c->collect(n->getQuantity());
+ }
+- else if (args[i]->isDerivedFrom(App::NumberExpression::getClassTypeId())) {
+- c->collect(static_cast(args[i])->getQuantity());
+- }
+ }
+
+ return new NumberExpression(owner, c->getQuantity());
+diff --git a/src/App/FeaturePython.cpp b/src/App/FeaturePython.cpp
+index 0a90b43a0..9d04fecad 100644
+--- a/src/App/FeaturePython.cpp
++++ b/src/App/FeaturePython.cpp
+@@ -108,17 +108,21 @@ void FeaturePythonImp::onBeforeChange(const Property* prop)
+ if (feature.hasAttr("__object__")) {
+ Py::Callable method(feature.getAttr(std::string("onBeforeChange")));
+ Py::Tuple args(1);
+- std::string prop_name = object->getPropertyName(prop);
+- args.setItem(0, Py::String(prop_name));
+- method.apply(args);
++ const char* prop_name = object->getPropertyName(prop);
++ if (prop_name) {
++ args.setItem(0, Py::String(prop_name));
++ method.apply(args);
++ }
+ }
+ else {
+ Py::Callable method(feature.getAttr(std::string("onBeforeChange")));
+ Py::Tuple args(2);
+ args.setItem(0, Py::Object(object->getPyObject(), true));
+- std::string prop_name = object->getPropertyName(prop);
+- args.setItem(1, Py::String(prop_name));
+- method.apply(args);
++ const char* prop_name = object->getPropertyName(prop);
++ if (prop_name) {
++ args.setItem(1, Py::String(prop_name));
++ method.apply(args);
++ }
+ }
+ }
+ }
+@@ -141,17 +145,21 @@ void FeaturePythonImp::onChanged(const Property* prop)
+ if (feature.hasAttr("__object__")) {
+ Py::Callable method(feature.getAttr(std::string("onChanged")));
+ Py::Tuple args(1);
+- std::string prop_name = object->getPropertyName(prop);
+- args.setItem(0, Py::String(prop_name));
+- method.apply(args);
++ const char* prop_name = object->getPropertyName(prop);
++ if (prop_name) {
++ args.setItem(0, Py::String(prop_name));
++ method.apply(args);
++ }
+ }
+ else {
+ Py::Callable method(feature.getAttr(std::string("onChanged")));
+ Py::Tuple args(2);
+ args.setItem(0, Py::Object(object->getPyObject(), true));
+- std::string prop_name = object->getPropertyName(prop);
+- args.setItem(1, Py::String(prop_name));
+- method.apply(args);
++ const char* prop_name = object->getPropertyName(prop);
++ if (prop_name) {
++ args.setItem(1, Py::String(prop_name));
++ method.apply(args);
++ }
+ }
+ }
+ }
+diff --git a/src/Gui/ViewProviderPythonFeature.cpp b/src/Gui/ViewProviderPythonFeature.cpp
+index 927557068..2fe1c4fd1 100644
+--- a/src/Gui/ViewProviderPythonFeature.cpp
++++ b/src/Gui/ViewProviderPythonFeature.cpp
+@@ -643,17 +643,21 @@ void ViewProviderPythonFeatureImp::onChanged(const App::Property* prop)
+ if (vp.hasAttr("__object__")) {
+ Py::Callable method(vp.getAttr(std::string("onChanged")));
+ Py::Tuple args(1);
+- std::string prop_name = object->getPropertyName(prop);
+- args.setItem(0, Py::String(prop_name));
+- method.apply(args);
++ const char* prop_name = object->getPropertyName(prop);
++ if (prop_name) {
++ args.setItem(0, Py::String(prop_name));
++ method.apply(args);
++ }
+ }
+ else {
+ Py::Callable method(vp.getAttr(std::string("onChanged")));
+ Py::Tuple args(2);
+ args.setItem(0, Py::Object(object->getPyObject(), true));
+- std::string prop_name = object->getPropertyName(prop);
+- args.setItem(1, Py::String(prop_name));
+- method.apply(args);
++ const char* prop_name = object->getPropertyName(prop);
++ if (prop_name) {
++ args.setItem(1, Py::String(prop_name));
++ method.apply(args);
++ }
+ }
+ }
+ }
+diff --git a/src/Mod/Arch/ArchStructure.py b/src/Mod/Arch/ArchStructure.py
+index 1a442dff2..a0ec64d56 100644
+--- a/src/Mod/Arch/ArchStructure.py
++++ b/src/Mod/Arch/ArchStructure.py
+@@ -152,7 +152,7 @@ class _CommandStructure:
+ st = Draft.getObjectsOfType(sel,"Structure")
+ ax = Draft.getObjectsOfType(sel,"Axis")
+ if ax:
+- FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Structural System")))
++ FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Structural System"))
+ FreeCADGui.addModule("Arch")
+ if st:
+ FreeCADGui.doCommand("obj = Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + "," + ArchCommands.getStringList(ax) + ")")
+@@ -164,7 +164,7 @@ class _CommandStructure:
+ FreeCAD.ActiveDocument.recompute()
+ return
+ elif not(ax) and not(st):
+- FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Structure")))
++ FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Structure"))
+ FreeCADGui.addModule("Arch")
+ for obj in sel:
+ FreeCADGui.doCommand("obj = Arch.makeStructure(FreeCAD.ActiveDocument." + obj.Name + ")")
+@@ -194,7 +194,7 @@ class _CommandStructure:
+ self.tracker.finalize()
+ if point == None:
+ return
+- FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Structure")))
++ FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Structure"))
+ FreeCADGui.addModule("Arch")
+ if self.Profile is not None:
+ if "Precast" in self.Profile:
+diff --git a/src/Mod/Import/Gui/AppImportGuiPy.cpp b/src/Mod/Import/Gui/AppImportGuiPy.cpp
+index b83092d9e..6c20eb94c 100644
+--- a/src/Mod/Import/Gui/AppImportGuiPy.cpp
++++ b/src/Mod/Import/Gui/AppImportGuiPy.cpp
+@@ -541,7 +541,12 @@ private:
+ // the App Code.
+ std::vector< std::vector > Colors;
+ get_parts_colors(hierarchical_part,FreeLabels,part_id,Colors);
+- ocaf.reallocateFreeShape(hierarchical_part,FreeLabels,part_id,Colors);
++ ocaf.reallocateFreeShape(hierarchical_part,FreeLabels,part_id,Colors);
++
++#if OCC_VERSION_HEX >= 0x070200
++ // Update is not performed automatically anymore: https://tracker.dev.opencascade.org/view.php?id=28055
++ XCAFDoc_DocumentTool::ShapeTool(hDoc->Main())->UpdateAssemblies();
++#endif
+
+ Base::FileInfo file(Utf8Name.c_str());
+ if (file.hasExtension("stp") || file.hasExtension("step")) {
+diff --git a/src/Mod/Mesh/App/MeshPy.xml b/src/Mod/Mesh/App/MeshPy.xml
+index c71944df6..76bc4618a 100644
+--- a/src/Mod/Mesh/App/MeshPy.xml
++++ b/src/Mod/Mesh/App/MeshPy.xml
+@@ -520,7 +520,7 @@ for p in mesh.Facets:
+
+ private:
+ friend class PropertyMeshKernel;
+- class PropertyMeshKernel* parentProperty;
++ class PropertyMeshKernel* parentProperty = nullptr;
+
+
+
+diff --git a/src/Mod/PartDesign/App/DatumPoint.cpp b/src/Mod/PartDesign/App/DatumPoint.cpp
+index 297d56276..5a65f09a6 100644
+--- a/src/Mod/PartDesign/App/DatumPoint.cpp
++++ b/src/Mod/PartDesign/App/DatumPoint.cpp
+@@ -99,12 +99,12 @@ void Point::onChanged(const App::Property* prop)
+ Superclass::onChanged(prop);
+ }
+
+-void Point::Restore(Base::XMLReader& r)
++void Point::onDocumentRestored()
+ {
+- Superclass::Restore(r);
+ //fix for #0002758 Datum point moves to (0,0,0) when reopening the file.
+ //recreate shape, as the restored one has old Placement burned into it.
+ this->makeShape();
++ Superclass::onDocumentRestored();
+ }
+
+ void Point::makeShape()
+@@ -114,7 +114,9 @@ void Point::makeShape()
+ BRepBuilderAPI_MakeVertex builder(gp_Pnt(0,0,0));
+ if (!builder.IsDone())
+ return;
+- Shape.setValue(builder.Shape());
++ Part::TopoShape tshape(builder.Shape());
++ tshape.setPlacement(this->Placement.getValue());
++ Shape.setValue(tshape);
+ }
+
+ Base::Vector3d Point::getPoint()
+diff --git a/src/Mod/PartDesign/App/DatumPoint.h b/src/Mod/PartDesign/App/DatumPoint.h
+index 19dfdbeb4..e00cf6434 100644
+--- a/src/Mod/PartDesign/App/DatumPoint.h
++++ b/src/Mod/PartDesign/App/DatumPoint.h
+@@ -50,9 +50,11 @@ public:
+
+ protected:
+ virtual void onChanged(const App::Property* prop);
+- virtual void Restore(Base::XMLReader& r);
++ virtual void onDocumentRestored() override;
++
+ private:
+ void makeShape();
++
+ };
+
+ } //namespace PartDesign
+diff --git a/src/Mod/Path/PathScripts/post/grbl_post.py b/src/Mod/Path/PathScripts/post/grbl_post.py
+index 536c2cf54..9ad099243 100644
+--- a/src/Mod/Path/PathScripts/post/grbl_post.py
++++ b/src/Mod/Path/PathScripts/post/grbl_post.py
+@@ -261,7 +261,7 @@ def parse(pathobj):
+ if param in c.Parameters:
+ if param == 'F':
+ if command not in RAPID_MOVES:
+- outstring.append(param + format(c.Parameters['F'], '.2f'))
++ outstring.append(param + format(c.Parameters['F'] * 60, '.2f'))
+ elif param == 'T':
+ outstring.append(param + str(c.Parameters['T']))
+ else:
+diff --git a/src/Mod/Path/libarea/CMakeLists.txt b/src/Mod/Path/libarea/CMakeLists.txt
+index ef95c29d3..087c911dd 100644
+--- a/src/Mod/Path/libarea/CMakeLists.txt
++++ b/src/Mod/Path/libarea/CMakeLists.txt
+@@ -16,13 +16,17 @@ OPTION(USE_BOOST_PYTHON "use BOOST_PYTHON, otherwise use PYBIND11" ON)
+
+ if(USE_BOOST_PYTHON)
+ if(NOT FREECAD_LIBPACK_USE OR FREECAD_LIBPACK_CHECKFILE_CLBUNDLER)
+- if(NOT PYTHON_VERSION_MAJOR LESS 3)
+- find_package( Boost COMPONENTS python3)
+- if (NOT Boost_PYTHON3_FOUND)
++ # boost-python >= 1.67 on some platforms has suffix
++ set(BOOST_PY_SUFFIX ${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR})
++
++ find_package( Boost COMPONENTS python${BOOST_PY_SUFFIX} )
++ if (NOT Boost_PYTHON${BOOST_PY_SUFFIX}_FOUND)
++ # try just the major version
++ find_package( Boost COMPONENTS python${PYTHON_VERSION_MAJOR} )
++ if (NOT Boost_PYTHON${PYTHON_VERSION_MAJOR}_FOUND)
++ # unversioned
+ find_package( Boost COMPONENTS python REQUIRED)
+ endif()
+- else()
+- find_package( Boost COMPONENTS python REQUIRED) # find BOOST and boost-python
+ endif()
+
+ if(Boost_FOUND)
+diff --git a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp
+index 83c6c6007..3d9709603 100644
+--- a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp
++++ b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp
+@@ -4867,7 +4867,7 @@ CmdSketcherCreatePeriodicBSpline::CmdSketcherCreatePeriodicBSpline()
+ void CmdSketcherCreatePeriodicBSpline::activated(int iMsg)
+ {
+ Q_UNUSED(iMsg);
+- ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerEllipse(1) );
++ ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerBSpline(1) );
+ }
+
+ bool CmdSketcherCreatePeriodicBSpline::isActive(void)
+diff --git a/src/Mod/Spreadsheet/TestSpreadsheet.py b/src/Mod/Spreadsheet/TestSpreadsheet.py
+index 56a0acf92..19ed6be8d 100644
+--- a/src/Mod/Spreadsheet/TestSpreadsheet.py
++++ b/src/Mod/Spreadsheet/TestSpreadsheet.py
+@@ -851,6 +851,16 @@ class SpreadsheetCases(unittest.TestCase):
+ self.assertEqual(sheet.getContents('B1'), '=A1 == 1 ? 11 : (A1 == 2 ? 12 : 13)')
+ self.assertEqual(sheet.getContents('C1'), '=A1 == 1 ? (A1 == 2 ? 12 : 13) : 11')
+
++ def testIssue3432(self):
++ """ Regression test for issue 3432; numbers with units are ignored from aggregates"""
++ sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet')
++ sheet.set('A1', '1mm')
++ sheet.set('B1', '2mm')
++ sheet.set('C1', '=max(A1:B1;3mm)')
++ self.doc.recompute()
++ self.assertEqual(sheet.get('C1'), Units.Quantity('3 mm'))
++
++
+ def tearDown(self):
+ #closing doc
+ FreeCAD.closeDocument(self.doc.Name)
+diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp
+index 02f0103d2..de4f5ff8e 100644
+--- a/src/Mod/TechDraw/Gui/Command.cpp
++++ b/src/Mod/TechDraw/Gui/Command.cpp
+@@ -78,6 +78,16 @@
+ using namespace TechDrawGui;
+ using namespace std;
+
++bool isArchSection(App::DocumentObject* obj)
++{
++ bool result = true;
++ App::Property* prop1 = obj->getPropertyByName("Objects");
++ App::Property* prop2 = obj->getPropertyByName("OnlySolids");
++ if ( (!prop1) || (!prop2) ) {
++ result = false;
++ }
++ return result;
++}
+
+ //===========================================================================
+ // TechDraw_NewPageDef (default template)
+@@ -92,7 +102,7 @@ CmdTechDrawNewPageDef::CmdTechDrawNewPageDef()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert new default drawing page");
+ sToolTipText = QT_TR_NOOP("Insert new default drawing page");
+- sWhatsThis = "TechDraw_NewPageDef";
++ sWhatsThis = "TechDraw_New_Default";
+ sStatusTip = sToolTipText;
+ sPixmap = "actions/techdraw-new-default";
+ }
+@@ -162,7 +172,7 @@ CmdTechDrawNewPage::CmdTechDrawNewPage()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert new drawing page from template");
+ sToolTipText = QT_TR_NOOP("Insert new drawing page from template");
+- sWhatsThis = "TechDraw_NewPage";
++ sWhatsThis = "TechDraw_New_Pick";
+ sStatusTip = sToolTipText;
+ sPixmap = "actions/techdraw-new-pick";
+ }
+@@ -302,7 +312,7 @@ CmdTechDrawNewViewSection::CmdTechDrawNewViewSection()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert section view in drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new Section View of a Part in the active drawing");
+- sWhatsThis = "TechDraw_NewViewSecton";
++ sWhatsThis = "TechDraw_NewSection";
+ sStatusTip = sToolTipText;
+ sPixmap = "actions/techdraw-viewsection";
+ }
+@@ -371,7 +381,7 @@ CmdTechDrawNewViewDetail::CmdTechDrawNewViewDetail()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert detail view in drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new Detail View of a Part in the active drawing");
+- sWhatsThis = "TechDraw_NewViewDetail";
++ sWhatsThis = "TechDraw_NewProjGroup";
+ sStatusTip = sToolTipText;
+ sPixmap = "actions/techdraw-viewdetail";
+ }
+@@ -562,7 +572,7 @@ CmdTechDrawAnnotation::CmdTechDrawAnnotation()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("&Annotation");
+ sToolTipText = QT_TR_NOOP("Inserts an Annotation in the active drawing");
+- sWhatsThis = "TechDraw_Annotation";
++ sWhatsThis = "TechDraw_NewAnnotation";
+ sStatusTip = QT_TR_NOOP("Inserts an Annotation in the active drawing");
+ sPixmap = "actions/techdraw-annotation";
+ }
+@@ -855,7 +865,7 @@ CmdTechDrawDraftView::CmdTechDrawDraftView()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert a DraftView");
+ sToolTipText = QT_TR_NOOP("Inserts a Draft WB object into the active drawing");
+- sWhatsThis = "TechDraw_DraftView";
++ sWhatsThis = "TechDraw_NewDraft";
+ sStatusTip = QT_TR_NOOP("Inserts a Draft WB object into the active drawing");
+ sPixmap = "actions/techdraw-draft-view";
+ }
+@@ -869,6 +879,7 @@ void CmdTechDrawDraftView::activated(int iMsg)
+ }
+
+ //TODO: shouldn't this be checking for a Draft object only?
++// there is no obvious way of check for a Draft object. Could be App::FeaturePython, Part::Part2DObject, ???
+ std::vector objects = getSelection().getObjectsOfType(App::DocumentObject::getClassTypeId());
+ if (objects.empty()) {
+ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
+@@ -894,7 +905,6 @@ bool CmdTechDrawDraftView::isActive(void)
+ return DrawGuiUtil::needPage(this);
+ }
+
+-//TODO: shouldn't this be checking for an Arch object only?
+ //===========================================================================
+ // TechDraw_ArchView
+ //===========================================================================
+@@ -908,7 +918,7 @@ CmdTechDrawArchView::CmdTechDrawArchView()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert an ArchView");
+ sToolTipText = QT_TR_NOOP("Inserts a view of an Arch Section Plane into the active drawing");
+- sWhatsThis = "TechDraw_ArchView";
++ sWhatsThis = "TechDraw_NewArch";
+ sStatusTip = QT_TR_NOOP("Inserts a view of an Arch Section Plane into the active drawing");
+ sPixmap = "actions/techdraw-arch-view";
+ }
+@@ -922,23 +932,33 @@ void CmdTechDrawArchView::activated(int iMsg)
+ }
+
+ std::vector objects = getSelection().getObjectsOfType(App::DocumentObject::getClassTypeId());
+- if (objects.size() != 1) {
++ if (objects.empty()) {
+ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
+- QObject::tr("Select exactly one Arch Section Plane object."));
++ QObject::tr("Select at least one object."));
+ return;
+ }
+- App::Property* prop1 = objects[0]->getPropertyByName("Objects");
+- App::Property* prop2 = objects[0]->getPropertyByName("OnlySolids");
+- if ( (!prop1) || (!prop2) ) {
++ int ifound = 0;
++ bool found = false;
++ for (auto& obj: objects) {
++ if (isArchSection(obj)) {
++ found = true;
++ break;
++ }
++ ifound++;
++ }
++ App::DocumentObject* archObj;
++ if (found) {
++ archObj = objects[ifound];
++ } else {
+ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
+- QObject::tr("The selected object is not an Arch Section Plane."));
++ QObject::tr("There is no Arch Section Plane in selection."));
+ return;
+ }
+
+ std::string PageName = page->getNameInDocument();
+
+ std::string FeatName = getUniqueObjectName("ArchView");
+- std::string SourceName = objects[0]->getNameInDocument();
++ std::string SourceName = archObj->getNameInDocument();
+ openCommand("Create ArchView");
+ doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewArch','%s')",FeatName.c_str());
+ doCommand(Doc,"App.activeDocument().%s.Source = App.activeDocument().%s",FeatName.c_str(),SourceName.c_str());
+@@ -1024,7 +1044,7 @@ CmdTechDrawExportPage::CmdTechDrawExportPage()
+ sGroup = QT_TR_NOOP("File");
+ sMenuText = QT_TR_NOOP("&Export page...");
+ sToolTipText = QT_TR_NOOP("Export a page to an SVG file");
+- sWhatsThis = "TechDraw_ExportPage";
++ sWhatsThis = "TechDraw_SaveSVG";
+ sStatusTip = QT_TR_NOOP("Export a page to an SVG file");
+ sPixmap = "actions/techdraw-saveSVG";
+ }
+diff --git a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp
+index f5324cc3b..5fa0b0bf9 100644
+--- a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp
++++ b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp
+@@ -236,7 +236,7 @@ CmdTechDrawNewRadiusDimension::CmdTechDrawNewRadiusDimension()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert a new radius dimension into the drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new radius dimension feature for the selected view");
+- sWhatsThis = "TechDraw_NewRadiusDimension";
++ sWhatsThis = "TechDraw_Dimension_Radius";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Dimension_Radius";
+ }
+@@ -323,7 +323,7 @@ CmdTechDrawNewDiameterDimension::CmdTechDrawNewDiameterDimension()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert a new diameter dimension into the drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new diameter dimension feature for the selected view");
+- sWhatsThis = "TechDraw_NewDiameterDimension";
++ sWhatsThis = "TechDraw_Dimension_Diameter";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Dimension_Diameter";
+ }
+@@ -410,7 +410,7 @@ CmdTechDrawNewLengthDimension::CmdTechDrawNewLengthDimension()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert a new length dimension into the drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new length dimension");
+- sWhatsThis = "TechDraw_NewLengthDimension";
++ sWhatsThis = "TechDraw_Dimension_Length";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Dimension_Length";
+ }
+@@ -518,7 +518,7 @@ CmdTechDrawNewDistanceXDimension::CmdTechDrawNewDistanceXDimension()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert a new horizontal dimension into the drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new horizontal-distance dimension");
+- sWhatsThis = "TechDraw_NewDistanceXDimension";
++ sWhatsThis = "TechDraw_Dimension_Horizontal";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Dimension_Horizontal";
+ }
+@@ -626,7 +626,7 @@ CmdTechDrawNewDistanceYDimension::CmdTechDrawNewDistanceYDimension()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert a new vertical dimension into the drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new vertical distance dimension");
+- sWhatsThis = "TechDraw_NewDistanceYDimension";
++ sWhatsThis = "TechDraw_Dimension_Vertical";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Dimension_Vertical";
+ }
+@@ -733,7 +733,7 @@ CmdTechDrawNewAngleDimension::CmdTechDrawNewAngleDimension()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Insert a new angle dimension into the drawing");
+ sToolTipText = QT_TR_NOOP("Insert a new angle dimension");
+- sWhatsThis = "TechDraw_NewAngleDimension";
++ sWhatsThis = "TechDraw_Dimension_Angle";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Dimension_Angle";
+ }
+@@ -822,7 +822,7 @@ CmdTechDrawLinkDimension::CmdTechDrawLinkDimension()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Link a dimension to 3D geometry");
+ sToolTipText = QT_TR_NOOP("Link a dimension to 3D geometry");
+- sWhatsThis = "TechDraw_LinkDimension";
++ sWhatsThis = "TechDraw_Dimension_Link";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Dimension_Link";
+ }
+diff --git a/src/Mod/TechDraw/Gui/CommandDecorate.cpp b/src/Mod/TechDraw/Gui/CommandDecorate.cpp
+index 9edf97d00..b6cb5dab0 100644
+--- a/src/Mod/TechDraw/Gui/CommandDecorate.cpp
++++ b/src/Mod/TechDraw/Gui/CommandDecorate.cpp
+@@ -80,7 +80,7 @@ CmdTechDrawNewHatch::CmdTechDrawNewHatch()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Hatch a Face using image file");
+ sToolTipText = QT_TR_NOOP("Hatch a Face using image file");
+- sWhatsThis = "TechDraw_NewHatch";
++ sWhatsThis = "TechDraw_Hatch";
+ sStatusTip = sToolTipText;
+ sPixmap = "actions/techdraw-hatch";
+ }
+@@ -142,7 +142,7 @@ CmdTechDrawNewGeomHatch::CmdTechDrawNewGeomHatch()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Apply geometric hatch to a Face");
+ sToolTipText = QT_TR_NOOP("Apply geometric hatch to a Face");
+- sWhatsThis = "TechDraw_NewGeomHatch";
++ sWhatsThis = "TechDraw_GeomHatch";
+ sStatusTip = sToolTipText;
+ sPixmap = "actions/techdraw-geomhatch";
+ }
+@@ -264,7 +264,7 @@ CmdTechDrawToggleFrame::CmdTechDrawToggleFrame()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Turn View Frames on or off");
+ sToolTipText = QT_TR_NOOP("Turn View Frames on or off");
+- sWhatsThis = "TechDraw_ToggleFrame";
++ sWhatsThis = "TechDraw_Toggle";
+ sStatusTip = sToolTipText;
+ sPixmap = "actions/techdraw-toggleframe";
+ }
+@@ -311,7 +311,7 @@ CmdTechDrawRedrawPage::CmdTechDrawRedrawPage()
+ sGroup = QT_TR_NOOP("TechDraw");
+ sMenuText = QT_TR_NOOP("Redraw a page");
+ sToolTipText = QT_TR_NOOP("Redraw a page");
+- sWhatsThis = "TechDraw_RedrawPage";
++ sWhatsThis = "TechDraw_Redraw";
+ sStatusTip = sToolTipText;
+ sPixmap = "TechDraw_Tree_Page_Sync";
+ }
diff --git a/fix-build.diff b/fix-build.diff
new file mode 100644
index 0000000..21c8593
--- /dev/null
+++ b/fix-build.diff
@@ -0,0 +1,36 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 3ecfe23a6..246bb15a8 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -445,7 +445,6 @@ if(NOT FREECAD_LIBPACK_USE OR FREECAD_LIBPACK_CHECKFILE_CLBUNDLER)
+
+ # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=677598
+ # Acceptable versions of Python
+-set(Python_ADDITIONAL_VERSIONS "2.7")
+
+ # For building on OS X
+ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+diff --git a/src/3rdParty/salomesmesh/CMakeLists.txt b/src/3rdParty/salomesmesh/CMakeLists.txt
+index 303ae6e0a..9c10046e6 100644
+--- a/src/3rdParty/salomesmesh/CMakeLists.txt
++++ b/src/3rdParty/salomesmesh/CMakeLists.txt
+@@ -379,6 +379,7 @@ if (BUILD_FEM_NETGEN)
+ FILE(GLOB NETGENPlugin_source_files src/NETGENPlugin/*.cpp inc/NETGENPlugin_*.h* )
+ ADD_LIBRARY(NETGENPlugin SHARED ${NETGENPlugin_source_files})
+ TARGET_LINK_LIBRARIES(NETGENPlugin SMDS SMESHDS SMESH StdMeshers ${SMESH_LIBS} )
++set_property(TARGET NETGENPlugin PROPERTY CXX_STANDARD 14)
+
+ SET_BIN_DIR(NETGENPlugin NETGENPlugin)
+ if(WIN32)
+diff --git a/src/3rdParty/salomesmesh/src/SMESH/SMESH_MeshAlgos.cpp b/src/3rdParty/salomesmesh/src/SMESH/SMESH_MeshAlgos.cpp
+index 3b66ec663..3d4bc8afd 100644
+--- a/src/3rdParty/salomesmesh/src/SMESH/SMESH_MeshAlgos.cpp
++++ b/src/3rdParty/salomesmesh/src/SMESH/SMESH_MeshAlgos.cpp
+@@ -38,6 +38,7 @@
+ #include
+ #include
+ #include
++#include
+ #include
+ #include
+ #include
diff --git a/fix-draft-module-with-python3.patch b/fix-draft-module-with-python3.patch
new file mode 100644
index 0000000..fb89470
--- /dev/null
+++ b/fix-draft-module-with-python3.patch
@@ -0,0 +1,48 @@
+commit 338630b951abab1e44b01c80fbe2d07aba415daf
+Author: Adrian Schröter
+Date: Tue Apr 17 08:39:39 2018 +0200
+
+ fix runtime error creating a wire from string with python3
+
+ Tested against version 0.17
+
+diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py
+index 4c27018c4..da8db2895 100644
+--- a/src/Mod/Draft/Draft.py
++++ b/src/Mod/Draft/Draft.py
+@@ -6133,8 +6133,10 @@ class _ShapeString(_DraftObject):
+ ff8 = obj.FontFile.encode('utf8') # 1947 accents in filepath
+ # TODO: change for Py3?? bytes?
+ # Part.makeWireString uses FontFile as char* string
+-# CharList = Part.makeWireString(obj.String,obj.FontFile,obj.Size,obj.Tracking)
+- CharList = Part.makeWireString(obj.String,ff8,obj.Size,obj.Tracking)
++ if sys.version_info.major < 3:
++ CharList = Part.makeWireString(obj.String,ff8,obj.Size,obj.Tracking)
++ else:
++ CharList = Part.makeWireString(obj.String,obj.FontFile,obj.Size,obj.Tracking)
+ if len(CharList) == 0:
+ msg(translate("draft","ShapeString: string has no wires\n"), 'warning')
+ return
+@@ -6142,8 +6144,7 @@ class _ShapeString(_DraftObject):
+
+ # test a simple letter to know if we have a sticky font or not
+ sticky = False
+-# testWire = Part.makeWireString("L",obj.FontFile,obj.Size,obj.Tracking)[0][0]
+- testWire = Part.makeWireString("L",ff8,obj.Size,obj.Tracking)[0][0]
++ testWire = Part.makeWireString("L",obj.FontFile,obj.Size,obj.Tracking)[0][0]
+ if testWire.isClosed:
+ try:
+ testFace = Part.Face(testWire)
+diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py
+index a007d03e6..1de205bbf 100644
+--- a/src/Mod/Draft/DraftTools.py
++++ b/src/Mod/Draft/DraftTools.py
+@@ -2204,7 +2204,7 @@ class ShapeString(Creator):
+ #print("debug: D_T ShapeString.createObject type(self.SString): " str(type(self.SString)))
+
+ dquote = '"'
+- if type(self.SString) == unicode: # Python3: no more unicode
++ if sys.version_info.major < 3: # Python3: no more unicode
+ String = 'u' + dquote + self.SString.encode('unicode_escape') + dquote
+ else:
+ String = dquote + self.SString + dquote
diff --git a/remove-qtwebkit.patch b/remove-qtwebkit.patch
deleted file mode 100644
index 72fb99c..0000000
--- a/remove-qtwebkit.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-diff -Naur FreeCAD-0.16.orig/src/Gui/DownloadManager.cpp FreeCAD-0.16/src/Gui/DownloadManager.cpp
---- FreeCAD-0.16.orig/src/Gui/DownloadManager.cpp 2016-04-07 03:39:34.000000000 +0200
-+++ FreeCAD-0.16/src/Gui/DownloadManager.cpp 2017-02-07 17:05:51.753657498 +0100
-@@ -33,7 +33,6 @@
- #include
- #include
- #include
--#include
-
- #include "DownloadItem.h"
- #include "DownloadManager.h"
-@@ -224,11 +223,6 @@
- ui->downloadsView->setRowHeight(row, item->minimumSizeHint().height());
-
- bool remove = false;
-- QWebSettings *globalSettings = QWebSettings::globalSettings();
-- if (!item->downloading()
-- && globalSettings->testAttribute(QWebSettings::PrivateBrowsingEnabled))
-- remove = true;
--
- if (item->downloadedSuccessfully()
- && removePolicy() == DownloadManager::SuccessFullDownload) {
- remove = true;
diff --git a/remove-webgui.patch b/remove-webgui.patch
deleted file mode 100644
index e21bae0..0000000
--- a/remove-webgui.patch
+++ /dev/null
@@ -1,124 +0,0 @@
-diff -Naur FreeCAD-0.16.orig/src/Mod/Arch/ArchServer.py FreeCAD-0.16/src/Mod/Arch/ArchServer.py
---- FreeCAD-0.16.orig/src/Mod/Arch/ArchServer.py 2016-04-07 03:39:34.000000000 +0200
-+++ FreeCAD-0.16/src/Mod/Arch/ArchServer.py 2017-02-07 18:55:34.918643280 +0100
-@@ -36,20 +36,6 @@
- __url__ = "http://www.freecadweb.org"
-
-
--class _CommandBimserver:
-- "the Arch Bimserver command definition"
-- def GetResources(self):
-- return {'Pixmap' : 'Arch_Bimserver',
-- 'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Bimserver","BIM server"),
-- 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Bimserver","Opens a browser window and connects to a BIM server instance")}
--
-- def Activated(self):
-- p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
-- url = p.GetString("BimServerUrl","http://localhost:8082")
-- FreeCADGui.addModule("WebGui")
-- FreeCADGui.doCommand("WebGui.openBrowser(\""+url+"\")")
--
--
- class _CommandGit:
- "the Arch Git Commit command definition"
- def GetResources(self):
-@@ -161,5 +147,4 @@
-
-
- if FreeCAD.GuiUp:
-- FreeCADGui.addCommand('Arch_Bimserver',_CommandBimserver())
- FreeCADGui.addCommand('Arch_Git',_CommandGit())
-diff -Naur FreeCAD-0.16.orig/src/Mod/Arch/InitGui.py FreeCAD-0.16/src/Mod/Arch/InitGui.py
---- FreeCAD-0.16.orig/src/Mod/Arch/InitGui.py 2016-04-07 03:39:34.000000000 +0200
-+++ FreeCAD-0.16/src/Mod/Arch/InitGui.py 2017-02-07 18:54:19.949158114 +0100
-@@ -44,7 +44,7 @@
- "Arch_SelectNonSolidMeshes","Arch_RemoveShape",
- "Arch_CloseHoles","Arch_MergeWalls","Arch_Check",
- "Arch_IfcExplorer","Arch_ToggleIfcBrepFlag","Arch_3Views",
-- "Arch_Bimserver","Arch_Git","Arch_IfcSpreadsheet"]
-+ "Arch_Git","Arch_IfcSpreadsheet"]
-
- # draft tools
- self.drafttools = ["Draft_Line","Draft_Wire","Draft_Circle","Draft_Arc","Draft_Ellipse",
-diff -Naur FreeCAD-0.16.orig/src/Mod/Drawing/Gui/Command.cpp FreeCAD-0.16/src/Mod/Drawing/Gui/Command.cpp
---- FreeCAD-0.16.orig/src/Mod/Drawing/Gui/Command.cpp 2016-04-07 03:39:34.000000000 +0200
-+++ FreeCAD-0.16/src/Mod/Drawing/Gui/Command.cpp 2017-02-07 18:52:19.077843909 +0100
-@@ -427,43 +427,6 @@
-
-
- //===========================================================================
--// Drawing_OpenBrowserView
--//===========================================================================
--
--DEF_STD_CMD_A(CmdDrawingOpenBrowserView);
--
--CmdDrawingOpenBrowserView::CmdDrawingOpenBrowserView()
-- : Command("Drawing_OpenBrowserView")
--{
-- // seting the
-- sGroup = QT_TR_NOOP("Drawing");
-- sMenuText = QT_TR_NOOP("Open &browser view");
-- sToolTipText = QT_TR_NOOP("Opens the selected page in a browser view");
-- sWhatsThis = "Drawing_OpenBrowserView";
-- sStatusTip = QT_TR_NOOP("Opens the selected page in a browser view");
-- sPixmap = "actions/drawing-openbrowser";
--}
--
--void CmdDrawingOpenBrowserView::activated(int iMsg)
--{
-- unsigned int n = getSelection().countObjectsOfType(Drawing::FeaturePage::getClassTypeId());
-- if (n != 1) {
-- QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
-- QObject::tr("Select one Page object."));
-- return;
-- }
-- std::vector Sel = getSelection().getSelection();
-- doCommand(Doc,"PageName = App.activeDocument().%s.PageResult",Sel[0].FeatName);
-- doCommand(Doc,"import WebGui");
-- doCommand(Doc,"WebGui.openBrowser(PageName)");
--}
--
--bool CmdDrawingOpenBrowserView::isActive(void)
--{
-- return (getActiveGuiDocument() ? true : false);
--}
--
--//===========================================================================
- // Drawing_Annotation
- //===========================================================================
-
-@@ -786,7 +749,6 @@
- rcCmdMgr.addCommand(new CmdDrawingNewA3Landscape());
- rcCmdMgr.addCommand(new CmdDrawingNewView());
- rcCmdMgr.addCommand(new CmdDrawingOrthoViews());
-- rcCmdMgr.addCommand(new CmdDrawingOpenBrowserView());
- rcCmdMgr.addCommand(new CmdDrawingAnnotation());
- rcCmdMgr.addCommand(new CmdDrawingClip());
- rcCmdMgr.addCommand(new CmdDrawingSymbol());
-diff -Naur FreeCAD-0.16.orig/src/Mod/Drawing/Gui/Workbench.cpp FreeCAD-0.16/src/Mod/Drawing/Gui/Workbench.cpp
---- FreeCAD-0.16.orig/src/Mod/Drawing/Gui/Workbench.cpp 2016-04-07 03:39:34.000000000 +0200
-+++ FreeCAD-0.16/src/Mod/Drawing/Gui/Workbench.cpp 2017-02-07 19:10:18.512913826 +0100
-@@ -61,7 +61,6 @@
- *part << "Drawing_NewPage";
- *part << "Drawing_NewView";
- *part << "Drawing_OrthoViews";
-- *part << "Drawing_OpenBrowserView";
- *part << "Drawing_Annotation";
- *part << "Drawing_Clip";
- *part << "Drawing_Symbol";
-@@ -84,7 +83,6 @@
- *part << "Drawing_NewPage";
- *part << "Drawing_NewView";
- *part << "Drawing_OrthoViews";
-- *part << "Drawing_OpenBrowserView";
- *part << "Drawing_Annotation";
- *part << "Drawing_Clip";
- *part << "Drawing_Symbol";
-@@ -106,7 +104,6 @@
- //*img << "Drawing_NewA3Landscape";
- *img << "Drawing_NewPage";
- *img << "Drawing_OrthoViews";
-- *img << "Drawing_OpenBrowserView";
- *img << "Drawing_Annotation";
- *img << "Drawing_Clip";
- *img << "Drawing_DraftView";