[ovito] 01/04: Use system qwt.

Anton Gladky gladk at moszumanska.debian.org
Sat Dec 10 13:36:03 UTC 2016


This is an automated email from the git hooks/post-receive script.

gladk pushed a commit to branch master
in repository ovito.

commit 739dfb48893a21a0cbb7ec45724b6ef3f4ad79b6
Author: Anton Gladky <gladk at debian.org>
Date:   Sat Dec 10 12:50:18 2016 +0100

    Use system qwt.
---
 debian/control                         |   1 +
 debian/copyright                       |  43 +-
 debian/patches/20_use_system_qwt.patch | 950 +++++++++++++++++++++++++++++++++
 debian/patches/series                  |   1 +
 debian/watch                           |   2 +-
 5 files changed, 954 insertions(+), 43 deletions(-)

diff --git a/debian/control b/debian/control
index 01c5463..b1f58ba 100644
--- a/debian/control
+++ b/debian/control
@@ -25,6 +25,7 @@ Build-Depends: cmake,
                libqt5scintilla2-dev,
                libqt5opengl5-dev,
                libqcustomplot-dev,
+               libqwt-qt5-dev,
                libswscale-dev,
                povray,
                python-dev,
diff --git a/debian/copyright b/debian/copyright
index 47b9f6c..bcd5e09 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -9,6 +9,7 @@ Files-Excluded:
   src/3rdparty/muparser/mu*
   src/3rdparty/muparser/Ch*
   src/3rdparty/muparser/L*
+  src/3rdparty/qwt/qw*
 
 Files: *
 Copyright: 2007-2016 Alexander Stukowski
@@ -48,11 +49,6 @@ Copyright: 2008 The Regents of the University of California, through
  approvals from the U.S. Dept. of Energy).
 License: BSD-3-clause
 
