mirror of
https://github.com/void-linux/void-packages.git
synced 2025-06-03 21:53:52 +02:00
PrusaSlicer: revbump for openexr3
This commit is contained in:
parent
d7cf53dc9c
commit
f249d184d3
3 changed files with 78 additions and 231 deletions
76
srcpkgs/PrusaSlicer/patches/prusa-slicer-openexr3.patch
Normal file
76
srcpkgs/PrusaSlicer/patches/prusa-slicer-openexr3.patch
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
diff -up PrusaSlicer-version_2.4.0/cmake/modules/FindOpenVDB.cmake.openexr3 PrusaSlicer-version_2.4.0/cmake/modules/FindOpenVDB.cmake
|
||||||
|
--- PrusaSlicer-version_2.4.0/cmake/modules/FindOpenVDB.cmake.openexr3 2021-12-21 15:57:35.000000000 +0000
|
||||||
|
+++ PrusaSlicer-version_2.4.0/cmake/modules/FindOpenVDB.cmake 2022-02-11 19:27:12.105404186 +0000
|
||||||
|
@@ -347,28 +347,10 @@ macro(just_fail msg)
|
||||||
|
return()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
-find_package(IlmBase QUIET)
|
||||||
|
-if(NOT IlmBase_FOUND)
|
||||||
|
- pkg_check_modules(IlmBase QUIET IlmBase)
|
||||||
|
-endif()
|
||||||
|
-if (IlmBase_FOUND AND NOT TARGET IlmBase::Half)
|
||||||
|
- message(STATUS "Falling back to IlmBase found by pkg-config...")
|
||||||
|
-
|
||||||
|
- find_library(IlmHalf_LIBRARY NAMES Half)
|
||||||
|
- if(IlmHalf_LIBRARY-NOTFOUND OR NOT IlmBase_INCLUDE_DIRS)
|
||||||
|
- just_fail("IlmBase::Half can not be found!")
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- add_library(IlmBase::Half UNKNOWN IMPORTED)
|
||||||
|
- set_target_properties(IlmBase::Half PROPERTIES
|
||||||
|
- IMPORTED_LOCATION "${IlmHalf_LIBRARY}"
|
||||||
|
- INTERFACE_INCLUDE_DIRECTORIES "${IlmBase_INCLUDE_DIRS}")
|
||||||
|
-elseif(NOT IlmBase_FOUND)
|
||||||
|
- just_fail("IlmBase::Half can not be found!")
|
||||||
|
-endif()
|
||||||
|
find_package(TBB ${_quiet} ${_required} COMPONENTS tbb)
|
||||||
|
find_package(ZLIB ${_quiet} ${_required})
|
||||||
|
find_package(Boost ${_quiet} ${_required} COMPONENTS iostreams system )
|
||||||
|
+find_package(Imath CONFIG)
|
||||||
|
|
||||||
|
# Use GetPrerequisites to see which libraries this OpenVDB lib has linked to
|
||||||
|
# which we can query for optional deps. This basically runs ldd/otoll/objdump
|
||||||
|
@@ -419,7 +401,7 @@ foreach(PREREQUISITE ${_OPENVDB_PREREQUI
|
||||||
|
set(OpenVDB_USES_LOG4CPLUS ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
- string(FIND ${PREREQUISITE} "IlmImf" _HAS_DEP)
|
||||||
|
+ string(FIND ${PREREQUISITE} "OpenEXR" _HAS_DEP)
|
||||||
|
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||||
|
set(OpenVDB_USES_ILM ON)
|
||||||
|
endif()
|
||||||
|
@@ -450,11 +432,7 @@ if(OpenVDB_USES_LOG4CPLUS)
|
||||||
|
find_package(Log4cplus ${_quiet} ${_required})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
-if(OpenVDB_USES_ILM)
|
||||||
|
- find_package(IlmBase ${_quiet} ${_required})
|
||||||
|
-endif()
|
||||||
|
-
|
||||||
|
-if(OpenVDB_USES_EXR)
|
||||||
|
+if(OpenVDB_USES_ILM OR OpenVDB_USES_EXR)
|
||||||
|
find_package(OpenEXR ${_quiet} ${_required})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
@@ -471,7 +449,7 @@ endif()
|
||||||
|
set(_OPENVDB_VISIBLE_DEPENDENCIES
|
||||||
|
Boost::iostreams
|
||||||
|
Boost::system
|
||||||
|
- IlmBase::Half
|
||||||
|
+ Imath::Imath
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_OPENVDB_DEFINITIONS)
|
||||||
|
@@ -481,10 +459,7 @@ endif()
|
||||||
|
|
||||||
|
if(OpenVDB_USES_EXR)
|
||||||
|
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES
|
||||||
|
- IlmBase::IlmThread
|
||||||
|
- IlmBase::Iex
|
||||||
|
- IlmBase::Imath
|
||||||
|
- OpenEXR::IlmImf
|
||||||
|
+ OpenEXR::OpenEXR
|
||||||
|
)
|
||||||
|
list(APPEND _OPENVDB_DEFINITIONS "-DOPENVDB_TOOLS_RAYTRACER_USE_EXR")
|
||||||
|
endif()
|
|
@ -1,229 +0,0 @@
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -326,7 +326,7 @@ endif()
|
|
||||||
# boost::process was introduced first in version 1.64.0,
|
|
||||||
# boost::beast::detail::base64 was introduced first in version 1.66.0
|
|
||||||
set(MINIMUM_BOOST_VERSION "1.66.0")
|
|
||||||
-set(_boost_components "system;filesystem;thread;log;locale;regex;chrono;atomic;date_time;iostreams")
|
|
||||||
+set(_boost_components "system;filesystem;thread;log;locale;regex;chrono;atomic;date_time;iostreams;nowide")
|
|
||||||
find_package(Boost ${MINIMUM_BOOST_VERSION} REQUIRED COMPONENTS ${_boost_components})
|
|
||||||
|
|
||||||
add_library(boost_libs INTERFACE)
|
|
||||||
--- a/src/CMakeLists.txt
|
|
||||||
+++ b/src/CMakeLists.txt
|
|
||||||
@@ -4,8 +4,6 @@ project(PrusaSlicer-native)
|
|
||||||
add_subdirectory(build-utils)
|
|
||||||
add_subdirectory(admesh)
|
|
||||||
add_subdirectory(avrdude)
|
|
||||||
-# boost/nowide
|
|
||||||
-add_subdirectory(boost)
|
|
||||||
add_subdirectory(clipper)
|
|
||||||
add_subdirectory(miniz)
|
|
||||||
add_subdirectory(glu-libtess)
|
|
||||||
--- a/src/libslic3r/CMakeLists.txt
|
|
||||||
+++ b/src/libslic3r/CMakeLists.txt
|
|
||||||
@@ -341,7 +341,6 @@ target_link_libraries(libslic3r
|
|
||||||
miniz
|
|
||||||
boost_libs
|
|
||||||
clipper
|
|
||||||
- nowide
|
|
||||||
${EXPAT_LIBRARIES}
|
|
||||||
glu-libtess
|
|
||||||
qhull
|
|
||||||
--- a/src/PrusaSlicer.cpp
|
|
||||||
+++ b/src/PrusaSlicer.cpp
|
|
||||||
@@ -25,9 +25,9 @@
|
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/nowide/args.hpp>
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/iostream.hpp>
|
|
||||||
-#include <boost/nowide/integration/filesystem.hpp>
|
|
||||||
+#include <boost/nowide/filesystem.hpp>
|
|
||||||
#include <boost/dll/runtime_symbol_info.hpp>
|
|
||||||
|
|
||||||
#include "unix/fhs.hpp" // Generated by CMake from ../platform/unix/fhs.hpp.in
|
|
||||||
--- a/src/libslic3r/pchheader.hpp
|
|
||||||
+++ b/src/libslic3r/pchheader.hpp
|
|
||||||
@@ -81,12 +81,12 @@
|
|
||||||
#include <boost/log/expressions.hpp>
|
|
||||||
#include <boost/log/trivial.hpp>
|
|
||||||
#include <boost/multi_array.hpp>
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/convert.hpp>
|
|
||||||
#include <boost/nowide/cstdio.hpp>
|
|
||||||
#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
|
||||||
-#include <boost/nowide/integration/filesystem.hpp>
|
|
||||||
+#include <boost/nowide/filesystem.hpp>
|
|
||||||
#include <boost/nowide/iostream.hpp>
|
|
||||||
|
|
||||||
// boost/property_tree/json_parser/detail/parser.hpp includes boost/bind.hpp, which is deprecated.
|
|
||||||
--- a/src/libslic3r/AppConfig.cpp
|
|
||||||
+++ b/src/libslic3r/AppConfig.cpp
|
|
||||||
@@ -12,7 +12,7 @@
|
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
#include <boost/filesystem/operations.hpp>
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
|
||||||
#include <boost/property_tree/ini_parser.hpp>
|
|
||||||
#include <boost/property_tree/ptree_fwd.hpp>
|
|
||||||
--- a/src/libslic3r/Config.cpp
|
|
||||||
+++ b/src/libslic3r/Config.cpp
|
|
||||||
@@ -16,7 +16,7 @@
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#include <boost/foreach.hpp>
|
|
||||||
#include <boost/lexical_cast.hpp>
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/iostream.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
|
||||||
#include <boost/property_tree/ini_parser.hpp>
|
|
||||||
--- a/src/libslic3r/GCode/PostProcessor.cpp
|
|
||||||
+++ b/src/libslic3r/GCode/PostProcessor.cpp
|
|
||||||
@@ -9,7 +9,7 @@
|
|
||||||
#include <boost/format.hpp>
|
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/nowide/convert.hpp>
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
--- a/src/libslic3r/Preset.cpp
|
|
||||||
+++ b/src/libslic3r/Preset.cpp
|
|
||||||
@@ -30,7 +30,7 @@
|
|
||||||
#include <boost/algorithm/string.hpp>
|
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
|
||||||
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/convert.hpp>
|
|
||||||
#include <boost/nowide/cstdio.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
|
||||||
--- a/src/libslic3r/PresetBundle.cpp
|
|
||||||
+++ b/src/libslic3r/PresetBundle.cpp
|
|
||||||
@@ -14,7 +14,7 @@
|
|
||||||
#include <boost/algorithm/clamp.hpp>
|
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
|
||||||
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/cstdio.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
|
||||||
#include <boost/property_tree/ini_parser.hpp>
|
|
||||||
--- a/src/slic3r/pchheader.hpp
|
|
||||||
+++ b/src/slic3r/pchheader.hpp
|
|
||||||
@@ -73,7 +73,7 @@
|
|
||||||
#include <boost/locale.hpp>
|
|
||||||
#include <boost/locale/encoding_utf.hpp>
|
|
||||||
#include <boost/log/trivial.hpp>
|
|
||||||
-#include <boost/nowide/cenv.hpp>
|
|
||||||
+#include <boost/nowide/cstdlib.hpp>
|
|
||||||
#include <boost/nowide/convert.hpp>
|
|
||||||
#include <boost/nowide/cstdio.hpp>
|
|
||||||
#include <boost/nowide/fstream.hpp>
|
|
||||||
--- a/src/slic3r/GUI/Plater.cpp
|
|
||||||
+++ b/src/slic3r/GUI/Plater.cpp
|
|
||||||
@@ -1339,7 +1339,7 @@ void Sidebar::update_sliced_info_sizer()
|
|
||||||
wxString t_est = std::isnan(ps.estimated_print_time) ? "N/A" : get_time_dhms(float(ps.estimated_print_time));
|
|
||||||
p->sliced_info->SetTextAndShow(siEstimatedTime, t_est, _L("Estimated printing time") + ":");
|
|
||||||
|
|
||||||
- p->plater->get_notification_manager()->set_slicing_complete_print_time(_utf8("Estimated printing time: ") + boost::nowide::narrow(t_est), p->plater->is_sidebar_collapsed());
|
|
||||||
+ p->plater->get_notification_manager()->set_slicing_complete_print_time(static_cast<const char*>((_utf8("Estimated printing time: ") + t_est.utf8_str()).utf8_str()), p->plater->is_sidebar_collapsed());
|
|
||||||
|
|
||||||
// Hide non-SLA sliced info parameters
|
|
||||||
p->sliced_info->SetTextAndShow(siFilament_m, "N/A");
|
|
||||||
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
|
|
||||||
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
|
|
||||||
@@ -4153,7 +4153,7 @@ void ObjectList::fix_through_netfabb()
|
|
||||||
}
|
|
||||||
if (msg.IsEmpty())
|
|
||||||
msg = _L("Repairing was canceled");
|
|
||||||
- plater->get_notification_manager()->push_notification(NotificationType::NetfabbFinished, NotificationManager::NotificationLevel::PrintInfoShortNotificationLevel, boost::nowide::narrow(msg));
|
|
||||||
+ plater->get_notification_manager()->push_notification(NotificationType::NetfabbFinished, NotificationManager::NotificationLevel::PrintInfoShortNotificationLevel, static_cast<const char *>(msg.utf8_str()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ObjectList::simplify()
|
|
||||||
--- a/src/slic3r/GUI/PrintHostDialogs.cpp
|
|
||||||
+++ b/src/slic3r/GUI/PrintHostDialogs.cpp
|
|
||||||
@@ -411,7 +411,7 @@ void PrintHostQueueDialog::on_progress(E
|
|
||||||
wxVariant nm, hst;
|
|
||||||
job_list->GetValue(nm, evt.job_id, COL_FILENAME);
|
|
||||||
job_list->GetValue(hst, evt.job_id, COL_HOST);
|
|
||||||
- wxGetApp().notification_manager()->set_upload_job_notification_percentage(evt.job_id + 1, boost::nowide::narrow(nm.GetString()), boost::nowide::narrow(hst.GetString()), evt.progress / 100.f);
|
|
||||||
+ wxGetApp().notification_manager()->set_upload_job_notification_percentage(evt.job_id + 1, nm.GetString().ToStdString(), hst.GetString().ToStdString(), evt.progress / 100.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -432,7 +432,7 @@ void PrintHostQueueDialog::on_error(Even
|
|
||||||
wxVariant nm, hst;
|
|
||||||
job_list->GetValue(nm, evt.job_id, COL_FILENAME);
|
|
||||||
job_list->GetValue(hst, evt.job_id, COL_HOST);
|
|
||||||
- wxGetApp().notification_manager()->upload_job_notification_show_error(evt.job_id + 1, boost::nowide::narrow(nm.GetString()), boost::nowide::narrow(hst.GetString()));
|
|
||||||
+ wxGetApp().notification_manager()->upload_job_notification_show_error(evt.job_id + 1, nm.GetString().ToStdString(), hst.GetString().ToStdString());
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintHostQueueDialog::on_cancel(Event &evt)
|
|
||||||
@@ -447,7 +447,7 @@ void PrintHostQueueDialog::on_cancel(Eve
|
|
||||||
wxVariant nm, hst;
|
|
||||||
job_list->GetValue(nm, evt.job_id, COL_FILENAME);
|
|
||||||
job_list->GetValue(hst, evt.job_id, COL_HOST);
|
|
||||||
- wxGetApp().notification_manager()->upload_job_notification_show_canceled(evt.job_id + 1, boost::nowide::narrow(nm.GetString()), boost::nowide::narrow(hst.GetString()));
|
|
||||||
+ wxGetApp().notification_manager()->upload_job_notification_show_canceled(evt.job_id + 1, nm.GetString().ToStdString(), hst.GetString().ToStdString());
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintHostQueueDialog::get_active_jobs(std::vector<std::pair<std::string, std::string>>& ret)
|
|
||||||
--- a/src/slic3r/GUI/Search.cpp
|
|
||||||
+++ b/src/slic3r/GUI/Search.cpp
|
|
||||||
@@ -239,7 +239,7 @@ bool OptionsSearcher::search(const std::
|
|
||||||
const Option &opt = options[i];
|
|
||||||
if (full_list) {
|
|
||||||
std::string label = into_u8(get_label(opt));
|
|
||||||
- found.emplace_back(FoundOption{ label, label, boost::nowide::narrow(get_tooltip(opt)), i, 0 });
|
|
||||||
+ found.emplace_back(FoundOption{ label, label, get_tooltip(opt).ToStdString(), i, 0 });
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -276,7 +276,7 @@ bool OptionsSearcher::search(const std::
|
|
||||||
boost::erase_all(label_plain, std::string(1, char(ImGui::ColorMarkerStart)));
|
|
||||||
boost::erase_all(label_plain, std::string(1, char(ImGui::ColorMarkerEnd)));
|
|
||||||
#endif
|
|
||||||
- found.emplace_back(FoundOption{ label_plain, label_u8, boost::nowide::narrow(get_tooltip(opt)), i, score });
|
|
||||||
+ found.emplace_back(FoundOption{ label_plain, label_u8, get_tooltip(opt).ToStdString(), i, score });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--- a/src/slic3r/GUI/DesktopIntegrationDialog.cpp
|
|
||||||
+++ b/src/slic3r/GUI/DesktopIntegrationDialog.cpp
|
|
||||||
@@ -118,7 +118,7 @@ void resolve_path_from_var(const std::st
|
|
||||||
wxString wxdirs;
|
|
||||||
if (! wxGetEnv(boost::nowide::widen(var), &wxdirs) || wxdirs.empty() )
|
|
||||||
return;
|
|
||||||
- std::string dirs = boost::nowide::narrow(wxdirs);
|
|
||||||
+ std::string dirs = wxdirs.ToStdString();
|
|
||||||
for (size_t i = dirs.find(':'); i != std::string::npos; i = dirs.find(':'))
|
|
||||||
{
|
|
||||||
paths.push_back(dirs.substr(0, i));
|
|
||||||
@@ -303,7 +303,7 @@ void DesktopIntegrationDialog::perform_d
|
|
||||||
// if all failed - try creating default home folder
|
|
||||||
if (i == target_candidates.size() - 1) {
|
|
||||||
// create $HOME/.local/share
|
|
||||||
- create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/icons" + icon_theme_dirs);
|
|
||||||
+ create_path(wxFileName::GetHomeDir().ToStdString(), ".local/share/icons" + icon_theme_dirs);
|
|
||||||
// copy icon
|
|
||||||
target_dir_icons = GUI::format("%1%/.local/share",wxFileName::GetHomeDir());
|
|
||||||
std::string icon_path = GUI::format("%1%/icons/PrusaSlicer.png",resources_dir());
|
|
||||||
@@ -355,7 +355,7 @@ void DesktopIntegrationDialog::perform_d
|
|
||||||
// if all failed - try creating default home folder
|
|
||||||
if (i == target_candidates.size() - 1) {
|
|
||||||
// create $HOME/.local/share
|
|
||||||
- create_path(boost::nowide::narrow(wxFileName::GetHomeDir()), ".local/share/applications");
|
|
||||||
+ create_path(wxFileName::GetHomeDir().ToStdString(), ".local/share/applications");
|
|
||||||
// create desktop file
|
|
||||||
target_dir_desktop = GUI::format("%1%/.local/share",wxFileName::GetHomeDir());
|
|
||||||
std::string path = GUI::format("%1%/applications/PrusaSlicer%2%.desktop", target_dir_desktop, version_suffix);
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Template file for 'PrusaSlicer'
|
# Template file for 'PrusaSlicer'
|
||||||
pkgname=PrusaSlicer
|
pkgname=PrusaSlicer
|
||||||
version=2.4.2
|
version=2.4.2
|
||||||
revision=3
|
revision=4
|
||||||
build_style=cmake
|
build_style=cmake
|
||||||
build_helper="qemu cmake-wxWidgets-gtk3"
|
build_helper="qemu cmake-wxWidgets-gtk3"
|
||||||
# Pre-Compiled Headers seems to be slower
|
# Pre-Compiled Headers seems to be slower
|
||||||
|
@ -11,7 +11,7 @@ hostmakedepends="pkg-config"
|
||||||
makedepends=" boost-devel cereal cgal-devel dbus-devel eigen glew-devel
|
makedepends=" boost-devel cereal cgal-devel dbus-devel eigen glew-devel
|
||||||
glu-devel gmpxx-devel gtest-devel gtk+3-devel libcurl-devel libglib-devel
|
glu-devel gmpxx-devel gtest-devel gtk+3-devel libcurl-devel libglib-devel
|
||||||
libpng-devel nlopt-devel openvdb-devel tbb-devel wxWidgets-devel mpfr-devel
|
libpng-devel nlopt-devel openvdb-devel tbb-devel wxWidgets-devel mpfr-devel
|
||||||
c-blosc-devel ilmbase-devel libopenexr-devel wxWidgets-gtk3-devel"
|
c-blosc-devel imath-devel libopenexr-devel wxWidgets-gtk3-devel"
|
||||||
short_desc="G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)"
|
short_desc="G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)"
|
||||||
maintainer="Jasper Chan <jasperchan515@gmail.com>"
|
maintainer="Jasper Chan <jasperchan515@gmail.com>"
|
||||||
license="GPL-3.0-or-later"
|
license="GPL-3.0-or-later"
|
||||||
|
|
Loading…
Add table
Reference in a new issue