-Files: src/3rdparty/qwt/*
-Copyright: 1997   Josef Wilgen
-           2002   Uwe Rathmann
-License: Qwt
-
 License: GPL-2+
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -109,40 +105,3 @@ License: MIT
   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License: Qwt
-                             Qwt License
-                           Version 1.0, January 1, 2003
- .
- The Qwt library and included programs are provided under the terms
- of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) with the following
- exceptions:
- .
-    1. Widgets that are subclassed from Qwt widgets do not
-       constitute a derivative work.
- .
-    2. Static linking of applications and widgets to the
-       Qwt library does not constitute a derivative work
-       and does not require the author to provide source
-       code for the application or widget, use the shared
-       Qwt libraries, or link their applications or
-       widgets against a user-supplied version of Qwt.
- .
-       If you link the application or widget to a modified
-       version of Qwt, then the changes to Qwt must be 
-       provided under the terms of the LGPL in sections
-       1, 2, and 4.
- .
-    3. You do not have to provide a copy of the Qwt license
-       with programs that are linked to the Qwt library, nor
-       do you have to identify the Qwt license in your
-       program or documentation as required by section 6
-       of the LGPL.
- .
- .
-       However, programs must still identify their use of Qwt.
-       The following example statement can be included in user
-       documentation to satisfy this requirement:
- .
-           [program/widget] is based in part on the work of
-           the Qwt project (http://qwt.sf.net).
diff --git a/debian/patches/20_use_system_qwt.patch b/debian/patches/20_use_system_qwt.patch
new file mode 100644
index 0000000..d17dcfc
--- /dev/null
+++ b/debian/patches/20_use_system_qwt.patch
@@ -0,0 +1,950 @@
+From: Alexander Stukowski <stukowski at mm.tu-darmstadt.de>
+Date: Sat, 10 Dec 2016 10:33:46 +0100
+Subject: [PATCH] Use system copy of Qwt library if present instead of building internal copy.
+
+---
+ cmake/FindQwt.cmake                                                                           |  15 +++++++++++++++
+ doc/develop/feature_requests.txt                                                              |   3 +--
+ doc/manual/development/build_linux.docbook                                                    |   4 ++--
+ src/3rdparty/qwt/CMakeLists.txt                                                               | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------
+ src/core/dataset/importexport/FileExporter.h                                                  |   2 +-
+ src/plugins/netcdf/CMakeLists.txt                                                             |   3 +++
+ src/plugins/netcdf/NetCDFExporter.cpp                                                         | 278 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ src/plugins/netcdf/NetCDFExporter.h                                                           |  49 +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/plugins/netcdf/NetCDFImporter.cpp                                                         |  49 +++++++++++++------------------------------------
+ src/plugins/particles/export/ParticleExporter.cpp                                             |   4 ++--
+ src/plugins/particles/export/ParticleExporter.h                                               |   4 ++--
+ src/plugins/particles/gui/modifier/analysis/binandreduce/BinAndReduceModifierEditor.cpp       |  18 +++++++++---------
+ src/plugins/particles/gui/modifier/analysis/coordination/CoordinationNumberModifierEditor.cpp |   6 +++---
+ src/plugins/particles/gui/modifier/analysis/histogram/HistogramModifierEditor.cpp             |   8 ++++----
+ src/plugins/particles/gui/modifier/analysis/ptm/PolyhedralTemplateMatchingModifierEditor.cpp  |   8 ++++----
+ src/plugins/particles/gui/modifier/analysis/scatterplot/ScatterPlotModifierEditor.cpp         |  10 +++++-----
+ tests/scripts/test_suite/global_namespace.py                                                  |   6 +++---
+ 17 files changed, 502 insertions(+), 171 deletions(-)
+ create mode 100644 cmake/FindQwt.cmake
+
+Index: ovito/cmake/FindQwt.cmake
+===================================================================
+--- /dev/null
++++ ovito/cmake/FindQwt.cmake
+@@ -0,0 +1,15 @@
++# Try to find the Qwt library
++#  QWT_FOUND - system has Qwt lib
++#  Qwt_INCLUDE_DIRS - the include directories needed
++#  Qwt_LIBRARIES - libraries needed
++
++FIND_PATH(QWT_INCLUDE_DIR NAMES qwt/qwt.h)
++FIND_LIBRARY(QWT_LIBRARY NAMES qwt-qt5 qwt)
++
++SET(Qwt_INCLUDE_DIRS ${QWT_INCLUDE_DIR})
++SET(Qwt_LIBRARIES ${QWT_LIBRARY})
++
++INCLUDE(FindPackageHandleStandardArgs)
++FIND_PACKAGE_HANDLE_STANDARD_ARGS(Qwt DEFAULT_MSG QWT_LIBRARY QWT_INCLUDE_DIR)
++
++MARK_AS_ADVANCED(QWT_INCLUDE_DIR QWT_LIBRARY)
+Index: ovito/src/3rdparty/qwt/CMakeLists.txt
+===================================================================
+--- ovito.orig/src/3rdparty/qwt/CMakeLists.txt
++++ ovito/src/3rdparty/qwt/CMakeLists.txt
+@@ -19,106 +19,120 @@
+ #
+ ###############################################################################
+ 
+-# Build the library.
+-SET(QWT_SOURCE_FILES
+-    qwt_abstract_scale_draw.cpp
+-    qwt_clipper.cpp
+-    qwt_color_map.cpp
+-    qwt_column_symbol.cpp
+-    qwt_date.cpp
+-    qwt_date_scale_draw.cpp
+-    qwt_date_scale_engine.cpp
+-    qwt_dyngrid_layout.cpp
+-    qwt_event_pattern.cpp
+-    qwt_graphic.cpp
+-    qwt_interval.cpp
+-    qwt_interval_symbol.cpp
+-    qwt_math.cpp
+-    qwt_magnifier.cpp
+-    qwt_null_paintdevice.cpp
+-    qwt_painter.cpp
+-    qwt_painter_command.cpp
+-    qwt_panner.cpp
+-    qwt_picker.cpp
+-    qwt_picker_machine.cpp
+-    qwt_pixel_matrix.cpp
+-    qwt_point_3d.cpp
+-    qwt_point_polar.cpp
+-    qwt_round_scale_draw.cpp
+-    qwt_scale_div.cpp
+-    qwt_scale_draw.cpp
+-    qwt_scale_map.cpp
+-    qwt_spline.cpp
+-    qwt_scale_engine.cpp
+-    qwt_symbol.cpp
+-    qwt_system_clock.cpp
+-    qwt_text_engine.cpp
+-    qwt_text_label.cpp
+-    qwt_text.cpp
+-    qwt_transform.cpp
+-    qwt_widget_overlay.cpp
+-
+-	# QwtPlot files:
+-	qwt_curve_fitter.cpp
+-	qwt_abstract_legend.cpp
+-	qwt_legend.cpp
+-	qwt_legend_data.cpp
+-	qwt_legend_label.cpp
+-	qwt_plot.cpp
+-	qwt_plot_renderer.cpp
+-	qwt_plot_xml.cpp
+-	qwt_plot_axis.cpp
+-	qwt_plot_curve.cpp
+-	qwt_plot_dict.cpp
+-	qwt_plot_directpainter.cpp
+-	qwt_plot_grid.cpp
+-	qwt_plot_histogram.cpp
+-	qwt_plot_item.cpp
+-	qwt_plot_abstract_barchart.cpp
+-	qwt_plot_barchart.cpp
+-	qwt_plot_multi_barchart.cpp
+-	qwt_plot_intervalcurve.cpp
+-	qwt_plot_zoneitem.cpp
+-	qwt_plot_tradingcurve.cpp
+-	qwt_plot_spectrogram.cpp
+-	qwt_plot_spectrocurve.cpp
+-	qwt_plot_scaleitem.cpp
+-	qwt_plot_legenditem.cpp
+-	qwt_plot_seriesitem.cpp
+-	qwt_plot_shapeitem.cpp
+-	qwt_plot_marker.cpp
+-	qwt_plot_textlabel.cpp
+-	qwt_plot_layout.cpp
+-	qwt_plot_canvas.cpp
+-	qwt_plot_panner.cpp
+-	qwt_plot_rasteritem.cpp
+-	qwt_plot_picker.cpp
+-	qwt_plot_zoomer.cpp
+-	qwt_plot_magnifier.cpp
+-	qwt_plot_rescaler.cpp
+-	qwt_point_mapper.cpp
+-	qwt_raster_data.cpp
+-	qwt_matrix_raster_data.cpp
+-	qwt_sampling_thread.cpp
+-	qwt_series_data.cpp
+-	qwt_point_data.cpp
+-	qwt_scale_widget.cpp
+-)
+-
+-# Build the library.
+-ADD_LIBRARY(Qwt SHARED ${QWT_SOURCE_FILES}) 
+-
+-# Link to Qt5.
+-TARGET_LINK_LIBRARIES(Qwt PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets Qt5::PrintSupport Qt5::Concurrent)
+-
+-# Some compile time flags for Qwt.
+-TARGET_COMPILE_DEFINITIONS(Qwt PRIVATE QWT_NO_SVG QWT_NO_OPENGL QWT_MAKEDLL)
+-TARGET_COMPILE_DEFINITIONS(Qwt PUBLIC QWT_DLL)
+-
+-SET_TARGET_PROPERTIES(Qwt PROPERTIES MACOSX_RPATH TRUE)
+-
+-# Export this target.
+-INSTALL(TARGETS Qwt EXPORT OVITO 
+-	RUNTIME DESTINATION "${OVITO_RELATIVE_LIBRARY_DIRECTORY}"
+-	LIBRARY DESTINATION "${OVITO_RELATIVE_LIBRARY_DIRECTORY}")
++# Find Qwt library.
++FIND_PACKAGE(Qwt QUIET)
+ 
++IF(QWT_FOUND)
++
++	# Create imported target for the existing Qwt library.
++	ADD_LIBRARY(Qwt SHARED IMPORTED GLOBAL)
++	SET_PROPERTY(TARGET Qwt PROPERTY IMPORTED_LOCATION "${Qwt_LIBRARIES}")
++	SET_PROPERTY(TARGET Qwt APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${Qwt_INCLUDE_DIRS}")
++
++ELSE()
++
++	# Build the library.
++	SET(QWT_SOURCE_FILES
++		qwt_abstract_scale_draw.cpp
++		qwt_clipper.cpp
++		qwt_color_map.cpp
++		qwt_column_symbol.cpp
++		qwt_date.cpp
++		qwt_date_scale_draw.cpp
++		qwt_date_scale_engine.cpp
++		qwt_dyngrid_layout.cpp
++		qwt_event_pattern.cpp
++		qwt_graphic.cpp
++		qwt_interval.cpp
++		qwt_interval_symbol.cpp
++		qwt_math.cpp
++		qwt_magnifier.cpp
++		qwt_null_paintdevice.cpp
++		qwt_painter.cpp
++		qwt_painter_command.cpp
++		qwt_panner.cpp
++		qwt_picker.cpp
++		qwt_picker_machine.cpp
++		qwt_pixel_matrix.cpp
++		qwt_point_3d.cpp
++		qwt_point_polar.cpp
++		qwt_round_scale_draw.cpp
++		qwt_scale_div.cpp
++		qwt_scale_draw.cpp
++		qwt_scale_map.cpp
++		qwt_spline.cpp
++		qwt_scale_engine.cpp
++		qwt_symbol.cpp
++		qwt_system_clock.cpp
++		qwt_text_engine.cpp
++		qwt_text_label.cpp
++		qwt_text.cpp
++		qwt_transform.cpp
++		qwt_widget_overlay.cpp
++
++		# QwtPlot files:
++		qwt_curve_fitter.cpp
++		qwt_abstract_legend.cpp
++		qwt_legend.cpp
++		qwt_legend_data.cpp
++		qwt_legend_label.cpp
++		qwt_plot.cpp
++		qwt_plot_renderer.cpp
++		qwt_plot_xml.cpp
++		qwt_plot_axis.cpp
++		qwt_plot_curve.cpp
++		qwt_plot_dict.cpp
++		qwt_plot_directpainter.cpp
++		qwt_plot_grid.cpp
++		qwt_plot_histogram.cpp
++		qwt_plot_item.cpp
++		qwt_plot_abstract_barchart.cpp
++		qwt_plot_barchart.cpp
++		qwt_plot_multi_barchart.cpp
++		qwt_plot_intervalcurve.cpp
++		qwt_plot_zoneitem.cpp
++		qwt_plot_tradingcurve.cpp
++		qwt_plot_spectrogram.cpp
++		qwt_plot_spectrocurve.cpp
++		qwt_plot_scaleitem.cpp
++		qwt_plot_legenditem.cpp
++		qwt_plot_seriesitem.cpp
++		qwt_plot_shapeitem.cpp
++		qwt_plot_marker.cpp
++		qwt_plot_textlabel.cpp
++		qwt_plot_layout.cpp
++		qwt_plot_canvas.cpp
++		qwt_plot_panner.cpp
++		qwt_plot_rasteritem.cpp
++		qwt_plot_picker.cpp
++		qwt_plot_zoomer.cpp
++		qwt_plot_magnifier.cpp
++		qwt_plot_rescaler.cpp
++		qwt_point_mapper.cpp
++		qwt_raster_data.cpp
++		qwt_matrix_raster_data.cpp
++		qwt_sampling_thread.cpp
++		qwt_series_data.cpp
++		qwt_point_data.cpp
++		qwt_scale_widget.cpp
++	)
++
++	# Build the library.
++	ADD_LIBRARY(Qwt SHARED ${QWT_SOURCE_FILES}) 
++
++	# Link to Qt5.
++	TARGET_LINK_LIBRARIES(Qwt PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets Qt5::PrintSupport Qt5::Concurrent)
++
++	# Some compile time flags for Qwt.
++	TARGET_COMPILE_DEFINITIONS(Qwt PRIVATE QWT_NO_SVG QWT_NO_OPENGL QWT_MAKEDLL)
++	TARGET_COMPILE_DEFINITIONS(Qwt PUBLIC QWT_DLL)
++
++	SET_PROPERTY(TARGET Qwt APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/src/3rdparty")
++	SET_TARGET_PROPERTIES(Qwt PROPERTIES MACOSX_RPATH TRUE)
++
++	# Export this target.
++	INSTALL(TARGETS Qwt EXPORT OVITO 
++		RUNTIME DESTINATION "${OVITO_RELATIVE_LIBRARY_DIRECTORY}"
++		LIBRARY DESTINATION "${OVITO_RELATIVE_LIBRARY_DIRECTORY}")
++
++ENDIF()
+\ No newline at end of file
+Index: ovito/src/core/dataset/importexport/FileExporter.h
+===================================================================
+--- ovito.orig/src/core/dataset/importexport/FileExporter.h
++++ ovito/src/core/dataset/importexport/FileExporter.h
+@@ -126,7 +126,7 @@ protected:
+ 	/// \brief This is called once for every output file to be written and before exportFrame() is called.
+ 	virtual bool openOutputFile(const QString& filePath, int numberOfFrames) = 0;
+ 
+-	/// \brief This is called once for every output file written after exportFrame() has been called.s
++	/// \brief This is called once for every output file written after exportFrame() has been called.
+ 	virtual void closeOutputFile(bool exportCompleted) = 0;
+ 
+ 	/// \brief Exports a single animation frame to the current output file.
+Index: ovito/src/plugins/netcdf/CMakeLists.txt
+===================================================================
+--- ovito.orig/src/plugins/netcdf/CMakeLists.txt
++++ ovito/src/plugins/netcdf/CMakeLists.txt
+@@ -45,6 +45,9 @@ OVITO_STANDARD_PLUGIN(
+ )
+ 
+ TARGET_INCLUDE_DIRECTORIES(NetCDFPlugin PRIVATE "${netcdf_INCLUDE_DIRS}")
++IF(WIN32)
++	TARGET_COMPILE_DEFINITIONS(NetCDFPlugin PRIVATE DLL_NETCDF)
++ENDIF()
+ 
+ IF(WIN32)
+ 
+Index: ovito/src/plugins/netcdf/NetCDFExporter.cpp
+===================================================================
+--- ovito.orig/src/plugins/netcdf/NetCDFExporter.cpp
++++ ovito/src/plugins/netcdf/NetCDFExporter.cpp
+@@ -25,11 +25,145 @@
+ #include <core/utilities/concurrent/ProgressDisplay.h>
+ #include "NetCDFExporter.h"
+ 
++#include <netcdf.h>
++
++#define NCERR(x) ncerr(x, __FILE__, __LINE__)
++#define NCERRI(x, info) ncerr_with_info(x, __FILE__, __LINE__, info)
++
+ namespace Ovito { namespace Particles { OVITO_BEGIN_INLINE_NAMESPACE(Export) OVITO_BEGIN_INLINE_NAMESPACE(Formats)
+ 
++const char NC_FRAME_STR[]         = "frame";
++const char NC_SPATIAL_STR[]       = "spatial";
++const char NC_VOIGT_STR[]         = "Voigt";
++const char NC_ATOM_STR[]          = "atom";
++const char NC_CELL_SPATIAL_STR[]  = "cell_spatial";
++const char NC_CELL_ANGULAR_STR[]  = "cell_angular";
++const char NC_LABEL_STR[]         = "label";
++
++const char NC_TIME_STR[]          = "time";
++const char NC_CELL_ORIGIN_STR[]   = "cell_origin";
++const char NC_CELL_LENGTHS_STR[]  = "cell_lengths";
++const char NC_CELL_ANGLES_STR[]   = "cell_angles";
++
++const char NC_UNITS_STR[]         = "units";
++const char NC_SCALE_FACTOR_STR[]  = "scale_factor";
++
++#ifdef FLOATTYPE_FLOAT 
++	#define NC_OVITO_FLOATTYPE NC_FLOAT
++#else
++	#define NC_OVITO_FLOATTYPE NC_DOUBLE
++#endif
++
+ IMPLEMENT_SERIALIZABLE_OVITO_OBJECT(NetCDFPlugin, NetCDFExporter, FileColumnParticleExporter);
+ 
+ /******************************************************************************
++* Check for NetCDF error and throw exception
++******************************************************************************/
++void NetCDFExporter::ncerr(int err, const char* file, int line)
++{
++	if(err != NC_NOERR)
++		throwException(tr("NetCDF I/O error: %1 (line %2 of %3)").arg(QString(nc_strerror(err))).arg(line).arg(file));
++}
++
++/******************************************************************************
++* Check for NetCDF error and throw exception (and attach additional information
++* to exception string)
++******************************************************************************/
++void NetCDFExporter::ncerr_with_info(int err, const char* file, int line, const QString& info)
++{
++	if(err != NC_NOERR)
++		throwException(tr("NetCDF I/O error: %1 %2 (line %3 of %4)").arg(QString(nc_strerror(err))).arg(info).arg(line).arg(file));
++}
++
++/******************************************************************************
++ * This is called once for every output file to be written and before
++ * exportFrame() is called.
++ *****************************************************************************/
++bool NetCDFExporter::openOutputFile(const QString& filePath, int numberOfFrames)
++{
++	OVITO_ASSERT(!outputFile().isOpen());
++	outputFile().setFileName(filePath);
++
++	// Open the input file for writing.
++	NCERR(nc_create(filePath.toLocal8Bit().constData(), NC_64BIT_OFFSET, &_ncid));
++
++	// Define dimensions.
++	NCERR(nc_def_dim(_ncid, NC_FRAME_STR, NC_UNLIMITED, &_frame_dim));
++	NCERR(nc_def_dim(_ncid, NC_SPATIAL_STR, 3, &_spatial_dim));
++	NCERR(nc_def_dim(_ncid, NC_VOIGT_STR, 6, &_Voigt_dim));
++	NCERR(nc_def_dim(_ncid, NC_CELL_SPATIAL_STR, 3, &_cell_spatial_dim));
++	NCERR(nc_def_dim(_ncid, NC_CELL_ANGULAR_STR, 3, &_cell_angular_dim));
++	NCERR(nc_def_dim(_ncid, NC_LABEL_STR, 10, &_label_dim));
++
++	// Default variables.
++	int dims[NC_MAX_VAR_DIMS];
++	dims[0] = _spatial_dim;
++	NCERR(nc_def_var(_ncid, NC_SPATIAL_STR, NC_CHAR, 1, dims, &_spatial_var));
++	NCERR(nc_def_var(_ncid, NC_CELL_SPATIAL_STR, NC_CHAR, 1, dims, &_cell_spatial_var));
++	dims[0] = _spatial_dim;
++	dims[1] = _label_dim;
++	NCERR(nc_def_var(_ncid, NC_CELL_ANGULAR_STR, NC_CHAR, 2, dims, &_cell_angular_var));
++	dims[0] = _frame_dim;
++	NCERR(nc_def_var(_ncid, NC_TIME_STR, NC_DOUBLE, 1, dims, &_time_var));
++	dims[0] = _frame_dim;
++	dims[1] = _cell_spatial_dim;
++	NCERR(nc_def_var(_ncid, NC_CELL_ORIGIN_STR, NC_DOUBLE, 2, dims, &_cell_origin_var));
++	NCERR(nc_def_var(_ncid, NC_CELL_LENGTHS_STR, NC_DOUBLE, 2, dims, &_cell_lengths_var));
++	dims[0] = _frame_dim;
++	dims[1] = _cell_angular_dim;
++	NCERR(nc_def_var(_ncid, NC_CELL_ANGLES_STR, NC_DOUBLE, 2, dims, &_cell_angles_var));
++
++	// Global attributes.
++	NCERR(nc_put_att_text(_ncid, NC_GLOBAL, "Conventions", 5, "AMBER"));
++	NCERR(nc_put_att_text(_ncid, NC_GLOBAL, "ConventionVersion", 3, "1.0"));
++	NCERR(nc_put_att_text(_ncid, NC_GLOBAL, "program", 5, "OVITO"));
++	QByteArray programVersion = QCoreApplication::applicationVersion().toLocal8Bit();
++	NCERR(nc_put_att_text(_ncid, NC_GLOBAL, "programVersion", programVersion.length(), programVersion.constData()));
++
++	NCERR(nc_put_att_text(_ncid, _cell_angles_var, NC_UNITS_STR, 6, "degree"));
++
++	// Done with definitions.
++	NCERR(nc_enddef(_ncid));
++
++	// Write label variables.
++	size_t index[NC_MAX_VAR_DIMS], count[NC_MAX_VAR_DIMS];
++	NCERR(nc_put_var_text(_ncid, _spatial_var, "xyz"));
++	NCERR(nc_put_var_text(_ncid, _cell_spatial_var, "abc"));
++	index[0] = 0;
++	index[1] = 0;
++	count[0] = 1;
++	count[1] = 5;
++	NCERR(nc_put_vara_text(_ncid, _cell_angular_var, index, count, "alpha"));
++	index[0] = 1;	
++	count[1] = 4;
++	NCERR(nc_put_vara_text(_ncid, _cell_angular_var, index, count, "beta"));
++	index[0] = 2;
++	count[1] = 5;
++	NCERR(nc_put_vara_text(_ncid, _cell_angular_var, index, count, "gamma"));
++
++	_frameCounter = 0;
++
++	return true;
++}
++
++/******************************************************************************
++ * This is called once for every output file written after exportFrame()
++ * has been called.
++ *****************************************************************************/
++void NetCDFExporter::closeOutputFile(bool exportCompleted)
++{
++	OVITO_ASSERT(!outputFile().isOpen());
++
++	if(_ncid != -1) {
++		NCERR(nc_close(_ncid));
++		_ncid = -1;
++	}
++
++	if(!exportCompleted)
++		outputFile().remove();
++}
++
++/******************************************************************************
+ * Writes the particles of one animation frame to the current output file.
+ ******************************************************************************/
+ bool NetCDFExporter::exportObject(SceneNode* sceneNode, int frameNumber, TimePoint time, const QString& filePath, AbstractProgressDisplay* progress)
+@@ -40,10 +174,150 @@ bool NetCDFExporter::exportObject(SceneN
+ 
+ 	// Get simulation cell info.
+ 	SimulationCellObject* simulationCell = state.findObject<SimulationCellObject>();
+-
+-	AffineTransformation simCell = simulationCell->cellMatrix();
++	const AffineTransformation simCell = simulationCell->cellMatrix();
+ 	size_t atomsCount = posProperty->size();
++	
++	if(_atom_dim == -1) {
++		// Define "atom" dimension when first frame is written and the number of atoms is known.
++		NCERR(nc_redef(_ncid));
++		NCERR(nc_def_dim(_ncid, NC_ATOM_STR, atomsCount, &_atom_dim));
++
++		// Define NetCDF variables for global attributes.
++		const QVariantMap& attributes = state.attributes();
++		for(auto entry = attributes.constBegin(); entry != attributes.constEnd(); ++entry) {
++			int var;
++			if(entry.key() == NC_TIME_STR || entry.key() == QStringLiteral("SourceFrame"))
++				continue;
++			else if((QMetaType::Type)entry.value().type() == QMetaType::Double || (QMetaType::Type)entry.value().type() == QMetaType::Float)
++				NCERR(nc_def_var(_ncid, entry.key().toUtf8().constData(), NC_DOUBLE, 1, &_frame_dim, &var));
++			else if(entry.value().canConvert<int>())
++				NCERR(nc_def_var(_ncid, entry.key().toUtf8().constData(), NC_INT, 1, &_frame_dim, &var));
++			else
++				continue;
++			_attributes_vars.insert(entry.key(), var);
++		}
++
++		// Define NetCDF variable for atomci positions.
++		int dims[3] = { _frame_dim, _atom_dim, _spatial_dim };
++		NCERR(nc_def_var(_ncid, "coordinates", NC_OVITO_FLOATTYPE, 3, dims, &_coords_var));
++
++		// Define NetCDF variables for per-particle properties.
++		for(auto c = columnMapping().begin(); c != columnMapping().end(); ++c) {
++			if(c->type() == ParticleProperty::PositionProperty)
++				continue;
++			
++			// Can export particle properties only as a whole, not individual components.
++			if(std::find_if(columnMapping().begin(), c, [c](const ParticlePropertyReference& pr) { return pr.type() == c->type(); }))
++				continue;
++
++			ParticlePropertyObject* prop = c->findInState(state);
++			if(!prop)
++				throwException(tr("Invalid set of particle properties to be exported. The property '%1' does not exist.").arg(c->name()));
++			if((int)prop->componentCount() <= std::max(0, c->vectorComponent()))
++				throwException(tr("The output vector component selected for column %1 is out of range. The particle property '%2' has only %3 component(s).").arg(c-columnMapping().begin()+1).arg(c->name()).arg(prop->componentCount()));
++
++			if(prop->type() != ParticleProperty::UserProperty) {
++				const char* mangledNamed = nullptr;
++				if(prop->type() == ParticleProperty::ForceProperty)
++					mangledName = "forces";
++				else if(prop->type() == ParticleProperty::VelocityProperty)
++					mangledName = "velocities";
++				else if(prop->type() == ParticleProperty::ParticleTypesProperty)
++					mangledName = "atom_types";
++
++				if(mangledName) {
++					if(std::find_if(columnMapping().begin(), c, [c](const ParticlePropertyReference& pr) { return pr.type() == c->type(); }))
++						continue;
++					if(prop->dataType() == qMetaTypeId<int>()) {
++						int ncvar;
++						NCERR(nc_def_var(_ncid, mangledName, NC_INT, 2, dims, &ncvar));
++						_columns.emplace_back({ *c, qMetaTypeId<int>(), 1, ncvar });
++					}
++				}
++			}
++
++			if(prop->dataType() == qMetaTypeId<int>()) {
++				int ncvar;
++				NCERR(nc_def_var(_ncid, c->nameWithComponent().toUtf8().constData(), NC_INT, 2, dims, &ncvar));
++				_columns.emplace_back({ *c, qMetaTypeId<int>(), 1, ncvar });
++			}
++			else if(prop->dataType() == qMetaTypeId<FloatType>()) {
++				int ncvar;
++				NCERR(nc_def_var(_ncid, c->nameWithComponent().toUtf8().constData(), NC_OVITO_FLOATTYPE, 2, dims, &ncvar));
++				_columns.emplace_back({ *c, qMetaTypeId<FloatType>(), 1, ncvar });
++			}
++		}
++		
++		NCERR(nc_enddef(_ncid));
++	}
++	else {
++		size_t na;
++		NCERR(nc_inq_dimlen(_ncid, _atom_dim, &na));
++		if(na != atomsCount)
++			throwException(tr("Writing a NetCDF file with varying number of atoms is not supported."));
++	}
++
++	// Write global attributes.
++	const QVariantMap& attributes = state.attributes();
++	for(auto entry = _attributes_vars.constBegin(); entry != _attributes_vars.constEnd(); ++entry) {		
++		QVariant val = attributes.value(entry.key());
++		if((QMetaType::Type)val.type() == QMetaType::Double || (QMetaType::Type)val.type() == QMetaType::Float) {
++			double d = val.toDouble();
++			NCERR(nc_put_var1_double(_ncid, entry.value(), &_frameCounter, &d));
++		}
++		else if(val.canConvert<int>()) {
++			int i = val.toInt();
++			NCERR(nc_put_var1_int(_ncid, entry.value(), &_frameCounter, &i));
++		}
++	}
++
++	// Write "time" variable.
++	double t = _frameCounter;
++	if(attributes.contains(NC_TIME_STR)) t = attributes.value(NC_TIME_STR).toDouble();
++	else if(attributes.contains(QStringLiteral("SourceFrame"))) t = attributes.value(QStringLiteral("SourceFrame")).toDouble();
++    NCERR(nc_put_var1_double(_ncid, _time_var, &_frameCounter, &t));
++
++	// Write simulation cell.
++	double cell_origin[3], cell_lengths[3], cell_angles[3];
++
++	cell_origin[0] = simCell.translation().x();
++	cell_origin[1] = simCell.translation().y();
++	cell_origin[2] = simCell.translation().z();
++
++	cell_lengths[0] = simCell.column(0).length();
++	cell_lengths[1] = simCell.column(1).length();
++	cell_lengths[2] = simCell.column(2).length();
++
++	double h[6] = { simCell(0,0), simCell(1,1), simCell(2,2), simCell(0,1), simCell(0,2), simCell(1,2) };
++	double cosalpha = (h[5]*h[4]+h[1]*h[3])/sqrt((h[1]*h[1]+h[5]*h[5])*(h[2]*h[2]+h[3]*h[3]+h[4]*h[4]));
++	double cosbeta = h[4]/sqrt(h[2]*h[2]+h[3]*h[3]+h[4]*h[4]);
++	double cosgamma = h[5]/sqrt(h[1]*h[1]+h[5]*h[5]);
++
++	cell_angles[0] = acos(cosalpha) * 180.0/M_PI;
++	cell_angles[1] = acos(cosbeta)  * 180.0/M_PI;
++	cell_angles[2] = acos(cosgamma) * 180.0/M_PI;
++
++	// AMBER convention says that nonperiodic boundaries should have 'cell_lengths' set to zero.
++	if(!simulationCell->pbcX()) cell_lengths[0] = 0;
++	if(!simulationCell->pbcY()) cell_lengths[1] = 0;
++	if(!simulationCell->pbcZ()) cell_lengths[2] = 0;
++
++	size_t start[3] = { _frameCounter, 0, 0 };
++    size_t count[3] = { 1, 3, 0 };
++    NCERR(nc_put_vara_double(_ncid, _cell_origin_var, start, count, cell_origin));
++    NCERR(nc_put_vara_double(_ncid, _cell_lengths_var, start, count, cell_lengths));
++    NCERR(nc_put_vara_double(_ncid, _cell_angles_var, start, count, cell_angles));
++
++	// Write atomic coordinates.
++	count[1] = atomsCount;
++	count[2] = 3;
++#ifdef FLOATTYPE_FLOAT 
++	NCERR(nc_put_vara_float(_ncid, _coords_var, start, count, posProperty->constDataFloat()));
++#else
++	NCERR(nc_put_vara_double(_ncid, _coords_var, start, count, posProperty->constDataFloat()));	
++#endif
+ 
++	_frameCounter++;
+ 	return true;
+ }
+ 
+Index: ovito/src/plugins/netcdf/NetCDFExporter.h
+===================================================================
+--- ovito.orig/src/plugins/netcdf/NetCDFExporter.h
++++ ovito/src/plugins/netcdf/NetCDFExporter.h
+@@ -51,11 +51,60 @@ public:
+ 
+ protected:
+ 
++	/// \brief This is called once for every output file to be written and before exportFrame() is called.
++	virtual bool openOutputFile(const QString& filePath, int numberOfFrames) override;
++
++	/// \brief This is called once for every output file written after exportFrame() has been called.
++	virtual void closeOutputFile(bool exportCompleted) override;
++
+ 	/// \brief Writes the particles of one animation frame to the current output file.
+ 	virtual bool exportObject(SceneNode* sceneNode, int frameNumber, TimePoint time, const QString& filePath, AbstractProgressDisplay* progressDisplay) override;
+ 
+ private:
+ 
++	/// Checks for NetCDF error and throws exception.
++	void ncerr(int err, const char* file, int line);
++
++	/// Checks for NetCDF error and throws exception (and attach additional information to exception string.
++	void ncerr_with_info(int err, const char* file, int line, const QString& info);
++
++	/// The NetCDF file handle.
++	int _ncid = -1;
++
++	// NetCDF file dimensions:
++	int _frame_dim;
++	int _spatial_dim;
++	int _Voigt_dim;
++	int _atom_dim = -1;
++	int _cell_spatial_dim;
++	int _cell_angular_dim;
++	int _label_dim;
++
++	// NetCDF file variables:
++	int _spatial_var;
++	int _cell_spatial_var;
++	int _cell_angular_var;
++	int _time_var;
++	int _cell_origin_var;
++	int _cell_lengths_var;
++	int _cell_angles_var;
++	int _coords_var;
++
++	/// NetCDF file variables for global attributes.
++	QMap<QString, int> _attributes_vars;
++
++	struct NCOutputColumn {
++		ParticlePropertyReference property;
++		int dataType;
++		size_t componentCount;
++		int ncvar;
++	};
++
++	std::vector<NCOutputColumn> _columns;
++
++	/// The number of frames written.
++	size_t _frameCounter;
++
+ 	Q_OBJECT
+ 	OVITO_OBJECT
+ };
+Index: ovito/src/plugins/netcdf/NetCDFImporter.cpp
+===================================================================
+--- ovito.orig/src/plugins/netcdf/NetCDFImporter.cpp
++++ ovito/src/plugins/netcdf/NetCDFImporter.cpp
+@@ -38,7 +38,7 @@
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ 
+-#include <core/Core.h>
++#include <plugins/particles/Particles.h>
+ #include <core/utilities/io/FileManager.h>
+ #include <core/utilities/concurrent/Future.h>
+ #include <core/dataset/DataSetContainer.h>
+@@ -46,10 +46,6 @@
+ #include "NetCDFImporter.h"
+ 
+ #include <QtMath>
+-
+-#ifdef WIN32
+-	#define DLL_NETCDF
+-#endif
+ #include <netcdf.h>
+ 
+ #define NCERR(x)  _ncerr(x, __FILE__, __LINE__)
+@@ -77,20 +73,20 @@ void fullToVoigt(size_t particleCount, T
+ /******************************************************************************
+ * Check for NetCDF error and throw exception
+ ******************************************************************************/
+-static void _ncerr(int err, const char *file, int line)
++static void _ncerr(int err, const char* file, int line)
+ {
+-	if (err != NC_NOERR)
+-		throw Exception(NetCDFImporter::tr("NetCDF error in line %1 of source file %2: %3").arg(line).arg(file).arg(QString(nc_strerror(err))));
++	if(err != NC_NOERR)
++		throw Exception(NetCDFImporter::tr("NetCDF I/O error: %1 (line %2 of %3)").arg(QString(nc_strerror(err))).arg(line).arg(file));
+ }
+ 
+ /******************************************************************************
+ * Check for NetCDF error and throw exception (and attach additional information
+ * to exception string)
+ ******************************************************************************/
+-static void _ncerr_with_info(int err, const char *file, int line, const QString &info)
++static void _ncerr_with_info(int err, const char* file, int line, const QString& info)
+ {
+-	if (err != NC_NOERR)
+-		throw Exception(NetCDFImporter::tr("NetCDF error in line %1 of source file %2: %3 %4").arg(line).arg(file).arg(QString(nc_strerror(err))).arg(info));
++	if(err != NC_NOERR)
++		throw Exception(NetCDFImporter::tr("NetCDF I/O error: %1 %2 (line %3 of %4)").arg(QString(nc_strerror(err))).arg(info).arg(line).arg(file));
+ }
+ 
+ /******************************************************************************
+@@ -199,25 +195,6 @@ void NetCDFImporter::NetCDFImportTask::o
+ 	if (strcmp(conventions_str.get(), "AMBER"))
+ 		throw Exception(tr("NetCDF file %1 follows '%2' conventions, expected 'AMBER'.").arg(filename, conventions_str.get()));
+ 
+-#if 0
+-	// Read creator information
+-	NCERR( nc_inq_attlen(_ncid, NC_GLOBAL, "program", &len) );
+-	char *program_str = new char[len+1];
+-	NCERR( nc_get_att_text(_ncid, NC_GLOBAL, "program", program_str) );
+-	program_str[len] = 0;
+-
+-	NCERR( nc_inq_attlen(_ncid, NC_GLOBAL, "programVersion", &len) );
+-	char *program_version_str = new char[len+1];
+-	NCERR( nc_get_att_text(_ncid, NC_GLOBAL, "programVersion", program_version_str) );
+-	program_version_str[len] = 0;
+-
+-	// Log this
+-	VerboseLogger() << "Opened AMBER-style NetCDF file " << filename << ". File written by " << program_str << ", " << program_version_str << "." << endl;
+-
+-	delete [] program_str;
+-	delete [] program_version_str;
+-#endif
+-
+ 	// Read optional file title.
+ 	if(nc_inq_attlen(_ncid, NC_GLOBAL, "title", &len) == NC_NOERR) {
+ 		std::unique_ptr<char[]> title_str(new char[len+1]);
+@@ -371,7 +348,7 @@ void NetCDFImporter::NetCDFImportTask::p
+ 		// Now iterate over all variables and see whether they start with either atom or frame dimensions.
+ 		int nVars;
+ 		NCERR( nc_inq_nvars(_ncid, &nVars) );
+-		for (int varId = 0; varId < nVars; varId++) {
++		for(int varId = 0; varId < nVars; varId++) {
+ 			char name[NC_MAX_NAME+1];
+ 			nc_type type;
+ 
+@@ -381,13 +358,13 @@ void NetCDFImporter::NetCDFImportTask::p
+ 			OVITO_ASSERT(nDims >= 1);
+ 
+ 			// Check if dimensions make sense and we can understand them.
+-			if ((dimIds[0] == _atom_dim || dimIds[0] == _sph_dim || dimIds[0] == _dem_dim) ||
++			if((dimIds[0] == _atom_dim || dimIds[0] == _sph_dim || dimIds[0] == _dem_dim) ||
+ 					( nDims > 1 && dimIds[0] == _frame_dim && (dimIds[1] == _atom_dim || dimIds[1] == _sph_dim || dimIds[1] == _dem_dim))) {
+ 				// Do we support this data type?
+-				if (type == NC_BYTE || type == NC_SHORT || type == NC_INT || type == NC_LONG || type == NC_CHAR) {
++				if(type == NC_BYTE || type == NC_SHORT || type == NC_INT || type == NC_LONG || type == NC_CHAR) {
+ 					columnMapping.push_back(mapVariableToColumn(name, qMetaTypeId<int>()));
+ 				}
+-				else if (type == NC_FLOAT || type == NC_DOUBLE) {
++				else if(type == NC_FLOAT || type == NC_DOUBLE) {
+ 					columnMapping.push_back(mapVariableToColumn(name, qMetaTypeId<FloatType>()));
+ 				}
+ 				else {
+@@ -396,7 +373,7 @@ void NetCDFImporter::NetCDFImportTask::p
+ 			}
+ 
+ 			// Read in scalar values as attributes.
+-			if (nDims == 1 && dimIds[0] == _frame_dim) {
++			if(nDims == 1 && dimIds[0] == _frame_dim) {
+ 				if (type == NC_SHORT || type == NC_INT || type == NC_LONG) {
+ 					size_t startp[2] = { movieFrame, 0 };
+ 					size_t countp[2] = { 1, 1 };
+@@ -415,7 +392,7 @@ void NetCDFImporter::NetCDFImportTask::p
+ 		}
+ 
+ 		// Check if the only thing we need to do is read column information.
+-		if (_parseFileHeaderOnly) {
++		if(_parseFileHeaderOnly) {
+ 			_customColumnMapping = columnMapping;
+ 			closeNetCDF();
+ 			return;
+Index: ovito/src/plugins/particles/export/ParticleExporter.cpp
+===================================================================
+--- ovito.orig/src/plugins/particles/export/ParticleExporter.cpp
++++ ovito/src/plugins/particles/export/ParticleExporter.cpp
+@@ -81,7 +81,7 @@ const PipelineFlowState& ParticleExporte
+ 
+ /******************************************************************************
+  * This is called once for every output file to be written and before
+- * exportData() is called.
++ * exportFrame() is called.
+  *****************************************************************************/
+ bool ParticleExporter::openOutputFile(const QString& filePath, int numberOfFrames)
+ {
+@@ -95,7 +95,7 @@ bool ParticleExporter::openOutputFile(co
+ }
+ 
+ /******************************************************************************
+- * This is called once for every output file written after exportData()
++ * This is called once for every output file written after exportFrame()
+  * has been called.
+  *****************************************************************************/
+ void ParticleExporter::closeOutputFile(bool exportCompleted)
+Index: ovito/src/plugins/particles/export/ParticleExporter.h
+===================================================================
+--- ovito.orig/src/plugins/particles/export/ParticleExporter.h
++++ ovito/src/plugins/particles/export/ParticleExporter.h
+@@ -49,10 +49,10 @@ protected:
+ 	/// \brief Constructs a new instance of this class.
+ 	ParticleExporter(DataSet* dataset);
+ 
+-	/// \brief This is called once for every output file to be written and before exportData() is called.
++	/// \brief This is called once for every output file to be written and before exportFrame() is called.
+ 	virtual bool openOutputFile(const QString& filePath, int numberOfFrames) override;
+ 
+-	/// \brief This is called once for every output file written after exportData() has been called.
++	/// \brief This is called once for every output file written after exportFrame() has been called.
+ 	virtual void closeOutputFile(bool exportCompleted) override;
+ 
+ 	/// Returns the current file this exporter is writing to.
+Index: ovito/src/plugins/particles/gui/modifier/analysis/binandreduce/BinAndReduceModifierEditor.cpp
+===================================================================
+--- ovito.orig/src/plugins/particles/gui/modifier/analysis/binandreduce/BinAndReduceModifierEditor.cpp
++++ ovito/src/plugins/particles/gui/modifier/analysis/binandreduce/BinAndReduceModifierEditor.cpp
+@@ -30,15 +30,15 @@
+ #include <plugins/particles/gui/util/ParticlePropertyParameterUI.h>
+ #include "BinAndReduceModifierEditor.h"
+ 
+-#include <3rdparty/qwt/qwt_plot.h>
+-#include <3rdparty/qwt/qwt_plot_curve.h>
+-#include <3rdparty/qwt/qwt_plot_spectrogram.h>
+-#include <3rdparty/qwt/qwt_plot_grid.h>
+-#include <3rdparty/qwt/qwt_scale_engine.h>
+-#include <3rdparty/qwt/qwt_matrix_raster_data.h>
+-#include <3rdparty/qwt/qwt_color_map.h>
+-#include <3rdparty/qwt/qwt_scale_widget.h>
+-#include <3rdparty/qwt/qwt_plot_layout.h>
++#include <qwt/qwt_plot.h>
++#include <qwt/qwt_plot_curve.h>
++#include <qwt/qwt_plot_spectrogram.h>
++#include <qwt/qwt_plot_grid.h>
++#include <qwt/qwt_scale_engine.h>
++#include <qwt/qwt_matrix_raster_data.h>
++#include <qwt/qwt_color_map.h>
++#include <qwt/qwt_scale_widget.h>
++#include <qwt/qwt_plot_layout.h>
+ 
+ namespace Ovito { namespace Particles { OVITO_BEGIN_INLINE_NAMESPACE(Modifiers) OVITO_BEGIN_INLINE_NAMESPACE(Analysis) OVITO_BEGIN_INLINE_NAMESPACE(Internal)
+ 
+Index: ovito/src/plugins/particles/gui/modifier/analysis/coordination/CoordinationNumberModifierEditor.cpp
+===================================================================
+--- ovito.orig/src/plugins/particles/gui/modifier/analysis/coordination/CoordinationNumberModifierEditor.cpp
++++ ovito/src/plugins/particles/gui/modifier/analysis/coordination/CoordinationNumberModifierEditor.cpp
+@@ -26,9 +26,9 @@
+ #include <gui/properties/FloatParameterUI.h>
+ #include "CoordinationNumberModifierEditor.h"
+ 
+-#include <3rdparty/qwt/qwt_plot.h>
+-#include <3rdparty/qwt/qwt_plot_curve.h>
+-#include <3rdparty/qwt/qwt_plot_grid.h>
++#include <qwt/qwt_plot.h>
++#include <qwt/qwt_plot_curve.h>
++#include <qwt/qwt_plot_grid.h>
+ 
+ namespace Ovito { namespace Particles { OVITO_BEGIN_INLINE_NAMESPACE(Modifiers) OVITO_BEGIN_INLINE_NAMESPACE(Analysis) OVITO_BEGIN_INLINE_NAMESPACE(Internal)
+ 
+Index: ovito/src/plugins/particles/gui/modifier/analysis/histogram/HistogramModifierEditor.cpp
+===================================================================
+--- ovito.orig/src/plugins/particles/gui/modifier/analysis/histogram/HistogramModifierEditor.cpp
++++ ovito/src/plugins/particles/gui/modifier/analysis/histogram/HistogramModifierEditor.cpp
+@@ -28,10 +28,10 @@
+ #include <gui/mainwin/MainWindow.h>
+ #include "HistogramModifierEditor.h"
+ 
+-#include <3rdparty/qwt/qwt_plot.h>
+-#include <3rdparty/qwt/qwt_plot_curve.h>
+-#include <3rdparty/qwt/qwt_plot_zoneitem.h>
+-#include <3rdparty/qwt/qwt_plot_grid.h>
++#include <qwt/qwt_plot.h>
++#include <qwt/qwt_plot_curve.h>
++#include <qwt/qwt_plot_zoneitem.h>
++#include <qwt/qwt_plot_grid.h>
+ 
+ namespace Ovito { namespace Particles { OVITO_BEGIN_INLINE_NAMESPACE(Modifiers) OVITO_BEGIN_INLINE_NAMESPACE(Analysis) OVITO_BEGIN_INLINE_NAMESPACE(Internal)
+ 
+Index: ovito/src/plugins/particles/gui/modifier/analysis/ptm/PolyhedralTemplateMatchingModifierEditor.cpp
+===================================================================
+--- ovito.orig/src/plugins/particles/gui/modifier/analysis/ptm/PolyhedralTemplateMatchingModifierEditor.cpp
++++ ovito/src/plugins/particles/gui/modifier/analysis/ptm/PolyhedralTemplateMatchingModifierEditor.cpp
+@@ -26,10 +26,10 @@
+ #include <gui/properties/FloatParameterUI.h>
+ #include "PolyhedralTemplateMatchingModifierEditor.h"
+ 
+-#include <3rdparty/qwt/qwt_plot.h>
+-#include <3rdparty/qwt/qwt_plot_curve.h>
+-#include <3rdparty/qwt/qwt_plot_zoneitem.h>
+-#include <3rdparty/qwt/qwt_plot_grid.h>
++#include <qwt/qwt_plot.h>
++#include <qwt/qwt_plot_curve.h>
++#include <qwt/qwt_plot_zoneitem.h>
++#include <qwt/qwt_plot_grid.h>
+ 
+ namespace Ovito { namespace Particles { OVITO_BEGIN_INLINE_NAMESPACE(Modifiers) OVITO_BEGIN_INLINE_NAMESPACE(Analysis) OVITO_BEGIN_INLINE_NAMESPACE(Internal)
+ 
+Index: ovito/src/plugins/particles/gui/modifier/analysis/scatterplot/ScatterPlotModifierEditor.cpp
+===================================================================
+--- ovito.orig/src/plugins/particles/gui/modifier/analysis/scatterplot/ScatterPlotModifierEditor.cpp
++++ ovito/src/plugins/particles/gui/modifier/analysis/scatterplot/ScatterPlotModifierEditor.cpp
+@@ -29,11 +29,11 @@
+ #include <gui/mainwin/MainWindow.h>
+ #include "ScatterPlotModifierEditor.h"
+ 
+-#include <3rdparty/qwt/qwt_plot.h>
+-#include <3rdparty/qwt/qwt_plot_spectrocurve.h>
+-#include <3rdparty/qwt/qwt_plot_zoneitem.h>
+-#include <3rdparty/qwt/qwt_plot_grid.h>
+-#include <3rdparty/qwt/qwt_color_map.h>
++#include <qwt/qwt_plot.h>
++#include <qwt/qwt_plot_spectrocurve.h>
++#include <qwt/qwt_plot_zoneitem.h>
++#include <qwt/qwt_plot_grid.h>
++#include <qwt/qwt_color_map.h>
+ 
+ namespace Ovito { namespace Particles { OVITO_BEGIN_INLINE_NAMESPACE(Modifiers) OVITO_BEGIN_INLINE_NAMESPACE(Analysis) OVITO_BEGIN_INLINE_NAMESPACE(Internal)
+ 
+Index: ovito/tests/scripts/test_suite/global_namespace.py
+===================================================================
+--- ovito.orig/tests/scripts/test_suite/global_namespace.py
++++ ovito/tests/scripts/test_suite/global_namespace.py
+@@ -1,9 +1,9 @@
+ from ovito import *
+ 
+ assert(len(ovito.version) == 3)
+-print(ovito.version_string)
+-print(ovito.gui_mode)
+-print(ovito.headless_mode)
++print("version_string=", ovito.version_string)
++print("gui_mode=", ovito.gui_mode)
++print("headless_mode=", ovito.headless_mode)
+ 
+ # Progress display
+ progress = ovito.get_progress_display()
diff --git a/debian/patches/series b/debian/patches/series
index b3bdb4a..70ecbe6 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,2 @@
 10_disable_povray.patch
+20_use_system_qwt.patch
diff --git a/debian/watch b/debian/watch
index 83f8a1d..84ae432 100644
--- a/debian/watch
+++ b/debian/watch
@@ -1,3 +1,3 @@
 version=3
-opts=repacksuffix=+dfsg1,filenamemangle=s/.*\.tar\.gz\?ref=v?(\d\S+)/<project>-$1\.tar\.gz/g \
+opts=repacksuffix=+dfsg2,filenamemangle=s/.*\.tar\.gz\?ref=v?(\d\S+)/<project>-$1\.tar\.gz/g \
        https://gitlab.com/stuko/ovito/tags?sort=updated_desc .*archive\.tar\.gz\?ref=v?(\d\S+)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ovito.git



More information about the debian-science-commits mailing list