From 3e5c9ab40fa179a81d61fb348f0a601b95cafdd5 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 18 Apr 2024 23:47:45 +0200 Subject: [PATCH 01/88] Use external seq arrange binary (for prototyping only) --- src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/ArrangeHelper.cpp | 218 +++++++++++++++++++++++++++++++ src/slic3r/GUI/ArrangeHelper.hpp | 12 ++ src/slic3r/GUI/GLCanvas3D.cpp | 45 ++++++- 4 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 src/slic3r/GUI/ArrangeHelper.cpp create mode 100644 src/slic3r/GUI/ArrangeHelper.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 3e1a8eed41..baec0f0869 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -17,6 +17,8 @@ set(SLIC3R_GUI_SOURCES pchheader.hpp GUI/AboutDialog.cpp GUI/AboutDialog.hpp + GUI/ArrangeHelper.cpp + GUI/ArrangeHelper.hpp GUI/ArrangeSettingsDialogImgui.hpp GUI/ArrangeSettingsDialogImgui.cpp GUI/UserAccountCommunication.cpp diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp new file mode 100644 index 0000000000..5b39409eab --- /dev/null +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -0,0 +1,218 @@ +#include "ArrangeHelper.hpp" + +#include "libslic3r/Model.hpp" +#include "libslic3r/TriangleMesh.hpp" + +#include "boost/algorithm/string/split.hpp" +#include "boost/filesystem/path.hpp" + +#include + + +namespace Slic3r { + + + +static bool find_and_remove(std::string& src, const std::string& key) +{ + size_t pos = src.find(key); + if (pos != std::string::npos) { + src.erase(pos, key.length()); + return true; + } + return false; +} + +struct ObjectToPrint { + int id = 0; + coord_t total_height = 0; + std::vector> pgns_at_height; +}; + +std::vector load_exported_data(const std::string& filename) +{ + std::vector objects_to_print; + + std::ifstream in(filename); + if (! in) + throw std::runtime_error("NO EXPORTED FILE WAS FOUND"); + std::string line; + + while (in) { + std::getline(in, line); + if (find_and_remove(line, "OBJECT_ID")) { + objects_to_print.push_back(ObjectToPrint()); + objects_to_print.back().id = std::stoi(line); + } + if (find_and_remove(line, "TOTAL_HEIGHT")) + objects_to_print.back().total_height = std::stoi(line); + if (find_and_remove(line, "POLYGON_AT_HEIGHT")) + objects_to_print.back().pgns_at_height.emplace_back(std::make_pair(std::stoi(line), Polygon())); + if (find_and_remove(line, "POINT")) { + std::stringstream ss(line); + std::string val; + ss >> val; + Point pt(std::stoi(val), 0); + ss >> val; + pt.y() = std::stoi(val); + objects_to_print.back().pgns_at_height.back().second.append(pt); + } + } + return objects_to_print; +} + +std::vector read_required_heights() +{ + std::vector heights; + std::ifstream out("printer_geometry.mk4.txt"); + std::string line; + std::array keys = {"CONVEX_HEIGHT", "BOX_HEIGHT"}; + while (out) { + std::getline(out, line); + for (const std::string& key : keys) { + if (size_t pos = line.find(key); pos != std::string::npos) { + line = line.substr(pos + key.size()); + heights.push_back(double(std::stoi(line)) * SCALING_FACTOR); + break; + } + } + } + return heights; +} + + + +void export_arrange_data(const Model& model, const std::vector& heights) +{ + std::ofstream out("arrange_data_export.txt"); + for (const ModelObject* mo : model.objects) { + // Calculate polygon describing convex hull of everything above given heights. + const ModelInstance* mi = mo->instances.front(); + out << "OBJECT_ID" << mo->id().id << std::endl; + out << "TOTAL_HEIGHT" << scaled(mo->instance_bounding_box(0).size().z()) << std::endl;; + for (double height : heights) { + auto tr = Transform3d::Identity(); + Vec3d offset = mi->get_offset(); + tr.translate(Vec3d(-offset.x(), -offset.y(), 0.)); + Polygon pgn = its_convex_hull_2d_above(mo->mesh().its, tr.cast(), height); + out << "POLYGON_AT_HEIGHT" << scaled(height) << std::endl; + for (const Point& pt : pgn) + out << "POINT" << pt.x() << " " << pt.y() << std::endl; + } + } +} + + + + +void import_arrange_data(Model& model, bool delete_files) +{ + // First go through all files in the current directory + // and remember all which match the pattern. + namespace fs = boost::filesystem; + fs::path p("."); + fs::directory_iterator end_itr; + std::vector filenames; + for (fs::directory_iterator itr(p); itr != end_itr; ++itr) + { + if (fs::is_regular_file(itr->path())) { + std::string name = itr->path().filename().string(); + if (boost::starts_with(name, "arrange_data_import") && boost::ends_with(name, ".txt")) + filenames.emplace_back(name); + } + } + // Sort the files alphabetically. + std::sort(filenames.begin(), filenames.end()); + + + struct MoveData { + size_t id; + coord_t x; + coord_t y; + size_t bed_idx; + }; + + // A vector to collect move data for all the files. + std::vector move_data_all; + + + // Now iterate through all the files, read the data and move the objects accordingly. + // Save the move data from this file to move_data_all. + size_t bed_idx = 0; + for (const std::string& name : filenames) { + std::cout << " - loading file " << name << "..." << std::endl; + std::ifstream in(name); + + std::string line; + std::vector move_data; + while (in) { + std::getline(in, line); + std::vector values; + boost::split(values, line, boost::is_any_of(" ")); + if (values.size() > 2) + move_data.emplace_back(MoveData{size_t(std::stoi(values[0])), std::stoi(values[1]), std::stoi(values[2]), bed_idx}); + } + + // Iterate the same way as when exporting. + for (ModelObject* mo : model.objects) { + ModelInstance* mi = mo->instances.front(); + const ObjectID& oid = mo->id(); + auto it = std::find_if(move_data.begin(), move_data.end(), [&oid](const auto& md) { return md.id == oid.id; }); + if (it != move_data.end()) { + mi->set_offset(Vec3d(unscaled(it->x) + bed_idx * 300, unscaled(it->y), mi->get_offset().z())); + } + } + move_data_all.insert(move_data_all.end(), move_data.begin(), move_data.end()); + ++bed_idx; + } + + if (delete_files) { + std::cout << " - removing all the files..."; + for (const std::string& name : filenames) + fs::remove(fs::path(name)); + std::cout << "done" << std::endl; + } + + // Now reorder the objects in the model so they are in the same order as requested. + auto comp = [&move_data_all](ModelObject* mo1, ModelObject* mo2) { + auto it1 = std::find_if(move_data_all.begin(), move_data_all.end(), [&mo1](const auto& md) { return md.id == mo1->id().id; }); + auto it2 = std::find_if(move_data_all.begin(), move_data_all.end(), [&mo2](const auto& md) { return md.id == mo2->id().id; }); + return it1->bed_idx == it2->bed_idx ? it1 < it2 : it1->bed_idx < it2->bed_idx; + }; + std::sort(model.objects.begin(), model.objects.end(), comp); +} + + + +void export_run_and_import_arrange_data(Model& model, const std::string& cmd, bool delete_files) +{ + std::cout << "Reading height from printer_geometry.mk4.txt" << std::endl; + std::vector heights = read_required_heights(); + if (heights.empty()) { + std::cout << "unable" << std::endl; + return; + } + + std::cout << "Exporting the arrange data..."; + export_arrange_data(model, heights); + std::cout << "done" << std::endl; + + std::cout << "Running " << cmd << std::endl; + int out = wxExecute(wxString::FromUTF8(cmd), wxEXEC_SYNC); + if (out == -1) { + std::cout << "unable" << std::endl; + return; + } + std::cout << "sequential_prusa returned " << out << (out == 0 ? ": ok" : ": appears to be an error") << std::endl; + + if (out ==0 ) { + std::cout << "Importing the arrange data..." << std::endl; + import_arrange_data(model, delete_files); + std::cout << "Import done" << std::endl; + } +} + + + + +} diff --git a/src/slic3r/GUI/ArrangeHelper.hpp b/src/slic3r/GUI/ArrangeHelper.hpp new file mode 100644 index 0000000000..63cc351e56 --- /dev/null +++ b/src/slic3r/GUI/ArrangeHelper.hpp @@ -0,0 +1,12 @@ +#ifndef slic3r_Arrange_Helper_hpp +#define slic3r_Arrange_Helper_hpp + +class Model; + +namespace Slic3r { + void export_run_and_import_arrange_data(Model&, const std::string&, bool); + void export_arrange_data(const Model& model, const std::vector& heights); + void import_arrange_data(Model& model, bool delete_files); +} + +#endif // slic3r_Arrange_Helper_hpp \ No newline at end of file diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 51d6de463e..4eda5dca27 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -44,6 +44,7 @@ #include "I18N.hpp" #include "NotificationManager.hpp" #include "format.hpp" +#include "ArrangeHelper.hpp" #include "slic3r/GUI/BitmapCache.hpp" #include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" @@ -2217,7 +2218,49 @@ void GLCanvas3D::render() #endif // SHOW_IMGUI_DEMO_WINDOW - + + + { + // This is just temporary pipe to export data to the separate arrange algorithm + // and importing the result back. TESTING ONLY !!! + ImGui::Begin("TESTING ONLY (arrange)"); + static bool decimation = true; + static bool precision_high = false; + static bool assumptions = false; + static int object_group_size = 4; + static bool delete_files = true; + static std::string printer_file = "printer_geometry.mk4.txt"; + ImGui::Checkbox("Decimation", &decimation); + ImGui::Checkbox("Precision", &precision_high); + ImGui::Checkbox("Assumptions", &assumptions); + ImGui::InputInt("Group size", &object_group_size); + wxGetApp().imgui()->disabled_begin(true); + ImGui::InputText("Printer file", printer_file.data(), printer_file.size()); + wxGetApp().imgui()->disabled_end(); + ImGui::Separator(); + ImGui::Checkbox("Delete files after use", &delete_files); + + std::stringstream ss; + ss << "./sequential_prusa" + << " --decimation=" << (decimation ? "yes" : "no") + << " --precision=" << (precision_high ? "high" : "low") + << " --assumptions=" << (assumptions ? "yes" : "no") + << " --object-group-size=" << object_group_size + << " --printer-file=" << printer_file + << " --interactive=no"; + ImGui::Text((std::string("Command: '") + ss.str() + "'").c_str()); + + + if (ImGui::Button("Do external arrange")) { + export_run_and_import_arrange_data(wxGetApp().plater()->model(), ss.str(), delete_files); + reload_scene(true, true); + wxGetApp().obj_list()->update_after_undo_redo(); + } + ImGui::End(); + } + + + const bool is_looking_downward = camera.is_looking_downward(); From 614ab6bdb99cf34d3f83a7138456bf5bc2d46f06 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Sun, 29 Sep 2024 13:16:49 +0200 Subject: [PATCH 02/88] Added z3 dep and libseqarrange dir --- deps/+z3/z3.cmake | 15 + src/CMakeLists.txt | 5 +- src/libseqarrange/CMakeLists.txt | 5 + .../data/arrange_data_export.txt | 300 + .../data/arrange_data_export.txt.1 | 280 + .../data/arrange_data_export.txt.10 | 16 + .../data/arrange_data_export.txt.11 | 54 + .../data/arrange_data_export.txt.12 | 27 + .../data/arrange_data_export.txt.13 | 12 + .../data/arrange_data_export.txt.14 | 16 + .../data/arrange_data_export.txt.15 | 20 + .../data/arrange_data_export.txt.16 | 27 + .../data/arrange_data_export.txt.17 | 81 + .../data/arrange_data_export.txt.2 | 1396 ++ .../data/arrange_data_export.txt.3 | 64 + .../data/arrange_data_export.txt.4 | 300 + .../data/arrange_data_export.txt.5 | 19054 ++++++++++++++++ .../data/arrange_data_export.txt.6 | 300 + .../data/arrange_data_export.txt.7 | 995 + .../data/arrange_data_export.txt.8 | 203 + .../data/arrange_data_export.txt.9 | 209 + .../data/arrange_data_export.txt.body.mk4 | 116 + .../data/arrange_data_export.txt.composed.mk4 | 88 + .../arrange_data_export.txt.composed_hose.mk4 | 24 + .../data/arrange_data_export.txt.extruder.mk4 | 135 + .../data/arrange_data_export.txt.fan.mk4 | 139 + .../data/arrange_data_export.txt.gantry.mk4 | 416 + .../data/arrange_data_export.txt.hose.mk4 | 102 + .../data/arrange_data_export.txt.nozzle.mk4 | 385 + .../data/arrange_data_import.txt | 103 + .../data/arrange_data_import.txt.1 | 3 + .../data/arrange_data_import.txt.2 | 5 + .../data/arrange_data_import.txt.3 | 4 + .../data/arrange_data_import_000.txt | 6 + .../data/arrange_data_import_001.txt | 5 + .../data/arrange_data_import_002.txt | 2 + src/libseqarrange/data/combo_body.txt | 38 + src/libseqarrange/data/combo_fac.txt | 38 + src/libseqarrange/data/combo_fan.txt | 38 + src/libseqarrange/data/combo_gantry.txt | 36 + src/libseqarrange/data/combo_hose.txt | 32 + src/libseqarrange/data/combo_nozzle.txt | 47 + src/libseqarrange/data/export.body.mk4 | 35 + src/libseqarrange/data/export.composed.mk4 | 90 + src/libseqarrange/data/export.fan.mk4 | 35 + src/libseqarrange/data/export.gantry.mk4 | 33 + src/libseqarrange/data/export.hose.mk4 | 29 + src/libseqarrange/data/export.nozzle.mk4 | 44 + .../data/extruder_bounding_boxes.mk4.svg | 20 + src/libseqarrange/data/polygon_test_10.svg | 12 + src/libseqarrange/data/polygon_test_11.svg | 12 + src/libseqarrange/data/polygon_test_12.svg | 12 + src/libseqarrange/data/polygon_test_13.svg | 20 + src/libseqarrange/data/polygon_test_14.svg | 20 + src/libseqarrange/data/polygon_test_15.svg | 10 + src/libseqarrange/data/polygon_test_7.svg | 11 + src/libseqarrange/data/polygon_test_8.svg | 11 + src/libseqarrange/data/polygon_test_9.svg | 11 + src/libseqarrange/data/preprocess_test_1.svg | 9 + src/libseqarrange/data/preprocess_test_2.svg | 28 + src/libseqarrange/data/preprocess_test_3.svg | 11 + src/libseqarrange/data/preprocess_test_4.svg | 15 + src/libseqarrange/data/preprocess_test_5.svg | 10 + src/libseqarrange/data/preprocess_test_6.svg | 71 + .../data/sequential_decimator.svg | 20 + src/libseqarrange/data/sequential_prusa.svg | 16 + .../data/sequential_prusa_000.svg | 54 + .../data/sequential_prusa_001.svg | 51 + .../data/sequential_prusa_002.svg | 27 + src/libseqarrange/data/sequential_test_4.svg | 16 + src/libseqarrange/data/sequential_test_5.svg | 18 + src/libseqarrange/data/sequential_test_6.svg | 16 + src/libseqarrange/data/sequential_test_7.svg | 42 + src/libseqarrange/include/seq_defs.hpp | 73 + src/libseqarrange/include/seq_interface.hpp | 123 + src/libseqarrange/include/seq_preprocess.hpp | 220 + src/libseqarrange/include/seq_sequential.hpp | 1713 ++ src/libseqarrange/include/seq_step | 1 + src/libseqarrange/include/seq_utilities.hpp | 47 + src/libseqarrange/include/seq_version.hpp | 7 + src/libseqarrange/include/seq_version.sh | 7 + .../printers/printer_geometry.mk3s.txt | 31 + .../printer_geometry.mk4.compatibility.txt | 43 + .../printers/printer_geometry.mk4.txt | 45 + src/libseqarrange/src/CMakeLists.txt | 23 + src/libseqarrange/src/seq_interface.cpp | 1101 + src/libseqarrange/src/seq_preprocess.cpp | 965 + src/libseqarrange/src/seq_sequential.cpp | 10158 ++++++++ src/libseqarrange/src/seq_utilities.cpp | 201 + .../src/sequential_decimator.cpp | 411 + .../src/sequential_decimator.hpp | 73 + src/libseqarrange/src/sequential_prusa.cpp | 811 + src/libseqarrange/src/sequential_prusa.hpp | 65 + src/libseqarrange/test/CMakeLists.txt | 22 + src/libseqarrange/test/prusaparts.cpp | 5981 +++++ src/libseqarrange/test/prusaparts.hpp | 14 + .../test/seq_test_arrangement.cpp | 1023 + .../test/seq_test_arrangement.hpp | 44 + src/libseqarrange/test/seq_test_interface.cpp | 413 + src/libseqarrange/test/seq_test_interface.hpp | 35 + src/libseqarrange/test/seq_test_polygon.cpp | 3054 +++ src/libseqarrange/test/seq_test_polygon.hpp | 67 + .../test/seq_test_preprocess.cpp | 1134 + .../test/seq_test_preprocess.hpp | 38 + .../test/seq_test_sequential.cpp | 2307 ++ .../test/seq_test_sequential.hpp | 41 + 106 files changed, 56240 insertions(+), 1 deletion(-) create mode 100644 deps/+z3/z3.cmake create mode 100644 src/libseqarrange/CMakeLists.txt create mode 100644 src/libseqarrange/data/arrange_data_export.txt create mode 100644 src/libseqarrange/data/arrange_data_export.txt.1 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.10 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.11 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.12 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.13 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.14 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.15 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.16 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.17 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.2 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.3 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.5 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.6 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.7 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.8 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.9 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.body.mk4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.composed.mk4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.fan.mk4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.hose.mk4 create mode 100644 src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 create mode 100644 src/libseqarrange/data/arrange_data_import.txt create mode 100644 src/libseqarrange/data/arrange_data_import.txt.1 create mode 100644 src/libseqarrange/data/arrange_data_import.txt.2 create mode 100644 src/libseqarrange/data/arrange_data_import.txt.3 create mode 100644 src/libseqarrange/data/arrange_data_import_000.txt create mode 100644 src/libseqarrange/data/arrange_data_import_001.txt create mode 100644 src/libseqarrange/data/arrange_data_import_002.txt create mode 100644 src/libseqarrange/data/combo_body.txt create mode 100644 src/libseqarrange/data/combo_fac.txt create mode 100644 src/libseqarrange/data/combo_fan.txt create mode 100644 src/libseqarrange/data/combo_gantry.txt create mode 100644 src/libseqarrange/data/combo_hose.txt create mode 100644 src/libseqarrange/data/combo_nozzle.txt create mode 100644 src/libseqarrange/data/export.body.mk4 create mode 100644 src/libseqarrange/data/export.composed.mk4 create mode 100644 src/libseqarrange/data/export.fan.mk4 create mode 100644 src/libseqarrange/data/export.gantry.mk4 create mode 100644 src/libseqarrange/data/export.hose.mk4 create mode 100644 src/libseqarrange/data/export.nozzle.mk4 create mode 100644 src/libseqarrange/data/extruder_bounding_boxes.mk4.svg create mode 100644 src/libseqarrange/data/polygon_test_10.svg create mode 100644 src/libseqarrange/data/polygon_test_11.svg create mode 100644 src/libseqarrange/data/polygon_test_12.svg create mode 100644 src/libseqarrange/data/polygon_test_13.svg create mode 100644 src/libseqarrange/data/polygon_test_14.svg create mode 100644 src/libseqarrange/data/polygon_test_15.svg create mode 100644 src/libseqarrange/data/polygon_test_7.svg create mode 100644 src/libseqarrange/data/polygon_test_8.svg create mode 100644 src/libseqarrange/data/polygon_test_9.svg create mode 100644 src/libseqarrange/data/preprocess_test_1.svg create mode 100644 src/libseqarrange/data/preprocess_test_2.svg create mode 100644 src/libseqarrange/data/preprocess_test_3.svg create mode 100644 src/libseqarrange/data/preprocess_test_4.svg create mode 100644 src/libseqarrange/data/preprocess_test_5.svg create mode 100644 src/libseqarrange/data/preprocess_test_6.svg create mode 100644 src/libseqarrange/data/sequential_decimator.svg create mode 100644 src/libseqarrange/data/sequential_prusa.svg create mode 100644 src/libseqarrange/data/sequential_prusa_000.svg create mode 100644 src/libseqarrange/data/sequential_prusa_001.svg create mode 100644 src/libseqarrange/data/sequential_prusa_002.svg create mode 100644 src/libseqarrange/data/sequential_test_4.svg create mode 100644 src/libseqarrange/data/sequential_test_5.svg create mode 100644 src/libseqarrange/data/sequential_test_6.svg create mode 100644 src/libseqarrange/data/sequential_test_7.svg create mode 100644 src/libseqarrange/include/seq_defs.hpp create mode 100644 src/libseqarrange/include/seq_interface.hpp create mode 100644 src/libseqarrange/include/seq_preprocess.hpp create mode 100644 src/libseqarrange/include/seq_sequential.hpp create mode 100644 src/libseqarrange/include/seq_step create mode 100644 src/libseqarrange/include/seq_utilities.hpp create mode 100644 src/libseqarrange/include/seq_version.hpp create mode 100644 src/libseqarrange/include/seq_version.sh create mode 100644 src/libseqarrange/printers/printer_geometry.mk3s.txt create mode 100644 src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt create mode 100644 src/libseqarrange/printers/printer_geometry.mk4.txt create mode 100644 src/libseqarrange/src/CMakeLists.txt create mode 100644 src/libseqarrange/src/seq_interface.cpp create mode 100644 src/libseqarrange/src/seq_preprocess.cpp create mode 100644 src/libseqarrange/src/seq_sequential.cpp create mode 100644 src/libseqarrange/src/seq_utilities.cpp create mode 100644 src/libseqarrange/src/sequential_decimator.cpp create mode 100644 src/libseqarrange/src/sequential_decimator.hpp create mode 100644 src/libseqarrange/src/sequential_prusa.cpp create mode 100644 src/libseqarrange/src/sequential_prusa.hpp create mode 100644 src/libseqarrange/test/CMakeLists.txt create mode 100644 src/libseqarrange/test/prusaparts.cpp create mode 100644 src/libseqarrange/test/prusaparts.hpp create mode 100644 src/libseqarrange/test/seq_test_arrangement.cpp create mode 100644 src/libseqarrange/test/seq_test_arrangement.hpp create mode 100644 src/libseqarrange/test/seq_test_interface.cpp create mode 100644 src/libseqarrange/test/seq_test_interface.hpp create mode 100644 src/libseqarrange/test/seq_test_polygon.cpp create mode 100644 src/libseqarrange/test/seq_test_polygon.hpp create mode 100644 src/libseqarrange/test/seq_test_preprocess.cpp create mode 100644 src/libseqarrange/test/seq_test_preprocess.hpp create mode 100644 src/libseqarrange/test/seq_test_sequential.cpp create mode 100644 src/libseqarrange/test/seq_test_sequential.hpp diff --git a/deps/+z3/z3.cmake b/deps/+z3/z3.cmake new file mode 100644 index 0000000000..81736d3766 --- /dev/null +++ b/deps/+z3/z3.cmake @@ -0,0 +1,15 @@ +add_cmake_project(z3 + URL https://github.com/Z3Prover/z3/archive/refs/tags/z3-4.13.0.zip + URL_HASH SHA256=81543736dcbbbcb037a7df55d0be596245d509f3f69f56610df32728e48ee050 + CMAKE_ARGS + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + -DZ3_INCLUDE_GIT_HASH=OFF + -DZ3_INCLUDE_GIT_DESCRIBE=OFF + -DZ3_USE_LIB_GMP=OFF + -DZ3_BUILD_LIBZ3_SHARED=OFF + -DZ3_ENABLE_EXAMPLE_TARGETS=OFF + -DZ3_ALWAYS_BUILD_DOCS=OFF + -DZ3_BUILD_EXECUTABLE=OFF + -DZ3_BUILD_TEST_EXECUTABLES=OFF +) + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7eea9168a2..2bad952679 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,6 +20,8 @@ endif () add_subdirectory(slic3r-arrange) add_subdirectory(slic3r-arrange-wrapper) +add_subdirectory(libseqarrange) + if (SLIC3R_GUI) add_subdirectory(libvgcode) @@ -136,7 +138,8 @@ if (NOT WIN32 AND NOT APPLE) set_target_properties(PrusaSlicer PROPERTIES OUTPUT_NAME "prusa-slicer") endif () -target_link_libraries(PrusaSlicer libslic3r libcereal slic3r-arrange-wrapper stb_image) + +target_link_libraries(PrusaSlicer libslic3r libcereal slic3r-arrange-wrapper libseqarrange stb_image) if (APPLE) # add_compile_options(-stdlib=libc++) diff --git a/src/libseqarrange/CMakeLists.txt b/src/libseqarrange/CMakeLists.txt new file mode 100644 index 0000000000..b2f56fbd8d --- /dev/null +++ b/src/libseqarrange/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.10) + +add_subdirectory(src) +add_subdirectory(test) + diff --git a/src/libseqarrange/data/arrange_data_export.txt b/src/libseqarrange/data/arrange_data_export.txt new file mode 100644 index 0000000000..3df8886cb3 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt @@ -0,0 +1,300 @@ +OBJECT_ID131 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID66 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID44 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 11999992 +POINT17000000 15999992 +POINT-17000000 15999992 +POINT-21000000 11999992 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 3999992 +POINT-21000000 3999992 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID88 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID77 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000008 +POINT17000000 16000008 +POINT-17000000 16000008 +POINT-21000000 12000008 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID120 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID99 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID151 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID162 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 12000000 +POINT24439178 16000000 +POINT-24439194 16000000 +POINT-30189590 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 12000000 +POINT26286238 14715178 +POINT24439178 16000000 +POINT-24439194 16000000 +POINT-28342532 13284822 +POINT-30189590 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 4000000 +POINT-30189590 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 4000000 +POINT-30189590 4000000 +OBJECT_ID192 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID203 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 12000002 +POINT17000000 16000002 +POINT-17000000 16000002 +POINT-21000000 12000002 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 12000002 +POINT17000000 16000002 +POINT-17000000 16000002 +POINT-21000000 12000002 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID223 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 12000000 +POINT17000004 16000000 +POINT-16999998 16000000 +POINT-20999998 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 12000000 +POINT17000004 16000000 +POINT-16999998 16000000 +POINT-20999998 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 4000000 +POINT-20999998 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 4000000 +POINT-20999998 4000000 +OBJECT_ID234 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000002 16000000 +POINT-21000002 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000002 16000000 +POINT-21000002 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000002 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000002 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.1 b/src/libseqarrange/data/arrange_data_export.txt.1 new file mode 100644 index 0000000000..717147177a --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.1 @@ -0,0 +1,280 @@ +OBJECT_ID0 +TOTAL_HEIGHT7499881 +POLYGON_AT_HEIGHT0 +POLYGON_AT_HEIGHT2000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID1 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID2 +TOTAL_HEIGHT12500000 +POLYGON_AT_HEIGHT0 +POINT53955696 36312440 +POINT53960332 35812212 +POINT53974232 35312152 +POINT53980368 35158472 +POINT53980696 35150836 +POINT53997396 34812440 +POINT54177468 32858964 +POINT54180408 32836238 +POINT54570228 30584692 +POINT54578356 30547374 +POINT55155776 28352270 +POINT55171592 28301194 +POINT55929840 26178012 +POINT55955728 26114322 +POINT56886760 24077800 +POINT56924948 24002958 +POINT58019548 22066986 +POINT58072092 21982728 +POINT59319916 20160258 +POINT59388652 20068590 +POINT60778372 18371550 +POINT60832636 18310702 +POINT60864892 18274716 +POINT61169608 17940972 +POINT61513376 17577550 +POINT61863816 17220556 +POINT62220808 16870118 +POINT62384256 16713928 +POINT62489872 16614386 +POINT62584228 16526354 +POINT62953956 16189381 +POINT64125840 15199509 +POINT64251572 15099894 +POINT65990388 13839354 +POINT66136932 13742451 +POINT67964288 12643402 +POINT68132016 12552109 +POINT70033112 11620394 +POINT70222040 11537682 +POINT72181736 10777802 +POINT72391536 10706677 +POINT74394488 10121782 +POINT74624424 10065249 +POINT76655160 9657131 +POINT76904200 9618143 +POINT78947264 9387243 +POINT79213968 9368675 +POINT79455696 9354137 +POINT79955416 9330975 +POINT80455464 9317074 +POINT80955696 9312439 +POINT103955696 9312439 +POINT107594760 31912408 +POINT107855744 33991392 +POINT107865312 34105032 +POINT107914000 34812440 +POINT107937168 35312152 +POINT107951064 35812212 +POINT107955696 36312440 +POINT107951064 36812668 +POINT107937168 37312724 +POINT107914000 37812440 +POINT107865312 38519844 +POINT107855744 38633488 +POINT107594760 40712472 +POINT103955696 63312440 +POINT80955696 63312440 +POINT80455464 63307804 +POINT79955416 63293904 +POINT79455696 63270740 +POINT79213968 63256204 +POINT78947264 63237632 +POINT76904200 63006736 +POINT76655160 62967748 +POINT74624424 62559632 +POINT74394488 62503096 +POINT72391536 61918200 +POINT72181736 61847076 +POINT70222040 61087196 +POINT70033112 61004488 +POINT68132016 60072768 +POINT67964288 59981476 +POINT66136932 58882428 +POINT65990388 58785524 +POINT64251572 57524988 +POINT64125840 57425368 +POINT62953956 56435496 +POINT62584228 56098528 +POINT62489872 56010492 +POINT62384256 55910948 +POINT62220808 55754760 +POINT61863816 55404320 +POINT61513376 55047328 +POINT61169608 54683908 +POINT60864892 54350164 +POINT60832636 54314180 +POINT60778372 54253328 +POINT59388652 52556288 +POINT59319916 52464624 +POINT58072092 50642152 +POINT58019548 50557892 +POINT56924948 48621916 +POINT56886760 48547076 +POINT55955728 46510556 +POINT55929840 46446864 +POINT55171592 44323684 +POINT55155776 44272608 +POINT54578356 42077504 +POINT54570228 42040184 +POINT54180408 39788640 +POINT54177468 39765916 +POINT53997396 37812440 +POINT53980696 37474040 +POINT53980368 37466408 +POINT53974232 37312724 +POINT53960332 36812668 +POLYGON_AT_HEIGHT2000000 +POINT53955696 36312440 +POINT53960332 35812212 +POINT53974232 35312152 +POINT53980368 35158472 +POINT53997396 34812440 +POINT54177468 32858964 +POINT54179940 32839874 +POINT54242780 32475990 +POINT54570228 30584692 +POINT54577056 30553344 +POINT54670744 30196158 +POINT55155776 28352270 +POINT55169064 28309366 +POINT55292912 27961484 +POINT55929840 26178012 +POINT55951584 26124514 +POINT56104692 25788478 +POINT56886760 24077800 +POINT56918840 24014932 +POINT57100088 23693204 +POINT58019548 22066986 +POINT58063684 21996208 +POINT58271744 21691132 +POINT59319916 20160258 +POINT59377656 20083258 +POINT60778372 18371550 +POINT60832636 18310702 +POINT61169608 17940972 +POINT61513376 17577550 +POINT61863816 17220556 +POINT62220808 16870118 +POINT62384256 16713928 +POINT62584228 16526354 +POINT62953956 16189381 +POINT64125840 15199509 +POINT64231452 15115832 +POINT64529784 14898207 +POINT65990388 13839354 +POINT66113488 13757956 +POINT66429308 13566603 +POINT67964288 12643402 +POINT68105176 12566715 +POINT68436192 12403034 +POINT70033112 11620394 +POINT70191808 11550916 +POINT70535592 11416101 +POINT72181736 10777802 +POINT72357960 10718057 +POINT72712008 10613093 +POINT74394488 10121782 +POINT74587640 10074294 +POINT74949352 9999949 +POINT76655160 9657131 +POINT76864352 9624381 +POINT78947264 9387243 +POINT79375120 9358983 +POINT79455696 9354137 +POINT79955416 9330975 +POINT80455464 9317074 +POINT80955696 9312439 +POINT103955696 9312439 +POINT107594760 31912408 +POINT107813992 33658752 +POINT107857280 34009576 +POINT107865312 34105032 +POINT107914000 34812440 +POINT107937168 35312152 +POINT107951064 35812212 +POINT107955696 36312440 +POINT107951064 36812668 +POINT107937168 37312724 +POINT107914000 37812440 +POINT107865312 38519844 +POINT107857280 38615304 +POINT107813992 38966124 +POINT107594760 40712472 +POINT103955696 63312440 +POINT80955696 63312440 +POINT80455464 63307804 +POINT79955416 63293904 +POINT79455696 63270740 +POINT79375120 63265896 +POINT78947264 63237632 +POINT76864352 63000500 +POINT76655160 62967748 +POINT74949352 62624932 +POINT74587640 62550588 +POINT74394488 62503096 +POINT72712008 62011784 +POINT72357960 61906824 +POINT72181736 61847076 +POINT70535592 61208780 +POINT70191808 61073964 +POINT70033112 61004488 +POINT68436192 60221844 +POINT68105176 60058164 +POINT67964288 59981476 +POINT66429308 59058272 +POINT66113488 58866924 +POINT65990388 58785524 +POINT64529784 57726672 +POINT64231452 57509048 +POINT64125840 57425368 +POINT62953956 56435496 +POINT62584228 56098528 +POINT62384256 55910948 +POINT62220808 55754760 +POINT61863816 55404320 +POINT61513376 55047328 +POINT61169608 54683908 +POINT60832636 54314180 +POINT60778372 54253328 +POINT59377656 52541624 +POINT59319916 52464624 +POINT58271744 50933748 +POINT58063684 50628668 +POINT58019548 50557892 +POINT57100088 48931676 +POINT56918840 48609944 +POINT56886760 48547076 +POINT56104692 46836400 +POINT55951584 46500368 +POINT55929840 46446864 +POINT55292912 44663396 +POINT55169064 44315512 +POINT55155776 44272608 +POINT54670744 42428720 +POINT54577056 42071532 +POINT54570228 42040184 +POINT54242780 40148888 +POINT54179940 39785004 +POINT54177468 39765916 +POINT53997396 37812440 +POINT53980368 37466408 +POINT53974232 37312724 +POINT53960332 36812668 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.10 b/src/libseqarrange/data/arrange_data_export.txt.10 new file mode 100644 index 0000000000..5ad5c01397 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.10 @@ -0,0 +1,16 @@ +OBJECT_ID1988 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.11 b/src/libseqarrange/data/arrange_data_export.txt.11 new file mode 100644 index 0000000000..bfc7c68d08 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.11 @@ -0,0 +1,54 @@ +OBJECT_ID2107 +TOTAL_HEIGHT57960411 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-19619748 13380253 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID2130 +TOTAL_HEIGHT57960411 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-19619748 13380253 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.12 b/src/libseqarrange/data/arrange_data_export.txt.12 new file mode 100644 index 0000000000..1f633763cc --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.12 @@ -0,0 +1,27 @@ +OBJECT_ID2107 +TOTAL_HEIGHT57960411 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-19619748 13380253 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.13 b/src/libseqarrange/data/arrange_data_export.txt.13 new file mode 100644 index 0000000000..db8c8443f3 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.13 @@ -0,0 +1,12 @@ +OBJECT_ID44 +TOTAL_HEIGHT1000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.14 b/src/libseqarrange/data/arrange_data_export.txt.14 new file mode 100644 index 0000000000..6a91e1e626 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.14 @@ -0,0 +1,16 @@ +OBJECT_ID44 +TOTAL_HEIGHT2500000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.15 b/src/libseqarrange/data/arrange_data_export.txt.15 new file mode 100644 index 0000000000..0dd319d2dc --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.15 @@ -0,0 +1,20 @@ +OBJECT_ID44 +TOTAL_HEIGHT18000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.16 b/src/libseqarrange/data/arrange_data_export.txt.16 new file mode 100644 index 0000000000..e2b84a008d --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.16 @@ -0,0 +1,27 @@ +OBJECT_ID44 +TOTAL_HEIGHT30000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-18333334 14666667 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.17 b/src/libseqarrange/data/arrange_data_export.txt.17 new file mode 100644 index 0000000000..3647a91554 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.17 @@ -0,0 +1,81 @@ +OBJECT_ID44 +TOTAL_HEIGHT30000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-18333334 14666667 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID82 +TOTAL_HEIGHT30000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000008 +POINT21000000 -16000008 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000008 +POINT21000000 -16000008 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-18333334 14666667 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000008 +POINT21000000 -16000008 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000008 +POINT21000000 -16000008 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID102 +TOTAL_HEIGHT30000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-18333334 14666667 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.2 b/src/libseqarrange/data/arrange_data_export.txt.2 new file mode 100644 index 0000000000..3fd568824a --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.2 @@ -0,0 +1,1396 @@ +OBJECT_ID0 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID1 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID2 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID3 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID4 +TOTAL_HEIGHT12500000 +POLYGON_AT_HEIGHT0 +POINT-54000000 0 +POINT-53990732 -1000457 +POINT-53962928 -2000572 +POINT-53948816 -2350650 +POINT-53948604 -2355446 +POINT-53916604 -3000000 +POINT-53795348 -4696844 +POINT-53794512 -4706410 +POINT-53539900 -7034134 +POINT-53538020 -7048414 +POINT-53182948 -9358089 +POINT-53179620 -9377002 +POINT-52725176 -11664301 +POINT-52719988 -11687739 +POINT-52167444 -13948401 +POINT-52159996 -13976229 +POINT-51510812 -16206057 +POINT-51500716 -16238113 +POINT-50756528 -18432990 +POINT-50743400 -18469088 +POINT-49906012 -20624978 +POINT-49889496 -20664906 +POINT-48960892 -22777864 +POINT-48940620 -22821386 +POINT-47922948 -24887568 +POINT-47898588 -24934426 +POINT-46794152 -26950088 +POINT-46765372 -27000000 +POINT-45576644 -28961520 +POINT-45543136 -29014180 +POINT-44272728 -30918044 +POINT-44234212 -30973128 +POINT-42884884 -32815952 +POINT-42841080 -32873116 +POINT-41415736 -34651648 +POINT-41366400 -34710528 +POINT-40246116 -36003476 +POINT-39868072 -36421652 +POINT-39812976 -36481872 +POINT-39572172 -36742936 +POINT-38884644 -37469780 +POINT-38244828 -38122608 +POINT-38183764 -38183764 +POINT-37469780 -38884644 +POINT-36742936 -39572172 +POINT-36549076 -39751288 +POINT-36481872 -39812976 +POINT-36003476 -40246116 +POINT-34784036 -41304612 +POINT-34710528 -41366400 +POINT-32953048 -42779628 +POINT-32873116 -42841080 +POINT-31059592 -44173544 +POINT-30973128 -44234212 +POINT-29107252 -45483712 +POINT-29014180 -45543136 +POINT-27099730 -46707652 +POINT-27000000 -46765372 +POINT-25040830 -47843044 +POINT-24934426 -47898588 +POINT-22934460 -48887732 +POINT-22821386 -48940620 +POINT-20784608 -49839744 +POINT-20664906 -49889496 +POINT-18595356 -50697264 +POINT-18469088 -50743400 +POINT-16370850 -51458676 +POINT-16238113 -51500716 +POINT-14115306 -52122532 +POINT-13976229 -52159996 +POINT-11833003 -52687568 +POINT-11687739 -52719988 +POINT-9528267 -53152724 +POINT-9377002 -53179620 +POINT-7205467 -53517112 +POINT-7048414 -53538020 +POINT-4869007 -53780040 +POINT-4706410 -53794512 +POINT-3000000 -53916604 +POINT-2523316 -53941012 +POINT-2355446 -53948604 +POINT-2000572 -53962928 +POINT-1000457 -53990732 +POINT-172841 -53999720 +POINT0 -54000000 +POINT46000000 -54000000 +POINT53190920 -9312667 +POINT53538020 -7048414 +POINT53544396 -6999841 +POINT53794512 -4706410 +POINT53797352 -4673873 +POINT53916604 -3000000 +POINT53948604 -2355446 +POINT53949316 -2339132 +POINT53962928 -2000572 +POINT53990732 -1000457 +POINT54000000 0 +POINT53990732 1000457 +POINT53962928 2000572 +POINT53949316 2339132 +POINT53948604 2355446 +POINT53916604 3000000 +POINT53797352 4673873 +POINT53794512 4706410 +POINT53544396 6999841 +POINT53538020 7048414 +POINT53190920 9312667 +POINT46000000 54000000 +POINT0 54000000 +POINT-172841 53999720 +POINT-1000457 53990732 +POINT-2000572 53962928 +POINT-2355446 53948604 +POINT-2523316 53941012 +POINT-3000000 53916604 +POINT-4706410 53794512 +POINT-4869007 53780040 +POINT-7048414 53538020 +POINT-7205467 53517112 +POINT-9377002 53179620 +POINT-9528267 53152724 +POINT-11687739 52719988 +POINT-11833003 52687568 +POINT-13976229 52159996 +POINT-14115306 52122532 +POINT-16238113 51500716 +POINT-16370850 51458676 +POINT-18469088 50743400 +POINT-18595356 50697264 +POINT-20664906 49889496 +POINT-20784608 49839744 +POINT-22821386 48940620 +POINT-22934460 48887732 +POINT-24934426 47898588 +POINT-25040830 47843044 +POINT-27000000 46765372 +POINT-27099730 46707652 +POINT-29014180 45543136 +POINT-29107252 45483712 +POINT-30973128 44234212 +POINT-31059592 44173544 +POINT-32873116 42841080 +POINT-32953048 42779628 +POINT-34710528 41366400 +POINT-34784036 41304612 +POINT-36003476 40246116 +POINT-36481872 39812976 +POINT-36549076 39751288 +POINT-36742936 39572172 +POINT-37469780 38884644 +POINT-38183764 38183764 +POINT-38244828 38122608 +POINT-38884644 37469780 +POINT-39572172 36742936 +POINT-39812976 36481872 +POINT-39868072 36421652 +POINT-40246116 36003476 +POINT-41366400 34710528 +POINT-41415736 34651648 +POINT-42841080 32873116 +POINT-42884884 32815952 +POINT-44234212 30973128 +POINT-44272728 30918044 +POINT-45543136 29014180 +POINT-45576644 28961520 +POINT-46765372 27000000 +POINT-46794152 26950088 +POINT-47898588 24934426 +POINT-47922948 24887568 +POINT-48940620 22821386 +POINT-48960892 22777864 +POINT-49889496 20664906 +POINT-49906012 20624978 +POINT-50743400 18469088 +POINT-50756528 18432990 +POINT-51500716 16238113 +POINT-51510812 16206057 +POINT-52159996 13976229 +POINT-52167444 13948401 +POINT-52719988 11687739 +POINT-52725176 11664301 +POINT-53179620 9377002 +POINT-53182948 9358089 +POINT-53538020 7048414 +POINT-53539900 7034134 +POINT-53794512 4706410 +POINT-53795348 4696844 +POINT-53916604 3000000 +POINT-53948604 2355446 +POINT-53948816 2350650 +POINT-53962928 2000572 +POINT-53990732 1000457 +POLYGON_AT_HEIGHT2000000 +POINT-54000000 0 +POINT-53990732 -1000457 +POINT-53962928 -2000572 +POINT-53948816 -2350650 +POINT-53916604 -3000000 +POINT-53795348 -4696844 +POINT-53794648 -4704879 +POINT-53753776 -5078846 +POINT-53539900 -7034134 +POINT-53538324 -7046129 +POINT-53481208 -7417962 +POINT-53182948 -9358089 +POINT-53180152 -9373976 +POINT-53106908 -9742970 +POINT-52725176 -11664301 +POINT-52720816 -11683990 +POINT-52631580 -12049445 +POINT-52167444 -13948401 +POINT-52161188 -13971776 +POINT-52056124 -14333001 +POINT-51510812 -16206057 +POINT-51502332 -16232985 +POINT-51381644 -16589294 +POINT-50756528 -18432990 +POINT-50745504 -18463312 +POINT-50609416 -18814030 +POINT-49906012 -20624978 +POINT-49892140 -20658518 +POINT-49740920 -21002980 +POINT-48960892 -22777864 +POINT-48943864 -22814422 +POINT-48777796 -23151976 +POINT-47922948 -24887568 +POINT-47902484 -24926928 +POINT-47721880 -25256932 +POINT-46794152 -26950088 +POINT-46769976 -26992014 +POINT-46575176 -27313842 +POINT-45576644 -28961520 +POINT-45548496 -29005754 +POINT-45339872 -29318798 +POINT-44272728 -30918044 +POINT-44240376 -30964314 +POINT-44018320 -31267978 +POINT-42884884 -32815952 +POINT-42848088 -32863968 +POINT-42613024 -33157680 +POINT-41415736 -34651648 +POINT-41374296 -34701108 +POINT-40619544 -35572496 +POINT-40246116 -36003476 +POINT-39868072 -36421652 +POINT-39572172 -36742936 +POINT-38884644 -37469780 +POINT-38244828 -38122608 +POINT-38183764 -38183764 +POINT-37469780 -38884644 +POINT-36742936 -39572172 +POINT-36549076 -39751288 +POINT-36003476 -40246116 +POINT-34784036 -41304612 +POINT-34722292 -41356516 +POINT-34429332 -41592516 +POINT-32953048 -42779628 +POINT-32885906 -42831248 +POINT-32582950 -43054276 +POINT-31059592 -44173544 +POINT-30986962 -44224504 +POINT-30674588 -44434132 +POINT-29107252 -45483712 +POINT-29029072 -45533632 +POINT-28707866 -45729456 +POINT-27099730 -46707652 +POINT-27015956 -46756136 +POINT-26686534 -46937800 +POINT-25040830 -47843044 +POINT-24951450 -47889700 +POINT-24614432 -48056852 +POINT-22934460 -48887732 +POINT-22839478 -48932160 +POINT-22495502 -49084480 +POINT-20784608 -49839744 +POINT-20684058 -49881536 +POINT-20333778 -50018736 +POINT-18595356 -50697264 +POINT-18489290 -50736020 +POINT-18133370 -50857844 +POINT-16370850 -51458676 +POINT-16259352 -51493992 +POINT-15898464 -51600208 +POINT-14115306 -52122532 +POINT-13998481 -52154004 +POINT-13633312 -52244408 +POINT-11833003 -52687568 +POINT-11710981 -52714800 +POINT-11342224 -52789224 +POINT-9528267 -53152724 +POINT-9401204 -53175316 +POINT-9029556 -53233620 +POINT-7205467 -53517112 +POINT-7073542 -53534676 +POINT-6699709 -53576744 +POINT-4869007 -53780040 +POINT-4732425 -53792200 +POINT-3568803 -53875908 +POINT-3000000 -53916604 +POINT-2523316 -53941012 +POINT-2000572 -53962928 +POINT-1000457 -53990732 +POINT-172841 -53999720 +POINT0 -54000000 +POINT46000000 -54000000 +POINT53190920 -9312667 +POINT53482488 -7410694 +POINT53539040 -7040642 +POINT53544396 -6999841 +POINT53754492 -5073359 +POINT53794968 -4701204 +POINT53797352 -4673873 +POINT53916604 -3000000 +POINT53949316 -2339132 +POINT53962928 -2000572 +POINT53990732 -1000457 +POINT54000000 0 +POINT53990732 1000457 +POINT53962928 2000572 +POINT53949316 2339132 +POINT53916604 3000000 +POINT53797352 4673873 +POINT53794968 4701204 +POINT53754492 5073359 +POINT53544396 6999841 +POINT53539040 7040642 +POINT53482488 7410694 +POINT53190920 9312667 +POINT46000000 54000000 +POINT0 54000000 +POINT-172841 53999720 +POINT-1000457 53990732 +POINT-2000572 53962928 +POINT-2523316 53941012 +POINT-3000000 53916604 +POINT-3568803 53875908 +POINT-4732425 53792200 +POINT-4869007 53780040 +POINT-6699709 53576744 +POINT-7073542 53534676 +POINT-7205467 53517112 +POINT-9029556 53233620 +POINT-9401204 53175316 +POINT-9528267 53152724 +POINT-11342224 52789224 +POINT-11710981 52714800 +POINT-11833003 52687568 +POINT-13633312 52244408 +POINT-13998481 52154004 +POINT-14115306 52122532 +POINT-15898464 51600208 +POINT-16259352 51493992 +POINT-16370850 51458676 +POINT-18133370 50857844 +POINT-18489290 50736020 +POINT-18595356 50697264 +POINT-20333778 50018736 +POINT-20684058 49881536 +POINT-20784608 49839744 +POINT-22495502 49084480 +POINT-22839478 48932160 +POINT-22934460 48887732 +POINT-24614432 48056852 +POINT-24951450 47889700 +POINT-25040830 47843044 +POINT-26686534 46937800 +POINT-27015956 46756136 +POINT-27099730 46707652 +POINT-28707866 45729456 +POINT-29029072 45533632 +POINT-29107252 45483712 +POINT-30674588 44434132 +POINT-30986962 44224504 +POINT-31059592 44173544 +POINT-32582950 43054276 +POINT-32885906 42831248 +POINT-32953048 42779628 +POINT-34429332 41592516 +POINT-34722292 41356516 +POINT-34784036 41304612 +POINT-36003476 40246116 +POINT-36549076 39751288 +POINT-36742936 39572172 +POINT-37469780 38884644 +POINT-38183764 38183764 +POINT-38244828 38122608 +POINT-38884644 37469780 +POINT-39572172 36742936 +POINT-39868072 36421652 +POINT-40246116 36003476 +POINT-40619544 35572496 +POINT-41374296 34701108 +POINT-41415736 34651648 +POINT-42613024 33157680 +POINT-42848088 32863968 +POINT-42884884 32815952 +POINT-44018320 31267978 +POINT-44240376 30964314 +POINT-44272728 30918044 +POINT-45339872 29318798 +POINT-45548496 29005754 +POINT-45576644 28961520 +POINT-46575176 27313842 +POINT-46769976 26992014 +POINT-46794152 26950088 +POINT-47721880 25256932 +POINT-47902484 24926928 +POINT-47922948 24887568 +POINT-48777796 23151976 +POINT-48943864 22814422 +POINT-48960892 22777864 +POINT-49740920 21002980 +POINT-49892140 20658518 +POINT-49906012 20624978 +POINT-50609416 18814030 +POINT-50745504 18463312 +POINT-50756528 18432990 +POINT-51381644 16589294 +POINT-51502332 16232985 +POINT-51510812 16206057 +POINT-52056124 14333001 +POINT-52161188 13971776 +POINT-52167444 13948401 +POINT-52631580 12049445 +POINT-52720816 11683990 +POINT-52725176 11664301 +POINT-53106908 9742970 +POINT-53180152 9373976 +POINT-53182948 9358089 +POINT-53481208 7417962 +POINT-53538324 7046129 +POINT-53539900 7034134 +POINT-53753776 5078846 +POINT-53794648 4704879 +POINT-53795348 4696844 +POINT-53916604 3000000 +POINT-53948816 2350650 +POINT-53962928 2000572 +POINT-53990732 1000457 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID5 +TOTAL_HEIGHT12500000 +POLYGON_AT_HEIGHT0 +POINT-54000000 0 +POINT-53990732 -1000457 +POINT-53962928 -2000572 +POINT-53948816 -2350650 +POINT-53948604 -2355446 +POINT-53916604 -3000000 +POINT-53795348 -4696844 +POINT-53794512 -4706410 +POINT-53539900 -7034134 +POINT-53538020 -7048414 +POINT-53182948 -9358089 +POINT-53179620 -9377002 +POINT-52725176 -11664301 +POINT-52719988 -11687739 +POINT-52167444 -13948401 +POINT-52159996 -13976229 +POINT-51510812 -16206057 +POINT-51500716 -16238113 +POINT-50756528 -18432990 +POINT-50743400 -18469088 +POINT-49906012 -20624978 +POINT-49889496 -20664906 +POINT-48960892 -22777864 +POINT-48940620 -22821386 +POINT-47922948 -24887568 +POINT-47898588 -24934426 +POINT-46794152 -26950088 +POINT-46765372 -27000000 +POINT-45576644 -28961520 +POINT-45543136 -29014180 +POINT-44272728 -30918044 +POINT-44234212 -30973128 +POINT-42884884 -32815952 +POINT-42841080 -32873116 +POINT-41415736 -34651648 +POINT-41366400 -34710528 +POINT-40246116 -36003476 +POINT-39868072 -36421652 +POINT-39812976 -36481872 +POINT-39572172 -36742936 +POINT-38884644 -37469780 +POINT-38244828 -38122608 +POINT-38183764 -38183764 +POINT-37469780 -38884644 +POINT-36742936 -39572172 +POINT-36549076 -39751288 +POINT-36481872 -39812976 +POINT-36003476 -40246116 +POINT-34784036 -41304612 +POINT-34710528 -41366400 +POINT-32953048 -42779628 +POINT-32873116 -42841080 +POINT-31059592 -44173544 +POINT-30973128 -44234212 +POINT-29107252 -45483712 +POINT-29014180 -45543136 +POINT-27099730 -46707652 +POINT-27000000 -46765372 +POINT-25040830 -47843044 +POINT-24934426 -47898588 +POINT-22934460 -48887732 +POINT-22821386 -48940620 +POINT-20784608 -49839744 +POINT-20664906 -49889496 +POINT-18595356 -50697264 +POINT-18469088 -50743400 +POINT-16370850 -51458676 +POINT-16238113 -51500716 +POINT-14115306 -52122532 +POINT-13976229 -52159996 +POINT-11833003 -52687568 +POINT-11687739 -52719988 +POINT-9528267 -53152724 +POINT-9377002 -53179620 +POINT-7205467 -53517112 +POINT-7048414 -53538020 +POINT-4869007 -53780040 +POINT-4706410 -53794512 +POINT-3000000 -53916604 +POINT-2523316 -53941012 +POINT-2355446 -53948604 +POINT-2000572 -53962928 +POINT-1000457 -53990732 +POINT-172841 -53999720 +POINT0 -54000000 +POINT46000000 -54000000 +POINT53190920 -9312667 +POINT53538020 -7048414 +POINT53544396 -6999841 +POINT53794512 -4706410 +POINT53797352 -4673873 +POINT53916604 -3000000 +POINT53948604 -2355446 +POINT53949316 -2339132 +POINT53962928 -2000572 +POINT53990732 -1000457 +POINT54000000 0 +POINT53990732 1000457 +POINT53962928 2000572 +POINT53949316 2339132 +POINT53948604 2355446 +POINT53916604 3000000 +POINT53797352 4673873 +POINT53794512 4706410 +POINT53544396 6999841 +POINT53538020 7048414 +POINT53190920 9312667 +POINT46000000 54000000 +POINT0 54000000 +POINT-172841 53999720 +POINT-1000457 53990732 +POINT-2000572 53962928 +POINT-2355446 53948604 +POINT-2523316 53941012 +POINT-3000000 53916604 +POINT-4706410 53794512 +POINT-4869007 53780040 +POINT-7048414 53538020 +POINT-7205467 53517112 +POINT-9377002 53179620 +POINT-9528267 53152724 +POINT-11687739 52719988 +POINT-11833003 52687568 +POINT-13976229 52159996 +POINT-14115306 52122532 +POINT-16238113 51500716 +POINT-16370850 51458676 +POINT-18469088 50743400 +POINT-18595356 50697264 +POINT-20664906 49889496 +POINT-20784608 49839744 +POINT-22821386 48940620 +POINT-22934460 48887732 +POINT-24934426 47898588 +POINT-25040830 47843044 +POINT-27000000 46765372 +POINT-27099730 46707652 +POINT-29014180 45543136 +POINT-29107252 45483712 +POINT-30973128 44234212 +POINT-31059592 44173544 +POINT-32873116 42841080 +POINT-32953048 42779628 +POINT-34710528 41366400 +POINT-34784036 41304612 +POINT-36003476 40246116 +POINT-36481872 39812976 +POINT-36549076 39751288 +POINT-36742936 39572172 +POINT-37469780 38884644 +POINT-38183764 38183764 +POINT-38244828 38122608 +POINT-38884644 37469780 +POINT-39572172 36742936 +POINT-39812976 36481872 +POINT-39868072 36421652 +POINT-40246116 36003476 +POINT-41366400 34710528 +POINT-41415736 34651648 +POINT-42841080 32873116 +POINT-42884884 32815952 +POINT-44234212 30973128 +POINT-44272728 30918044 +POINT-45543136 29014180 +POINT-45576644 28961520 +POINT-46765372 27000000 +POINT-46794152 26950088 +POINT-47898588 24934426 +POINT-47922948 24887568 +POINT-48940620 22821386 +POINT-48960892 22777864 +POINT-49889496 20664906 +POINT-49906012 20624978 +POINT-50743400 18469088 +POINT-50756528 18432990 +POINT-51500716 16238113 +POINT-51510812 16206057 +POINT-52159996 13976229 +POINT-52167444 13948401 +POINT-52719988 11687739 +POINT-52725176 11664301 +POINT-53179620 9377002 +POINT-53182948 9358089 +POINT-53538020 7048414 +POINT-53539900 7034134 +POINT-53794512 4706410 +POINT-53795348 4696844 +POINT-53916604 3000000 +POINT-53948604 2355446 +POINT-53948816 2350650 +POINT-53962928 2000572 +POINT-53990732 1000457 +POLYGON_AT_HEIGHT2000000 +POINT-54000000 0 +POINT-53990732 -1000457 +POINT-53962928 -2000572 +POINT-53948816 -2350650 +POINT-53916604 -3000000 +POINT-53795348 -4696844 +POINT-53794648 -4704879 +POINT-53753776 -5078846 +POINT-53539900 -7034134 +POINT-53538324 -7046129 +POINT-53481208 -7417962 +POINT-53182948 -9358089 +POINT-53180152 -9373976 +POINT-53106908 -9742970 +POINT-52725176 -11664301 +POINT-52720816 -11683990 +POINT-52631580 -12049445 +POINT-52167444 -13948401 +POINT-52161188 -13971776 +POINT-52056124 -14333001 +POINT-51510812 -16206057 +POINT-51502332 -16232985 +POINT-51381644 -16589294 +POINT-50756528 -18432990 +POINT-50745504 -18463312 +POINT-50609416 -18814030 +POINT-49906012 -20624978 +POINT-49892140 -20658518 +POINT-49740920 -21002980 +POINT-48960892 -22777864 +POINT-48943864 -22814422 +POINT-48777796 -23151976 +POINT-47922948 -24887568 +POINT-47902484 -24926928 +POINT-47721880 -25256932 +POINT-46794152 -26950088 +POINT-46769976 -26992014 +POINT-46575176 -27313842 +POINT-45576644 -28961520 +POINT-45548496 -29005754 +POINT-45339872 -29318798 +POINT-44272728 -30918044 +POINT-44240376 -30964314 +POINT-44018320 -31267978 +POINT-42884884 -32815952 +POINT-42848088 -32863968 +POINT-42613024 -33157680 +POINT-41415736 -34651648 +POINT-41374296 -34701108 +POINT-40619544 -35572496 +POINT-40246116 -36003476 +POINT-39868072 -36421652 +POINT-39572172 -36742936 +POINT-38884644 -37469780 +POINT-38244828 -38122608 +POINT-38183764 -38183764 +POINT-37469780 -38884644 +POINT-36742936 -39572172 +POINT-36549076 -39751288 +POINT-36003476 -40246116 +POINT-34784036 -41304612 +POINT-34722292 -41356516 +POINT-34429332 -41592516 +POINT-32953048 -42779628 +POINT-32885906 -42831248 +POINT-32582950 -43054276 +POINT-31059592 -44173544 +POINT-30986962 -44224504 +POINT-30674588 -44434132 +POINT-29107252 -45483712 +POINT-29029072 -45533632 +POINT-28707866 -45729456 +POINT-27099730 -46707652 +POINT-27015956 -46756136 +POINT-26686534 -46937800 +POINT-25040830 -47843044 +POINT-24951450 -47889700 +POINT-24614432 -48056852 +POINT-22934460 -48887732 +POINT-22839478 -48932160 +POINT-22495502 -49084480 +POINT-20784608 -49839744 +POINT-20684058 -49881536 +POINT-20333778 -50018736 +POINT-18595356 -50697264 +POINT-18489290 -50736020 +POINT-18133370 -50857844 +POINT-16370850 -51458676 +POINT-16259352 -51493992 +POINT-15898464 -51600208 +POINT-14115306 -52122532 +POINT-13998481 -52154004 +POINT-13633312 -52244408 +POINT-11833003 -52687568 +POINT-11710981 -52714800 +POINT-11342224 -52789224 +POINT-9528267 -53152724 +POINT-9401204 -53175316 +POINT-9029556 -53233620 +POINT-7205467 -53517112 +POINT-7073542 -53534676 +POINT-6699709 -53576744 +POINT-4869007 -53780040 +POINT-4732425 -53792200 +POINT-3568803 -53875908 +POINT-3000000 -53916604 +POINT-2523316 -53941012 +POINT-2000572 -53962928 +POINT-1000457 -53990732 +POINT-172841 -53999720 +POINT0 -54000000 +POINT46000000 -54000000 +POINT53190920 -9312667 +POINT53482488 -7410694 +POINT53539040 -7040642 +POINT53544396 -6999841 +POINT53754492 -5073359 +POINT53794968 -4701204 +POINT53797352 -4673873 +POINT53916604 -3000000 +POINT53949316 -2339132 +POINT53962928 -2000572 +POINT53990732 -1000457 +POINT54000000 0 +POINT53990732 1000457 +POINT53962928 2000572 +POINT53949316 2339132 +POINT53916604 3000000 +POINT53797352 4673873 +POINT53794968 4701204 +POINT53754492 5073359 +POINT53544396 6999841 +POINT53539040 7040642 +POINT53482488 7410694 +POINT53190920 9312667 +POINT46000000 54000000 +POINT0 54000000 +POINT-172841 53999720 +POINT-1000457 53990732 +POINT-2000572 53962928 +POINT-2523316 53941012 +POINT-3000000 53916604 +POINT-3568803 53875908 +POINT-4732425 53792200 +POINT-4869007 53780040 +POINT-6699709 53576744 +POINT-7073542 53534676 +POINT-7205467 53517112 +POINT-9029556 53233620 +POINT-9401204 53175316 +POINT-9528267 53152724 +POINT-11342224 52789224 +POINT-11710981 52714800 +POINT-11833003 52687568 +POINT-13633312 52244408 +POINT-13998481 52154004 +POINT-14115306 52122532 +POINT-15898464 51600208 +POINT-16259352 51493992 +POINT-16370850 51458676 +POINT-18133370 50857844 +POINT-18489290 50736020 +POINT-18595356 50697264 +POINT-20333778 50018736 +POINT-20684058 49881536 +POINT-20784608 49839744 +POINT-22495502 49084480 +POINT-22839478 48932160 +POINT-22934460 48887732 +POINT-24614432 48056852 +POINT-24951450 47889700 +POINT-25040830 47843044 +POINT-26686534 46937800 +POINT-27015956 46756136 +POINT-27099730 46707652 +POINT-28707866 45729456 +POINT-29029072 45533632 +POINT-29107252 45483712 +POINT-30674588 44434132 +POINT-30986962 44224504 +POINT-31059592 44173544 +POINT-32582950 43054276 +POINT-32885906 42831248 +POINT-32953048 42779628 +POINT-34429332 41592516 +POINT-34722292 41356516 +POINT-34784036 41304612 +POINT-36003476 40246116 +POINT-36549076 39751288 +POINT-36742936 39572172 +POINT-37469780 38884644 +POINT-38183764 38183764 +POINT-38244828 38122608 +POINT-38884644 37469780 +POINT-39572172 36742936 +POINT-39868072 36421652 +POINT-40246116 36003476 +POINT-40619544 35572496 +POINT-41374296 34701108 +POINT-41415736 34651648 +POINT-42613024 33157680 +POINT-42848088 32863968 +POINT-42884884 32815952 +POINT-44018320 31267978 +POINT-44240376 30964314 +POINT-44272728 30918044 +POINT-45339872 29318798 +POINT-45548496 29005754 +POINT-45576644 28961520 +POINT-46575176 27313842 +POINT-46769976 26992014 +POINT-46794152 26950088 +POINT-47721880 25256932 +POINT-47902484 24926928 +POINT-47922948 24887568 +POINT-48777796 23151976 +POINT-48943864 22814422 +POINT-48960892 22777864 +POINT-49740920 21002980 +POINT-49892140 20658518 +POINT-49906012 20624978 +POINT-50609416 18814030 +POINT-50745504 18463312 +POINT-50756528 18432990 +POINT-51381644 16589294 +POINT-51502332 16232985 +POINT-51510812 16206057 +POINT-52056124 14333001 +POINT-52161188 13971776 +POINT-52167444 13948401 +POINT-52631580 12049445 +POINT-52720816 11683990 +POINT-52725176 11664301 +POINT-53106908 9742970 +POINT-53180152 9373976 +POINT-53182948 9358089 +POINT-53481208 7417962 +POINT-53538324 7046129 +POINT-53539900 7034134 +POINT-53753776 5078846 +POINT-53794648 4704879 +POINT-53795348 4696844 +POINT-53916604 3000000 +POINT-53948816 2350650 +POINT-53962928 2000572 +POINT-53990732 1000457 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID6 +TOTAL_HEIGHT12500000 +POLYGON_AT_HEIGHT0 +POINT-54000000 0 +POINT-53990732 -1000457 +POINT-53962928 -2000572 +POINT-53948816 -2350650 +POINT-53948604 -2355446 +POINT-53916604 -3000000 +POINT-53795348 -4696844 +POINT-53794512 -4706410 +POINT-53539900 -7034134 +POINT-53538020 -7048414 +POINT-53182948 -9358089 +POINT-53179620 -9377002 +POINT-52725176 -11664301 +POINT-52719988 -11687739 +POINT-52167444 -13948401 +POINT-52159996 -13976229 +POINT-51510812 -16206057 +POINT-51500716 -16238113 +POINT-50756528 -18432990 +POINT-50743400 -18469088 +POINT-49906012 -20624978 +POINT-49889496 -20664906 +POINT-48960892 -22777864 +POINT-48940620 -22821386 +POINT-47922948 -24887568 +POINT-47898588 -24934426 +POINT-46794152 -26950088 +POINT-46765372 -27000000 +POINT-45576644 -28961520 +POINT-45543136 -29014180 +POINT-44272728 -30918044 +POINT-44234212 -30973128 +POINT-42884884 -32815952 +POINT-42841080 -32873116 +POINT-41415736 -34651648 +POINT-41366400 -34710528 +POINT-40246116 -36003476 +POINT-39868072 -36421652 +POINT-39812976 -36481872 +POINT-39572172 -36742936 +POINT-38884644 -37469780 +POINT-38244828 -38122608 +POINT-38183764 -38183764 +POINT-37469780 -38884644 +POINT-36742936 -39572172 +POINT-36549076 -39751288 +POINT-36481872 -39812976 +POINT-36003476 -40246116 +POINT-34784036 -41304612 +POINT-34710528 -41366400 +POINT-32953048 -42779628 +POINT-32873116 -42841080 +POINT-31059592 -44173544 +POINT-30973128 -44234212 +POINT-29107252 -45483712 +POINT-29014180 -45543136 +POINT-27099730 -46707652 +POINT-27000000 -46765372 +POINT-25040830 -47843044 +POINT-24934426 -47898588 +POINT-22934460 -48887732 +POINT-22821386 -48940620 +POINT-20784608 -49839744 +POINT-20664906 -49889496 +POINT-18595356 -50697264 +POINT-18469088 -50743400 +POINT-16370850 -51458676 +POINT-16238113 -51500716 +POINT-14115306 -52122532 +POINT-13976229 -52159996 +POINT-11833003 -52687568 +POINT-11687739 -52719988 +POINT-9528267 -53152724 +POINT-9377002 -53179620 +POINT-7205467 -53517112 +POINT-7048414 -53538020 +POINT-4869007 -53780040 +POINT-4706410 -53794512 +POINT-3000000 -53916604 +POINT-2523316 -53941012 +POINT-2355446 -53948604 +POINT-2000572 -53962928 +POINT-1000457 -53990732 +POINT-172841 -53999720 +POINT0 -54000000 +POINT46000000 -54000000 +POINT53190920 -9312667 +POINT53538020 -7048414 +POINT53544396 -6999841 +POINT53794512 -4706410 +POINT53797352 -4673873 +POINT53916604 -3000000 +POINT53948604 -2355446 +POINT53949316 -2339132 +POINT53962928 -2000572 +POINT53990732 -1000457 +POINT54000000 0 +POINT53990732 1000457 +POINT53962928 2000572 +POINT53949316 2339132 +POINT53948604 2355446 +POINT53916604 3000000 +POINT53797352 4673873 +POINT53794512 4706410 +POINT53544396 6999841 +POINT53538020 7048414 +POINT53190920 9312667 +POINT46000000 54000000 +POINT0 54000000 +POINT-172841 53999720 +POINT-1000457 53990732 +POINT-2000572 53962928 +POINT-2355446 53948604 +POINT-2523316 53941012 +POINT-3000000 53916604 +POINT-4706410 53794512 +POINT-4869007 53780040 +POINT-7048414 53538020 +POINT-7205467 53517112 +POINT-9377002 53179620 +POINT-9528267 53152724 +POINT-11687739 52719988 +POINT-11833003 52687568 +POINT-13976229 52159996 +POINT-14115306 52122532 +POINT-16238113 51500716 +POINT-16370850 51458676 +POINT-18469088 50743400 +POINT-18595356 50697264 +POINT-20664906 49889496 +POINT-20784608 49839744 +POINT-22821386 48940620 +POINT-22934460 48887732 +POINT-24934426 47898588 +POINT-25040830 47843044 +POINT-27000000 46765372 +POINT-27099730 46707652 +POINT-29014180 45543136 +POINT-29107252 45483712 +POINT-30973128 44234212 +POINT-31059592 44173544 +POINT-32873116 42841080 +POINT-32953048 42779628 +POINT-34710528 41366400 +POINT-34784036 41304612 +POINT-36003476 40246116 +POINT-36481872 39812976 +POINT-36549076 39751288 +POINT-36742936 39572172 +POINT-37469780 38884644 +POINT-38183764 38183764 +POINT-38244828 38122608 +POINT-38884644 37469780 +POINT-39572172 36742936 +POINT-39812976 36481872 +POINT-39868072 36421652 +POINT-40246116 36003476 +POINT-41366400 34710528 +POINT-41415736 34651648 +POINT-42841080 32873116 +POINT-42884884 32815952 +POINT-44234212 30973128 +POINT-44272728 30918044 +POINT-45543136 29014180 +POINT-45576644 28961520 +POINT-46765372 27000000 +POINT-46794152 26950088 +POINT-47898588 24934426 +POINT-47922948 24887568 +POINT-48940620 22821386 +POINT-48960892 22777864 +POINT-49889496 20664906 +POINT-49906012 20624978 +POINT-50743400 18469088 +POINT-50756528 18432990 +POINT-51500716 16238113 +POINT-51510812 16206057 +POINT-52159996 13976229 +POINT-52167444 13948401 +POINT-52719988 11687739 +POINT-52725176 11664301 +POINT-53179620 9377002 +POINT-53182948 9358089 +POINT-53538020 7048414 +POINT-53539900 7034134 +POINT-53794512 4706410 +POINT-53795348 4696844 +POINT-53916604 3000000 +POINT-53948604 2355446 +POINT-53948816 2350650 +POINT-53962928 2000572 +POINT-53990732 1000457 +POLYGON_AT_HEIGHT2000000 +POINT-54000000 0 +POINT-53990732 -1000457 +POINT-53962928 -2000572 +POINT-53948816 -2350650 +POINT-53916604 -3000000 +POINT-53795348 -4696844 +POINT-53794648 -4704879 +POINT-53753776 -5078846 +POINT-53539900 -7034134 +POINT-53538324 -7046129 +POINT-53481208 -7417962 +POINT-53182948 -9358089 +POINT-53180152 -9373976 +POINT-53106908 -9742970 +POINT-52725176 -11664301 +POINT-52720816 -11683990 +POINT-52631580 -12049445 +POINT-52167444 -13948401 +POINT-52161188 -13971776 +POINT-52056124 -14333001 +POINT-51510812 -16206057 +POINT-51502332 -16232985 +POINT-51381644 -16589294 +POINT-50756528 -18432990 +POINT-50745504 -18463312 +POINT-50609416 -18814030 +POINT-49906012 -20624978 +POINT-49892140 -20658518 +POINT-49740920 -21002980 +POINT-48960892 -22777864 +POINT-48943864 -22814422 +POINT-48777796 -23151976 +POINT-47922948 -24887568 +POINT-47902484 -24926928 +POINT-47721880 -25256932 +POINT-46794152 -26950088 +POINT-46769976 -26992014 +POINT-46575176 -27313842 +POINT-45576644 -28961520 +POINT-45548496 -29005754 +POINT-45339872 -29318798 +POINT-44272728 -30918044 +POINT-44240376 -30964314 +POINT-44018320 -31267978 +POINT-42884884 -32815952 +POINT-42848088 -32863968 +POINT-42613024 -33157680 +POINT-41415736 -34651648 +POINT-41374296 -34701108 +POINT-40619544 -35572496 +POINT-40246116 -36003476 +POINT-39868072 -36421652 +POINT-39572172 -36742936 +POINT-38884644 -37469780 +POINT-38244828 -38122608 +POINT-38183764 -38183764 +POINT-37469780 -38884644 +POINT-36742936 -39572172 +POINT-36549076 -39751288 +POINT-36003476 -40246116 +POINT-34784036 -41304612 +POINT-34722292 -41356516 +POINT-34429332 -41592516 +POINT-32953048 -42779628 +POINT-32885906 -42831248 +POINT-32582950 -43054276 +POINT-31059592 -44173544 +POINT-30986962 -44224504 +POINT-30674588 -44434132 +POINT-29107252 -45483712 +POINT-29029072 -45533632 +POINT-28707866 -45729456 +POINT-27099730 -46707652 +POINT-27015956 -46756136 +POINT-26686534 -46937800 +POINT-25040830 -47843044 +POINT-24951450 -47889700 +POINT-24614432 -48056852 +POINT-22934460 -48887732 +POINT-22839478 -48932160 +POINT-22495502 -49084480 +POINT-20784608 -49839744 +POINT-20684058 -49881536 +POINT-20333778 -50018736 +POINT-18595356 -50697264 +POINT-18489290 -50736020 +POINT-18133370 -50857844 +POINT-16370850 -51458676 +POINT-16259352 -51493992 +POINT-15898464 -51600208 +POINT-14115306 -52122532 +POINT-13998481 -52154004 +POINT-13633312 -52244408 +POINT-11833003 -52687568 +POINT-11710981 -52714800 +POINT-11342224 -52789224 +POINT-9528267 -53152724 +POINT-9401204 -53175316 +POINT-9029556 -53233620 +POINT-7205467 -53517112 +POINT-7073542 -53534676 +POINT-6699709 -53576744 +POINT-4869007 -53780040 +POINT-4732425 -53792200 +POINT-3568803 -53875908 +POINT-3000000 -53916604 +POINT-2523316 -53941012 +POINT-2000572 -53962928 +POINT-1000457 -53990732 +POINT-172841 -53999720 +POINT0 -54000000 +POINT46000000 -54000000 +POINT53190920 -9312667 +POINT53482488 -7410694 +POINT53539040 -7040642 +POINT53544396 -6999841 +POINT53754492 -5073359 +POINT53794968 -4701204 +POINT53797352 -4673873 +POINT53916604 -3000000 +POINT53949316 -2339132 +POINT53962928 -2000572 +POINT53990732 -1000457 +POINT54000000 0 +POINT53990732 1000457 +POINT53962928 2000572 +POINT53949316 2339132 +POINT53916604 3000000 +POINT53797352 4673873 +POINT53794968 4701204 +POINT53754492 5073359 +POINT53544396 6999841 +POINT53539040 7040642 +POINT53482488 7410694 +POINT53190920 9312667 +POINT46000000 54000000 +POINT0 54000000 +POINT-172841 53999720 +POINT-1000457 53990732 +POINT-2000572 53962928 +POINT-2523316 53941012 +POINT-3000000 53916604 +POINT-3568803 53875908 +POINT-4732425 53792200 +POINT-4869007 53780040 +POINT-6699709 53576744 +POINT-7073542 53534676 +POINT-7205467 53517112 +POINT-9029556 53233620 +POINT-9401204 53175316 +POINT-9528267 53152724 +POINT-11342224 52789224 +POINT-11710981 52714800 +POINT-11833003 52687568 +POINT-13633312 52244408 +POINT-13998481 52154004 +POINT-14115306 52122532 +POINT-15898464 51600208 +POINT-16259352 51493992 +POINT-16370850 51458676 +POINT-18133370 50857844 +POINT-18489290 50736020 +POINT-18595356 50697264 +POINT-20333778 50018736 +POINT-20684058 49881536 +POINT-20784608 49839744 +POINT-22495502 49084480 +POINT-22839478 48932160 +POINT-22934460 48887732 +POINT-24614432 48056852 +POINT-24951450 47889700 +POINT-25040830 47843044 +POINT-26686534 46937800 +POINT-27015956 46756136 +POINT-27099730 46707652 +POINT-28707866 45729456 +POINT-29029072 45533632 +POINT-29107252 45483712 +POINT-30674588 44434132 +POINT-30986962 44224504 +POINT-31059592 44173544 +POINT-32582950 43054276 +POINT-32885906 42831248 +POINT-32953048 42779628 +POINT-34429332 41592516 +POINT-34722292 41356516 +POINT-34784036 41304612 +POINT-36003476 40246116 +POINT-36549076 39751288 +POINT-36742936 39572172 +POINT-37469780 38884644 +POINT-38183764 38183764 +POINT-38244828 38122608 +POINT-38884644 37469780 +POINT-39572172 36742936 +POINT-39868072 36421652 +POINT-40246116 36003476 +POINT-40619544 35572496 +POINT-41374296 34701108 +POINT-41415736 34651648 +POINT-42613024 33157680 +POINT-42848088 32863968 +POINT-42884884 32815952 +POINT-44018320 31267978 +POINT-44240376 30964314 +POINT-44272728 30918044 +POINT-45339872 29318798 +POINT-45548496 29005754 +POINT-45576644 28961520 +POINT-46575176 27313842 +POINT-46769976 26992014 +POINT-46794152 26950088 +POINT-47721880 25256932 +POINT-47902484 24926928 +POINT-47922948 24887568 +POINT-48777796 23151976 +POINT-48943864 22814422 +POINT-48960892 22777864 +POINT-49740920 21002980 +POINT-49892140 20658518 +POINT-49906012 20624978 +POINT-50609416 18814030 +POINT-50745504 18463312 +POINT-50756528 18432990 +POINT-51381644 16589294 +POINT-51502332 16232985 +POINT-51510812 16206057 +POINT-52056124 14333001 +POINT-52161188 13971776 +POINT-52167444 13948401 +POINT-52631580 12049445 +POINT-52720816 11683990 +POINT-52725176 11664301 +POINT-53106908 9742970 +POINT-53180152 9373976 +POINT-53182948 9358089 +POINT-53481208 7417962 +POINT-53538324 7046129 +POINT-53539900 7034134 +POINT-53753776 5078846 +POINT-53794648 4704879 +POINT-53795348 4696844 +POINT-53916604 3000000 +POINT-53948816 2350650 +POINT-53962928 2000572 +POINT-53990732 1000457 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.3 b/src/libseqarrange/data/arrange_data_export.txt.3 new file mode 100644 index 0000000000..bcdc436975 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.3 @@ -0,0 +1,64 @@ +OBJECT_ID44 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID66 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID86 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID106 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.4 b/src/libseqarrange/data/arrange_data_export.txt.4 new file mode 100644 index 0000000000..3df8886cb3 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.4 @@ -0,0 +1,300 @@ +OBJECT_ID131 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID66 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID44 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 11999992 +POINT17000000 15999992 +POINT-17000000 15999992 +POINT-21000000 11999992 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 3999992 +POINT-21000000 3999992 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID88 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID77 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000008 +POINT17000000 16000008 +POINT-17000000 16000008 +POINT-21000000 12000008 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID120 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID99 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID151 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID162 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 12000000 +POINT24439178 16000000 +POINT-24439194 16000000 +POINT-30189590 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 12000000 +POINT26286238 14715178 +POINT24439178 16000000 +POINT-24439194 16000000 +POINT-28342532 13284822 +POINT-30189590 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 4000000 +POINT-30189590 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 4000000 +POINT-30189590 4000000 +OBJECT_ID192 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID203 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 12000002 +POINT17000000 16000002 +POINT-17000000 16000002 +POINT-21000000 12000002 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 12000002 +POINT17000000 16000002 +POINT-17000000 16000002 +POINT-21000000 12000002 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID223 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 12000000 +POINT17000004 16000000 +POINT-16999998 16000000 +POINT-20999998 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 12000000 +POINT17000004 16000000 +POINT-16999998 16000000 +POINT-20999998 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 4000000 +POINT-20999998 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 4000000 +POINT-20999998 4000000 +OBJECT_ID234 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000002 16000000 +POINT-21000002 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000002 16000000 +POINT-21000002 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000002 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000002 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.5 b/src/libseqarrange/data/arrange_data_export.txt.5 new file mode 100644 index 0000000000..fc6d91f42e --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.5 @@ -0,0 +1,19054 @@ +OBJECT_ID44 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804161 0 +POINT-5800148 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704155 -1072845 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482231 -1906242 +POINT-5407585 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807083 -3252884 +POINT-4682853 -3429336 +POINT-4552147 -3601043 +POINT-4415153 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235847 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651283 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2744712 -5114479 +POINT-2552711 -5212990 +POINT-2357177 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545234 -5595070 +POINT-1336196 -5648659 +POINT-1125312 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377906 -5792381 +POINT592948 -5774353 +POINT807167 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855705 -5500213 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837616 +POINT3386161 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308891 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4746795 -3341682 +POINT4867729 -3162956 +POINT4981926 -2979858 +POINT5089248 -2792633 +POINT5189537 -2601555 +POINT5282646 -2406883 +POINT5368461 -2208885 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5724121 -966621 +POINT5756096 -753204 +POINT5780113 -538749 +POINT5796142 -323547 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796142 323547 +POINT5780113 538749 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636497 1389144 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208877 +POINT5282646 2406883 +POINT5189537 2601555 +POINT5089248 2792633 +POINT4981926 2979850 +POINT4867729 3162956 +POINT4746795 3341682 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849205 +POINT4199280 4008041 +POINT4047401 4161338 +POINT3889923 4308891 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386161 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855705 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748344 +POINT592948 5774353 +POINT377906 5792381 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784370 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-1125312 5694443 +POINT-1336196 5648659 +POINT-1545234 5595070 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357177 5304291 +POINT-2552711 5212990 +POINT-2744712 5114479 +POINT-2932922 5008903 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4682853 3429329 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-5035454 2886741 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407585 2108719 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800148 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804161 0 +POINT-5800148 -215759 +POINT-5788124 -431221 +POINT-5785186 -462745 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5704155 -1072845 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5599982 -1524106 +POINT-5549301 -1701133 +POINT-5539461 -1731226 +POINT-5482231 -1906242 +POINT-5407585 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807083 -3252884 +POINT-4682853 -3429336 +POINT-4663677 -3454528 +POINT-4552147 -3601043 +POINT-4532048 -3625506 +POINT-4415153 -3767776 +POINT-4394158 -3791475 +POINT-4272049 -3929306 +POINT-4250188 -3952208 +POINT-4123047 -4085403 +POINT-3968338 -4235847 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651283 +POINT-3446495 -4669749 +POINT-3296920 -4777145 +POINT-3270535 -4794643 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2905309 -5024400 +POINT-2744712 -5114479 +POINT-2716543 -5128932 +POINT-2552711 -5212990 +POINT-2357177 -5304291 +POINT-2158393 -5388260 +POINT-2128790 -5399487 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1721780 -5542749 +POINT-1545234 -5595070 +POINT-1336196 -5648659 +POINT-1125312 -5694443 +POINT-1094144 -5700005 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-667677 -5765576 +POINT-484504 -5784370 +POINT-452910 -5786429 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377906 -5792381 +POINT592948 -5774353 +POINT624378 -5770537 +POINT807167 -5748344 +POINT838434 -5743362 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1262788 -5665241 +POINT1441970 -5622841 +POINT1472488 -5614410 +POINT1649978 -5565376 +POINT1855705 -5500213 +POINT1885512 -5489539 +POINT2058868 -5427459 +POINT2088258 -5415684 +POINT2259185 -5347198 +POINT2288116 -5334338 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2867637 -5046568 +POINT3026527 -4953514 +POINT3053234 -4936510 +POINT3208557 -4837616 +POINT3386161 -4715027 +POINT3411531 -4696085 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3750966 -4429711 +POINT3889923 -4308891 +POINT4047401 -4161346 +POINT4069684 -4138854 +POINT4199280 -4008041 +POINT4345360 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4638006 -3490248 +POINT4746795 -3341682 +POINT4764539 -3315460 +POINT4867729 -3162956 +POINT4884484 -3136093 +POINT4981926 -2979858 +POINT4997672 -2952389 +POINT5089248 -2792633 +POINT5189537 -2601555 +POINT5282646 -2406883 +POINT5368461 -2208885 +POINT5379963 -2179386 +POINT5446853 -2007827 +POINT5457251 -1977923 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5589111 -1567083 +POINT5636497 -1389144 +POINT5643501 -1358268 +POINT5684234 -1178695 +POINT5690087 -1147581 +POINT5724121 -966621 +POINT5756096 -753204 +POINT5780113 -538749 +POINT5782465 -507176 +POINT5796142 -323547 +POINT5797320 -291908 +POINT5804168 -107902 +POINT5804168 107894 +POINT5802991 139534 +POINT5796142 323547 +POINT5793791 355121 +POINT5780113 538749 +POINT5756096 753204 +POINT5751405 784514 +POINT5724121 966613 +POINT5718269 997729 +POINT5684234 1178695 +POINT5677231 1209572 +POINT5636497 1389144 +POINT5628350 1419740 +POINT5580963 1597679 +POINT5571685 1627949 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5435352 2037324 +POINT5368461 2208877 +POINT5355871 2237928 +POINT5282646 2406883 +POINT5268986 2435444 +POINT5189537 2601555 +POINT5089248 2792633 +POINT4981926 2979850 +POINT4867729 3162956 +POINT4746795 3341682 +POINT4728090 3367227 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849205 +POINT4199280 4008041 +POINT4047401 4161338 +POINT4024296 4182987 +POINT3889923 4308891 +POINT3727073 4450485 +POINT3702425 4470356 +POINT3559074 4585922 +POINT3533705 4604864 +POINT3386161 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2999207 4969514 +POINT2840316 5062568 +POINT2812420 5077542 +POINT2650177 5164627 +POINT2621743 5178553 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2229796 5358974 +POINT2058868 5427459 +POINT1855705 5500213 +POINT1825521 5509773 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1200919 5678672 +POINT1020278 5714386 +POINT807167 5748344 +POINT592948 5774353 +POINT561398 5776998 +POINT377906 5792381 +POINT346279 5793852 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784370 +POINT-515999 5781139 +POINT-699173 5762344 +POINT-730526 5757944 +POINT-912872 5732353 +POINT-1125312 5694443 +POINT-1336196 5648659 +POINT-1545234 5595070 +POINT-1752136 5533752 +POINT-1782137 5523633 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357177 5304291 +POINT-2552711 5212990 +POINT-2580881 5198537 +POINT-2744712 5114479 +POINT-2772326 5098989 +POINT-2932922 5008903 +POINT-2959941 4992399 +POINT-3117080 4896408 +POINT-3143466 4878910 +POINT-3296920 4777145 +POINT-3322639 4758678 +POINT-3472213 4651275 +POINT-3497227 4631866 +POINT-3642700 4518982 +POINT-3666974 4498656 +POINT-3808151 4380440 +POINT-3831653 4359226 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4435252 3743314 +POINT-4552147 3601043 +POINT-4571324 3575850 +POINT-4682853 3429329 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-4940928 3044766 +POINT-5035454 2886741 +POINT-5050686 2858986 +POINT-5139274 2697563 +POINT-5153465 2669260 +POINT-5235992 2504654 +POINT-5249120 2475843 +POINT-5325470 2308281 +POINT-5337518 2279002 +POINT-5407585 2108719 +POINT-5418537 2079012 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5616273 1462926 +POINT-5660339 1284141 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800148 215759 +POINT-5800737 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804161 0 +POINT-5800148 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704155 -1072845 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5527809 -1766859 +POINT-5482231 -1906242 +POINT-5407585 -2108719 +POINT-5381272 -2172667 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5205000 -2566470 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4886993 -3129921 +POINT-4807083 -3252884 +POINT-4682853 -3429336 +POINT-4640969 -3484359 +POINT-4552147 -3601043 +POINT-4508248 -3654472 +POINT-4415153 -3767776 +POINT-4369296 -3819538 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235847 +POINT-3808151 -4380447 +POINT-3755133 -4424840 +POINT-3642700 -4518982 +POINT-3472213 -4651283 +POINT-3416042 -4691615 +POINT-3296920 -4777145 +POINT-3239292 -4815362 +POINT-3117080 -4896408 +POINT-3058068 -4932459 +POINT-2932922 -5008911 +POINT-2872611 -5042740 +POINT-2744712 -5114479 +POINT-2683187 -5146046 +POINT-2552711 -5212990 +POINT-2357177 -5304291 +POINT-2158393 -5388260 +POINT-2093736 -5412781 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545234 -5595070 +POINT-1336196 -5648659 +POINT-1125312 -5694443 +POINT-912872 -5732353 +POINT-844393 -5741964 +POINT-699173 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT231416 -5799199 +POINT377906 -5792381 +POINT592948 -5774353 +POINT661594 -5766019 +POINT807167 -5748344 +POINT1020278 -5714386 +POINT1088117 -5700974 +POINT1231979 -5672531 +POINT1299270 -5656608 +POINT1441970 -5622841 +POINT1508625 -5604427 +POINT1649978 -5565376 +POINT1715902 -5544495 +POINT1855705 -5500213 +POINT1920807 -5476900 +POINT2058868 -5427459 +POINT2123059 -5401740 +POINT2259185 -5347198 +POINT2322374 -5319110 +POINT2456375 -5259544 +POINT2518478 -5229129 +POINT2650177 -5164627 +POINT2711106 -5131923 +POINT2840316 -5062568 +POINT2899987 -5027622 +POINT3026527 -4953514 +POINT3084858 -4916375 +POINT3208557 -4837616 +POINT3386161 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308891 +POINT3940386 -4261611 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4660156 -3460000 +POINT4746795 -3341682 +POINT4785548 -3284410 +POINT4867729 -3162956 +POINT4904323 -3104283 +POINT4981926 -2979858 +POINT5016317 -2919863 +POINT5089248 -2792633 +POINT5189537 -2601555 +POINT5282646 -2406883 +POINT5368461 -2208885 +POINT5393582 -2144457 +POINT5446853 -2007827 +POINT5469563 -1942512 +POINT5517723 -1804000 +POINT5537988 -1737886 +POINT5580963 -1597679 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5697016 -1110737 +POINT5724121 -966621 +POINT5756096 -753204 +POINT5780113 -538749 +POINT5796142 -323547 +POINT5798714 -254445 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796142 323547 +POINT5791006 392507 +POINT5780113 538749 +POINT5772417 607470 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5668937 1246133 +POINT5636497 1389144 +POINT5618702 1455968 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5495013 1869316 +POINT5446853 2007827 +POINT5421733 2072253 +POINT5368461 2208877 +POINT5282646 2406883 +POINT5189537 2601555 +POINT5089248 2792633 +POINT4981926 2979850 +POINT4867729 3162956 +POINT4746795 3341682 +POINT4705940 3397475 +POINT4619301 3515792 +POINT4576402 3570028 +POINT4485428 3685043 +POINT4345360 3849205 +POINT4199280 4008041 +POINT4047401 4161338 +POINT3996938 4208621 +POINT3889923 4308891 +POINT3837739 4354264 +POINT3727073 4450485 +POINT3673239 4493885 +POINT3559074 4585922 +POINT3503665 4627293 +POINT3386161 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2966857 4988460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1993765 5450773 +POINT1855705 5500213 +POINT1789781 5521092 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT951988 5725268 +POINT807167 5748344 +POINT592948 5774353 +POINT524039 5780130 +POINT377906 5792381 +POINT308829 5795594 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-338169 5793905 +POINT-484504 5784370 +POINT-553294 5777312 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-980947 5720205 +POINT-1125312 5694443 +POINT-1336196 5648659 +POINT-1545234 5595070 +POINT-1611535 5575421 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2021277 5440261 +POINT-2158393 5388260 +POINT-2357177 5304291 +POINT-2552711 5212990 +POINT-2744712 5114479 +POINT-2805023 5080648 +POINT-2932922 5008903 +POINT-2991935 4972855 +POINT-3117080 4896408 +POINT-3174709 4858191 +POINT-3296920 4777145 +POINT-3353092 4736811 +POINT-3472213 4651275 +POINT-3526845 4608883 +POINT-3642700 4518982 +POINT-3695718 4474587 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4317906 3877545 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4682853 3429329 +POINT-4722662 3372788 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-5035454 2886741 +POINT-5139274 2697563 +POINT-5170267 2635746 +POINT-5235992 2504654 +POINT-5264665 2441727 +POINT-5325470 2308281 +POINT-5407585 2108719 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5568334 1634652 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5674380 1216432 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800148 215759 +POINT-5801434 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804161 0 +POINT-5800520 -195760 +POINT-5800148 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704155 -1072845 +POINT-5660339 -1284141 +POINT-5613483 -1474246 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5488448 -1887230 +POINT-5482231 -1906242 +POINT-5407585 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5148239 -2679682 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807083 -3252884 +POINT-4694369 -3412981 +POINT-4682853 -3429336 +POINT-4564262 -3585128 +POINT-4552147 -3601043 +POINT-4415153 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3982678 -4221903 +POINT-3968338 -4235847 +POINT-3822999 -4367044 +POINT-3808151 -4380447 +POINT-3658036 -4506141 +POINT-3642700 -4518982 +POINT-3488016 -4639020 +POINT-3472213 -4651283 +POINT-3313169 -4765479 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2949992 -4998483 +POINT-2932922 -5008911 +POINT-2762158 -5104694 +POINT-2744712 -5114479 +POINT-2570508 -5203859 +POINT-2552711 -5212990 +POINT-2375302 -5295828 +POINT-2357177 -5304291 +POINT-2158393 -5388260 +POINT-1975322 -5457690 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545234 -5595070 +POINT-1336196 -5648659 +POINT-1125312 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT357925 -5793311 +POINT377906 -5792381 +POINT573016 -5776024 +POINT592948 -5774353 +POINT787310 -5750755 +POINT807167 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855705 -5500213 +POINT2040036 -5434203 +POINT2058868 -5427459 +POINT2240618 -5354638 +POINT2259185 -5347198 +POINT2438097 -5267669 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2822692 -5072028 +POINT2840316 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837616 +POINT3369699 -4726390 +POINT3386161 -4715027 +POINT3543047 -4597889 +POINT3559074 -4585922 +POINT3711501 -4463039 +POINT3727073 -4450485 +POINT3874828 -4322016 +POINT3889923 -4308891 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4734978 -3357821 +POINT4746795 -3341682 +POINT4867729 -3162956 +POINT4971341 -2996830 +POINT4981926 -2979858 +POINT5079301 -2809987 +POINT5089248 -2792633 +POINT5189537 -2601555 +POINT5274016 -2424927 +POINT5282646 -2406883 +POINT5360507 -2227238 +POINT5368461 -2208885 +POINT5439587 -2026464 +POINT5446853 -2007827 +POINT5511154 -1822893 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5631350 -1408474 +POINT5636497 -1389144 +POINT5679810 -1198202 +POINT5684234 -1178695 +POINT5720424 -986278 +POINT5724121 -966621 +POINT5756096 -753204 +POINT5777887 -558627 +POINT5780113 -538749 +POINT5794657 -343494 +POINT5796142 -323547 +POINT5803425 -127890 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796886 303558 +POINT5796142 323547 +POINT5781599 518802 +POINT5780113 538749 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5640922 1369638 +POINT5636497 1389144 +POINT5580963 1597679 +POINT5523585 1784876 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208877 +POINT5282646 2406883 +POINT5189537 2601555 +POINT5098544 2774922 +POINT5089248 2792633 +POINT4991874 2962497 +POINT4981926 2979850 +POINT4878314 3145984 +POINT4867729 3162956 +POINT4758005 3325116 +POINT4746795 3341682 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849205 +POINT4199280 4008041 +POINT4061479 4147129 +POINT4047401 4161338 +POINT3904520 4295214 +POINT3889923 4308891 +POINT3742168 4437361 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3402189 4703060 +POINT3386161 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2857576 5052460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2077436 5420020 +POINT2058868 5427459 +POINT1874536 5493470 +POINT1855705 5500213 +POINT1669047 5559329 +POINT1649978 5565368 +POINT1461251 5617507 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT826920 5745197 +POINT807167 5748344 +POINT592948 5774353 +POINT397839 5790710 +POINT377906 5792381 +POINT182319 5801477 +POINT162338 5802406 +POINT-33449 5804227 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-464544 5785671 +POINT-484504 5784370 +POINT-679275 5764386 +POINT-699173 5762344 +POINT-893064 5735133 +POINT-912872 5732353 +POINT-1125312 5694443 +POINT-1336196 5648659 +POINT-1545234 5595070 +POINT-1732958 5539436 +POINT-1752136 5533752 +POINT-1937665 5471175 +POINT-1956619 5464782 +POINT-2139691 5395353 +POINT-2158393 5388260 +POINT-2338752 5312074 +POINT-2357177 5304291 +POINT-2552711 5212990 +POINT-2726916 5123610 +POINT-2744712 5114479 +POINT-2915477 5018689 +POINT-2932922 5008903 +POINT-3100011 4906835 +POINT-3117080 4896408 +POINT-3280251 4788200 +POINT-3296920 4777145 +POINT-3455965 4662942 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3953490 4249250 +POINT-3968338 4235847 +POINT-4108707 4099341 +POINT-4123047 4085395 +POINT-4258238 3943774 +POINT-4272049 3929306 +POINT-4401889 3782749 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4670738 3445245 +POINT-4682853 3429329 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-5035454 2886741 +POINT-5129651 2715098 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5399974 2127216 +POINT-5407585 2108719 +POINT-5475312 1925010 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5700094 1092430 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5786268 451137 +POINT-5788124 431221 +POINT-5800148 215759 +OBJECT_ID69 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325477 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807091 -3252884 +POINT-4682853 -3429329 +POINT-4552154 -3601043 +POINT-4415153 -3767776 +POINT-4272056 -3929306 +POINT-4123054 -4085395 +POINT-3968345 -4235847 +POINT-3808159 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296928 -4777145 +POINT-3117080 -4896408 +POINT-2932930 -5008903 +POINT-2744720 -5114479 +POINT-2552719 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1752143 -5533752 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-912879 -5732353 +POINT-699173 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748344 +POINT1020271 -5714386 +POINT1231971 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565368 +POINT1855697 -5500213 +POINT2058860 -5427459 +POINT2259178 -5347198 +POINT2456375 -5259544 +POINT2650169 -5164627 +POINT2840309 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161338 +POINT4199272 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746788 -3341682 +POINT4867721 -3162956 +POINT4981926 -2979850 +POINT5089241 -2792633 +POINT5189529 -2601555 +POINT5282646 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724113 -966613 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5796142 -323547 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796142 323547 +POINT5780105 538749 +POINT5756088 753204 +POINT5724113 966621 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368454 2208885 +POINT5282646 2406883 +POINT5189529 2601555 +POINT5089241 2792640 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4746788 3341682 +POINT4619301 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199272 4008049 +POINT4047393 4161338 +POINT3889923 4308891 +POINT3727073 4450477 +POINT3559074 4585930 +POINT3386154 4715034 +POINT3208557 4837608 +POINT3026527 4953514 +POINT2840309 5062568 +POINT2650169 5164634 +POINT2456375 5259544 +POINT2259178 5347191 +POINT2058860 5427452 +POINT1855697 5500221 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231971 5672539 +POINT1020271 5714393 +POINT807167 5748344 +POINT592941 5774360 +POINT377899 5792381 +POINT162338 5802406 +POINT-53451 5804420 +POINT-269165 5798393 +POINT-484504 5784370 +POINT-699173 5762336 +POINT-912879 5732353 +POINT-1125320 5694450 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533745 +POINT-1956619 5464775 +POINT-2158393 5388252 +POINT-2357185 5304283 +POINT-2552719 5212990 +POINT-2744720 5114479 +POINT-2932930 5008903 +POINT-3117080 4896415 +POINT-3296928 4777153 +POINT-3472213 4651283 +POINT-3642700 4518989 +POINT-3808159 4380440 +POINT-3968345 4235847 +POINT-4123054 4085395 +POINT-4272056 3929298 +POINT-4415153 3767784 +POINT-4552154 3601051 +POINT-4682853 3429329 +POINT-4807091 3252876 +POINT-4924675 3071937 +POINT-5035454 2886741 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325477 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803580 -31655 +POINT-5800155 -215759 +POINT-5798390 -247370 +POINT-5788124 -431221 +POINT-5785186 -462745 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5697733 -1103846 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5599982 -1524106 +POINT-5549301 -1701133 +POINT-5539462 -1731226 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325477 -2308281 +POINT-5312349 -2337092 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807091 -3252884 +POINT-4682853 -3429329 +POINT-4663678 -3454522 +POINT-4552154 -3601043 +POINT-4532054 -3625506 +POINT-4415153 -3767776 +POINT-4394159 -3791475 +POINT-4272056 -3929306 +POINT-4123054 -4085395 +POINT-4100356 -4107469 +POINT-3968345 -4235847 +POINT-3808159 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296928 -4777145 +POINT-3270542 -4794643 +POINT-3117080 -4896408 +POINT-3090062 -4912913 +POINT-2932930 -5008903 +POINT-2744720 -5114479 +POINT-2552719 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-2128790 -5399487 +POINT-1956619 -5464782 +POINT-1752143 -5533752 +POINT-1721788 -5542749 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-1094152 -5700005 +POINT-912879 -5732353 +POINT-699173 -5762344 +POINT-667677 -5765576 +POINT-484504 -5784370 +POINT-452910 -5786429 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748344 +POINT838432 -5743362 +POINT1020271 -5714386 +POINT1231971 -5672531 +POINT1262782 -5665241 +POINT1441970 -5622841 +POINT1472488 -5614409 +POINT1649978 -5565368 +POINT1680160 -5555809 +POINT1855697 -5500213 +POINT1885505 -5489539 +POINT2058860 -5427459 +POINT2088250 -5415684 +POINT2259178 -5347198 +POINT2288110 -5334338 +POINT2456375 -5259544 +POINT2650169 -5164627 +POINT2840309 -5062568 +POINT3026527 -4953514 +POINT3053234 -4936510 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3750966 -4429711 +POINT3889923 -4308891 +POINT3913026 -4287243 +POINT4047393 -4161338 +POINT4069677 -4138847 +POINT4199272 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4638005 -3490248 +POINT4746788 -3341682 +POINT4764531 -3315460 +POINT4867721 -3162956 +POINT4884477 -3136091 +POINT4981926 -2979850 +POINT5089241 -2792633 +POINT5189529 -2601555 +POINT5203191 -2572993 +POINT5282646 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5457251 -1977923 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5589110 -1567083 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5690085 -1147579 +POINT5724113 -966613 +POINT5756088 -753204 +POINT5759612 -721740 +POINT5780105 -538749 +POINT5782458 -507176 +POINT5796142 -323547 +POINT5797319 -291907 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796142 323547 +POINT5793790 355121 +POINT5780105 538749 +POINT5776582 570213 +POINT5756088 753204 +POINT5751397 784516 +POINT5724113 966621 +POINT5684234 1178695 +POINT5677230 1209572 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5571685 1627949 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5435351 2037326 +POINT5368454 2208885 +POINT5282646 2406883 +POINT5189529 2601555 +POINT5089241 2792640 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4746788 3341682 +POINT4619301 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4323920 3872510 +POINT4199272 4008049 +POINT4176989 4030539 +POINT4047393 4161338 +POINT4024290 4182987 +POINT3889923 4308891 +POINT3727073 4450477 +POINT3702425 4470351 +POINT3559074 4585930 +POINT3533704 4604872 +POINT3386154 4715034 +POINT3360098 4733018 +POINT3208557 4837608 +POINT3181850 4854614 +POINT3026527 4953514 +POINT2999206 4969514 +POINT2840309 5062568 +POINT2812412 5077543 +POINT2650169 5164634 +POINT2621736 5178559 +POINT2456375 5259544 +POINT2259178 5347191 +POINT2058860 5427452 +POINT1855697 5500221 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231971 5672539 +POINT1020271 5714393 +POINT807167 5748344 +POINT592941 5774360 +POINT561391 5777004 +POINT377899 5792381 +POINT346272 5793852 +POINT162338 5802406 +POINT130678 5802702 +POINT-53451 5804420 +POINT-85100 5803536 +POINT-269165 5798393 +POINT-484504 5784370 +POINT-515999 5781138 +POINT-699173 5762336 +POINT-912879 5732353 +POINT-944048 5726792 +POINT-1125320 5694450 +POINT-1156260 5687732 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533745 +POINT-1782143 5523626 +POINT-1956619 5464775 +POINT-2158393 5388252 +POINT-2357185 5304283 +POINT-2385873 5290889 +POINT-2552719 5212990 +POINT-2744720 5114479 +POINT-2932930 5008903 +POINT-3117080 4896415 +POINT-3143467 4878918 +POINT-3296928 4777153 +POINT-3322645 4758686 +POINT-3472213 4651283 +POINT-3497227 4631873 +POINT-3642700 4518989 +POINT-3808159 4380440 +POINT-3968345 4235847 +POINT-4123054 4085395 +POINT-4272056 3929298 +POINT-4293051 3905601 +POINT-4415153 3767784 +POINT-4552154 3601051 +POINT-4571330 3575857 +POINT-4682853 3429329 +POINT-4807091 3252876 +POINT-4924675 3071937 +POINT-4940928 3044766 +POINT-5035454 2886741 +POINT-5050686 2858986 +POINT-5139274 2697563 +POINT-5153465 2669260 +POINT-5235992 2504654 +POINT-5249121 2475843 +POINT-5325477 2308281 +POINT-5337525 2279002 +POINT-5407593 2108719 +POINT-5418545 2079012 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5616273 1462926 +POINT-5660339 1284141 +POINT-5666769 1253141 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5796300 -284802 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5728582 -928247 +POINT-5704162 -1072845 +POINT-5690120 -1140554 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325477 -2308281 +POINT-5235992 -2504654 +POINT-5205000 -2566470 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4886996 -3129921 +POINT-4807091 -3252884 +POINT-4682853 -3429329 +POINT-4552154 -3601043 +POINT-4508253 -3654472 +POINT-4415153 -3767776 +POINT-4369299 -3819538 +POINT-4272056 -3929306 +POINT-4224309 -3979324 +POINT-4123054 -4085395 +POINT-4073478 -4133607 +POINT-3968345 -4235847 +POINT-3808159 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3416044 -4691610 +POINT-3296928 -4777145 +POINT-3239297 -4815362 +POINT-3117080 -4896408 +POINT-2932930 -5008903 +POINT-2744720 -5114479 +POINT-2552719 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-2093736 -5412781 +POINT-1956619 -5464782 +POINT-1891096 -5486883 +POINT-1752143 -5533752 +POINT-1685843 -5553401 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-1057245 -5706591 +POINT-912879 -5732353 +POINT-844398 -5741964 +POINT-699173 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT15697 -5803770 +POINT162338 -5802406 +POINT231413 -5799194 +POINT377899 -5792381 +POINT592941 -5774353 +POINT661588 -5766019 +POINT807167 -5748344 +POINT1020271 -5714386 +POINT1088109 -5700974 +POINT1231971 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565368 +POINT1715900 -5544490 +POINT1855697 -5500213 +POINT1920800 -5476900 +POINT2058860 -5427459 +POINT2123051 -5401740 +POINT2259178 -5347198 +POINT2456375 -5259544 +POINT2518475 -5229129 +POINT2650169 -5164627 +POINT2711098 -5131923 +POINT2840309 -5062568 +POINT3026527 -4953514 +POINT3084858 -4916375 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308891 +POINT3940383 -4261609 +POINT4047393 -4161338 +POINT4096062 -4112215 +POINT4199272 -4008041 +POINT4246083 -3957143 +POINT4345352 -3849205 +POINT4390239 -3796600 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746788 -3341682 +POINT4867721 -3162956 +POINT4904318 -3104281 +POINT4981926 -2979850 +POINT5089241 -2792633 +POINT5121378 -2731403 +POINT5189529 -2601555 +POINT5282646 -2406883 +POINT5310143 -2343435 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5469563 -1942512 +POINT5517723 -1804000 +POINT5537988 -1737886 +POINT5580963 -1597679 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5697013 -1110735 +POINT5724113 -966613 +POINT5734360 -898227 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5785244 -469789 +POINT5796142 -323547 +POINT5798712 -254442 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796142 323547 +POINT5780105 538749 +POINT5772409 607470 +POINT5756088 753204 +POINT5745842 821592 +POINT5724113 966621 +POINT5711334 1034579 +POINT5684234 1178695 +POINT5668935 1246133 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5495013 1869316 +POINT5446853 2007827 +POINT5421731 2072255 +POINT5368454 2208885 +POINT5282646 2406883 +POINT5189529 2601555 +POINT5089241 2792640 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4828969 3220228 +POINT4746788 3341682 +POINT4619301 3515800 +POINT4576402 3570036 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199272 4008049 +POINT4150603 4057170 +POINT4047393 4161338 +POINT3996933 4208621 +POINT3889923 4308891 +POINT3837739 4354262 +POINT3727073 4450477 +POINT3673239 4493882 +POINT3559074 4585930 +POINT3503663 4627301 +POINT3386154 4715034 +POINT3208557 4837608 +POINT3026527 4953514 +POINT2840309 5062568 +POINT2779379 5095275 +POINT2650169 5164634 +POINT2588069 5195048 +POINT2456375 5259544 +POINT2259178 5347191 +POINT2058860 5427452 +POINT1855697 5500221 +POINT1789776 5521100 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231971 5672539 +POINT1164133 5685951 +POINT1020271 5714393 +POINT951983 5725273 +POINT807167 5748344 +POINT738519 5756681 +POINT592941 5774360 +POINT524032 5780135 +POINT377899 5792381 +POINT308823 5795594 +POINT162338 5802406 +POINT93189 5803052 +POINT-53451 5804420 +POINT-122575 5802489 +POINT-269165 5798393 +POINT-484504 5784370 +POINT-553294 5777310 +POINT-699173 5762336 +POINT-912879 5732353 +POINT-1125320 5694450 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533745 +POINT-1956619 5464775 +POINT-2158393 5388252 +POINT-2222095 5361345 +POINT-2357185 5304283 +POINT-2552719 5212990 +POINT-2744720 5114479 +POINT-2805031 5080648 +POINT-2932930 5008903 +POINT-2991940 4972857 +POINT-3117080 4896415 +POINT-3174712 4858198 +POINT-3296928 4777153 +POINT-3353097 4736819 +POINT-3472213 4651283 +POINT-3526845 4608890 +POINT-3642700 4518989 +POINT-3808159 4380440 +POINT-3859490 4334106 +POINT-3968345 4235847 +POINT-4017921 4187636 +POINT-4123054 4085395 +POINT-4170801 4035375 +POINT-4272056 3929298 +POINT-4317911 3877542 +POINT-4415153 3767784 +POINT-4459055 3714355 +POINT-4552154 3601051 +POINT-4682853 3429329 +POINT-4722665 3372785 +POINT-4807091 3252876 +POINT-4924675 3071937 +POINT-5035454 2886741 +POINT-5139274 2697563 +POINT-5170267 2635746 +POINT-5235992 2504654 +POINT-5325477 2308281 +POINT-5351791 2244332 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5568334 1634652 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5674382 1216432 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800155 215759 +POINT-5801441 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804168 0 +POINT-5800527 -195760 +POINT-5800155 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5707493 -1053122 +POINT-5704162 -1072845 +POINT-5664401 -1264556 +POINT-5660339 -1284141 +POINT-5613483 -1474246 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5333089 -2289783 +POINT-5325477 -2308281 +POINT-5244287 -2486451 +POINT-5235992 -2504654 +POINT-5148239 -2679682 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4817990 -3236112 +POINT-4807091 -3252884 +POINT-4694369 -3412974 +POINT-4682853 -3429329 +POINT-4564269 -3585127 +POINT-4552154 -3601043 +POINT-4415153 -3767776 +POINT-4272056 -3929306 +POINT-4123054 -4085395 +POINT-3982685 -4221902 +POINT-3968345 -4235847 +POINT-3808159 -4380440 +POINT-3642700 -4518982 +POINT-3488016 -4639013 +POINT-3472213 -4651275 +POINT-3296928 -4777145 +POINT-3133751 -4885353 +POINT-3117080 -4896408 +POINT-2949999 -4998476 +POINT-2932930 -5008903 +POINT-2744720 -5114479 +POINT-2570516 -5203859 +POINT-2552719 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1975322 -5457690 +POINT-1956619 -5464782 +POINT-1771097 -5527359 +POINT-1752143 -5533752 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-932571 -5728839 +POINT-912879 -5732353 +POINT-699173 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT787310 -5750755 +POINT807167 -5748344 +POINT1020271 -5714386 +POINT1231971 -5672531 +POINT1441970 -5622841 +POINT1630698 -5570696 +POINT1649978 -5565368 +POINT1836629 -5506253 +POINT1855697 -5500213 +POINT2040029 -5434203 +POINT2058860 -5427459 +POINT2240610 -5354638 +POINT2259178 -5347198 +POINT2456375 -5259544 +POINT2632206 -5173425 +POINT2650169 -5164627 +POINT2840309 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543046 -4597889 +POINT3559074 -4585922 +POINT3711501 -4463039 +POINT3727073 -4450485 +POINT3874828 -4322016 +POINT3889923 -4308891 +POINT4032797 -4175015 +POINT4047393 -4161338 +POINT4199272 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4734971 -3357821 +POINT4746788 -3341682 +POINT4856512 -3179522 +POINT4867721 -3162956 +POINT4971340 -2996823 +POINT4981926 -2979850 +POINT5089241 -2792633 +POINT5189529 -2601555 +POINT5282646 -2406883 +POINT5368454 -2208885 +POINT5439586 -2026464 +POINT5446853 -2007827 +POINT5511154 -1822893 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5631343 -1408474 +POINT5636490 -1389144 +POINT5679809 -1198202 +POINT5684234 -1178695 +POINT5720417 -986271 +POINT5724113 -966613 +POINT5756088 -753204 +POINT5777879 -558627 +POINT5780105 -538749 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796886 303559 +POINT5796142 323547 +POINT5781592 518802 +POINT5780105 538749 +POINT5756088 753204 +POINT5727077 946839 +POINT5724113 966621 +POINT5687931 1159038 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5523585 1784876 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5375721 2190249 +POINT5368454 2208885 +POINT5290600 2388530 +POINT5282646 2406883 +POINT5189529 2601555 +POINT5098537 2774928 +POINT5089241 2792640 +POINT4991873 2962498 +POINT4981926 2979850 +POINT4878307 3145984 +POINT4867721 3162956 +POINT4746788 3341682 +POINT4631118 3499661 +POINT4619301 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199272 4008049 +POINT4061471 4147130 +POINT4047393 4161338 +POINT3889923 4308891 +POINT3727073 4450477 +POINT3574646 4573375 +POINT3559074 4585930 +POINT3402182 4703068 +POINT3386154 4715034 +POINT3225018 4826247 +POINT3208557 4837608 +POINT3026527 4953514 +POINT2857570 5052460 +POINT2840309 5062568 +POINT2667793 5155174 +POINT2650169 5164634 +POINT2474338 5250747 +POINT2456375 5259544 +POINT2259178 5347191 +POINT2058860 5427452 +POINT1874529 5493476 +POINT1855697 5500221 +POINT1669047 5559337 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231971 5672539 +POINT1039894 5710514 +POINT1020271 5714393 +POINT807167 5748344 +POINT612798 5771949 +POINT592941 5774360 +POINT397831 5790711 +POINT377899 5792381 +POINT182318 5801477 +POINT162338 5802406 +POINT-53451 5804420 +POINT-249170 5798952 +POINT-269165 5798393 +POINT-464544 5785670 +POINT-484504 5784370 +POINT-679275 5764379 +POINT-699173 5762336 +POINT-912879 5732353 +POINT-1125320 5694450 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533745 +POINT-1937666 5471168 +POINT-1956619 5464775 +POINT-2139691 5395345 +POINT-2158393 5388252 +POINT-2357185 5304283 +POINT-2552719 5212990 +POINT-2744720 5114479 +POINT-2932930 5008903 +POINT-3100011 4906842 +POINT-3117080 4896415 +POINT-3296928 4777153 +POINT-3455966 4662950 +POINT-3472213 4651283 +POINT-3626897 4531252 +POINT-3642700 4518989 +POINT-3808159 4380440 +POINT-3953497 4249250 +POINT-3968345 4235847 +POINT-4108714 4099341 +POINT-4123054 4085395 +POINT-4258245 3943767 +POINT-4272056 3929298 +POINT-4401890 3782755 +POINT-4415153 3767784 +POINT-4539456 3616506 +POINT-4552154 3601051 +POINT-4670739 3445246 +POINT-4682853 3429329 +POINT-4807091 3252876 +POINT-4913776 3088709 +POINT-4924675 3071937 +POINT-5035454 2886741 +POINT-5129651 2715098 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5317183 2326483 +POINT-5325477 2308281 +POINT-5407593 2108719 +POINT-5475320 1925010 +POINT-5482239 1906242 +POINT-5543085 1720145 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5786268 451137 +POINT-5788124 431221 +POINT-5799040 235730 +POINT-5800155 215759 +POINT-5803797 19998 +OBJECT_ID80 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804161 0 +POINT-5800155 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5704162 -1072845 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482231 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807083 -3252884 +POINT-4682853 -3429329 +POINT-4552147 -3601043 +POINT-4415153 -3767776 +POINT-4272056 -3929302 +POINT-4123047 -4085399 +POINT-3968345 -4235847 +POINT-3808151 -4380443 +POINT-3642700 -4518982 +POINT-3472213 -4651279 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008907 +POINT-2744712 -5114479 +POINT-2552711 -5212986 +POINT-2357185 -5304287 +POINT-2158393 -5388256 +POINT-1956619 -5464779 +POINT-1752143 -5533748 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-912879 -5732353 +POINT-699173 -5762340 +POINT-484504 -5784366 +POINT-269165 -5798397 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748340 +POINT1020278 -5714386 +POINT1231971 -5672531 +POINT1441970 -5622837 +POINT1649978 -5565372 +POINT1855705 -5500213 +POINT2058860 -5427456 +POINT2259178 -5347194 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837612 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450481 +POINT3889923 -4308887 +POINT4047401 -4161342 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685047 +POINT4619301 -3515792 +POINT4746795 -3341682 +POINT4867721 -3162956 +POINT4981926 -2979850 +POINT5089248 -2792633 +POINT5189529 -2601555 +POINT5282646 -2406883 +POINT5368461 -2208877 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5796142 -323547 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796142 323547 +POINT5780113 538749 +POINT5756096 753204 +POINT5724121 966621 +POINT5684234 1178695 +POINT5636497 1389152 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208885 +POINT5282646 2406883 +POINT5189529 2601562 +POINT5089248 2792640 +POINT4981926 2979858 +POINT4867721 3162956 +POINT4746795 3341682 +POINT4619301 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4047401 4161346 +POINT3889923 4308891 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2058860 5427459 +POINT1855705 5500213 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231971 5672531 +POINT1020278 5714386 +POINT807167 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784370 +POINT-699173 5762344 +POINT-912879 5732353 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212990 +POINT-2744712 5114486 +POINT-2932922 5008911 +POINT-3117080 4896415 +POINT-3296920 4777145 +POINT-3472213 4651283 +POINT-3642700 4518989 +POINT-3808151 4380447 +POINT-3968345 4235847 +POINT-4123047 4085403 +POINT-4272056 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4682853 3429336 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-5035454 2886749 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5608696 1493675 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804161 0 +POINT-5800155 -215759 +POINT-5798390 -247370 +POINT-5788124 -431221 +POINT-5785186 -462745 +POINT-5768097 -646087 +POINT-5763989 -677480 +POINT-5740097 -860054 +POINT-5704162 -1072845 +POINT-5697733 -1103846 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5599982 -1524106 +POINT-5549301 -1701133 +POINT-5539461 -1731226 +POINT-5482231 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807083 -3252884 +POINT-4682853 -3429329 +POINT-4663677 -3454522 +POINT-4552147 -3601043 +POINT-4532048 -3625506 +POINT-4415153 -3767776 +POINT-4394159 -3791474 +POINT-4272056 -3929302 +POINT-4250194 -3952204 +POINT-4123047 -4085399 +POINT-4100350 -4107473 +POINT-3968345 -4235847 +POINT-3944842 -4257062 +POINT-3808151 -4380443 +POINT-3783877 -4400769 +POINT-3642700 -4518982 +POINT-3617687 -4538392 +POINT-3472213 -4651279 +POINT-3446495 -4669746 +POINT-3296920 -4777145 +POINT-3270535 -4794643 +POINT-3117080 -4896408 +POINT-2932922 -5008907 +POINT-2905309 -5024396 +POINT-2744712 -5114479 +POINT-2552711 -5212986 +POINT-2357185 -5304287 +POINT-2158393 -5388256 +POINT-2128790 -5399483 +POINT-1956619 -5464779 +POINT-1926619 -5474898 +POINT-1752143 -5533748 +POINT-1721788 -5542745 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-1094152 -5700005 +POINT-912879 -5732353 +POINT-881525 -5736753 +POINT-699173 -5762340 +POINT-667677 -5765572 +POINT-484504 -5784366 +POINT-452910 -5786425 +POINT-269165 -5798397 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748340 +POINT838434 -5743359 +POINT1020278 -5714386 +POINT1231971 -5672531 +POINT1262782 -5665240 +POINT1441970 -5622837 +POINT1472488 -5614406 +POINT1649978 -5565372 +POINT1680162 -5555813 +POINT1855705 -5500213 +POINT2058860 -5427456 +POINT2259178 -5347194 +POINT2288110 -5334335 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2867637 -5046568 +POINT3026527 -4953514 +POINT3208557 -4837612 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3583722 -4566051 +POINT3727073 -4450481 +POINT3750966 -4429707 +POINT3889923 -4308887 +POINT4047401 -4161342 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685047 +POINT4505069 -3660215 +POINT4619301 -3515792 +POINT4638006 -3490248 +POINT4746795 -3341682 +POINT4764537 -3315460 +POINT4867721 -3162956 +POINT4884477 -3136091 +POINT4981926 -2979850 +POINT4997672 -2952383 +POINT5089248 -2792633 +POINT5189529 -2601555 +POINT5203191 -2572993 +POINT5282646 -2406883 +POINT5368461 -2208877 +POINT5379963 -2179380 +POINT5446853 -2007827 +POINT5457251 -1977923 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5589111 -1567083 +POINT5636497 -1389144 +POINT5643501 -1358268 +POINT5684234 -1178695 +POINT5690087 -1147579 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5782465 -507169 +POINT5796142 -323547 +POINT5797319 -291907 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796142 323547 +POINT5793791 355121 +POINT5780113 538749 +POINT5756096 753204 +POINT5751405 784516 +POINT5724121 966621 +POINT5718269 997736 +POINT5684234 1178695 +POINT5677231 1209573 +POINT5636497 1389152 +POINT5628350 1419746 +POINT5580963 1597679 +POINT5571685 1627949 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5435352 2037326 +POINT5368461 2208885 +POINT5355871 2237934 +POINT5282646 2406883 +POINT5189529 2601562 +POINT5089248 2792640 +POINT4981926 2979858 +POINT4867721 3162956 +POINT4849980 3189178 +POINT4746795 3341682 +POINT4728090 3367228 +POINT4619301 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4323921 3872510 +POINT4199280 4008049 +POINT4047401 4161346 +POINT3889923 4308891 +POINT3727073 4450485 +POINT3702425 4470356 +POINT3559074 4585922 +POINT3533704 4604864 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2999207 4969514 +POINT2840316 5062568 +POINT2812420 5077542 +POINT2650177 5164627 +POINT2621743 5178553 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2229788 5358974 +POINT2058860 5427459 +POINT1855705 5500213 +POINT1825521 5509774 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231971 5672531 +POINT1200913 5678672 +POINT1020278 5714386 +POINT807167 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT346272 5793860 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784370 +POINT-515999 5781139 +POINT-699173 5762344 +POINT-730527 5757944 +POINT-912879 5732353 +POINT-944048 5726791 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533752 +POINT-1782143 5523633 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212990 +POINT-2580881 5198538 +POINT-2744712 5114486 +POINT-2772326 5098997 +POINT-2932922 5008911 +POINT-2959941 4992406 +POINT-3117080 4896415 +POINT-3143466 4878917 +POINT-3296920 4777145 +POINT-3322639 4758679 +POINT-3472213 4651283 +POINT-3497227 4631873 +POINT-3642700 4518989 +POINT-3666974 4498663 +POINT-3808151 4380447 +POINT-3831654 4359232 +POINT-3968345 4235847 +POINT-4123047 4085403 +POINT-4272056 3929306 +POINT-4293051 3905607 +POINT-4415153 3767776 +POINT-4435252 3743314 +POINT-4552147 3601043 +POINT-4571324 3575851 +POINT-4682853 3429336 +POINT-4701080 3403448 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-5035454 2886749 +POINT-5139274 2697563 +POINT-5153465 2669260 +POINT-5235992 2504654 +POINT-5249120 2475843 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5608696 1493675 +POINT-5616273 1462934 +POINT-5660339 1284149 +POINT-5666769 1253147 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800155 215759 +POINT-5800743 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804161 0 +POINT-5800155 -215759 +POINT-5796300 -284802 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5728582 -928241 +POINT-5704162 -1072845 +POINT-5690120 -1140554 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5527809 -1766859 +POINT-5482231 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5205000 -2566470 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4886993 -3129921 +POINT-4807083 -3252884 +POINT-4682853 -3429329 +POINT-4640969 -3484354 +POINT-4552147 -3601043 +POINT-4508248 -3654472 +POINT-4415153 -3767776 +POINT-4369299 -3819536 +POINT-4272056 -3929302 +POINT-4224307 -3979323 +POINT-4123047 -4085399 +POINT-4073474 -4133609 +POINT-3968345 -4235847 +POINT-3917012 -4282182 +POINT-3808151 -4380443 +POINT-3642700 -4518982 +POINT-3472213 -4651279 +POINT-3416042 -4691612 +POINT-3296920 -4777145 +POINT-3239292 -4815362 +POINT-3117080 -4896408 +POINT-3058068 -4932458 +POINT-2932922 -5008907 +POINT-2744712 -5114479 +POINT-2683187 -5146045 +POINT-2552711 -5212986 +POINT-2490056 -5242243 +POINT-2357185 -5304287 +POINT-2158393 -5388256 +POINT-1956619 -5464779 +POINT-1891096 -5486880 +POINT-1752143 -5533748 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-1057245 -5706591 +POINT-912879 -5732353 +POINT-699173 -5762340 +POINT-484504 -5784366 +POINT-269165 -5798397 +POINT-200040 -5800325 +POINT-53451 -5804413 +POINT15697 -5803770 +POINT162338 -5802406 +POINT231413 -5799194 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748340 +POINT875457 -5737460 +POINT1020278 -5714386 +POINT1088114 -5700974 +POINT1231971 -5672531 +POINT1299264 -5656607 +POINT1441970 -5622837 +POINT1508625 -5604423 +POINT1649978 -5565372 +POINT1855705 -5500213 +POINT2058860 -5427456 +POINT2259178 -5347194 +POINT2456375 -5259544 +POINT2518478 -5229129 +POINT2650177 -5164627 +POINT2711106 -5131923 +POINT2840316 -5062568 +POINT2899987 -5027622 +POINT3026527 -4953514 +POINT3208557 -4837612 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3612908 -4542521 +POINT3727073 -4450481 +POINT3889923 -4308887 +POINT3940386 -4261607 +POINT4047401 -4161342 +POINT4199280 -4008041 +POINT4246088 -3957143 +POINT4345352 -3849205 +POINT4390239 -3796601 +POINT4485428 -3685047 +POINT4619301 -3515792 +POINT4660156 -3460000 +POINT4746795 -3341682 +POINT4785546 -3284410 +POINT4867721 -3162956 +POINT4904318 -3104281 +POINT4981926 -2979850 +POINT5016317 -2919858 +POINT5089248 -2792633 +POINT5121383 -2731403 +POINT5189529 -2601555 +POINT5282646 -2406883 +POINT5310145 -2343433 +POINT5368461 -2208877 +POINT5393582 -2144452 +POINT5446853 -2007827 +POINT5469563 -1942512 +POINT5517723 -1804000 +POINT5537988 -1737886 +POINT5580963 -1597679 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5697016 -1110735 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5796142 -323547 +POINT5798712 -254442 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796142 323547 +POINT5791006 392507 +POINT5780113 538749 +POINT5772417 607470 +POINT5756096 753204 +POINT5724121 966621 +POINT5684234 1178695 +POINT5668937 1246135 +POINT5636497 1389152 +POINT5618702 1455973 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5495013 1869316 +POINT5446853 2007827 +POINT5421733 2072255 +POINT5368461 2208885 +POINT5282646 2406883 +POINT5189529 2601562 +POINT5157395 2662792 +POINT5089248 2792640 +POINT4981926 2979858 +POINT4867721 3162956 +POINT4828971 3220228 +POINT4746795 3341682 +POINT4619301 3515800 +POINT4576402 3570036 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4047401 4161346 +POINT3889923 4308891 +POINT3837739 4354264 +POINT3727073 4450485 +POINT3673239 4493885 +POINT3559074 4585922 +POINT3503663 4627293 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2966857 4988460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2058860 5427459 +POINT1993760 5450773 +POINT1855705 5500213 +POINT1789781 5521095 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1374677 5638764 +POINT1231971 5672531 +POINT1020278 5714386 +POINT951988 5725268 +POINT807167 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-338169 5793905 +POINT-484504 5784370 +POINT-553294 5777312 +POINT-699173 5762344 +POINT-912879 5732353 +POINT-980955 5720205 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533752 +POINT-1956619 5464782 +POINT-2021277 5440261 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212990 +POINT-2614237 5181425 +POINT-2744712 5114486 +POINT-2805023 5080655 +POINT-2932922 5008911 +POINT-2991935 4972862 +POINT-3117080 4896415 +POINT-3174709 4858196 +POINT-3296920 4777145 +POINT-3353092 4736813 +POINT-3472213 4651283 +POINT-3526845 4608890 +POINT-3642700 4518989 +POINT-3695718 4474594 +POINT-3808151 4380447 +POINT-3859484 4334111 +POINT-3968345 4235847 +POINT-4123047 4085403 +POINT-4272056 3929306 +POINT-4317911 3877545 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4594031 3546021 +POINT-4682853 3429336 +POINT-4722662 3372793 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-5035454 2886749 +POINT-5139274 2697563 +POINT-5170267 2635746 +POINT-5235992 2504654 +POINT-5264665 2441727 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5568334 1634654 +POINT-5608696 1493675 +POINT-5660339 1284149 +POINT-5674382 1216438 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431221 +POINT-5800155 215759 +POINT-5801439 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804161 0 +POINT-5800527 -195760 +POINT-5800155 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5707493 -1053121 +POINT-5704162 -1072845 +POINT-5664401 -1264556 +POINT-5660339 -1284141 +POINT-5613483 -1474246 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5488448 -1887230 +POINT-5482231 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5148239 -2679682 +POINT-5139274 -2697563 +POINT-5035454 -2886741 +POINT-4924675 -3071937 +POINT-4807083 -3252884 +POINT-4694369 -3412974 +POINT-4682853 -3429329 +POINT-4552147 -3601043 +POINT-4415153 -3767776 +POINT-4285320 -3914330 +POINT-4272056 -3929302 +POINT-4136859 -4070931 +POINT-4123047 -4085399 +POINT-3982685 -4221902 +POINT-3968345 -4235847 +POINT-3823000 -4367040 +POINT-3808151 -4380443 +POINT-3642700 -4518982 +POINT-3488016 -4639016 +POINT-3472213 -4651279 +POINT-3313169 -4765478 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2949992 -4998480 +POINT-2932922 -5008907 +POINT-2744712 -5114479 +POINT-2552711 -5212986 +POINT-2375309 -5295824 +POINT-2357185 -5304287 +POINT-2158393 -5388256 +POINT-1975322 -5457686 +POINT-1956619 -5464779 +POINT-1771097 -5527355 +POINT-1752143 -5533748 +POINT-1564420 -5589386 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-932571 -5728839 +POINT-912879 -5732353 +POINT-718981 -5759561 +POINT-699173 -5762340 +POINT-504402 -5782325 +POINT-484504 -5784366 +POINT-269165 -5798397 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748340 +POINT1020278 -5714386 +POINT1231971 -5672531 +POINT1441970 -5622837 +POINT1630698 -5570699 +POINT1649978 -5565372 +POINT1836636 -5506253 +POINT1855705 -5500213 +POINT2040030 -5434200 +POINT2058860 -5427456 +POINT2240610 -5354634 +POINT2259178 -5347194 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2822692 -5072028 +POINT2840316 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837612 +POINT3386154 -4715027 +POINT3543046 -4597889 +POINT3559074 -4585922 +POINT3727073 -4450481 +POINT3874828 -4322012 +POINT3889923 -4308887 +POINT4047401 -4161342 +POINT4185202 -4022251 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685047 +POINT4606892 -3531481 +POINT4619301 -3515792 +POINT4734978 -3357821 +POINT4746795 -3341682 +POINT4856513 -3179522 +POINT4867721 -3162956 +POINT4971340 -2996823 +POINT4981926 -2979850 +POINT5079301 -2809986 +POINT5089248 -2792633 +POINT5180234 -2619266 +POINT5189529 -2601555 +POINT5282646 -2406883 +POINT5360507 -2227231 +POINT5368461 -2208877 +POINT5439587 -2026463 +POINT5446853 -2007827 +POINT5511154 -1822893 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5631350 -1408474 +POINT5636497 -1389144 +POINT5679810 -1198202 +POINT5684234 -1178695 +POINT5720424 -986271 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5777887 -558620 +POINT5780113 -538742 +POINT5794657 -343494 +POINT5796142 -323547 +POINT5804161 -107894 +POINT5804161 107902 +POINT5796886 303559 +POINT5796142 323547 +POINT5781599 518802 +POINT5780113 538749 +POINT5756096 753204 +POINT5724121 966621 +POINT5684234 1178695 +POINT5640922 1369645 +POINT5636497 1389152 +POINT5580963 1597679 +POINT5523585 1784876 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208885 +POINT5282646 2406883 +POINT5189529 2601562 +POINT5089248 2792640 +POINT4981926 2979858 +POINT4867721 3162956 +POINT4758004 3325116 +POINT4746795 3341682 +POINT4619301 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4061479 4147137 +POINT4047401 4161346 +POINT3904520 4295215 +POINT3889923 4308891 +POINT3742168 4437361 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2857576 5052460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2077428 5420020 +POINT2058860 5427459 +POINT1874536 5493470 +POINT1855705 5500213 +POINT1669047 5559336 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231971 5672531 +POINT1020278 5714386 +POINT826920 5745197 +POINT807167 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-464544 5785671 +POINT-484504 5784370 +POINT-679275 5764386 +POINT-699173 5762344 +POINT-893071 5735133 +POINT-912879 5732353 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1732966 5539436 +POINT-1752143 5533752 +POINT-1937666 5471175 +POINT-1956619 5464782 +POINT-2139691 5395353 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212990 +POINT-2726916 5123617 +POINT-2744712 5114486 +POINT-2915477 5018697 +POINT-2932922 5008911 +POINT-3100011 4906843 +POINT-3117080 4896415 +POINT-3280251 4788201 +POINT-3296920 4777145 +POINT-3472213 4651283 +POINT-3626897 4531252 +POINT-3642700 4518989 +POINT-3792815 4393289 +POINT-3808151 4380447 +POINT-3953497 4249250 +POINT-3968345 4235847 +POINT-4123047 4085403 +POINT-4272056 3929306 +POINT-4401890 3782749 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4670738 3445252 +POINT-4682853 3429336 +POINT-4807083 3252884 +POINT-4924675 3071937 +POINT-5035454 2886749 +POINT-5129651 2715099 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482231 1906242 +POINT-5549301 1701133 +POINT-5608696 1493675 +POINT-5660339 1284149 +POINT-5700100 1092431 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5786268 451137 +POINT-5788124 431221 +POINT-5799040 235730 +POINT-5800155 215759 +OBJECT_ID100 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5704162 -1072837 +POINT-5660339 -1284141 +POINT-5608703 -1493667 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-4924682 -3071937 +POINT-4807083 -3252876 +POINT-4682861 -3429329 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929298 +POINT-4123047 -4085395 +POINT-3968353 -4235847 +POINT-3808151 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008903 +POINT-2744720 -5114479 +POINT-2552719 -5212982 +POINT-2357193 -5304283 +POINT-2158401 -5388252 +POINT-1956619 -5464775 +POINT-1752151 -5533745 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784363 +POINT-269165 -5798393 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855697 -5500213 +POINT2058853 -5427452 +POINT2259170 -5347191 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837608 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3727066 -4450477 +POINT3889923 -4308891 +POINT4047393 -4161338 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4746795 -3341682 +POINT4867721 -3162956 +POINT4981918 -2979850 +POINT5089248 -2792633 +POINT5189529 -2601555 +POINT5282638 -2406883 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107902 +POINT5796142 323547 +POINT5780105 538749 +POINT5756088 753204 +POINT5724121 966621 +POINT5684234 1178703 +POINT5636490 1389152 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208885 +POINT5282638 2406883 +POINT5189529 2601562 +POINT5089248 2792640 +POINT4981918 2979858 +POINT4867721 3162956 +POINT4746795 3341690 +POINT4619293 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4047393 4161346 +POINT3889923 4308891 +POINT3727066 4450485 +POINT3559066 4585930 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1855697 5500221 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231964 5672531 +POINT1020278 5714386 +POINT807159 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804420 +POINT-269165 5798401 +POINT-484512 5784370 +POINT-699173 5762344 +POINT-912887 5732353 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212990 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-3117080 4896415 +POINT-3296920 4777145 +POINT-3472213 4651283 +POINT-3642700 4518989 +POINT-3808151 4380447 +POINT-3968353 4235847 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4682861 3429336 +POINT-4807083 3252884 +POINT-4924682 3071937 +POINT-5035461 2886749 +POINT-5139282 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493675 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803580 -31655 +POINT-5800155 -215759 +POINT-5798391 -247370 +POINT-5788131 -431221 +POINT-5785192 -462745 +POINT-5768097 -646087 +POINT-5763989 -677480 +POINT-5740097 -860054 +POINT-5704162 -1072837 +POINT-5697733 -1103839 +POINT-5660339 -1284141 +POINT-5608703 -1493667 +POINT-5599988 -1524106 +POINT-5549301 -1701133 +POINT-5539462 -1731226 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-4924682 -3071937 +POINT-4907429 -3098484 +POINT-4807083 -3252876 +POINT-4788858 -3278764 +POINT-4682861 -3429329 +POINT-4552154 -3601043 +POINT-4532055 -3625506 +POINT-4415161 -3767776 +POINT-4272064 -3929298 +POINT-4250201 -3952200 +POINT-4123047 -4085395 +POINT-3968353 -4235847 +POINT-3944849 -4257061 +POINT-3808151 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3446495 -4669742 +POINT-3296920 -4777145 +POINT-3270535 -4794643 +POINT-3117080 -4896408 +POINT-3090061 -4912913 +POINT-2932922 -5008903 +POINT-2905310 -5024393 +POINT-2744720 -5114479 +POINT-2552719 -5212982 +POINT-2357193 -5304283 +POINT-2158401 -5388252 +POINT-1956619 -5464775 +POINT-1752151 -5533745 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-1094153 -5700005 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-667678 -5765575 +POINT-484512 -5784363 +POINT-269165 -5798393 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807159 -5748337 +POINT838427 -5743356 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1262775 -5665240 +POINT1441970 -5622833 +POINT1472488 -5614402 +POINT1649978 -5565368 +POINT1680160 -5555809 +POINT1855697 -5500213 +POINT1885503 -5489538 +POINT2058853 -5427452 +POINT2259170 -5347191 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837608 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3583715 -4566050 +POINT3727066 -4450477 +POINT3750960 -4429704 +POINT3889923 -4308891 +POINT3913026 -4287243 +POINT4047393 -4161338 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4638000 -3490248 +POINT4746795 -3341682 +POINT4764537 -3315460 +POINT4867721 -3162956 +POINT4884476 -3136091 +POINT4981918 -2979850 +POINT4997665 -2952383 +POINT5089248 -2792633 +POINT5189529 -2601555 +POINT5203190 -2572993 +POINT5282638 -2406883 +POINT5295229 -2377832 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5457250 -1977923 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5589110 -1567077 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5690087 -1147579 +POINT5724121 -966613 +POINT5728811 -935303 +POINT5756088 -753204 +POINT5759612 -721739 +POINT5780105 -538742 +POINT5782458 -507169 +POINT5796142 -323547 +POINT5797318 -291907 +POINT5804153 -107894 +POINT5804153 107902 +POINT5802978 139541 +POINT5796142 323547 +POINT5793790 355121 +POINT5780105 538749 +POINT5776582 570213 +POINT5756088 753204 +POINT5751398 784516 +POINT5724121 966621 +POINT5718269 997737 +POINT5684234 1178703 +POINT5677230 1209579 +POINT5636490 1389152 +POINT5580963 1597679 +POINT5571684 1627949 +POINT5517715 1804000 +POINT5507319 1833905 +POINT5446853 2007827 +POINT5435351 2037326 +POINT5368454 2208885 +POINT5282638 2406883 +POINT5268978 2435445 +POINT5189529 2601562 +POINT5089248 2792640 +POINT5073501 2820108 +POINT4981918 2979858 +POINT4867721 3162956 +POINT4849980 3189179 +POINT4746795 3341690 +POINT4728089 3367235 +POINT4619293 3515800 +POINT4599653 3540632 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4323921 3872510 +POINT4199280 4008049 +POINT4047393 4161346 +POINT4024290 4182993 +POINT3889923 4308891 +POINT3727066 4450485 +POINT3559066 4585930 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2999200 4969514 +POINT2840316 5062568 +POINT2812420 5077542 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2229780 5358974 +POINT2058853 5427459 +POINT2029047 5438135 +POINT1855697 5500221 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231964 5672531 +POINT1200906 5678672 +POINT1020278 5714386 +POINT807159 5748344 +POINT775730 5752160 +POINT592941 5774353 +POINT377899 5792389 +POINT346272 5793860 +POINT162338 5802414 +POINT-53451 5804420 +POINT-85100 5803537 +POINT-269165 5798401 +POINT-484512 5784370 +POINT-516006 5781139 +POINT-699173 5762344 +POINT-730528 5757944 +POINT-912887 5732353 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1366880 5640804 +POINT-1545242 5595077 +POINT-1575599 5586080 +POINT-1752151 5533752 +POINT-1782150 5523633 +POINT-1956619 5464782 +POINT-1986224 5453555 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212990 +POINT-2744720 5114486 +POINT-2772332 5098997 +POINT-2932922 5008911 +POINT-2959941 4992406 +POINT-3117080 4896415 +POINT-3143466 4878917 +POINT-3296920 4777145 +POINT-3322639 4758679 +POINT-3472213 4651283 +POINT-3497227 4631873 +POINT-3642700 4518989 +POINT-3666974 4498663 +POINT-3808151 4380447 +POINT-3968353 4235847 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4293059 3905607 +POINT-4415161 3767776 +POINT-4435260 3743314 +POINT-4552154 3601043 +POINT-4571331 3575851 +POINT-4682861 3429336 +POINT-4807083 3252884 +POINT-4824337 3226336 +POINT-4924682 3071937 +POINT-5035461 2886749 +POINT-5139282 2697563 +POINT-5153471 2669260 +POINT-5235992 2504654 +POINT-5249120 2475843 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5418545 2079012 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493675 +POINT-5616279 1462934 +POINT-5660339 1284149 +POINT-5666769 1253147 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5789896 399609 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5796303 -284802 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5728582 -928239 +POINT-5704162 -1072837 +POINT-5690120 -1140549 +POINT-5660339 -1284141 +POINT-5643793 -1351283 +POINT-5608703 -1493667 +POINT-5589668 -1560149 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-4999963 -2946086 +POINT-4924682 -3071937 +POINT-4886998 -3129918 +POINT-4807083 -3252876 +POINT-4682861 -3429329 +POINT-4640977 -3484354 +POINT-4552154 -3601043 +POINT-4508256 -3654472 +POINT-4415161 -3767776 +POINT-4272064 -3929298 +POINT-4224312 -3979319 +POINT-4123047 -4085395 +POINT-4073476 -4133607 +POINT-3968353 -4235847 +POINT-3808151 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3416042 -4691610 +POINT-3296920 -4777145 +POINT-3239292 -4815362 +POINT-3117080 -4896408 +POINT-2932922 -5008903 +POINT-2744720 -5114479 +POINT-2683194 -5146044 +POINT-2552719 -5212982 +POINT-2490064 -5242239 +POINT-2357193 -5304283 +POINT-2158401 -5388252 +POINT-1956619 -5464775 +POINT-1752151 -5533745 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-844403 -5741964 +POINT-699173 -5762344 +POINT-630386 -5769400 +POINT-484512 -5784363 +POINT-415505 -5788859 +POINT-269165 -5798393 +POINT-53451 -5804413 +POINT15697 -5803770 +POINT162338 -5802406 +POINT231413 -5799194 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020278 -5714386 +POINT1088112 -5700974 +POINT1231964 -5672531 +POINT1441970 -5622833 +POINT1508625 -5604419 +POINT1649978 -5565368 +POINT1715900 -5544490 +POINT1855697 -5500213 +POINT2058853 -5427452 +POINT2123043 -5401733 +POINT2259170 -5347191 +POINT2456375 -5259544 +POINT2518478 -5229129 +POINT2650177 -5164627 +POINT2711106 -5131923 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3084852 -4916373 +POINT3208557 -4837608 +POINT3265467 -4798328 +POINT3386154 -4715027 +POINT3441563 -4673656 +POINT3559066 -4585922 +POINT3727066 -4450477 +POINT3889923 -4308891 +POINT3940383 -4261609 +POINT4047393 -4161338 +POINT4096065 -4112215 +POINT4199280 -4008041 +POINT4246088 -3957143 +POINT4345352 -3849205 +POINT4390239 -3796600 +POINT4485428 -3685043 +POINT4528324 -3630808 +POINT4619293 -3515792 +POINT4660150 -3460000 +POINT4746795 -3341682 +POINT4785546 -3284410 +POINT4867721 -3162956 +POINT4904315 -3104281 +POINT4981918 -2979850 +POINT5016311 -2919858 +POINT5089248 -2792633 +POINT5121383 -2731403 +POINT5189529 -2601555 +POINT5282638 -2406883 +POINT5310138 -2343433 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5469561 -1942512 +POINT5517715 -1804000 +POINT5537983 -1737883 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5697016 -1110735 +POINT5724121 -966613 +POINT5734365 -898227 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5785244 -469784 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107902 +POINT5801586 177004 +POINT5796142 323547 +POINT5780105 538749 +POINT5772409 607470 +POINT5756088 753204 +POINT5724121 966621 +POINT5684234 1178703 +POINT5668935 1246140 +POINT5636490 1389152 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5495008 1869316 +POINT5446853 2007827 +POINT5421731 2072255 +POINT5368454 2208885 +POINT5340955 2272332 +POINT5282638 2406883 +POINT5252802 2469267 +POINT5189529 2601562 +POINT5157395 2662792 +POINT5089248 2792640 +POINT5054855 2852633 +POINT4981918 2979858 +POINT4867721 3162956 +POINT4746795 3341690 +POINT4705938 3397483 +POINT4619293 3515800 +POINT4576397 3570036 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4047393 4161346 +POINT3996933 4208626 +POINT3889923 4308891 +POINT3727066 4450485 +POINT3673231 4493888 +POINT3559066 4585930 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3150224 4874755 +POINT3026519 4953514 +POINT2966852 4988460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1855697 5500221 +POINT1789776 5521100 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1374675 5638764 +POINT1231964 5672531 +POINT1020278 5714386 +POINT951985 5725268 +POINT807159 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804420 +POINT-269165 5798401 +POINT-338171 5793905 +POINT-484512 5784370 +POINT-553299 5777312 +POINT-699173 5762344 +POINT-912887 5732353 +POINT-980960 5720205 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1403194 5631494 +POINT-1545242 5595077 +POINT-1611545 5575426 +POINT-1752151 5533752 +POINT-1817672 5511651 +POINT-1956619 5464782 +POINT-2021279 5440261 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212990 +POINT-2614245 5181425 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-2991935 4972862 +POINT-3117080 4896415 +POINT-3174709 4858196 +POINT-3296920 4777145 +POINT-3353092 4736813 +POINT-3472213 4651283 +POINT-3526845 4608890 +POINT-3642700 4518989 +POINT-3695718 4474594 +POINT-3808151 4380447 +POINT-3859487 4334111 +POINT-3968353 4235847 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4317919 3877545 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4594039 3546021 +POINT-4682861 3429336 +POINT-4807083 3252884 +POINT-4924682 3071937 +POINT-4960181 3012595 +POINT-5035461 2886749 +POINT-5139282 2697563 +POINT-5235992 2504654 +POINT-5264665 2441727 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493675 +POINT-5625250 1426533 +POINT-5660339 1284149 +POINT-5674382 1216438 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5774517 577234 +POINT-5788131 431221 +POINT-5800155 215759 +POINT-5801441 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804168 0 +POINT-5800527 -195760 +POINT-5800155 -215759 +POINT-5789246 -411249 +POINT-5788131 -431221 +POINT-5769954 -626171 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5707493 -1053114 +POINT-5704162 -1072837 +POINT-5660339 -1284141 +POINT-5608703 -1493667 +POINT-5554807 -1681903 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-4934951 -3054771 +POINT-4924682 -3071937 +POINT-4807083 -3252876 +POINT-4682861 -3429329 +POINT-4564270 -3585127 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929298 +POINT-4136859 -4070927 +POINT-4123047 -4085395 +POINT-3982692 -4221902 +POINT-3968353 -4235847 +POINT-3808151 -4380440 +POINT-3642700 -4518982 +POINT-3488016 -4639013 +POINT-3472213 -4651275 +POINT-3313169 -4765478 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2949992 -4998476 +POINT-2932922 -5008903 +POINT-2762165 -5104693 +POINT-2744720 -5114479 +POINT-2552719 -5212982 +POINT-2357193 -5304283 +POINT-2176827 -5380469 +POINT-2158401 -5388252 +POINT-1956619 -5464775 +POINT-1752151 -5533745 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784363 +POINT-289125 -5797093 +POINT-269165 -5798393 +POINT-73446 -5803855 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1000524 -5717533 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1422505 -5627440 +POINT1441970 -5622833 +POINT1630698 -5570695 +POINT1649978 -5565368 +POINT1836629 -5506253 +POINT1855697 -5500213 +POINT2058853 -5427452 +POINT2259170 -5347191 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2822692 -5072028 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3191683 -4848352 +POINT3208557 -4837608 +POINT3386154 -4715027 +POINT3543039 -4597889 +POINT3559066 -4585922 +POINT3711494 -4463032 +POINT3727066 -4450477 +POINT3889923 -4308891 +POINT4032797 -4175015 +POINT4047393 -4161338 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4606885 -3531480 +POINT4619293 -3515792 +POINT4734977 -3357821 +POINT4746795 -3341682 +POINT4856513 -3179522 +POINT4867721 -3162956 +POINT4971333 -2996823 +POINT4981918 -2979850 +POINT5079300 -2809986 +POINT5089248 -2792633 +POINT5180234 -2619266 +POINT5189529 -2601555 +POINT5274008 -2424927 +POINT5282638 -2406883 +POINT5360500 -2227231 +POINT5368454 -2208877 +POINT5439586 -2026463 +POINT5446853 -2007827 +POINT5511147 -1822893 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5679809 -1198202 +POINT5684234 -1178695 +POINT5720424 -986271 +POINT5724121 -966613 +POINT5753125 -772985 +POINT5756088 -753204 +POINT5777879 -558620 +POINT5780105 -538742 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5803411 -127883 +POINT5804153 -107894 +POINT5804153 107902 +POINT5796885 303559 +POINT5796142 323547 +POINT5781592 518802 +POINT5780105 538749 +POINT5756088 753204 +POINT5724121 966621 +POINT5684234 1178703 +POINT5636490 1389152 +POINT5586110 1578350 +POINT5580963 1597679 +POINT5523578 1784876 +POINT5517715 1804000 +POINT5453422 1988934 +POINT5446853 2007827 +POINT5375721 2190249 +POINT5368454 2208885 +POINT5282638 2406883 +POINT5189529 2601562 +POINT5089248 2792640 +POINT4991867 2962504 +POINT4981918 2979858 +POINT4867721 3162956 +POINT4758004 3325123 +POINT4746795 3341690 +POINT4631111 3499662 +POINT4619293 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4061472 4147137 +POINT4047393 4161346 +POINT3904519 4295215 +POINT3889923 4308891 +POINT3742161 4437361 +POINT3727066 4450485 +POINT3559066 4585930 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3043393 4942771 +POINT3026519 4953514 +POINT2857576 5052460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2077420 5420020 +POINT2058853 5427459 +POINT1874528 5493477 +POINT1855697 5500221 +POINT1669047 5559337 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231964 5672531 +POINT1020278 5714386 +POINT826913 5745197 +POINT807159 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804420 +POINT-249170 5798959 +POINT-269165 5798401 +POINT-464551 5785671 +POINT-484512 5784370 +POINT-679275 5764386 +POINT-699173 5762344 +POINT-893078 5735133 +POINT-912887 5732353 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1732972 5539437 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2139698 5395353 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212990 +POINT-2726923 5123617 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-3100011 4906843 +POINT-3117080 4896415 +POINT-3280251 4788201 +POINT-3296920 4777145 +POINT-3472213 4651283 +POINT-3626897 4531252 +POINT-3642700 4518989 +POINT-3792815 4393289 +POINT-3808151 4380447 +POINT-3953504 4249250 +POINT-3968353 4235847 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4401897 3782749 +POINT-4415161 3767776 +POINT-4539456 3616498 +POINT-4552154 3601043 +POINT-4670746 3445252 +POINT-4682861 3429336 +POINT-4807083 3252884 +POINT-4913782 3088709 +POINT-4924682 3071937 +POINT-5025193 2903914 +POINT-5035461 2886749 +POINT-5129659 2715099 +POINT-5139282 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5475320 1925010 +POINT-5482239 1906242 +POINT-5543085 1720145 +POINT-5549301 1701133 +POINT-5608703 1493675 +POINT-5655553 1303570 +POINT-5660339 1284149 +POINT-5700100 1092431 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5799041 235730 +POINT-5800155 215759 +POINT-5803797 19998 +OBJECT_ID110 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431213 +POINT-5768097 -646087 +POINT-5740097 -860046 +POINT-5704162 -1072830 +POINT-5660339 -1284133 +POINT-5608703 -1493667 +POINT-5549301 -1701126 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139282 -2697555 +POINT-5035461 -2886734 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4682861 -3429321 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929290 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3808166 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2744720 -5114471 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2158401 -5388260 +POINT-1956619 -5464767 +POINT-1752151 -5533737 +POINT-1545242 -5595062 +POINT-1336212 -5648651 +POINT-1125320 -5694443 +POINT-912887 -5732345 +POINT-699173 -5762344 +POINT-484512 -5784363 +POINT-269165 -5798385 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855697 -5500213 +POINT2058853 -5427444 +POINT2259170 -5347198 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3026519 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3727066 -4450470 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4199280 -4008041 +POINT4345352 -3849197 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4746795 -3341674 +POINT4867721 -3162948 +POINT4981918 -2979843 +POINT5089248 -2792633 +POINT5189529 -2601547 +POINT5282638 -2406875 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107910 +POINT5796142 323547 +POINT5780105 538757 +POINT5756088 753204 +POINT5724121 966629 +POINT5684234 1178695 +POINT5636490 1389160 +POINT5580963 1597686 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208892 +POINT5282638 2406891 +POINT5189529 2601562 +POINT5089248 2792648 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4619293 3515808 +POINT4485428 3685058 +POINT4345352 3849212 +POINT4199280 4008056 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953521 +POINT2840316 5062576 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1855697 5500229 +POINT1649978 5565384 +POINT1441970 5622848 +POINT1231964 5672531 +POINT1020278 5714386 +POINT807159 5748352 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804428 +POINT-269165 5798401 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-3117080 4896423 +POINT-3296936 4777145 +POINT-3472213 4651291 +POINT-3642700 4518997 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4682861 3429336 +POINT-4807098 3252884 +POINT-4924682 3071945 +POINT-5035461 2886749 +POINT-5139282 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5482239 1906250 +POINT-5549301 1701141 +POINT-5608703 1493682 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431228 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803580 -31655 +POINT-5800155 -215759 +POINT-5798391 -247369 +POINT-5788131 -431213 +POINT-5785192 -462738 +POINT-5768097 -646087 +POINT-5763989 -677478 +POINT-5740097 -860046 +POINT-5704162 -1072830 +POINT-5697733 -1103831 +POINT-5660339 -1284133 +POINT-5608703 -1493667 +POINT-5599988 -1524105 +POINT-5549301 -1701126 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139282 -2697555 +POINT-5124050 -2725311 +POINT-5035461 -2886734 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4788871 -3278770 +POINT-4682861 -3429321 +POINT-4552154 -3601043 +POINT-4532055 -3625506 +POINT-4415161 -3767776 +POINT-4272064 -3929290 +POINT-4250201 -3952192 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3944851 -4257054 +POINT-3808166 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296936 -4777145 +POINT-3270548 -4794643 +POINT-3117080 -4896408 +POINT-3090061 -4912912 +POINT-2932922 -5008896 +POINT-2744720 -5114471 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2328027 -5316597 +POINT-2158401 -5388260 +POINT-1956619 -5464767 +POINT-1752151 -5533737 +POINT-1545242 -5595062 +POINT-1514574 -5602925 +POINT-1336212 -5648651 +POINT-1125320 -5694443 +POINT-912887 -5732345 +POINT-881532 -5736747 +POINT-699173 -5762344 +POINT-667678 -5765575 +POINT-484512 -5784363 +POINT-269165 -5798385 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807159 -5748337 +POINT838427 -5743356 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1262775 -5665240 +POINT1441970 -5622833 +POINT1472488 -5614402 +POINT1649978 -5565368 +POINT1680160 -5555809 +POINT1855697 -5500213 +POINT1885503 -5489537 +POINT2058853 -5427444 +POINT2088243 -5415671 +POINT2259170 -5347198 +POINT2288103 -5334337 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT2867635 -5046561 +POINT3026519 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3583715 -4566049 +POINT3727066 -4450470 +POINT3750960 -4429697 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4199280 -4008041 +POINT4345352 -3849197 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4638000 -3490247 +POINT4746795 -3341674 +POINT4764537 -3315452 +POINT4867721 -3162948 +POINT4884476 -3136084 +POINT4981918 -2979843 +POINT5089248 -2792633 +POINT5189529 -2601547 +POINT5203190 -2572986 +POINT5282638 -2406875 +POINT5295229 -2377826 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5457250 -1977923 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5589110 -1567077 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5690087 -1147579 +POINT5724121 -966613 +POINT5728811 -935303 +POINT5756088 -753204 +POINT5759612 -721739 +POINT5780105 -538742 +POINT5782458 -507169 +POINT5796142 -323547 +POINT5797318 -291907 +POINT5804153 -107894 +POINT5804153 107910 +POINT5802978 139547 +POINT5796142 323547 +POINT5793790 355122 +POINT5780105 538757 +POINT5776582 570220 +POINT5756088 753204 +POINT5751398 784517 +POINT5724121 966629 +POINT5684234 1178695 +POINT5677230 1209574 +POINT5636490 1389160 +POINT5580963 1597686 +POINT5571684 1627956 +POINT5517715 1804000 +POINT5507319 1833905 +POINT5446853 2007827 +POINT5435351 2037327 +POINT5368454 2208892 +POINT5282638 2406891 +POINT5268978 2435452 +POINT5189529 2601562 +POINT5174816 2629598 +POINT5089248 2792648 +POINT5073501 2820115 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4849980 3189185 +POINT4746795 3341690 +POINT4728089 3367236 +POINT4619293 3515808 +POINT4599653 3540640 +POINT4485428 3685058 +POINT4345352 3849212 +POINT4323921 3872517 +POINT4199280 4008056 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3533697 4604864 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953521 +POINT2999200 4969522 +POINT2840316 5062576 +POINT2812420 5077549 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2229780 5358974 +POINT2058853 5427459 +POINT2029047 5438136 +POINT1855697 5500229 +POINT1649978 5565384 +POINT1619460 5573815 +POINT1441970 5622848 +POINT1411159 5630138 +POINT1231964 5672531 +POINT1200906 5678672 +POINT1020278 5714386 +POINT807159 5748352 +POINT775730 5752167 +POINT592941 5774353 +POINT377899 5792389 +POINT346272 5793860 +POINT162338 5802414 +POINT-53451 5804428 +POINT-85100 5803544 +POINT-269165 5798401 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1366880 5640804 +POINT-1545242 5595077 +POINT-1575599 5586080 +POINT-1752151 5533752 +POINT-1782150 5523633 +POINT-1956619 5464782 +POINT-1986224 5453555 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2744720 5114486 +POINT-2772332 5098997 +POINT-2932922 5008911 +POINT-3117080 4896423 +POINT-3143468 4878923 +POINT-3296936 4777145 +POINT-3472213 4651291 +POINT-3497227 4631881 +POINT-3642700 4518997 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4293059 3905607 +POINT-4415161 3767776 +POINT-4435260 3743314 +POINT-4552154 3601043 +POINT-4571331 3575851 +POINT-4682861 3429336 +POINT-4701089 3403448 +POINT-4807098 3252884 +POINT-4824350 3226337 +POINT-4924682 3071945 +POINT-4940935 3044774 +POINT-5035461 2886749 +POINT-5139282 2697570 +POINT-5153471 2669266 +POINT-5235992 2504654 +POINT-5249120 2475844 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5418545 2079013 +POINT-5482239 1906250 +POINT-5549301 1701141 +POINT-5608703 1493682 +POINT-5616279 1462940 +POINT-5660339 1284149 +POINT-5666769 1253147 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788131 431228 +POINT-5789896 399615 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5796303 -284800 +POINT-5788131 -431213 +POINT-5768097 -646087 +POINT-5740097 -860046 +POINT-5728582 -928231 +POINT-5704162 -1072830 +POINT-5690120 -1140541 +POINT-5660339 -1284133 +POINT-5643793 -1351277 +POINT-5608703 -1493667 +POINT-5589668 -1560146 +POINT-5549301 -1701126 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5205002 -2566468 +POINT-5139282 -2697555 +POINT-5035461 -2886734 +POINT-4999963 -2946079 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4682861 -3429321 +POINT-4640977 -3484348 +POINT-4552154 -3601043 +POINT-4508256 -3654472 +POINT-4415161 -3767776 +POINT-4369306 -3819533 +POINT-4272064 -3929290 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3808166 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3416046 -4691610 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-3058068 -4932454 +POINT-2932922 -5008896 +POINT-2872614 -5042727 +POINT-2744720 -5114471 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2158401 -5388260 +POINT-1956619 -5464767 +POINT-1752151 -5533737 +POINT-1545242 -5595062 +POINT-1336212 -5648651 +POINT-1268633 -5663325 +POINT-1125320 -5694443 +POINT-1057247 -5706589 +POINT-912887 -5732345 +POINT-699173 -5762344 +POINT-630386 -5769400 +POINT-484512 -5784363 +POINT-269165 -5798385 +POINT-200040 -5800317 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT231413 -5799186 +POINT377899 -5792373 +POINT446808 -5786599 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020278 -5714386 +POINT1088112 -5700974 +POINT1231964 -5672531 +POINT1441970 -5622833 +POINT1508625 -5604419 +POINT1649978 -5565368 +POINT1715900 -5544490 +POINT1855697 -5500213 +POINT1920797 -5476895 +POINT2058853 -5427444 +POINT2123043 -5401730 +POINT2259170 -5347198 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT2899984 -5027615 +POINT3026519 -4953506 +POINT3084852 -4916370 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3441563 -4673656 +POINT3559066 -4585922 +POINT3612901 -4542517 +POINT3727066 -4450470 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4096065 -4112210 +POINT4199280 -4008041 +POINT4345352 -3849197 +POINT4390239 -3796595 +POINT4485428 -3685043 +POINT4528324 -3630808 +POINT4619293 -3515792 +POINT4746795 -3341674 +POINT4785546 -3284402 +POINT4867721 -3162948 +POINT4904315 -3104273 +POINT4981918 -2979843 +POINT5089248 -2792633 +POINT5121383 -2731400 +POINT5189529 -2601547 +POINT5282638 -2406875 +POINT5310138 -2343428 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5469561 -1942512 +POINT5517715 -1804000 +POINT5537983 -1737883 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5697016 -1110735 +POINT5724121 -966613 +POINT5734365 -898227 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5785244 -469784 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107910 +POINT5801586 177009 +POINT5796142 323547 +POINT5780105 538757 +POINT5772409 607475 +POINT5756088 753204 +POINT5724121 966629 +POINT5684234 1178695 +POINT5668935 1246137 +POINT5636490 1389160 +POINT5580963 1597686 +POINT5517715 1804000 +POINT5495008 1869316 +POINT5446853 2007827 +POINT5421731 2072258 +POINT5368454 2208892 +POINT5340955 2272340 +POINT5282638 2406891 +POINT5252802 2469272 +POINT5189529 2601562 +POINT5157395 2662794 +POINT5089248 2792648 +POINT5054855 2852638 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4705938 3397485 +POINT4619293 3515808 +POINT4576397 3570043 +POINT4485428 3685058 +POINT4440541 3737661 +POINT4345352 3849212 +POINT4298544 3900113 +POINT4199280 4008056 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953521 +POINT2966852 4988467 +POINT2840316 5062576 +POINT2779387 5095278 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1993753 5450778 +POINT1855697 5500229 +POINT1649978 5565384 +POINT1441970 5622848 +POINT1374675 5638769 +POINT1231964 5672531 +POINT1020278 5714386 +POINT807159 5748352 +POINT738514 5756684 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804428 +POINT-122575 5802497 +POINT-269165 5798401 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1403194 5631494 +POINT-1545242 5595077 +POINT-1611545 5575426 +POINT-1752151 5533752 +POINT-1817672 5511651 +POINT-1956619 5464782 +POINT-2021279 5440261 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2614245 5181430 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-2991935 4972865 +POINT-3117080 4896423 +POINT-3174714 4858201 +POINT-3296936 4777145 +POINT-3353103 4736816 +POINT-3472213 4651291 +POINT-3526845 4608898 +POINT-3642700 4518997 +POINT-3695723 4474600 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4317919 3877545 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4594039 3546021 +POINT-4682861 3429336 +POINT-4807098 3252884 +POINT-4924682 3071945 +POINT-4960181 3012600 +POINT-5035461 2886749 +POINT-5068730 2826128 +POINT-5139282 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5482239 1906250 +POINT-5549301 1701141 +POINT-5608703 1493682 +POINT-5625250 1426539 +POINT-5660339 1284149 +POINT-5674382 1216438 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5774517 577237 +POINT-5788131 431228 +POINT-5800155 215759 +POINT-5801441 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804168 0 +POINT-5800527 -195760 +POINT-5800155 -215759 +POINT-5789246 -411242 +POINT-5788131 -431213 +POINT-5769954 -626170 +POINT-5768097 -646087 +POINT-5740097 -860046 +POINT-5707493 -1053107 +POINT-5704162 -1072830 +POINT-5664401 -1264548 +POINT-5660339 -1284133 +POINT-5608703 -1493667 +POINT-5549301 -1701126 +POINT-5488455 -1887223 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5244286 -2486451 +POINT-5235992 -2504654 +POINT-5139282 -2697555 +POINT-5035461 -2886734 +POINT-4934951 -3054763 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4694377 -3412967 +POINT-4682861 -3429321 +POINT-4564270 -3585126 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4285328 -3914319 +POINT-4272064 -3929290 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3808166 -4380432 +POINT-3658037 -4506140 +POINT-3642700 -4518982 +POINT-3488016 -4639013 +POINT-3472213 -4651275 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2762165 -5104685 +POINT-2744720 -5114471 +POINT-2570516 -5203851 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2158401 -5388260 +POINT-1975322 -5457676 +POINT-1956619 -5464767 +POINT-1752151 -5533737 +POINT-1564421 -5589378 +POINT-1545242 -5595062 +POINT-1355587 -5643684 +POINT-1336212 -5648651 +POINT-1125320 -5694443 +POINT-932578 -5728832 +POINT-912887 -5732345 +POINT-718982 -5759564 +POINT-699173 -5762344 +POINT-484512 -5784363 +POINT-289125 -5797086 +POINT-269165 -5798385 +POINT-53451 -5804413 +POINT142336 -5802585 +POINT162338 -5802398 +POINT357918 -5793303 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1000524 -5717533 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1422505 -5627440 +POINT1441970 -5622833 +POINT1630698 -5570695 +POINT1649978 -5565368 +POINT1836629 -5506253 +POINT1855697 -5500213 +POINT2058853 -5427444 +POINT2240603 -5354636 +POINT2259170 -5347198 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3009260 -4963615 +POINT3026519 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543039 -4597889 +POINT3559066 -4585922 +POINT3727066 -4450470 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4199280 -4008041 +POINT4331812 -3863921 +POINT4345352 -3849197 +POINT4472444 -3700259 +POINT4485428 -3685043 +POINT4606885 -3531480 +POINT4619293 -3515792 +POINT4734977 -3357814 +POINT4746795 -3341674 +POINT4856513 -3179515 +POINT4867721 -3162948 +POINT4981918 -2979843 +POINT5079300 -2809986 +POINT5089248 -2792633 +POINT5180234 -2619259 +POINT5189529 -2601547 +POINT5274008 -2424919 +POINT5282638 -2406875 +POINT5360500 -2227230 +POINT5368454 -2208877 +POINT5439586 -2026463 +POINT5446853 -2007827 +POINT5511147 -1822893 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5679809 -1198202 +POINT5684234 -1178695 +POINT5720424 -986271 +POINT5724121 -966613 +POINT5753125 -772985 +POINT5756088 -753204 +POINT5777879 -558620 +POINT5780105 -538742 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5803411 -127883 +POINT5804153 -107894 +POINT5804153 107910 +POINT5796885 303559 +POINT5796142 323547 +POINT5781592 518809 +POINT5780105 538757 +POINT5756088 753204 +POINT5724121 966629 +POINT5684234 1178695 +POINT5636490 1389160 +POINT5586110 1578358 +POINT5580963 1597686 +POINT5523578 1784877 +POINT5517715 1804000 +POINT5453422 1988934 +POINT5446853 2007827 +POINT5375721 2190256 +POINT5368454 2208892 +POINT5282638 2406891 +POINT5189529 2601562 +POINT5089248 2792648 +POINT4991867 2962505 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4619293 3515808 +POINT4485428 3685058 +POINT4358336 3833997 +POINT4345352 3849212 +POINT4199280 4008056 +POINT4061472 4147137 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3043393 4942778 +POINT3026519 4953521 +POINT2857576 5052468 +POINT2840316 5062576 +POINT2667801 5155168 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2077420 5420020 +POINT2058853 5427459 +POINT1874528 5493484 +POINT1855697 5500229 +POINT1669047 5559345 +POINT1649978 5565384 +POINT1461251 5617522 +POINT1441970 5622848 +POINT1251429 5667926 +POINT1231964 5672531 +POINT1020278 5714386 +POINT807159 5748352 +POINT612797 5771943 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804428 +POINT-269165 5798401 +POINT-464551 5785678 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1732972 5539437 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2139698 5395353 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-3100011 4906850 +POINT-3117080 4896423 +POINT-3280265 4788201 +POINT-3296936 4777145 +POINT-3472213 4651291 +POINT-3642700 4518997 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4108708 4099349 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4401897 3782749 +POINT-4415161 3767776 +POINT-4539456 3616498 +POINT-4552154 3601043 +POINT-4670746 3445252 +POINT-4682861 3429336 +POINT-4795583 3269239 +POINT-4807098 3252884 +POINT-4924682 3071945 +POINT-5025193 2903915 +POINT-5035461 2886749 +POINT-5129659 2715106 +POINT-5139282 2697570 +POINT-5235992 2504654 +POINT-5317176 2326490 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5482239 1906250 +POINT-5543085 1720153 +POINT-5549301 1701141 +POINT-5603197 1512912 +POINT-5608703 1493682 +POINT-5655553 1303571 +POINT-5660339 1284149 +POINT-5700100 1092431 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5786274 451144 +POINT-5788131 431228 +POINT-5799041 235731 +POINT-5800155 215759 +POINT-5803797 19998 +OBJECT_ID122 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804165 0 +POINT-5800152 -215759 +POINT-5788124 -431213 +POINT-5768097 -646087 +POINT-5740093 -860061 +POINT-5704159 -1072845 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5549301 -1701126 +POINT-5482231 -1906250 +POINT-5407589 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139274 -2697555 +POINT-5035454 -2886749 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4682853 -3429336 +POINT-4552150 -3601043 +POINT-4415153 -3767776 +POINT-4272053 -3929306 +POINT-4123047 -4085403 +POINT-3968341 -4235855 +POINT-3808155 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-2932926 -5008911 +POINT-2744716 -5114486 +POINT-2552711 -5212982 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1752143 -5533752 +POINT-1545242 -5595077 +POINT-1336204 -5648666 +POINT-1125320 -5694443 +POINT-912879 -5732345 +POINT-699173 -5762344 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855705 -5500213 +POINT2058860 -5427459 +POINT2259178 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3026527 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308883 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849197 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746795 -3341690 +POINT4867721 -3162948 +POINT4981926 -2979858 +POINT5089248 -2792633 +POINT5189529 -2601562 +POINT5282646 -2406875 +POINT5368461 -2208877 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597671 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5796142 -323547 +POINT5804161 -107894 +POINT5804161 107894 +POINT5796142 323547 +POINT5780113 538742 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636497 1389144 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208877 +POINT5282646 2406891 +POINT5189529 2601562 +POINT5089248 2792633 +POINT4981926 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849212 +POINT4199280 4008041 +POINT4047401 4161346 +POINT3889923 4308899 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953521 +POINT2840316 5062576 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2058860 5427459 +POINT1855705 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-912879 5732361 +POINT-1125320 5694443 +POINT-1336204 5648666 +POINT-1545242 5595077 +POINT-1752143 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212982 +POINT-2744716 5114486 +POINT-2932926 5008911 +POINT-3117080 4896408 +POINT-3296924 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808155 4380447 +POINT-3968341 4235855 +POINT-4123047 4085403 +POINT-4272053 3929306 +POINT-4415153 3767776 +POINT-4552150 3601043 +POINT-4682853 3429336 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5035454 2886749 +POINT-5139274 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407589 2108719 +POINT-5482231 1906250 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5704159 1072845 +POINT-5740093 860061 +POINT-5768097 646087 +POINT-5788124 431228 +POINT-5800152 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804165 0 +POINT-5800152 -215759 +POINT-5788124 -431213 +POINT-5785186 -462738 +POINT-5768097 -646087 +POINT-5740093 -860061 +POINT-5734821 -891280 +POINT-5704159 -1072845 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5599982 -1524105 +POINT-5549301 -1701126 +POINT-5539461 -1731221 +POINT-5482231 -1906250 +POINT-5471280 -1935955 +POINT-5407589 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139274 -2697555 +POINT-5124042 -2725313 +POINT-5035454 -2886749 +POINT-5019201 -2913918 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4682853 -3429336 +POINT-4663677 -3454528 +POINT-4552150 -3601043 +POINT-4532051 -3625506 +POINT-4415153 -3767776 +POINT-4394158 -3791475 +POINT-4272053 -3929306 +POINT-4123047 -4085403 +POINT-4100349 -4107477 +POINT-3968341 -4235855 +POINT-3944840 -4257069 +POINT-3808155 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3446496 -4669742 +POINT-3296924 -4777145 +POINT-3270538 -4794643 +POINT-3117080 -4896408 +POINT-3090062 -4912914 +POINT-2932926 -5008911 +POINT-2744716 -5114486 +POINT-2716546 -5128937 +POINT-2552711 -5212982 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-2128790 -5399487 +POINT-1956619 -5464782 +POINT-1752143 -5533752 +POINT-1721788 -5542750 +POINT-1545242 -5595077 +POINT-1514573 -5602940 +POINT-1336204 -5648666 +POINT-1125320 -5694443 +POINT-912879 -5732345 +POINT-881525 -5736747 +POINT-699173 -5762344 +POINT-667677 -5765575 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT409449 -5789743 +POINT592941 -5774353 +POINT807167 -5748337 +POINT838434 -5743356 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1262788 -5665240 +POINT1441970 -5622833 +POINT1472488 -5614402 +POINT1649978 -5565368 +POINT1680162 -5555809 +POINT1855705 -5500213 +POINT1885511 -5489539 +POINT2058860 -5427459 +POINT2088250 -5415684 +POINT2259178 -5347198 +POINT2288110 -5334339 +POINT2456375 -5259552 +POINT2484809 -5245625 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT2867637 -5046561 +POINT3026527 -4953506 +POINT3053234 -4936503 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3750966 -4429710 +POINT3889923 -4308883 +POINT4047401 -4161346 +POINT4069684 -4138854 +POINT4199280 -4008041 +POINT4345360 -3849197 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746795 -3341690 +POINT4764537 -3315466 +POINT4867721 -3162948 +POINT4884477 -3136086 +POINT4981926 -2979858 +POINT4997672 -2952389 +POINT5089248 -2792633 +POINT5103961 -2764600 +POINT5189529 -2601562 +POINT5203191 -2572998 +POINT5282646 -2406875 +POINT5368461 -2208877 +POINT5379963 -2179380 +POINT5446853 -2007827 +POINT5457251 -1977923 +POINT5517723 -1804000 +POINT5580963 -1597671 +POINT5589111 -1567077 +POINT5636497 -1389144 +POINT5643501 -1358268 +POINT5684234 -1178695 +POINT5690087 -1147579 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5782465 -507169 +POINT5796142 -323547 +POINT5797319 -291907 +POINT5804161 -107894 +POINT5804161 107894 +POINT5796142 323547 +POINT5793791 355119 +POINT5780113 538742 +POINT5756096 753204 +POINT5751405 784514 +POINT5724121 966613 +POINT5718269 997729 +POINT5684234 1178695 +POINT5677231 1209572 +POINT5636497 1389144 +POINT5628350 1419739 +POINT5580963 1597671 +POINT5571685 1627943 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5435352 2037324 +POINT5368461 2208877 +POINT5355871 2237929 +POINT5282646 2406891 +POINT5189529 2601562 +POINT5089248 2792633 +POINT4981926 2979858 +POINT4867721 3162964 +POINT4849980 3189185 +POINT4746795 3341690 +POINT4728090 3367233 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849212 +POINT4199280 4008041 +POINT4047401 4161346 +POINT3889923 4308899 +POINT3727073 4450485 +POINT3702425 4470356 +POINT3559074 4585922 +POINT3533704 4604864 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953521 +POINT2999207 4969522 +POINT2840316 5062576 +POINT2812420 5077549 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2229788 5358974 +POINT2058860 5427459 +POINT1855705 5500213 +POINT1825521 5509773 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1200919 5678672 +POINT1020278 5714386 +POINT807167 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT346272 5793860 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-912879 5732361 +POINT-1125320 5694443 +POINT-1336204 5648666 +POINT-1366873 5640804 +POINT-1545242 5595077 +POINT-1575598 5586080 +POINT-1752143 5533752 +POINT-1782143 5523633 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212982 +POINT-2744716 5114486 +POINT-2772330 5098997 +POINT-2932926 5008911 +POINT-3117080 4896408 +POINT-3296924 4777145 +POINT-3322642 4758678 +POINT-3472213 4651275 +POINT-3497227 4631866 +POINT-3642700 4518982 +POINT-3666975 4498657 +POINT-3808155 4380447 +POINT-3831657 4359233 +POINT-3968341 4235855 +POINT-4123047 4085403 +POINT-4272053 3929306 +POINT-4415153 3767776 +POINT-4435253 3743314 +POINT-4552150 3601043 +POINT-4682853 3429336 +POINT-4701081 3403448 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5035454 2886749 +POINT-5139274 2697570 +POINT-5153465 2669266 +POINT-5235992 2504654 +POINT-5249120 2475844 +POINT-5325470 2308288 +POINT-5407589 2108719 +POINT-5482231 1906250 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5616273 1462928 +POINT-5660339 1284149 +POINT-5704159 1072845 +POINT-5740093 860061 +POINT-5768097 646087 +POINT-5788124 431228 +POINT-5789889 399615 +POINT-5800152 215759 +POLYGON_AT_HEIGHT18000000 +POINT-5804165 0 +POINT-5800152 -215759 +POINT-5788124 -431213 +POINT-5768097 -646087 +POINT-5740093 -860061 +POINT-5704159 -1072845 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5549301 -1701126 +POINT-5482231 -1906250 +POINT-5407589 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5205000 -2566468 +POINT-5139274 -2697555 +POINT-5035454 -2886749 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4767277 -3309427 +POINT-4682853 -3429336 +POINT-4640970 -3484359 +POINT-4552150 -3601043 +POINT-4508250 -3654472 +POINT-4415153 -3767776 +POINT-4369297 -3819538 +POINT-4272053 -3929306 +POINT-4123047 -4085403 +POINT-4073472 -4133615 +POINT-3968341 -4235855 +POINT-3917010 -4282189 +POINT-3808155 -4380447 +POINT-3755136 -4424840 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3416043 -4691610 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-3058069 -4932459 +POINT-2932926 -5008911 +POINT-2744716 -5114486 +POINT-2683189 -5146049 +POINT-2552711 -5212982 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-2093736 -5412781 +POINT-1956619 -5464782 +POINT-1891096 -5486883 +POINT-1752143 -5533752 +POINT-1685843 -5553404 +POINT-1545242 -5595077 +POINT-1478257 -5612250 +POINT-1336204 -5648666 +POINT-1125320 -5694443 +POINT-1057245 -5706589 +POINT-912879 -5732345 +POINT-699173 -5762344 +POINT-630383 -5769400 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1088117 -5700974 +POINT1231979 -5672531 +POINT1441970 -5622833 +POINT1508625 -5604419 +POINT1649978 -5565368 +POINT1715902 -5544490 +POINT1855705 -5500213 +POINT1920805 -5476900 +POINT2058860 -5427459 +POINT2123051 -5401740 +POINT2259178 -5347198 +POINT2322368 -5319113 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT2899987 -5027615 +POINT3026527 -4953506 +POINT3084858 -4916370 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3779257 -4405110 +POINT3889923 -4308883 +POINT3940386 -4261606 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849197 +POINT4390244 -3796595 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4660156 -3460002 +POINT4746795 -3341690 +POINT4785546 -3284413 +POINT4867721 -3162948 +POINT4904318 -3104278 +POINT4981926 -2979858 +POINT5016317 -2919863 +POINT5089248 -2792633 +POINT5121383 -2731405 +POINT5189529 -2601562 +POINT5219368 -2539176 +POINT5282646 -2406875 +POINT5310145 -2343428 +POINT5368461 -2208877 +POINT5393582 -2144452 +POINT5446853 -2007827 +POINT5469563 -1942512 +POINT5517723 -1804000 +POINT5537988 -1737883 +POINT5580963 -1597671 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5697016 -1110735 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5796142 -323547 +POINT5798712 -254442 +POINT5804161 -107894 +POINT5804161 107894 +POINT5796142 323547 +POINT5791006 392505 +POINT5780113 538742 +POINT5772417 607465 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5668937 1246133 +POINT5636497 1389144 +POINT5618702 1455966 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5495013 1869316 +POINT5446853 2007827 +POINT5421733 2072253 +POINT5368461 2208877 +POINT5282646 2406891 +POINT5189529 2601562 +POINT5157395 2662790 +POINT5089248 2792633 +POINT4981926 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4619301 3515792 +POINT4576402 3570028 +POINT4485428 3685043 +POINT4345360 3849212 +POINT4199280 4008041 +POINT4150611 4057167 +POINT4047401 4161346 +POINT3889923 4308899 +POINT3727073 4450485 +POINT3673239 4493885 +POINT3559074 4585922 +POINT3503663 4627293 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953521 +POINT2966857 4988467 +POINT2840316 5062576 +POINT2779387 5095278 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2058860 5427459 +POINT1993760 5450773 +POINT1855705 5500213 +POINT1789781 5521092 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-912879 5732361 +POINT-1125320 5694443 +POINT-1192897 5679774 +POINT-1336204 5648666 +POINT-1403189 5631494 +POINT-1545242 5595077 +POINT-1611542 5575426 +POINT-1752143 5533752 +POINT-1956619 5464782 +POINT-2021277 5440261 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212982 +POINT-2614238 5181420 +POINT-2744716 5114486 +POINT-2805027 5080655 +POINT-2932926 5008911 +POINT-3117080 4896408 +POINT-3174710 4858191 +POINT-3296924 4777145 +POINT-3353095 4736811 +POINT-3472213 4651275 +POINT-3526845 4608883 +POINT-3642700 4518982 +POINT-3808155 4380447 +POINT-3968341 4235855 +POINT-4123047 4085403 +POINT-4272053 3929306 +POINT-4317909 3877545 +POINT-4415153 3767776 +POINT-4552150 3601043 +POINT-4594033 3546021 +POINT-4682853 3429336 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5035454 2886749 +POINT-5139274 2697570 +POINT-5170267 2635751 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407589 2108719 +POINT-5482231 1906250 +POINT-5549301 1701126 +POINT-5568334 1634647 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5674381 1216438 +POINT-5704159 1072845 +POINT-5715674 1004660 +POINT-5740093 860061 +POINT-5749067 791494 +POINT-5768097 646087 +POINT-5788124 431228 +POINT-5800152 215759 +POINT-5801438 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804165 0 +POINT-5800524 -195760 +POINT-5800152 -215759 +POINT-5789239 -411242 +POINT-5788124 -431213 +POINT-5768097 -646087 +POINT-5742689 -840228 +POINT-5740093 -860061 +POINT-5704159 -1072845 +POINT-5664401 -1264563 +POINT-5660339 -1284149 +POINT-5613483 -1474247 +POINT-5608696 -1493667 +POINT-5549301 -1701126 +POINT-5482231 -1906250 +POINT-5414508 -2089951 +POINT-5407589 -2108719 +POINT-5325470 -2308273 +POINT-5244286 -2486451 +POINT-5235992 -2504654 +POINT-5148239 -2679675 +POINT-5139274 -2697555 +POINT-5035454 -2886749 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4694369 -3412981 +POINT-4682853 -3429336 +POINT-4564265 -3585128 +POINT-4552150 -3601043 +POINT-4427852 -3752321 +POINT-4415153 -3767776 +POINT-4272053 -3929306 +POINT-4123047 -4085403 +POINT-3968341 -4235855 +POINT-3823003 -4367045 +POINT-3808155 -4380447 +POINT-3642700 -4518982 +POINT-3488016 -4639013 +POINT-3472213 -4651275 +POINT-3313172 -4765478 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-2932926 -5008911 +POINT-2762162 -5104700 +POINT-2744716 -5114486 +POINT-2552711 -5212982 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1975322 -5457690 +POINT-1956619 -5464782 +POINT-1771097 -5527359 +POINT-1752143 -5533752 +POINT-1564420 -5589393 +POINT-1545242 -5595077 +POINT-1355580 -5643699 +POINT-1336204 -5648666 +POINT-1144867 -5690200 +POINT-1125320 -5694443 +POINT-932571 -5728832 +POINT-912879 -5732345 +POINT-718981 -5759564 +POINT-699173 -5762344 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT573008 -5776025 +POINT592941 -5774353 +POINT807167 -5748337 +POINT1000525 -5717533 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1422506 -5627440 +POINT1441970 -5622833 +POINT1630698 -5570695 +POINT1649978 -5565368 +POINT1836636 -5506253 +POINT1855705 -5500213 +POINT2040030 -5434203 +POINT2058860 -5427459 +POINT2240610 -5354638 +POINT2259178 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3009267 -4963615 +POINT3026527 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543046 -4597889 +POINT3559074 -4585922 +POINT3711501 -4463039 +POINT3727073 -4450485 +POINT3874828 -4322009 +POINT3889923 -4308883 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849197 +POINT4472445 -3700259 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4734978 -3357828 +POINT4746795 -3341690 +POINT4856513 -3179516 +POINT4867721 -3162948 +POINT4981926 -2979858 +POINT5079301 -2809987 +POINT5089248 -2792633 +POINT5180234 -2619273 +POINT5189529 -2601562 +POINT5274015 -2424921 +POINT5282646 -2406875 +POINT5360507 -2227230 +POINT5368461 -2208877 +POINT5439587 -2026463 +POINT5446853 -2007827 +POINT5511154 -1822893 +POINT5517723 -1804000 +POINT5580963 -1597671 +POINT5631350 -1408473 +POINT5636497 -1389144 +POINT5679810 -1198202 +POINT5684234 -1178695 +POINT5720424 -986271 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5777887 -558620 +POINT5780113 -538742 +POINT5794657 -343494 +POINT5796142 -323547 +POINT5804161 -107894 +POINT5804161 107894 +POINT5796886 303558 +POINT5796142 323547 +POINT5781599 518795 +POINT5780113 538742 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5640922 1369638 +POINT5636497 1389144 +POINT5580963 1597671 +POINT5523585 1784876 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208877 +POINT5282646 2406891 +POINT5198160 2583518 +POINT5189529 2601562 +POINT5089248 2792633 +POINT4991874 2962504 +POINT4981926 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849212 +POINT4199280 4008041 +POINT4061479 4147136 +POINT4047401 4161346 +POINT3904520 4295222 +POINT3889923 4308899 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3043400 4942778 +POINT3026527 4953521 +POINT2857576 5052468 +POINT2840316 5062576 +POINT2667801 5155168 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2077428 5420020 +POINT2058860 5427459 +POINT1874536 5493470 +POINT1855705 5500213 +POINT1669047 5559329 +POINT1649978 5565368 +POINT1461251 5617507 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-679275 5764385 +POINT-699173 5762344 +POINT-912879 5732361 +POINT-1125320 5694443 +POINT-1336204 5648666 +POINT-1545242 5595077 +POINT-1732966 5539437 +POINT-1752143 5533752 +POINT-1937666 5471175 +POINT-1956619 5464782 +POINT-2139691 5395353 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212982 +POINT-2726919 5123616 +POINT-2744716 5114486 +POINT-2932926 5008911 +POINT-3100011 4906836 +POINT-3117080 4896408 +POINT-3280254 4788200 +POINT-3296924 4777145 +POINT-3455966 4662942 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808155 4380447 +POINT-3968341 4235855 +POINT-4108707 4099349 +POINT-4123047 4085403 +POINT-4272053 3929306 +POINT-4401889 3782749 +POINT-4415153 3767776 +POINT-4539452 3616498 +POINT-4552150 3601043 +POINT-4670738 3445252 +POINT-4682853 3429336 +POINT-4795572 3269239 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5035454 2886749 +POINT-5129651 2715106 +POINT-5139274 2697570 +POINT-5235992 2504654 +POINT-5317176 2326490 +POINT-5325470 2308288 +POINT-5407589 2108719 +POINT-5482231 1906250 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5704159 1072845 +POINT-5740093 860061 +POINT-5768097 646087 +POINT-5786268 451144 +POINT-5788124 431228 +POINT-5800152 215759 +OBJECT_ID133 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804165 0 +POINT-5800155 -215759 +POINT-5788128 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482235 -1906242 +POINT-5407593 -2108719 +POINT-5325474 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035457 -2886741 +POINT-4924675 -3071937 +POINT-4807087 -3252884 +POINT-4682857 -3429336 +POINT-4552150 -3601043 +POINT-4415153 -3767776 +POINT-4272053 -3929306 +POINT-4123050 -4085403 +POINT-3968345 -4235847 +POINT-3808155 -4380447 +POINT-3642704 -4518982 +POINT-3472213 -4651283 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-2932926 -5008911 +POINT-2744716 -5114479 +POINT-2552715 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1752140 -5533752 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-912879 -5732353 +POINT-699176 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162334 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748344 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1441970 -5622841 +POINT1649974 -5565376 +POINT1855701 -5500213 +POINT2058864 -5427459 +POINT2259178 -5347198 +POINT2456375 -5259544 +POINT2650173 -5164627 +POINT2840313 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308891 +POINT4047397 -4161346 +POINT4199276 -4008041 +POINT4345356 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4746792 -3341682 +POINT4867721 -3162956 +POINT4981926 -2979858 +POINT5089245 -2792633 +POINT5189533 -2601555 +POINT5282646 -2406883 +POINT5368458 -2208885 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5636493 -1389144 +POINT5684231 -1178695 +POINT5724117 -966621 +POINT5756092 -753204 +POINT5780109 -538749 +POINT5796142 -323547 +POINT5804161 -107902 +POINT5804161 107894 +POINT5796142 323547 +POINT5780109 538749 +POINT5756092 753204 +POINT5724117 966613 +POINT5684231 1178695 +POINT5636493 1389144 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368458 2208885 +POINT5282646 2406883 +POINT5189533 2601555 +POINT5089245 2792633 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4746792 3341682 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345356 3849205 +POINT4199276 4008041 +POINT4047397 4161338 +POINT3889923 4308891 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2840313 5062568 +POINT2650173 5164627 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2058864 5427459 +POINT1855701 5500213 +POINT1649974 5565368 +POINT1441970 5622841 +POINT1231975 5672531 +POINT1020275 5714386 +POINT807167 5748344 +POINT592941 5774353 +POINT377899 5792381 +POINT162334 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784370 +POINT-699176 5762344 +POINT-912879 5732353 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552715 5212990 +POINT-2744716 5114479 +POINT-2932926 5008903 +POINT-3117080 4896408 +POINT-3296924 4777145 +POINT-3472213 4651275 +POINT-3642704 4518982 +POINT-3808155 4380440 +POINT-3968345 4235847 +POINT-4123050 4085395 +POINT-4272053 3929306 +POINT-4415153 3767776 +POINT-4552150 3601043 +POINT-4682857 3429329 +POINT-4807087 3252884 +POINT-4924675 3071937 +POINT-5035457 2886741 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325474 2308281 +POINT-5407593 2108719 +POINT-5482235 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788128 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804165 0 +POINT-5800155 -215759 +POINT-5798391 -247370 +POINT-5788128 -431221 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5697733 -1103846 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5599982 -1524106 +POINT-5549301 -1701133 +POINT-5482235 -1906242 +POINT-5471284 -1935949 +POINT-5407593 -2108719 +POINT-5325474 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5124043 -2725318 +POINT-5035457 -2886741 +POINT-5019204 -2913912 +POINT-4924675 -3071937 +POINT-4907423 -3098485 +POINT-4807087 -3252884 +POINT-4682857 -3429336 +POINT-4552150 -3601043 +POINT-4532051 -3625506 +POINT-4415153 -3767776 +POINT-4394158 -3791475 +POINT-4272053 -3929306 +POINT-4123050 -4085403 +POINT-4100352 -4107476 +POINT-3968345 -4235847 +POINT-3944843 -4257062 +POINT-3808155 -4380447 +POINT-3642704 -4518982 +POINT-3472213 -4651283 +POINT-3446496 -4669749 +POINT-3296924 -4777145 +POINT-3270538 -4794643 +POINT-3117080 -4896408 +POINT-3090062 -4912914 +POINT-2932926 -5008911 +POINT-2905312 -5024400 +POINT-2744716 -5114479 +POINT-2716547 -5128932 +POINT-2552715 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-2128790 -5399487 +POINT-1956619 -5464782 +POINT-1752140 -5533752 +POINT-1721784 -5542749 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-1094152 -5700005 +POINT-912879 -5732353 +POINT-699176 -5762344 +POINT-667681 -5765576 +POINT-484504 -5784370 +POINT-452910 -5786429 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162334 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807167 -5748344 +POINT838433 -5743362 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1262785 -5665241 +POINT1441970 -5622841 +POINT1472488 -5614410 +POINT1649974 -5565376 +POINT1855701 -5500213 +POINT1885508 -5489539 +POINT2058864 -5427459 +POINT2088253 -5415684 +POINT2259178 -5347198 +POINT2288110 -5334338 +POINT2456375 -5259544 +POINT2650173 -5164627 +POINT2840313 -5062568 +POINT3026527 -4953514 +POINT3053234 -4936510 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3750966 -4429711 +POINT3889923 -4308891 +POINT3913027 -4287244 +POINT4047397 -4161346 +POINT4069680 -4138854 +POINT4199276 -4008041 +POINT4345356 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4746792 -3341682 +POINT4867721 -3162956 +POINT4884477 -3136093 +POINT4981926 -2979858 +POINT5089245 -2792633 +POINT5189533 -2601555 +POINT5282646 -2406883 +POINT5368458 -2208885 +POINT5446853 -2007827 +POINT5457251 -1977923 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5636493 -1389144 +POINT5643497 -1358268 +POINT5684231 -1178695 +POINT5690083 -1147581 +POINT5724117 -966621 +POINT5756092 -753204 +POINT5759616 -721740 +POINT5780109 -538749 +POINT5796142 -323547 +POINT5797319 -291908 +POINT5804161 -107902 +POINT5804161 107894 +POINT5796142 323547 +POINT5793790 355121 +POINT5780109 538749 +POINT5756092 753204 +POINT5751401 784514 +POINT5724117 966613 +POINT5684231 1178695 +POINT5677227 1209572 +POINT5636493 1389144 +POINT5628346 1419740 +POINT5580963 1597679 +POINT5571685 1627949 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5435352 2037326 +POINT5368458 2208885 +POINT5282646 2406883 +POINT5189533 2601555 +POINT5089245 2792633 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4849979 3189178 +POINT4746792 3341682 +POINT4728087 3367227 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345356 3849205 +POINT4199276 4008041 +POINT4047397 4161338 +POINT4024293 4182987 +POINT3889923 4308891 +POINT3727073 4450485 +POINT3702425 4470356 +POINT3559074 4585922 +POINT3533704 4604864 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2840313 5062568 +POINT2812416 5077542 +POINT2650173 5164627 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2229789 5358974 +POINT2058864 5427459 +POINT1855701 5500213 +POINT1825518 5509773 +POINT1649974 5565368 +POINT1441970 5622841 +POINT1231975 5672531 +POINT1200915 5678672 +POINT1020275 5714386 +POINT807167 5748344 +POINT592941 5774353 +POINT561391 5776998 +POINT377899 5792381 +POINT346272 5793852 +POINT162334 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784370 +POINT-516000 5781139 +POINT-699176 5762344 +POINT-730530 5757944 +POINT-912879 5732353 +POINT-944048 5726791 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552715 5212990 +POINT-2580885 5198537 +POINT-2744716 5114479 +POINT-2772330 5098989 +POINT-2932926 5008903 +POINT-2959944 4992399 +POINT-3117080 4896408 +POINT-3296924 4777145 +POINT-3322642 4758678 +POINT-3472213 4651275 +POINT-3497227 4631866 +POINT-3642704 4518982 +POINT-3666978 4498656 +POINT-3808155 4380440 +POINT-3968345 4235847 +POINT-3991043 4213773 +POINT-4123050 4085395 +POINT-4272053 3929306 +POINT-4415153 3767776 +POINT-4435253 3743314 +POINT-4552150 3601043 +POINT-4571327 3575850 +POINT-4682857 3429329 +POINT-4807087 3252884 +POINT-4924675 3071937 +POINT-5035457 2886741 +POINT-5050689 2858986 +POINT-5139274 2697563 +POINT-5153465 2669260 +POINT-5235992 2504654 +POINT-5325474 2308281 +POINT-5407593 2108719 +POINT-5482235 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5616273 1462926 +POINT-5660339 1284141 +POINT-5666769 1253141 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788128 431221 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804165 0 +POINT-5800155 -215759 +POINT-5788128 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5728582 -928247 +POINT-5704162 -1072845 +POINT-5690120 -1140554 +POINT-5660339 -1284141 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482235 -1906242 +POINT-5407593 -2108719 +POINT-5325474 -2308281 +POINT-5235992 -2504654 +POINT-5205000 -2566470 +POINT-5139274 -2697563 +POINT-5106007 -2758184 +POINT-5035457 -2886741 +POINT-4999958 -2946086 +POINT-4924675 -3071937 +POINT-4807087 -3252884 +POINT-4682857 -3429336 +POINT-4640973 -3484359 +POINT-4552150 -3601043 +POINT-4508250 -3654472 +POINT-4415153 -3767776 +POINT-4369297 -3819538 +POINT-4272053 -3929306 +POINT-4123050 -4085403 +POINT-4073476 -4133612 +POINT-3968345 -4235847 +POINT-3808155 -4380447 +POINT-3755137 -4424840 +POINT-3642704 -4518982 +POINT-3472213 -4651283 +POINT-3416043 -4691615 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-3058069 -4932459 +POINT-2932926 -5008911 +POINT-2872615 -5042740 +POINT-2744716 -5114479 +POINT-2552715 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-2093736 -5412781 +POINT-1956619 -5464782 +POINT-1891095 -5486883 +POINT-1752140 -5533752 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-1057245 -5706591 +POINT-912879 -5732353 +POINT-844399 -5741964 +POINT-699176 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT15695 -5803770 +POINT162334 -5802406 +POINT231411 -5799194 +POINT377899 -5792381 +POINT592941 -5774353 +POINT661588 -5766019 +POINT807167 -5748344 +POINT1020275 -5714386 +POINT1088113 -5700974 +POINT1231975 -5672531 +POINT1441970 -5622841 +POINT1508624 -5604427 +POINT1649974 -5565376 +POINT1715898 -5544495 +POINT1855701 -5500213 +POINT1920804 -5476900 +POINT2058864 -5427459 +POINT2123054 -5401740 +POINT2259178 -5347198 +POINT2456375 -5259544 +POINT2518476 -5229129 +POINT2650173 -5164627 +POINT2711102 -5131923 +POINT2840313 -5062568 +POINT3026527 -4953514 +POINT3084858 -4916375 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308891 +POINT4047397 -4161346 +POINT4199276 -4008041 +POINT4345356 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4660155 -3460000 +POINT4746792 -3341682 +POINT4867721 -3162956 +POINT4904318 -3104283 +POINT4981926 -2979858 +POINT5016316 -2919863 +POINT5089245 -2792633 +POINT5121382 -2731403 +POINT5189533 -2601555 +POINT5219371 -2539173 +POINT5282646 -2406883 +POINT5368458 -2208885 +POINT5446853 -2007827 +POINT5469563 -1942512 +POINT5517723 -1804000 +POINT5537988 -1737886 +POINT5580963 -1597679 +POINT5598758 -1530855 +POINT5636493 -1389144 +POINT5684231 -1178695 +POINT5724117 -966621 +POINT5756092 -753204 +POINT5780109 -538749 +POINT5785247 -469789 +POINT5796142 -323547 +POINT5798712 -254445 +POINT5804161 -107902 +POINT5804161 107894 +POINT5796142 323547 +POINT5780109 538749 +POINT5772413 607470 +POINT5756092 753204 +POINT5745846 821590 +POINT5724117 966613 +POINT5684231 1178695 +POINT5668934 1246133 +POINT5636493 1389144 +POINT5618699 1455968 +POINT5580963 1597679 +POINT5517723 1804000 +POINT5495013 1869316 +POINT5446853 2007827 +POINT5421732 2072255 +POINT5368458 2208885 +POINT5282646 2406883 +POINT5189533 2601555 +POINT5089245 2792633 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4828970 3220228 +POINT4746792 3341682 +POINT4705938 3397475 +POINT4619301 3515792 +POINT4576402 3570028 +POINT4485428 3685043 +POINT4345356 3849205 +POINT4199276 4008041 +POINT4047397 4161338 +POINT3996935 4208621 +POINT3889923 4308891 +POINT3837739 4354264 +POINT3727073 4450485 +POINT3673239 4493885 +POINT3559074 4585922 +POINT3503663 4627293 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2966856 4988460 +POINT2840313 5062568 +POINT2650173 5164627 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2058864 5427459 +POINT1993762 5450773 +POINT1855701 5500213 +POINT1789777 5521092 +POINT1649974 5565368 +POINT1583321 5583785 +POINT1441970 5622841 +POINT1374679 5638764 +POINT1231975 5672531 +POINT1020275 5714386 +POINT951985 5725268 +POINT807167 5748344 +POINT592941 5774353 +POINT524032 5780130 +POINT377899 5792381 +POINT308822 5795594 +POINT162334 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-338169 5793905 +POINT-484504 5784370 +POINT-553295 5777312 +POINT-699176 5762344 +POINT-912879 5732353 +POINT-980955 5720205 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2021277 5440261 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552715 5212990 +POINT-2744716 5114479 +POINT-2805027 5080648 +POINT-2932926 5008903 +POINT-2991937 4972855 +POINT-3117080 4896408 +POINT-3174710 4858191 +POINT-3296924 4777145 +POINT-3353095 4736811 +POINT-3472213 4651275 +POINT-3526846 4608883 +POINT-3642704 4518982 +POINT-3808155 4380440 +POINT-3859487 4334106 +POINT-3968345 4235847 +POINT-4017920 4187636 +POINT-4123050 4085395 +POINT-4272053 3929306 +POINT-4317909 3877545 +POINT-4415153 3767776 +POINT-4552150 3601043 +POINT-4594035 3546018 +POINT-4682857 3429329 +POINT-4722666 3372788 +POINT-4807087 3252884 +POINT-4924675 3071937 +POINT-5035457 2886741 +POINT-5068725 2826120 +POINT-5139274 2697563 +POINT-5170267 2635746 +POINT-5235992 2504654 +POINT-5325474 2308281 +POINT-5407593 2108719 +POINT-5482235 1906242 +POINT-5503726 1840516 +POINT-5549301 1701133 +POINT-5568334 1634652 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5674382 1216432 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788128 431221 +POINT-5800155 215759 +POINT-5801440 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804165 0 +POINT-5800527 -195760 +POINT-5800155 -215759 +POINT-5789243 -411249 +POINT-5788128 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5707493 -1053122 +POINT-5704162 -1072845 +POINT-5664401 -1264556 +POINT-5660339 -1284141 +POINT-5613483 -1474246 +POINT-5608696 -1493667 +POINT-5549301 -1701133 +POINT-5482235 -1906242 +POINT-5407593 -2108719 +POINT-5325474 -2308281 +POINT-5235992 -2504654 +POINT-5148239 -2679682 +POINT-5139274 -2697563 +POINT-5045080 -2869206 +POINT-5035457 -2886741 +POINT-4924675 -3071937 +POINT-4807087 -3252884 +POINT-4694372 -3412981 +POINT-4682857 -3429336 +POINT-4564266 -3585128 +POINT-4552150 -3601043 +POINT-4427852 -3752321 +POINT-4415153 -3767776 +POINT-4272053 -3929306 +POINT-4123050 -4085403 +POINT-3982685 -4221903 +POINT-3968345 -4235847 +POINT-3808155 -4380447 +POINT-3642704 -4518982 +POINT-3488016 -4639020 +POINT-3472213 -4651283 +POINT-3313172 -4765479 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-2932926 -5008911 +POINT-2762162 -5104694 +POINT-2744716 -5114479 +POINT-2570512 -5203859 +POINT-2552715 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1975322 -5457690 +POINT-1956619 -5464782 +POINT-1752140 -5533752 +POINT-1545242 -5595070 +POINT-1336204 -5648659 +POINT-1125320 -5694443 +POINT-932571 -5728839 +POINT-912879 -5732353 +POINT-699176 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162334 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT787310 -5750755 +POINT807167 -5748344 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1441970 -5622841 +POINT1649974 -5565376 +POINT1855701 -5500213 +POINT2040033 -5434203 +POINT2058864 -5427459 +POINT2240610 -5354638 +POINT2259178 -5347198 +POINT2456375 -5259544 +POINT2650173 -5164627 +POINT2840313 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543046 -4597889 +POINT3559074 -4585922 +POINT3711501 -4463039 +POINT3727073 -4450485 +POINT3874828 -4322016 +POINT3889923 -4308891 +POINT4032801 -4175022 +POINT4047397 -4161346 +POINT4199276 -4008041 +POINT4345356 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515792 +POINT4746792 -3341682 +POINT4867721 -3162956 +POINT4971340 -2996830 +POINT4981926 -2979858 +POINT5089245 -2792633 +POINT5189533 -2601555 +POINT5282646 -2406883 +POINT5368458 -2208885 +POINT5439587 -2026464 +POINT5446853 -2007827 +POINT5511154 -1822893 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5631346 -1408474 +POINT5636493 -1389144 +POINT5684231 -1178695 +POINT5720420 -986278 +POINT5724117 -966621 +POINT5756092 -753204 +POINT5777883 -558627 +POINT5780109 -538749 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5804161 -107902 +POINT5804161 107894 +POINT5796886 303558 +POINT5796142 323547 +POINT5780109 538749 +POINT5756092 753204 +POINT5727081 946832 +POINT5724117 966613 +POINT5684231 1178695 +POINT5640918 1369638 +POINT5636493 1389144 +POINT5580963 1597679 +POINT5523585 1784876 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368458 2208885 +POINT5282646 2406883 +POINT5189533 2601555 +POINT5098541 2774922 +POINT5089245 2792633 +POINT4981926 2979850 +POINT4878307 3145984 +POINT4867721 3162956 +POINT4758001 3325116 +POINT4746792 3341682 +POINT4631118 3499654 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345356 3849205 +POINT4199276 4008041 +POINT4061475 4147129 +POINT4047397 4161338 +POINT3889923 4308891 +POINT3742168 4437361 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2857573 5052460 +POINT2840313 5062568 +POINT2650173 5164627 +POINT2456375 5259544 +POINT2259178 5347198 +POINT2077431 5420020 +POINT2058864 5427459 +POINT1874532 5493470 +POINT1855701 5500213 +POINT1669043 5559329 +POINT1649974 5565368 +POINT1441970 5622841 +POINT1231975 5672531 +POINT1020275 5714386 +POINT826920 5745197 +POINT807167 5748344 +POINT592941 5774353 +POINT377899 5792381 +POINT182315 5801477 +POINT162334 5802406 +POINT-33450 5804227 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-464544 5785671 +POINT-484504 5784370 +POINT-679278 5764386 +POINT-699176 5762344 +POINT-893071 5735133 +POINT-912879 5732353 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1732962 5539436 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2139691 5395353 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552715 5212990 +POINT-2726920 5123610 +POINT-2744716 5114479 +POINT-2932926 5008903 +POINT-3117080 4896408 +POINT-3280254 4788200 +POINT-3296924 4777145 +POINT-3455966 4662942 +POINT-3472213 4651275 +POINT-3642704 4518982 +POINT-3808155 4380440 +POINT-3953497 4249250 +POINT-3968345 4235847 +POINT-4108710 4099341 +POINT-4123050 4085395 +POINT-4272053 3929306 +POINT-4401889 3782749 +POINT-4415153 3767776 +POINT-4539452 3616498 +POINT-4552150 3601043 +POINT-4670742 3445245 +POINT-4682857 3429329 +POINT-4807087 3252884 +POINT-4924675 3071937 +POINT-5025189 2903907 +POINT-5035457 2886741 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325474 2308281 +POINT-5407593 2108719 +POINT-5482235 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788128 431221 +POINT-5799041 235730 +POINT-5800155 215759 +OBJECT_ID144 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804153 0 +POINT-5800155 -215759 +POINT-5788116 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284145 +POINT-5608688 -1493671 +POINT-5549301 -1701133 +POINT-5482223 -1906246 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4924667 -3071937 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4552139 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085399 +POINT-3968338 -4235851 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3296920 -4777145 +POINT-3117080 -4896412 +POINT-2932922 -5008907 +POINT-2744705 -5114483 +POINT-2552703 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545242 -5595073 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732357 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804416 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774353 +POINT807174 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622837 +POINT1649978 -5565372 +POINT1855712 -5500217 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259548 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585926 +POINT3727081 -4450485 +POINT3889923 -4308891 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4746795 -3341686 +POINT4867721 -3162956 +POINT4981933 -2979854 +POINT5089248 -2792637 +POINT5189529 -2601558 +POINT5282654 -2406883 +POINT5368469 -2208881 +POINT5446853 -2007827 +POINT5517730 -1804000 +POINT5580963 -1597679 +POINT5636505 -1389148 +POINT5684234 -1178699 +POINT5724121 -966617 +POINT5756103 -753204 +POINT5780121 -538749 +POINT5796142 -323547 +POINT5804168 -107898 +POINT5804168 107898 +POINT5796142 323543 +POINT5780121 538749 +POINT5756103 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636505 1389144 +POINT5580963 1597679 +POINT5517730 1804000 +POINT5446853 2007827 +POINT5368469 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT4981933 2979850 +POINT4867721 3162956 +POINT4746795 3341682 +POINT4619308 3515792 +POINT4485428 3685043 +POINT4345367 3849205 +POINT4199280 4008041 +POINT4047409 4161338 +POINT3889923 4308891 +POINT3727081 4450485 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026535 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855712 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748344 +POINT592941 5774353 +POINT377899 5792381 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484497 5784370 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2552703 5212990 +POINT-2744705 5114479 +POINT-2932922 5008903 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4415146 3767776 +POINT-4552139 3601043 +POINT-4682846 3429329 +POINT-4807083 3252884 +POINT-4924667 3071937 +POINT-5035446 2886741 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482223 1906242 +POINT-5549301 1701133 +POINT-5608688 1493667 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804153 0 +POINT-5803567 -31655 +POINT-5800155 -215759 +POINT-5798389 -247370 +POINT-5788116 -431221 +POINT-5785179 -462745 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5697733 -1103846 +POINT-5660339 -1284145 +POINT-5652761 -1314886 +POINT-5608688 -1493671 +POINT-5599975 -1524109 +POINT-5549301 -1701133 +POINT-5482223 -1906246 +POINT-5471274 -1935952 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5124035 -2725319 +POINT-5035446 -2886745 +POINT-5019193 -2913916 +POINT-4924667 -3071937 +POINT-4907416 -3098485 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4552139 -3601043 +POINT-4532040 -3625506 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085399 +POINT-3968338 -4235851 +POINT-3944836 -4257065 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3446495 -4669746 +POINT-3296920 -4777145 +POINT-3270535 -4794644 +POINT-3117080 -4896412 +POINT-2932922 -5008907 +POINT-2905307 -5024397 +POINT-2744705 -5114483 +POINT-2552703 -5212990 +POINT-2524017 -5226385 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1721781 -5542749 +POINT-1545242 -5595073 +POINT-1514572 -5602936 +POINT-1336196 -5648662 +POINT-1305257 -5655379 +POINT-1125320 -5694443 +POINT-912872 -5732357 +POINT-881519 -5736757 +POINT-699173 -5762344 +POINT-667676 -5765576 +POINT-484497 -5784370 +POINT-452904 -5786429 +POINT-269165 -5798401 +POINT-53451 -5804416 +POINT-21791 -5804122 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774353 +POINT807174 -5748344 +POINT838440 -5743362 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622837 +POINT1472488 -5614406 +POINT1649978 -5565372 +POINT1680163 -5555813 +POINT1855712 -5500217 +POINT1885519 -5489542 +POINT2058868 -5427459 +POINT2088258 -5415684 +POINT2259185 -5347198 +POINT2456375 -5259548 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2867638 -5046568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585926 +POINT3583730 -4566055 +POINT3727081 -4450485 +POINT3889923 -4308891 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4638013 -3490251 +POINT4746795 -3341686 +POINT4867721 -3162956 +POINT4884478 -3136092 +POINT4981933 -2979854 +POINT4997678 -2952386 +POINT5089248 -2792637 +POINT5189529 -2601558 +POINT5203192 -2572996 +POINT5282654 -2406883 +POINT5368469 -2208881 +POINT5446853 -2007827 +POINT5457252 -1977923 +POINT5517730 -1804000 +POINT5527008 -1773730 +POINT5580963 -1597679 +POINT5589112 -1567084 +POINT5636505 -1389148 +POINT5643508 -1358272 +POINT5684234 -1178699 +POINT5690087 -1147583 +POINT5724121 -966617 +POINT5756103 -753204 +POINT5759627 -721740 +POINT5780121 -538749 +POINT5796142 -323547 +POINT5797320 -291908 +POINT5804168 -107898 +POINT5804168 107898 +POINT5802991 139537 +POINT5796142 323543 +POINT5793792 355117 +POINT5780121 538749 +POINT5756103 753204 +POINT5751411 784514 +POINT5724121 966613 +POINT5718269 997729 +POINT5684234 1178695 +POINT5677232 1209572 +POINT5636505 1389144 +POINT5628356 1419740 +POINT5580963 1597679 +POINT5571686 1627949 +POINT5517730 1804000 +POINT5507332 1833905 +POINT5446853 2007827 +POINT5435353 2037324 +POINT5368469 2208877 +POINT5355879 2237928 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT5073504 2820100 +POINT4981933 2979850 +POINT4965177 3006715 +POINT4867721 3162956 +POINT4849980 3189178 +POINT4746795 3341682 +POINT4728091 3367227 +POINT4619308 3515792 +POINT4599666 3540624 +POINT4485428 3685043 +POINT4345367 3849205 +POINT4199280 4008041 +POINT4047409 4161338 +POINT4024303 4182987 +POINT3889923 4308891 +POINT3727081 4450485 +POINT3702433 4470356 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026535 4953514 +POINT2999214 4969514 +POINT2840316 5062568 +POINT2812420 5077542 +POINT2650177 5164627 +POINT2621743 5178553 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2229796 5358974 +POINT2058868 5427459 +POINT1855712 5500213 +POINT1825528 5509773 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1200919 5678672 +POINT1020278 5714386 +POINT807174 5748344 +POINT775743 5752160 +POINT592941 5774353 +POINT561391 5776998 +POINT377899 5792381 +POINT346272 5793852 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484497 5784370 +POINT-515993 5781139 +POINT-699173 5762344 +POINT-730526 5757944 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533752 +POINT-1782137 5523633 +POINT-1956619 5464782 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2552703 5212990 +POINT-2580873 5198537 +POINT-2744705 5114479 +POINT-2932922 5008903 +POINT-2959941 4992399 +POINT-3117080 4896408 +POINT-3143466 4878910 +POINT-3296920 4777145 +POINT-3322639 4758678 +POINT-3472213 4651275 +POINT-3497227 4631866 +POINT-3642700 4518982 +POINT-3666974 4498656 +POINT-3808151 4380440 +POINT-3831653 4359226 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4415146 3767776 +POINT-4435245 3743314 +POINT-4552139 3601043 +POINT-4571316 3575850 +POINT-4682846 3429329 +POINT-4807083 3252884 +POINT-4924667 3071937 +POINT-4940920 3044766 +POINT-5035446 2886741 +POINT-5050678 2858986 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5249120 2475843 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482223 1906242 +POINT-5492065 1876149 +POINT-5549301 1701133 +POINT-5558014 1670695 +POINT-5608688 1493667 +POINT-5660339 1284141 +POINT-5666769 1253141 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5800155 215759 +POINT-5800742 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804153 0 +POINT-5802872 -69138 +POINT-5800155 -215759 +POINT-5788116 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5728582 -928247 +POINT-5704162 -1072845 +POINT-5690120 -1140555 +POINT-5660339 -1284145 +POINT-5643788 -1351286 +POINT-5608688 -1493671 +POINT-5589658 -1560151 +POINT-5549301 -1701133 +POINT-5482223 -1906246 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4924667 -3071937 +POINT-4886988 -3129921 +POINT-4807083 -3252884 +POINT-4767272 -3309426 +POINT-4682846 -3429332 +POINT-4552139 -3601043 +POINT-4415146 -3767776 +POINT-4369291 -3819538 +POINT-4272049 -3929306 +POINT-4123047 -4085399 +POINT-4073471 -4133611 +POINT-3968338 -4235851 +POINT-3917007 -4282185 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3416042 -4691612 +POINT-3296920 -4777145 +POINT-3239292 -4815364 +POINT-3117080 -4896412 +POINT-2932922 -5008907 +POINT-2744705 -5114483 +POINT-2552703 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1685838 -5553402 +POINT-1545242 -5595073 +POINT-1478254 -5612246 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732357 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804416 +POINT15697 -5803774 +POINT162338 -5802410 +POINT377899 -5792385 +POINT446808 -5786607 +POINT592941 -5774353 +POINT661591 -5766019 +POINT807174 -5748344 +POINT1020278 -5714386 +POINT1088117 -5700974 +POINT1231979 -5672531 +POINT1299270 -5656607 +POINT1441970 -5622837 +POINT1508625 -5604423 +POINT1649978 -5565372 +POINT1855712 -5500217 +POINT1920813 -5476902 +POINT2058868 -5427459 +POINT2123059 -5401740 +POINT2259185 -5347198 +POINT2322374 -5319111 +POINT2456375 -5259548 +POINT2518478 -5229131 +POINT2650177 -5164627 +POINT2711106 -5131923 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585926 +POINT3612916 -4542525 +POINT3727081 -4450485 +POINT3779263 -4405112 +POINT3889923 -4308891 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4660161 -3460003 +POINT4746795 -3341686 +POINT4785546 -3284413 +POINT4867721 -3162956 +POINT4904320 -3104282 +POINT4981933 -2979854 +POINT5016322 -2919861 +POINT5089248 -2792637 +POINT5121383 -2731407 +POINT5189529 -2601558 +POINT5219371 -2539176 +POINT5282654 -2406883 +POINT5368469 -2208881 +POINT5393587 -2144454 +POINT5446853 -2007827 +POINT5469566 -1942512 +POINT5517730 -1804000 +POINT5537993 -1737886 +POINT5580963 -1597679 +POINT5636505 -1389148 +POINT5684234 -1178699 +POINT5697016 -1110739 +POINT5724121 -966617 +POINT5734370 -898230 +POINT5756103 -753204 +POINT5780121 -538749 +POINT5785255 -469789 +POINT5796142 -323547 +POINT5798714 -254443 +POINT5804168 -107898 +POINT5804168 107898 +POINT5796142 323543 +POINT5780121 538749 +POINT5756103 753204 +POINT5745855 821590 +POINT5724121 966613 +POINT5684234 1178695 +POINT5668940 1246133 +POINT5636505 1389144 +POINT5618707 1455968 +POINT5580963 1597679 +POINT5517730 1804000 +POINT5495018 1869316 +POINT5446853 2007827 +POINT5421736 2072253 +POINT5368469 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5157395 2662784 +POINT5089248 2792633 +POINT5054860 2852625 +POINT4981933 2979850 +POINT4945335 3038525 +POINT4867721 3162956 +POINT4828971 3220228 +POINT4746795 3341682 +POINT4705943 3397475 +POINT4619308 3515792 +POINT4576407 3570028 +POINT4485428 3685043 +POINT4345367 3849205 +POINT4199280 4008041 +POINT4047409 4161338 +POINT3996943 4208621 +POINT3889923 4308891 +POINT3727081 4450485 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3150229 4874755 +POINT3026535 4953514 +POINT2966862 4988460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1993768 5450773 +POINT1855712 5500213 +POINT1789786 5521092 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT951990 5725268 +POINT807174 5748344 +POINT592941 5774353 +POINT524032 5780130 +POINT377899 5792381 +POINT308823 5795594 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-338167 5793905 +POINT-484497 5784370 +POINT-553288 5777312 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-980950 5720205 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1611540 5575421 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2021274 5440261 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2419833 5275034 +POINT-2552703 5212990 +POINT-2744705 5114479 +POINT-2805018 5080648 +POINT-2932922 5008903 +POINT-2991935 4972855 +POINT-3117080 4896408 +POINT-3174709 4858191 +POINT-3296920 4777145 +POINT-3353092 4736811 +POINT-3472213 4651275 +POINT-3526845 4608883 +POINT-3642700 4518982 +POINT-3695718 4474587 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4415146 3767776 +POINT-4552139 3601043 +POINT-4682846 3429329 +POINT-4807083 3252884 +POINT-4924667 3071937 +POINT-4960166 3012592 +POINT-5035446 2886741 +POINT-5068715 2826120 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5264665 2441727 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482223 1906242 +POINT-5503718 1840516 +POINT-5549301 1701133 +POINT-5608688 1493667 +POINT-5625240 1426526 +POINT-5660339 1284141 +POINT-5674382 1216432 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5791974 362177 +POINT-5800155 215759 +POINT-5801437 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804153 0 +POINT-5800526 -195760 +POINT-5800155 -215759 +POINT-5789232 -411249 +POINT-5788116 -431221 +POINT-5769953 -626171 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5707493 -1053122 +POINT-5704162 -1072845 +POINT-5660339 -1284145 +POINT-5613476 -1474250 +POINT-5608688 -1493671 +POINT-5554806 -1681903 +POINT-5549301 -1701133 +POINT-5488441 -1887234 +POINT-5482223 -1906246 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4934935 -3054772 +POINT-4924667 -3071937 +POINT-4817982 -3236112 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4564255 -3585127 +POINT-4552139 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4136858 -4070931 +POINT-4123047 -4085399 +POINT-3968338 -4235851 +POINT-3822999 -4367041 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3488016 -4639017 +POINT-3472213 -4651279 +POINT-3313169 -4765478 +POINT-3296920 -4777145 +POINT-3133750 -4885357 +POINT-3117080 -4896412 +POINT-2949992 -4998480 +POINT-2932922 -5008907 +POINT-2744705 -5114483 +POINT-2552703 -5212990 +POINT-2375301 -5295828 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1975321 -5457690 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1564419 -5589390 +POINT-1545242 -5595073 +POINT-1355573 -5643695 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732357 +POINT-718981 -5759565 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-73446 -5803859 +POINT-53451 -5804416 +POINT142336 -5802596 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774353 +POINT787317 -5750755 +POINT807174 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622837 +POINT1630698 -5570699 +POINT1649978 -5565372 +POINT1855712 -5500217 +POINT2058868 -5427459 +POINT2240618 -5354638 +POINT2259185 -5347198 +POINT2456375 -5259548 +POINT2650177 -5164627 +POINT2822692 -5072028 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543053 -4597893 +POINT3559082 -4585926 +POINT3727081 -4450485 +POINT3874829 -4322016 +POINT3889923 -4308891 +POINT4032811 -4175019 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4606899 -3531484 +POINT4619308 -3515796 +POINT4746795 -3341686 +POINT4856513 -3179523 +POINT4867721 -3162956 +POINT4971347 -2996826 +POINT4981933 -2979854 +POINT5089248 -2792637 +POINT5189529 -2601558 +POINT5274022 -2424928 +POINT5282654 -2406883 +POINT5360515 -2227234 +POINT5368469 -2208881 +POINT5439588 -2026463 +POINT5446853 -2007827 +POINT5511161 -1822893 +POINT5517730 -1804000 +POINT5575102 -1616803 +POINT5580963 -1597679 +POINT5636505 -1389148 +POINT5679810 -1198206 +POINT5684234 -1178699 +POINT5720424 -986275 +POINT5724121 -966617 +POINT5753139 -772985 +POINT5756103 -753204 +POINT5780121 -538749 +POINT5796142 -323547 +POINT5803425 -127887 +POINT5804168 -107898 +POINT5804168 107898 +POINT5796886 303555 +POINT5796142 323543 +POINT5780121 538749 +POINT5758330 733326 +POINT5756103 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5640929 1369638 +POINT5636505 1389144 +POINT5580963 1597679 +POINT5523592 1784876 +POINT5517730 1804000 +POINT5453423 1988934 +POINT5446853 2007827 +POINT5375735 2190242 +POINT5368469 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT4991881 2962497 +POINT4981933 2979850 +POINT4878308 3145984 +POINT4867721 3162956 +POINT4758004 3325116 +POINT4746795 3341682 +POINT4631125 3499654 +POINT4619308 3515792 +POINT4485428 3685043 +POINT4358350 3833988 +POINT4345367 3849205 +POINT4199280 4008041 +POINT4061486 4147129 +POINT4047409 4161338 +POINT3889923 4308891 +POINT3742175 4437361 +POINT3727081 4450485 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026535 4953514 +POINT2857577 5052460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2077436 5420020 +POINT2058868 5427459 +POINT1874543 5493470 +POINT1855712 5500213 +POINT1669048 5559329 +POINT1649978 5565368 +POINT1461251 5617507 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT826927 5745197 +POINT807174 5748344 +POINT592941 5774353 +POINT377899 5792381 +POINT182318 5801477 +POINT162338 5802406 +POINT-33449 5804227 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-464537 5785671 +POINT-484497 5784370 +POINT-679274 5764386 +POINT-699173 5762344 +POINT-893064 5735133 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1732959 5539436 +POINT-1752136 5533752 +POINT-1937665 5471175 +POINT-1956619 5464782 +POINT-2139684 5395353 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2552703 5212990 +POINT-2744705 5114479 +POINT-2915476 5018689 +POINT-2932922 5008903 +POINT-3100011 4906835 +POINT-3117080 4896408 +POINT-3280251 4788200 +POINT-3296920 4777145 +POINT-3455965 4662942 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3953490 4249250 +POINT-3968338 4235847 +POINT-4108707 4099341 +POINT-4123047 4085395 +POINT-4258238 3943774 +POINT-4272049 3929306 +POINT-4401882 3782749 +POINT-4415146 3767776 +POINT-4539441 3616498 +POINT-4552139 3601043 +POINT-4682846 3429329 +POINT-4807083 3252884 +POINT-4924667 3071937 +POINT-5025178 2903907 +POINT-5035446 2886741 +POINT-5129644 2715098 +POINT-5139267 2697563 +POINT-5227027 2522534 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5475306 1925010 +POINT-5482223 1906242 +POINT-5549301 1701133 +POINT-5603184 1512897 +POINT-5608688 1493667 +POINT-5655552 1303562 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5799040 235730 +POINT-5800155 215759 +POINT-5803783 19998 +OBJECT_ID155 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431213 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284133 +POINT-5608703 -1493667 +POINT-5549301 -1701126 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139282 -2697555 +POINT-5035461 -2886734 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4682861 -3429321 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3808166 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2744720 -5114471 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1545242 -5595062 +POINT-1336212 -5648651 +POINT-1125320 -5694443 +POINT-912887 -5732345 +POINT-699173 -5762344 +POINT-484512 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855697 -5500213 +POINT2058853 -5427444 +POINT2259170 -5347198 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3026519 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3727066 -4450485 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4199280 -4008041 +POINT4345352 -3849197 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4746795 -3341674 +POINT4867721 -3162948 +POINT4981918 -2979843 +POINT5089248 -2792633 +POINT5189529 -2601547 +POINT5282638 -2406875 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107910 +POINT5796142 323547 +POINT5780105 538757 +POINT5756088 753204 +POINT5724121 966629 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597686 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208892 +POINT5282638 2406891 +POINT5189529 2601562 +POINT5089248 2792648 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4619293 3515792 +POINT4485428 3685058 +POINT4345352 3849212 +POINT4199280 4008041 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953521 +POINT2840316 5062576 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1855697 5500213 +POINT1649978 5565384 +POINT1441970 5622848 +POINT1231964 5672531 +POINT1020278 5714386 +POINT807159 5748352 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-3117080 4896408 +POINT-3296936 4777145 +POINT-3472213 4651291 +POINT-3642700 4518982 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4682861 3429336 +POINT-4807098 3252884 +POINT-4924682 3071945 +POINT-5035461 2886749 +POINT-5139282 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5482239 1906250 +POINT-5549301 1701141 +POINT-5608703 1493682 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431228 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803580 -31655 +POINT-5800155 -215759 +POINT-5798391 -247369 +POINT-5788131 -431213 +POINT-5785192 -462738 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5697733 -1103844 +POINT-5660339 -1284133 +POINT-5608703 -1493667 +POINT-5599988 -1524105 +POINT-5549301 -1701126 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139282 -2697555 +POINT-5124050 -2725311 +POINT-5035461 -2886734 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4788871 -3278770 +POINT-4682861 -3429321 +POINT-4552154 -3601043 +POINT-4532055 -3625506 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4250201 -3952206 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3944851 -4257054 +POINT-3808166 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296936 -4777145 +POINT-3270548 -4794643 +POINT-3117080 -4896408 +POINT-3090061 -4912912 +POINT-2932922 -5008896 +POINT-2744720 -5114471 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2328027 -5316597 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1545242 -5595062 +POINT-1514574 -5602925 +POINT-1336212 -5648651 +POINT-1125320 -5694443 +POINT-912887 -5732345 +POINT-881532 -5736747 +POINT-699173 -5762344 +POINT-667678 -5765575 +POINT-484512 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807159 -5748337 +POINT838427 -5743356 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1262775 -5665240 +POINT1441970 -5622833 +POINT1472488 -5614402 +POINT1649978 -5565368 +POINT1680160 -5555809 +POINT1855697 -5500213 +POINT1885503 -5489537 +POINT2058853 -5427444 +POINT2088243 -5415671 +POINT2259170 -5347198 +POINT2288103 -5334337 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT2867635 -5046561 +POINT3026519 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3583715 -4566051 +POINT3727066 -4450485 +POINT3750960 -4429710 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4199280 -4008041 +POINT4345352 -3849197 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4638000 -3490247 +POINT4746795 -3341674 +POINT4764537 -3315452 +POINT4867721 -3162948 +POINT4884476 -3136084 +POINT4981918 -2979843 +POINT5089248 -2792633 +POINT5189529 -2601547 +POINT5203190 -2572986 +POINT5282638 -2406875 +POINT5295229 -2377826 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5457250 -1977923 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5589110 -1567077 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5690087 -1147579 +POINT5724121 -966613 +POINT5728811 -935303 +POINT5756088 -753204 +POINT5759612 -721739 +POINT5780105 -538742 +POINT5782458 -507169 +POINT5796142 -323547 +POINT5797318 -291907 +POINT5804153 -107894 +POINT5804153 107910 +POINT5802978 139547 +POINT5796142 323547 +POINT5793790 355122 +POINT5780105 538757 +POINT5776582 570220 +POINT5756088 753204 +POINT5751398 784517 +POINT5724121 966629 +POINT5684234 1178695 +POINT5677230 1209572 +POINT5636490 1389144 +POINT5580963 1597686 +POINT5571684 1627956 +POINT5517715 1804000 +POINT5507319 1833905 +POINT5446853 2007827 +POINT5435351 2037327 +POINT5368454 2208892 +POINT5282638 2406891 +POINT5268978 2435452 +POINT5189529 2601562 +POINT5174816 2629598 +POINT5089248 2792648 +POINT5073501 2820115 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4849980 3189185 +POINT4746795 3341690 +POINT4728089 3367233 +POINT4619293 3515792 +POINT4599653 3540626 +POINT4485428 3685058 +POINT4345352 3849212 +POINT4323921 3872515 +POINT4199280 4008041 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3533697 4604864 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953521 +POINT2999200 4969522 +POINT2840316 5062576 +POINT2812420 5077549 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2229780 5358974 +POINT2058853 5427459 +POINT1855697 5500213 +POINT1825515 5509775 +POINT1649978 5565384 +POINT1619460 5573815 +POINT1441970 5622848 +POINT1411159 5630138 +POINT1231964 5672531 +POINT1200906 5678672 +POINT1020278 5714386 +POINT807159 5748352 +POINT775730 5752167 +POINT592941 5774353 +POINT377899 5792389 +POINT346272 5793860 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1366880 5640804 +POINT-1545242 5595077 +POINT-1575599 5586080 +POINT-1752151 5533752 +POINT-1782150 5523633 +POINT-1956619 5464782 +POINT-1986224 5453555 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2744720 5114486 +POINT-2772332 5098997 +POINT-2932922 5008911 +POINT-2959941 4992405 +POINT-3117080 4896408 +POINT-3296936 4777145 +POINT-3472213 4651291 +POINT-3497227 4631879 +POINT-3642700 4518982 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4293059 3905607 +POINT-4415161 3767776 +POINT-4435260 3743314 +POINT-4552154 3601043 +POINT-4571331 3575851 +POINT-4682861 3429336 +POINT-4701089 3403448 +POINT-4807098 3252884 +POINT-4824350 3226337 +POINT-4924682 3071945 +POINT-4940935 3044774 +POINT-5035461 2886749 +POINT-5139282 2697570 +POINT-5153471 2669266 +POINT-5235992 2504654 +POINT-5249120 2475844 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5418545 2079013 +POINT-5482239 1906250 +POINT-5549301 1701141 +POINT-5608703 1493682 +POINT-5616279 1462940 +POINT-5660339 1284149 +POINT-5666769 1253147 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788131 431228 +POINT-5789896 399615 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5796303 -284800 +POINT-5788131 -431213 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5728582 -928247 +POINT-5704162 -1072845 +POINT-5690120 -1140551 +POINT-5660339 -1284133 +POINT-5643793 -1351277 +POINT-5608703 -1493667 +POINT-5589668 -1560146 +POINT-5549301 -1701126 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5205002 -2566468 +POINT-5139282 -2697555 +POINT-5035461 -2886734 +POINT-4999963 -2946079 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4682861 -3429321 +POINT-4640977 -3484348 +POINT-4552154 -3601043 +POINT-4508256 -3654472 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3808166 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3416046 -4691610 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-3058068 -4932454 +POINT-2932922 -5008896 +POINT-2872614 -5042727 +POINT-2744720 -5114471 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1545242 -5595062 +POINT-1336212 -5648651 +POINT-1268633 -5663325 +POINT-1125320 -5694443 +POINT-1057247 -5706589 +POINT-912887 -5732345 +POINT-699173 -5762344 +POINT-630386 -5769400 +POINT-484512 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT231413 -5799186 +POINT377899 -5792373 +POINT446808 -5786599 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020278 -5714386 +POINT1088112 -5700974 +POINT1231964 -5672531 +POINT1441970 -5622833 +POINT1508625 -5604419 +POINT1649978 -5565368 +POINT1715900 -5544490 +POINT1855697 -5500213 +POINT1920797 -5476895 +POINT2058853 -5427444 +POINT2123043 -5401730 +POINT2259170 -5347198 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT2899984 -5027615 +POINT3026519 -4953506 +POINT3084852 -4916370 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3441563 -4673656 +POINT3559066 -4585922 +POINT3612901 -4542522 +POINT3727066 -4450485 +POINT3779252 -4405110 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4096065 -4112210 +POINT4199280 -4008041 +POINT4345352 -3849197 +POINT4390239 -3796595 +POINT4485428 -3685043 +POINT4528324 -3630808 +POINT4619293 -3515792 +POINT4746795 -3341674 +POINT4785546 -3284402 +POINT4867721 -3162948 +POINT4904315 -3104273 +POINT4981918 -2979843 +POINT5089248 -2792633 +POINT5121383 -2731400 +POINT5189529 -2601547 +POINT5282638 -2406875 +POINT5310138 -2343428 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5469561 -1942512 +POINT5517715 -1804000 +POINT5537983 -1737883 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5697016 -1110735 +POINT5724121 -966613 +POINT5734365 -898227 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5785244 -469784 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107910 +POINT5801586 177009 +POINT5796142 323547 +POINT5780105 538757 +POINT5772409 607475 +POINT5756088 753204 +POINT5724121 966629 +POINT5684234 1178695 +POINT5668935 1246133 +POINT5636490 1389144 +POINT5580963 1597686 +POINT5517715 1804000 +POINT5495008 1869316 +POINT5446853 2007827 +POINT5421731 2072258 +POINT5368454 2208892 +POINT5340955 2272340 +POINT5282638 2406891 +POINT5252802 2469272 +POINT5189529 2601562 +POINT5157395 2662794 +POINT5089248 2792648 +POINT5054855 2852638 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4705938 3397480 +POINT4619293 3515792 +POINT4576397 3570033 +POINT4485428 3685058 +POINT4440541 3737661 +POINT4345352 3849212 +POINT4298544 3900108 +POINT4199280 4008041 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953521 +POINT2966852 4988467 +POINT2840316 5062576 +POINT2779387 5095278 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1993753 5450773 +POINT1855697 5500213 +POINT1789776 5521097 +POINT1649978 5565384 +POINT1441970 5622848 +POINT1374675 5638769 +POINT1231964 5672531 +POINT1020278 5714386 +POINT807159 5748352 +POINT738514 5756684 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1403194 5631494 +POINT-1545242 5595077 +POINT-1611545 5575426 +POINT-1752151 5533752 +POINT-1817672 5511651 +POINT-1956619 5464782 +POINT-2021279 5440261 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2614245 5181430 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-2991935 4972860 +POINT-3117080 4896408 +POINT-3174714 4858191 +POINT-3296936 4777145 +POINT-3353103 4736816 +POINT-3472213 4651291 +POINT-3642700 4518982 +POINT-3695723 4474589 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4317919 3877545 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4594039 3546021 +POINT-4682861 3429336 +POINT-4807098 3252884 +POINT-4924682 3071945 +POINT-4960181 3012600 +POINT-5035461 2886749 +POINT-5068730 2826128 +POINT-5139282 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5482239 1906250 +POINT-5549301 1701141 +POINT-5608703 1493682 +POINT-5625250 1426539 +POINT-5660339 1284149 +POINT-5674382 1216438 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5774517 577237 +POINT-5788131 431228 +POINT-5800155 215759 +POINT-5801441 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804168 0 +POINT-5800527 -195760 +POINT-5800155 -215759 +POINT-5789246 -411242 +POINT-5788131 -431213 +POINT-5769954 -626170 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5707493 -1053122 +POINT-5704162 -1072845 +POINT-5664401 -1264549 +POINT-5660339 -1284133 +POINT-5608703 -1493667 +POINT-5549301 -1701126 +POINT-5488455 -1887223 +POINT-5482239 -1906234 +POINT-5407593 -2108719 +POINT-5325470 -2308273 +POINT-5244286 -2486451 +POINT-5235992 -2504654 +POINT-5139282 -2697555 +POINT-5035461 -2886734 +POINT-4934951 -3054763 +POINT-4924682 -3071930 +POINT-4807098 -3252884 +POINT-4694377 -3412967 +POINT-4682861 -3429321 +POINT-4564270 -3585126 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085388 +POINT-3968353 -4235840 +POINT-3808166 -4380432 +POINT-3658037 -4506140 +POINT-3642700 -4518982 +POINT-3488016 -4639013 +POINT-3472213 -4651275 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2762165 -5104685 +POINT-2744720 -5114471 +POINT-2570516 -5203851 +POINT-2552719 -5212982 +POINT-2357193 -5304275 +POINT-2158401 -5388260 +POINT-1975322 -5457690 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1564421 -5589379 +POINT-1545242 -5595062 +POINT-1355587 -5643684 +POINT-1336212 -5648651 +POINT-1125320 -5694443 +POINT-932578 -5728832 +POINT-912887 -5732345 +POINT-718982 -5759564 +POINT-699173 -5762344 +POINT-484512 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT142336 -5802585 +POINT162338 -5802398 +POINT357918 -5793303 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1000524 -5717533 +POINT1020278 -5714386 +POINT1231964 -5672531 +POINT1422505 -5627440 +POINT1441970 -5622833 +POINT1630698 -5570695 +POINT1649978 -5565368 +POINT1836629 -5506253 +POINT1855697 -5500213 +POINT2058853 -5427444 +POINT2240603 -5354636 +POINT2259170 -5347198 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3009260 -4963615 +POINT3026519 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543039 -4597889 +POINT3559066 -4585922 +POINT3711494 -4463039 +POINT3727066 -4450485 +POINT3874827 -4322009 +POINT3889923 -4308883 +POINT4047393 -4161331 +POINT4199280 -4008041 +POINT4331812 -3863921 +POINT4345352 -3849197 +POINT4472444 -3700259 +POINT4485428 -3685043 +POINT4606885 -3531480 +POINT4619293 -3515792 +POINT4734977 -3357814 +POINT4746795 -3341674 +POINT4856513 -3179515 +POINT4867721 -3162948 +POINT4981918 -2979843 +POINT5079300 -2809986 +POINT5089248 -2792633 +POINT5180234 -2619259 +POINT5189529 -2601547 +POINT5274008 -2424919 +POINT5282638 -2406875 +POINT5360500 -2227230 +POINT5368454 -2208877 +POINT5439586 -2026463 +POINT5446853 -2007827 +POINT5511147 -1822893 +POINT5517715 -1804000 +POINT5580963 -1597671 +POINT5636490 -1389144 +POINT5679809 -1198202 +POINT5684234 -1178695 +POINT5720424 -986271 +POINT5724121 -966613 +POINT5753125 -772985 +POINT5756088 -753204 +POINT5777879 -558620 +POINT5780105 -538742 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5803411 -127883 +POINT5804153 -107894 +POINT5804153 107910 +POINT5796885 303559 +POINT5796142 323547 +POINT5781592 518809 +POINT5780105 538757 +POINT5756088 753204 +POINT5724121 966629 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5586110 1578356 +POINT5580963 1597686 +POINT5523578 1784877 +POINT5517715 1804000 +POINT5453422 1988934 +POINT5446853 2007827 +POINT5375721 2190256 +POINT5368454 2208892 +POINT5282638 2406891 +POINT5189529 2601562 +POINT5089248 2792648 +POINT4991867 2962505 +POINT4981918 2979858 +POINT4867721 3162964 +POINT4746795 3341690 +POINT4631111 3499655 +POINT4619293 3515792 +POINT4497836 3669369 +POINT4485428 3685058 +POINT4358336 3833997 +POINT4345352 3849212 +POINT4199280 4008041 +POINT4061472 4147136 +POINT4047393 4161346 +POINT3889923 4308899 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3043393 4942778 +POINT3026519 4953521 +POINT2857576 5052468 +POINT2840316 5062576 +POINT2667801 5155168 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2077420 5420020 +POINT2058853 5427459 +POINT1874528 5493470 +POINT1855697 5500213 +POINT1649978 5565384 +POINT1461251 5617522 +POINT1441970 5622848 +POINT1251429 5667926 +POINT1231964 5672531 +POINT1020278 5714386 +POINT807159 5748352 +POINT612797 5771943 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-464551 5785678 +POINT-484512 5784378 +POINT-699173 5762344 +POINT-912887 5732361 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1732972 5539437 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2139698 5395353 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212997 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-3100011 4906836 +POINT-3117080 4896408 +POINT-3280265 4788200 +POINT-3296936 4777145 +POINT-3472213 4651291 +POINT-3642700 4518982 +POINT-3792829 4393288 +POINT-3808166 4380447 +POINT-3968353 4235855 +POINT-4108708 4099349 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4401897 3782749 +POINT-4415161 3767776 +POINT-4539456 3616498 +POINT-4552154 3601043 +POINT-4670746 3445252 +POINT-4682861 3429336 +POINT-4795583 3269239 +POINT-4807098 3252884 +POINT-4924682 3071945 +POINT-5025193 2903915 +POINT-5035461 2886749 +POINT-5129659 2715106 +POINT-5139282 2697570 +POINT-5235992 2504654 +POINT-5317176 2326490 +POINT-5325470 2308288 +POINT-5407593 2108719 +POINT-5482239 1906250 +POINT-5543085 1720153 +POINT-5549301 1701141 +POINT-5603197 1512912 +POINT-5608703 1493682 +POINT-5655553 1303571 +POINT-5660339 1284149 +POINT-5700100 1092431 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5786274 451144 +POINT-5788131 431228 +POINT-5799041 235731 +POINT-5800155 215759 +POINT-5803797 19998 +OBJECT_ID166 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215766 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608688 -1493675 +POINT-5549301 -1701133 +POINT-5482239 -1906250 +POINT-5407593 -2108726 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035461 -2886749 +POINT-4924667 -3071937 +POINT-4807083 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4415146 -3767784 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3808151 -4380447 +POINT-3642700 -4518989 +POINT-3472213 -4651283 +POINT-3296920 -4777153 +POINT-3117080 -4896415 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545242 -5595077 +POINT-1336196 -5648666 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807174 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672539 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855697 -5500221 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT3026535 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715034 +POINT3559082 -4585930 +POINT3727081 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619308 -3515800 +POINT4746795 -3341690 +POINT4867721 -3162956 +POINT4981933 -2979858 +POINT5089248 -2792640 +POINT5189529 -2601562 +POINT5282654 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007835 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389152 +POINT5684234 -1178703 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5796142 -323547 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796142 323539 +POINT5780105 538742 +POINT5756088 753196 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517715 1803993 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT4981933 2979850 +POINT4867721 3162948 +POINT4746795 3341682 +POINT4619308 3515792 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT3889923 4308883 +POINT3727081 4450477 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837608 +POINT3026535 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347191 +POINT2058868 5427452 +POINT1855697 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT592941 5774353 +POINT377899 5792381 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-484497 5784363 +POINT-699173 5762336 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533745 +POINT-1956619 5464775 +POINT-2158386 5388252 +POINT-2357177 5304283 +POINT-2552719 5212982 +POINT-2744720 5114479 +POINT-2932922 5008903 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929298 +POINT-4415146 3767776 +POINT-4552154 3601043 +POINT-4682861 3429329 +POINT-4807083 3252876 +POINT-4924667 3071930 +POINT-5035461 2886741 +POINT-5139267 2697555 +POINT-5235992 2504646 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701126 +POINT-5608688 1493667 +POINT-5660339 1284141 +POINT-5704162 1072837 +POINT-5740097 860054 +POINT-5768097 646080 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803580 -31656 +POINT-5800155 -215766 +POINT-5798391 -247377 +POINT-5788131 -431221 +POINT-5785192 -462745 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5697733 -1103847 +POINT-5660339 -1284149 +POINT-5652761 -1314890 +POINT-5608688 -1493675 +POINT-5549301 -1701133 +POINT-5539462 -1731227 +POINT-5482239 -1906250 +POINT-5407593 -2108726 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035461 -2886749 +POINT-5019206 -2913919 +POINT-4924667 -3071937 +POINT-4907416 -3098485 +POINT-4807083 -3252884 +POINT-4788858 -3278772 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4532053 -3625507 +POINT-4415146 -3767784 +POINT-4272049 -3929306 +POINT-4250188 -3952208 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3944836 -4257069 +POINT-3808151 -4380447 +POINT-3642700 -4518989 +POINT-3617687 -4538399 +POINT-3472213 -4651283 +POINT-3446495 -4669750 +POINT-3296920 -4777153 +POINT-3117080 -4896415 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1721781 -5542750 +POINT-1545242 -5595077 +POINT-1514572 -5602940 +POINT-1336196 -5648666 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-881519 -5736760 +POINT-699173 -5762344 +POINT-667676 -5765576 +POINT-484497 -5784370 +POINT-452904 -5786429 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT-21791 -5804126 +POINT162338 -5802414 +POINT377899 -5792389 +POINT409449 -5789743 +POINT592941 -5774353 +POINT807174 -5748344 +POINT838440 -5743362 +POINT1020278 -5714386 +POINT1231979 -5672539 +POINT1441970 -5622841 +POINT1472488 -5614410 +POINT1649978 -5565376 +POINT1680160 -5555817 +POINT1855697 -5500221 +POINT1885506 -5489546 +POINT2058868 -5427459 +POINT2088258 -5415684 +POINT2259185 -5347198 +POINT2288116 -5334339 +POINT2456375 -5259552 +POINT2484809 -5245625 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT2867638 -5046576 +POINT3026535 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715034 +POINT3559082 -4585930 +POINT3727081 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619308 -3515800 +POINT4638013 -3490255 +POINT4746795 -3341690 +POINT4764537 -3315467 +POINT4867721 -3162956 +POINT4884478 -3136093 +POINT4981933 -2979858 +POINT4997678 -2952390 +POINT5089248 -2792640 +POINT5103961 -2764606 +POINT5189529 -2601562 +POINT5203192 -2573000 +POINT5282654 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007835 +POINT5457250 -1977929 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5589110 -1567084 +POINT5636490 -1389152 +POINT5684234 -1178703 +POINT5690087 -1147587 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5759612 -721740 +POINT5780105 -538749 +POINT5782458 -507176 +POINT5796142 -323547 +POINT5797320 -291908 +POINT5804168 -107902 +POINT5804168 107894 +POINT5802991 139533 +POINT5796142 323539 +POINT5793790 355113 +POINT5780105 538742 +POINT5776582 570206 +POINT5756088 753196 +POINT5751398 784508 +POINT5724121 966613 +POINT5718269 997729 +POINT5684234 1178695 +POINT5677230 1209572 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5571684 1627942 +POINT5517715 1803993 +POINT5507319 1833899 +POINT5446853 2007827 +POINT5435351 2037324 +POINT5368454 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT5073504 2820100 +POINT4981933 2979850 +POINT4965177 3006714 +POINT4867721 3162948 +POINT4849980 3189171 +POINT4746795 3341682 +POINT4728091 3367227 +POINT4619308 3515792 +POINT4599666 3540624 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT4024290 4182985 +POINT3889923 4308883 +POINT3727081 4450477 +POINT3702433 4470349 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837608 +POINT3181851 4854614 +POINT3026535 4953514 +POINT2999214 4969514 +POINT2840316 5062568 +POINT2812420 5077542 +POINT2650177 5164627 +POINT2621743 5178553 +POINT2456375 5259544 +POINT2259185 5347191 +POINT2058868 5427452 +POINT1855697 5500213 +POINT1825515 5509773 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1200919 5678672 +POINT1020278 5714386 +POINT807174 5748337 +POINT775743 5752154 +POINT592941 5774353 +POINT561391 5776998 +POINT377899 5792381 +POINT346272 5793852 +POINT162338 5802406 +POINT-53451 5804413 +POINT-85100 5803530 +POINT-269165 5798393 +POINT-300757 5796335 +POINT-484497 5784363 +POINT-699173 5762336 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533745 +POINT-1782137 5523626 +POINT-1956619 5464775 +POINT-2158386 5388252 +POINT-2357177 5304283 +POINT-2385867 5290888 +POINT-2552719 5212982 +POINT-2744720 5114479 +POINT-2932922 5008903 +POINT-2959941 4992399 +POINT-3117080 4896408 +POINT-3143466 4878910 +POINT-3296920 4777145 +POINT-3322639 4758678 +POINT-3472213 4651275 +POINT-3497227 4631866 +POINT-3642700 4518982 +POINT-3666974 4498656 +POINT-3808151 4380440 +POINT-3831653 4359226 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929298 +POINT-4415146 3767776 +POINT-4435247 3743314 +POINT-4552154 3601043 +POINT-4571331 3575850 +POINT-4682861 3429329 +POINT-4807083 3252876 +POINT-4924667 3071930 +POINT-5035461 2886741 +POINT-5050691 2858985 +POINT-5139267 2697555 +POINT-5235992 2504646 +POINT-5249120 2475836 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5418545 2079012 +POINT-5482239 1906242 +POINT-5549301 1701126 +POINT-5608688 1493667 +POINT-5660339 1284141 +POINT-5666769 1253139 +POINT-5704162 1072837 +POINT-5709435 1041619 +POINT-5740097 860054 +POINT-5768097 646080 +POINT-5788131 431221 +POINT-5789896 399609 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804168 0 +POINT-5800155 -215766 +POINT-5796303 -284808 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5728582 -928247 +POINT-5704162 -1072845 +POINT-5690120 -1140556 +POINT-5660339 -1284149 +POINT-5643788 -1351290 +POINT-5608688 -1493675 +POINT-5589658 -1560154 +POINT-5549301 -1701133 +POINT-5482239 -1906250 +POINT-5407593 -2108726 +POINT-5381277 -2172675 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035461 -2886749 +POINT-4999958 -2946092 +POINT-4924667 -3071937 +POINT-4886988 -3129921 +POINT-4807083 -3252884 +POINT-4767277 -3309427 +POINT-4682861 -3429336 +POINT-4640977 -3484359 +POINT-4552154 -3601043 +POINT-4415146 -3767784 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-4073471 -4133615 +POINT-3968338 -4235855 +POINT-3917007 -4282189 +POINT-3808151 -4380447 +POINT-3642700 -4518989 +POINT-3472213 -4651283 +POINT-3416042 -4691617 +POINT-3296920 -4777153 +POINT-3239292 -4815370 +POINT-3117080 -4896415 +POINT-3058068 -4932464 +POINT-2932922 -5008911 +POINT-2872614 -5042742 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1685838 -5553404 +POINT-1545242 -5595077 +POINT-1478254 -5612250 +POINT-1336196 -5648666 +POINT-1268622 -5663335 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-844393 -5741969 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT661591 -5766019 +POINT807174 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672539 +POINT1441970 -5622841 +POINT1508625 -5604427 +POINT1649978 -5565376 +POINT1855697 -5500221 +POINT1920802 -5476905 +POINT2058868 -5427459 +POINT2123059 -5401740 +POINT2259185 -5347198 +POINT2322374 -5319113 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT2899989 -5027630 +POINT3026535 -4953521 +POINT3084863 -4916380 +POINT3208557 -4837616 +POINT3386154 -4715034 +POINT3559082 -4585930 +POINT3727081 -4450485 +POINT3779263 -4405112 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4096065 -4112223 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619308 -3515800 +POINT4660161 -3460007 +POINT4746795 -3341690 +POINT4785546 -3284415 +POINT4867721 -3162956 +POINT4904320 -3104283 +POINT4981933 -2979858 +POINT5016322 -2919865 +POINT5089248 -2792640 +POINT5121383 -2731410 +POINT5189529 -2601562 +POINT5219371 -2539178 +POINT5282654 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007835 +POINT5469561 -1942517 +POINT5517715 -1804000 +POINT5537983 -1737886 +POINT5580963 -1597679 +POINT5636490 -1389152 +POINT5684234 -1178703 +POINT5697016 -1110742 +POINT5724121 -966621 +POINT5734365 -898233 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5785244 -469789 +POINT5796142 -323547 +POINT5798714 -254445 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796142 323539 +POINT5780105 538742 +POINT5772409 607462 +POINT5756088 753196 +POINT5724121 966613 +POINT5684234 1178695 +POINT5668935 1246133 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517715 1803993 +POINT5495008 1869310 +POINT5446853 2007827 +POINT5421731 2072253 +POINT5368454 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5157395 2662784 +POINT5089248 2792633 +POINT5054860 2852625 +POINT4981933 2979850 +POINT4945335 3038523 +POINT4867721 3162948 +POINT4828971 3220223 +POINT4746795 3341682 +POINT4705943 3397475 +POINT4619308 3515792 +POINT4576407 3570028 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT3996933 4208618 +POINT3889923 4308883 +POINT3727081 4450477 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837608 +POINT3026535 4953514 +POINT2966862 4988460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347191 +POINT2058868 5427452 +POINT1993763 5450768 +POINT1855697 5500213 +POINT1789776 5521092 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT592941 5774353 +POINT524032 5780130 +POINT377899 5792381 +POINT308823 5795594 +POINT162338 5802406 +POINT-53451 5804413 +POINT-122575 5802484 +POINT-269165 5798393 +POINT-484497 5784363 +POINT-699173 5762336 +POINT-912872 5732353 +POINT-980950 5720205 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533745 +POINT-1956619 5464775 +POINT-2158386 5388252 +POINT-2222087 5361345 +POINT-2357177 5304283 +POINT-2419838 5275026 +POINT-2552719 5212982 +POINT-2744720 5114479 +POINT-2805028 5080648 +POINT-2932922 5008903 +POINT-2991935 4972855 +POINT-3117080 4896408 +POINT-3174709 4858191 +POINT-3296920 4777145 +POINT-3353092 4736811 +POINT-3472213 4651275 +POINT-3526845 4608883 +POINT-3642700 4518982 +POINT-3695718 4474587 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4170794 4035375 +POINT-4272049 3929298 +POINT-4415146 3767776 +POINT-4552154 3601043 +POINT-4594039 3546018 +POINT-4682861 3429329 +POINT-4807083 3252876 +POINT-4924667 3071930 +POINT-4960171 3012587 +POINT-5035461 2886741 +POINT-5068725 2826118 +POINT-5139267 2697555 +POINT-5235992 2504646 +POINT-5264665 2441722 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701126 +POINT-5608688 1493667 +POINT-5625240 1426526 +POINT-5660339 1284141 +POINT-5674382 1216430 +POINT-5704162 1072837 +POINT-5715678 1004652 +POINT-5740097 860054 +POINT-5768097 646080 +POINT-5774517 577229 +POINT-5788131 431221 +POINT-5800155 215759 +POINT-5801441 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804168 0 +POINT-5800527 -195767 +POINT-5800155 -215766 +POINT-5789246 -411250 +POINT-5788131 -431221 +POINT-5769954 -626171 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5707493 -1053122 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5613476 -1474254 +POINT-5608688 -1493675 +POINT-5554806 -1681904 +POINT-5549301 -1701133 +POINT-5482239 -1906250 +POINT-5407593 -2108726 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5045083 -2869213 +POINT-5035461 -2886749 +POINT-4934937 -3054772 +POINT-4924667 -3071937 +POINT-4817982 -3236112 +POINT-4807083 -3252884 +POINT-4694375 -3412981 +POINT-4682861 -3429336 +POINT-4564270 -3585128 +POINT-4552154 -3601043 +POINT-4415146 -3767784 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3822999 -4367045 +POINT-3808151 -4380447 +POINT-3658036 -4506148 +POINT-3642700 -4518989 +POINT-3488016 -4639021 +POINT-3472213 -4651283 +POINT-3313169 -4765486 +POINT-3296920 -4777153 +POINT-3133750 -4885361 +POINT-3117080 -4896415 +POINT-2932922 -5008911 +POINT-2762165 -5104700 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1975321 -5457690 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1564419 -5589393 +POINT-1545242 -5595077 +POINT-1355573 -5643699 +POINT-1336196 -5648666 +POINT-1144866 -5690200 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-718981 -5759565 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT142336 -5802600 +POINT162338 -5802414 +POINT377899 -5792389 +POINT573008 -5776025 +POINT592941 -5774353 +POINT787317 -5750755 +POINT807174 -5748344 +POINT1020278 -5714386 +POINT1212356 -5676418 +POINT1231979 -5672539 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855697 -5500221 +POINT2040036 -5434204 +POINT2058868 -5427459 +POINT2240618 -5354638 +POINT2259185 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT3009274 -4963630 +POINT3026535 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715034 +POINT3559082 -4585930 +POINT3711509 -4463040 +POINT3727081 -4450485 +POINT3874829 -4322016 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4606899 -3531488 +POINT4619308 -3515800 +POINT4746795 -3341690 +POINT4856513 -3179523 +POINT4867721 -3162956 +POINT4971347 -2996830 +POINT4981933 -2979858 +POINT5079301 -2809994 +POINT5089248 -2792640 +POINT5180234 -2619273 +POINT5189529 -2601562 +POINT5282654 -2406883 +POINT5360501 -2227238 +POINT5368454 -2208885 +POINT5446853 -2007835 +POINT5511147 -1822894 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389152 +POINT5679809 -1198210 +POINT5684234 -1178703 +POINT5720424 -986279 +POINT5724121 -966621 +POINT5753125 -772986 +POINT5756088 -753204 +POINT5777879 -558627 +POINT5780105 -538749 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5803425 -127890 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796886 303551 +POINT5796142 323539 +POINT5781592 518794 +POINT5780105 538742 +POINT5756088 753196 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5586110 1578342 +POINT5580963 1597671 +POINT5523578 1784869 +POINT5517715 1803993 +POINT5453422 1988934 +POINT5446853 2007827 +POINT5375721 2190242 +POINT5368454 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT4991881 2962497 +POINT4981933 2979850 +POINT4878308 3145977 +POINT4867721 3162948 +POINT4758004 3325115 +POINT4746795 3341682 +POINT4631125 3499654 +POINT4619308 3515792 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4061472 4147129 +POINT4047393 4161338 +POINT3904519 4295207 +POINT3889923 4308883 +POINT3742175 4437353 +POINT3727081 4450477 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837608 +POINT3026535 4953514 +POINT2857577 5052460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2277463 5339067 +POINT2259185 5347191 +POINT2058868 5427452 +POINT1874529 5493469 +POINT1855697 5500213 +POINT1669047 5559329 +POINT1649978 5565368 +POINT1461251 5617507 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT592941 5774353 +POINT377899 5792381 +POINT182318 5801477 +POINT162338 5802406 +POINT-33449 5804227 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-484497 5784363 +POINT-679274 5764378 +POINT-699173 5762336 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533745 +POINT-1937665 5471168 +POINT-1956619 5464775 +POINT-2139684 5395345 +POINT-2158386 5388252 +POINT-2357177 5304283 +POINT-2534594 5221445 +POINT-2552719 5212982 +POINT-2744720 5114479 +POINT-2932922 5008903 +POINT-3100011 4906835 +POINT-3117080 4896408 +POINT-3280251 4788200 +POINT-3296920 4777145 +POINT-3455965 4662942 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3953490 4249250 +POINT-3968338 4235847 +POINT-4108707 4099341 +POINT-4123047 4085395 +POINT-4258238 3943767 +POINT-4272049 3929298 +POINT-4401882 3782748 +POINT-4415146 3767776 +POINT-4539455 3616498 +POINT-4552154 3601043 +POINT-4670746 3445245 +POINT-4682861 3429329 +POINT-4807083 3252876 +POINT-4924667 3071930 +POINT-5025192 2903907 +POINT-5035461 2886741 +POINT-5139267 2697555 +POINT-5227027 2522527 +POINT-5235992 2504646 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5475320 1925010 +POINT-5482239 1906242 +POINT-5549301 1701126 +POINT-5603184 1512897 +POINT-5608688 1493667 +POINT-5655552 1303562 +POINT-5660339 1284141 +POINT-5700100 1092423 +POINT-5704162 1072837 +POINT-5740097 860054 +POINT-5768097 646080 +POINT-5788131 431221 +POINT-5799041 235730 +POINT-5800155 215759 +POINT-5803797 19998 +OBJECT_ID177 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215761 +POINT-5788116 -431221 +POINT-5768097 -646087 +POINT-5740097 -860059 +POINT-5704162 -1072843 +POINT-5660339 -1284145 +POINT-5608688 -1493671 +POINT-5549301 -1701133 +POINT-5482239 -1906244 +POINT-5407593 -2108720 +POINT-5325470 -2308282 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4924667 -3071937 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4552154 -3601043 +POINT-4415146 -3767778 +POINT-4272049 -3929304 +POINT-4123047 -4085399 +POINT-3968338 -4235849 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3296920 -4777147 +POINT-3117080 -4896412 +POINT-2932922 -5008909 +POINT-2744720 -5114483 +POINT-2552719 -5212988 +POINT-2357177 -5304289 +POINT-2158386 -5388258 +POINT-1956619 -5464781 +POINT-1752136 -5533750 +POINT-1545242 -5595073 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732355 +POINT-699173 -5762344 +POINT-484497 -5784368 +POINT-269165 -5798399 +POINT-53451 -5804416 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774355 +POINT807174 -5748342 +POINT1020278 -5714386 +POINT1231979 -5672533 +POINT1441970 -5622839 +POINT1649978 -5565372 +POINT1855697 -5500217 +POINT2058868 -5427458 +POINT2259185 -5347196 +POINT2456375 -5259546 +POINT2650177 -5164627 +POINT2840316 -5062570 +POINT3026535 -4953516 +POINT3208557 -4837616 +POINT3386154 -4715029 +POINT3559082 -4585924 +POINT3727081 -4450483 +POINT3889923 -4308891 +POINT4047393 -4161344 +POINT4199280 -4008045 +POINT4345352 -3849207 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4746795 -3341686 +POINT4867721 -3162956 +POINT4981933 -2979856 +POINT5089248 -2792637 +POINT5189529 -2601558 +POINT5282654 -2406883 +POINT5368454 -2208883 +POINT5446853 -2007829 +POINT5517730 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389148 +POINT5684234 -1178697 +POINT5724121 -966619 +POINT5756088 -753204 +POINT5780105 -538747 +POINT5796142 -323547 +POINT5804168 -107898 +POINT5804168 107896 +POINT5796142 323545 +POINT5780105 538745 +POINT5756088 753202 +POINT5724121 966617 +POINT5684234 1178697 +POINT5636490 1389146 +POINT5580963 1597677 +POINT5517730 1803999 +POINT5446853 2007827 +POINT5368454 2208881 +POINT5282654 2406881 +POINT5189529 2601556 +POINT5089248 2792635 +POINT4981933 2979852 +POINT4867721 3162954 +POINT4746795 3341684 +POINT4619308 3515794 +POINT4485428 3685045 +POINT4345352 3849203 +POINT4199280 4008043 +POINT4047393 4161340 +POINT3889923 4308889 +POINT3727081 4450483 +POINT3559082 4585924 +POINT3386154 4715025 +POINT3208557 4837614 +POINT3026535 4953512 +POINT2840316 5062567 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2259185 5347196 +POINT2058868 5427458 +POINT1855697 5500215 +POINT1649978 5565370 +POINT1441970 5622835 +POINT1231979 5672529 +POINT1020278 5714384 +POINT807174 5748342 +POINT592941 5774351 +POINT377899 5792383 +POINT162338 5802408 +POINT-53451 5804415 +POINT-269165 5798399 +POINT-484497 5784368 +POINT-699173 5762342 +POINT-912872 5732355 +POINT-1125320 5694441 +POINT-1336196 5648660 +POINT-1545242 5595072 +POINT-1752136 5533750 +POINT-1956619 5464781 +POINT-2158386 5388258 +POINT-2357177 5304289 +POINT-2552719 5212988 +POINT-2744720 5114481 +POINT-2932922 5008905 +POINT-3117080 4896410 +POINT-3296920 4777147 +POINT-3472213 4651277 +POINT-3642700 4518984 +POINT-3808151 4380441 +POINT-3968338 4235849 +POINT-4123047 4085397 +POINT-4272049 3929304 +POINT-4415146 3767778 +POINT-4552154 3601041 +POINT-4682846 3429330 +POINT-4807083 3252882 +POINT-4924667 3071935 +POINT-5035446 2886743 +POINT-5139267 2697561 +POINT-5235992 2504652 +POINT-5325470 2308279 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701131 +POINT-5608688 1493669 +POINT-5660339 1284143 +POINT-5704162 1072841 +POINT-5740097 860057 +POINT-5768097 646085 +POINT-5788116 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803580 -31655 +POINT-5800155 -215761 +POINT-5798389 -247372 +POINT-5788116 -431221 +POINT-5785179 -462745 +POINT-5768097 -646087 +POINT-5763989 -677480 +POINT-5740097 -860059 +POINT-5704162 -1072843 +POINT-5697733 -1103844 +POINT-5660339 -1284145 +POINT-5652761 -1314886 +POINT-5608688 -1493671 +POINT-5599975 -1524109 +POINT-5549301 -1701133 +POINT-5539462 -1731226 +POINT-5482239 -1906244 +POINT-5407593 -2108720 +POINT-5325470 -2308282 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5124035 -2725319 +POINT-5035446 -2886745 +POINT-5019193 -2913916 +POINT-4924667 -3071937 +POINT-4907416 -3098485 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4552154 -3601043 +POINT-4532053 -3625506 +POINT-4415146 -3767778 +POINT-4272049 -3929304 +POINT-4250188 -3952206 +POINT-4123047 -4085399 +POINT-3968338 -4235849 +POINT-3944836 -4257064 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3446495 -4669746 +POINT-3296920 -4777147 +POINT-3270535 -4794645 +POINT-3117080 -4896412 +POINT-2932922 -5008909 +POINT-2905310 -5024399 +POINT-2744720 -5114483 +POINT-2552719 -5212988 +POINT-2357177 -5304289 +POINT-2158386 -5388258 +POINT-1956619 -5464781 +POINT-1926618 -5474900 +POINT-1752136 -5533750 +POINT-1545242 -5595073 +POINT-1514572 -5602936 +POINT-1336196 -5648662 +POINT-1305257 -5655379 +POINT-1125320 -5694443 +POINT-912872 -5732355 +POINT-881519 -5736755 +POINT-699173 -5762344 +POINT-667676 -5765576 +POINT-484497 -5784368 +POINT-452904 -5786427 +POINT-269165 -5798399 +POINT-237516 -5799282 +POINT-53451 -5804416 +POINT-21791 -5804122 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774355 +POINT807174 -5748342 +POINT1020278 -5714386 +POINT1231979 -5672533 +POINT1441970 -5622839 +POINT1649978 -5565372 +POINT1680160 -5555813 +POINT1855697 -5500217 +POINT1885506 -5489542 +POINT2058868 -5427458 +POINT2259185 -5347196 +POINT2288116 -5334337 +POINT2456375 -5259546 +POINT2484809 -5245620 +POINT2650177 -5164627 +POINT2678073 -5149654 +POINT2840316 -5062570 +POINT2867638 -5046570 +POINT3026535 -4953516 +POINT3208557 -4837616 +POINT3386154 -4715029 +POINT3559082 -4585924 +POINT3583730 -4566053 +POINT3727081 -4450483 +POINT3889923 -4308891 +POINT3913026 -4287244 +POINT4047393 -4161344 +POINT4069677 -4138853 +POINT4199280 -4008045 +POINT4345352 -3849207 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4638013 -3490251 +POINT4746795 -3341686 +POINT4867721 -3162956 +POINT4884478 -3136092 +POINT4981933 -2979856 +POINT4997678 -2952388 +POINT5089248 -2792637 +POINT5189529 -2601558 +POINT5203192 -2572996 +POINT5282654 -2406883 +POINT5368454 -2208883 +POINT5446853 -2007829 +POINT5457252 -1977924 +POINT5517730 -1804000 +POINT5527008 -1773730 +POINT5580963 -1597679 +POINT5589110 -1567084 +POINT5636490 -1389148 +POINT5684234 -1178697 +POINT5690087 -1147582 +POINT5724121 -966619 +POINT5756088 -753204 +POINT5759612 -721740 +POINT5780105 -538747 +POINT5782458 -507174 +POINT5796142 -323547 +POINT5797320 -291908 +POINT5804168 -107898 +POINT5804168 107896 +POINT5802991 139535 +POINT5796142 323545 +POINT5793790 355118 +POINT5780105 538745 +POINT5776582 570210 +POINT5756088 753202 +POINT5751398 784513 +POINT5724121 966617 +POINT5718269 997733 +POINT5684234 1178697 +POINT5677230 1209573 +POINT5636490 1389146 +POINT5580963 1597677 +POINT5571686 1627947 +POINT5517730 1803999 +POINT5507332 1833903 +POINT5446853 2007827 +POINT5435351 2037325 +POINT5368454 2208881 +POINT5282654 2406881 +POINT5189529 2601556 +POINT5174816 2629591 +POINT5089248 2792635 +POINT5073504 2820102 +POINT4981933 2979852 +POINT4965177 3006716 +POINT4867721 3162954 +POINT4849980 3189176 +POINT4746795 3341684 +POINT4728091 3367229 +POINT4619308 3515794 +POINT4599666 3540626 +POINT4485428 3685045 +POINT4345352 3849203 +POINT4199280 4008043 +POINT4047393 4161340 +POINT4024290 4182988 +POINT3889923 4308889 +POINT3727081 4450483 +POINT3559082 4585924 +POINT3386154 4715025 +POINT3360098 4733011 +POINT3208557 4837614 +POINT3026535 4953512 +POINT2999214 4969512 +POINT2840316 5062567 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2427444 5272406 +POINT2259185 5347196 +POINT2229796 5358972 +POINT2058868 5427458 +POINT2029059 5438133 +POINT1855697 5500215 +POINT1649978 5565370 +POINT1441970 5622835 +POINT1411161 5630126 +POINT1231979 5672529 +POINT1200919 5678670 +POINT1020278 5714384 +POINT807174 5748342 +POINT775743 5752158 +POINT592941 5774351 +POINT377899 5792383 +POINT346272 5793854 +POINT162338 5802408 +POINT-53451 5804415 +POINT-269165 5798399 +POINT-484497 5784368 +POINT-515993 5781137 +POINT-699173 5762342 +POINT-912872 5732355 +POINT-1125320 5694441 +POINT-1336196 5648660 +POINT-1366867 5640798 +POINT-1545242 5595072 +POINT-1752136 5533750 +POINT-1956619 5464781 +POINT-2158386 5388258 +POINT-2357177 5304289 +POINT-2552719 5212988 +POINT-2744720 5114481 +POINT-2932922 5008905 +POINT-3117080 4896410 +POINT-3143466 4878912 +POINT-3296920 4777147 +POINT-3322639 4758680 +POINT-3472213 4651277 +POINT-3497227 4631868 +POINT-3642700 4518984 +POINT-3808151 4380441 +POINT-3968338 4235849 +POINT-4123047 4085397 +POINT-4144908 4062496 +POINT-4272049 3929304 +POINT-4415146 3767778 +POINT-4552154 3601041 +POINT-4571329 3575849 +POINT-4682846 3429330 +POINT-4807083 3252882 +POINT-4924667 3071935 +POINT-4940920 3044765 +POINT-5035446 2886743 +POINT-5139267 2697561 +POINT-5235992 2504652 +POINT-5249120 2475841 +POINT-5325470 2308279 +POINT-5407593 2108719 +POINT-5418545 2079012 +POINT-5482239 1906242 +POINT-5549301 1701131 +POINT-5608688 1493669 +POINT-5660339 1284143 +POINT-5666769 1253142 +POINT-5704162 1072841 +POINT-5709435 1041622 +POINT-5740097 860057 +POINT-5768097 646085 +POINT-5788116 431221 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804168 0 +POINT-5800155 -215761 +POINT-5788116 -431221 +POINT-5768097 -646087 +POINT-5740097 -860059 +POINT-5728582 -928245 +POINT-5704162 -1072843 +POINT-5690120 -1140554 +POINT-5660339 -1284145 +POINT-5643788 -1351286 +POINT-5608688 -1493671 +POINT-5589658 -1560151 +POINT-5549301 -1701133 +POINT-5482239 -1906244 +POINT-5407593 -2108720 +POINT-5381277 -2172669 +POINT-5325470 -2308282 +POINT-5296797 -2371209 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4924667 -3071937 +POINT-4886988 -3129921 +POINT-4807083 -3252884 +POINT-4767272 -3309426 +POINT-4682846 -3429332 +POINT-4640967 -3484356 +POINT-4552154 -3601043 +POINT-4415146 -3767778 +POINT-4272049 -3929304 +POINT-4224302 -3979324 +POINT-4123047 -4085399 +POINT-3968338 -4235849 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3416042 -4691613 +POINT-3296920 -4777147 +POINT-3239292 -4815365 +POINT-3117080 -4896412 +POINT-3058068 -4932461 +POINT-2932922 -5008909 +POINT-2872614 -5042740 +POINT-2744720 -5114483 +POINT-2552719 -5212988 +POINT-2357177 -5304289 +POINT-2158386 -5388258 +POINT-1956619 -5464781 +POINT-1752136 -5533750 +POINT-1685838 -5553401 +POINT-1545242 -5595073 +POINT-1478254 -5612246 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732355 +POINT-844393 -5741965 +POINT-699173 -5762344 +POINT-630381 -5769402 +POINT-484497 -5784368 +POINT-269165 -5798399 +POINT-53451 -5804416 +POINT15697 -5803774 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774355 +POINT807174 -5748342 +POINT875462 -5737461 +POINT1020278 -5714386 +POINT1231979 -5672533 +POINT1299270 -5656609 +POINT1441970 -5622839 +POINT1649978 -5565372 +POINT1855697 -5500217 +POINT1920802 -5476902 +POINT2058868 -5427458 +POINT2259185 -5347196 +POINT2322374 -5319109 +POINT2456375 -5259546 +POINT2518478 -5229130 +POINT2650177 -5164627 +POINT2840316 -5062570 +POINT3026535 -4953516 +POINT3208557 -4837616 +POINT3386154 -4715029 +POINT3441568 -4673658 +POINT3559082 -4585924 +POINT3612916 -4542523 +POINT3727081 -4450483 +POINT3779263 -4405111 +POINT3889923 -4308891 +POINT4047393 -4161344 +POINT4096065 -4112220 +POINT4199280 -4008045 +POINT4345352 -3849207 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4660161 -3460003 +POINT4746795 -3341686 +POINT4785546 -3284413 +POINT4867721 -3162956 +POINT4904320 -3104282 +POINT4981933 -2979856 +POINT5016322 -2919863 +POINT5089248 -2792637 +POINT5121383 -2731407 +POINT5189529 -2601558 +POINT5219371 -2539176 +POINT5282654 -2406883 +POINT5368454 -2208883 +POINT5446853 -2007829 +POINT5469566 -1942513 +POINT5517730 -1804000 +POINT5537993 -1737886 +POINT5580963 -1597679 +POINT5636490 -1389148 +POINT5684234 -1178697 +POINT5697016 -1110738 +POINT5724121 -966619 +POINT5734365 -898231 +POINT5756088 -753204 +POINT5780105 -538747 +POINT5785244 -469787 +POINT5796142 -323547 +POINT5798714 -254443 +POINT5804168 -107898 +POINT5804168 107896 +POINT5796142 323545 +POINT5780105 538745 +POINT5772409 607467 +POINT5756088 753202 +POINT5724121 966617 +POINT5684234 1178697 +POINT5668935 1246134 +POINT5636490 1389146 +POINT5580963 1597677 +POINT5517730 1803999 +POINT5446853 2007827 +POINT5421731 2072254 +POINT5368454 2208881 +POINT5282654 2406881 +POINT5189529 2601556 +POINT5157395 2662786 +POINT5089248 2792635 +POINT5054860 2852627 +POINT4981933 2979852 +POINT4945335 3038526 +POINT4867721 3162954 +POINT4828971 3220227 +POINT4746795 3341684 +POINT4705943 3397477 +POINT4619308 3515794 +POINT4576407 3570030 +POINT4485428 3685045 +POINT4345352 3849203 +POINT4199280 4008043 +POINT4047393 4161340 +POINT3996933 4208622 +POINT3889923 4308889 +POINT3727081 4450483 +POINT3559082 4585924 +POINT3386154 4715025 +POINT3329244 4754308 +POINT3208557 4837614 +POINT3150229 4874753 +POINT3026535 4953512 +POINT2840316 5062567 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2259185 5347196 +POINT2194995 5372916 +POINT2058868 5427458 +POINT1993763 5450773 +POINT1855697 5500215 +POINT1789776 5521094 +POINT1649978 5565370 +POINT1441970 5622835 +POINT1231979 5672529 +POINT1020278 5714384 +POINT951990 5725266 +POINT807174 5748342 +POINT592941 5774351 +POINT377899 5792383 +POINT162338 5802408 +POINT-53451 5804415 +POINT-269165 5798399 +POINT-338167 5793903 +POINT-484497 5784368 +POINT-553288 5777310 +POINT-699173 5762342 +POINT-767651 5752733 +POINT-912872 5732355 +POINT-980950 5720206 +POINT-1125320 5694441 +POINT-1192894 5679771 +POINT-1336196 5648660 +POINT-1403184 5631488 +POINT-1545242 5595072 +POINT-1611540 5575422 +POINT-1752136 5533750 +POINT-1956619 5464781 +POINT-2158386 5388258 +POINT-2357177 5304289 +POINT-2419838 5275032 +POINT-2552719 5212988 +POINT-2614245 5181422 +POINT-2744720 5114481 +POINT-2805028 5080650 +POINT-2932922 5008905 +POINT-2991935 4972857 +POINT-3117080 4896410 +POINT-3174709 4858193 +POINT-3296920 4777147 +POINT-3353092 4736813 +POINT-3472213 4651277 +POINT-3526845 4608885 +POINT-3642700 4518984 +POINT-3695718 4474589 +POINT-3808151 4380441 +POINT-3859482 4334108 +POINT-3968338 4235849 +POINT-4123047 4085397 +POINT-4170794 4035378 +POINT-4272049 3929304 +POINT-4415146 3767778 +POINT-4552154 3601041 +POINT-4594033 3546018 +POINT-4682846 3429330 +POINT-4807083 3252882 +POINT-4924667 3071935 +POINT-4960166 3012591 +POINT-5035446 2886743 +POINT-5068715 2826121 +POINT-5139267 2697561 +POINT-5235992 2504652 +POINT-5264665 2441725 +POINT-5325470 2308279 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701131 +POINT-5608688 1493669 +POINT-5625240 1426528 +POINT-5660339 1284143 +POINT-5674382 1216432 +POINT-5704162 1072841 +POINT-5715678 1004656 +POINT-5740097 860057 +POINT-5768097 646085 +POINT-5774512 577233 +POINT-5788116 431221 +POINT-5791974 362177 +POINT-5800155 215759 +POINT-5801441 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804168 0 +POINT-5800527 -195762 +POINT-5800155 -215761 +POINT-5789232 -411249 +POINT-5788116 -431221 +POINT-5769953 -626171 +POINT-5768097 -646087 +POINT-5740097 -860059 +POINT-5707493 -1053120 +POINT-5704162 -1072843 +POINT-5660339 -1284145 +POINT-5613476 -1474250 +POINT-5608688 -1493671 +POINT-5554806 -1681903 +POINT-5549301 -1701133 +POINT-5482239 -1906244 +POINT-5407593 -2108720 +POINT-5333082 -2289785 +POINT-5325470 -2308282 +POINT-5244286 -2486452 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4934935 -3054772 +POINT-4924667 -3071937 +POINT-4817982 -3236112 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4564268 -3585127 +POINT-4552154 -3601043 +POINT-4415146 -3767778 +POINT-4272049 -3929304 +POINT-4136858 -4070931 +POINT-4123047 -4085399 +POINT-3982678 -4221904 +POINT-3968338 -4235849 +POINT-3822999 -4367041 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3488016 -4639017 +POINT-3472213 -4651279 +POINT-3313169 -4765480 +POINT-3296920 -4777147 +POINT-3133750 -4885357 +POINT-3117080 -4896412 +POINT-2949992 -4998482 +POINT-2932922 -5008909 +POINT-2744720 -5114483 +POINT-2552719 -5212988 +POINT-2357177 -5304289 +POINT-2158386 -5388258 +POINT-1956619 -5464781 +POINT-1752136 -5533750 +POINT-1564419 -5589390 +POINT-1545242 -5595073 +POINT-1355573 -5643695 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-932564 -5728841 +POINT-912872 -5732355 +POINT-699173 -5762344 +POINT-504395 -5782327 +POINT-484497 -5784368 +POINT-269165 -5798399 +POINT-73446 -5803859 +POINT-53451 -5804416 +POINT142336 -5802596 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774355 +POINT807174 -5748342 +POINT1020278 -5714386 +POINT1231979 -5672533 +POINT1441970 -5622839 +POINT1630698 -5570699 +POINT1649978 -5565372 +POINT1855697 -5500217 +POINT2058868 -5427458 +POINT2240618 -5354636 +POINT2259185 -5347196 +POINT2456375 -5259546 +POINT2650177 -5164627 +POINT2822692 -5072030 +POINT2840316 -5062570 +POINT3026535 -4953516 +POINT3208557 -4837616 +POINT3386154 -4715029 +POINT3543053 -4597891 +POINT3559082 -4585924 +POINT3727081 -4450483 +POINT3874829 -4322016 +POINT3889923 -4308891 +POINT4047393 -4161344 +POINT4199280 -4008045 +POINT4345352 -3849207 +POINT4485428 -3685047 +POINT4606899 -3531484 +POINT4619308 -3515796 +POINT4746795 -3341686 +POINT4856513 -3179523 +POINT4867721 -3162956 +POINT4971347 -2996828 +POINT4981933 -2979856 +POINT5089248 -2792637 +POINT5189529 -2601558 +POINT5274022 -2424928 +POINT5282654 -2406883 +POINT5368454 -2208883 +POINT5446853 -2007829 +POINT5511161 -1822894 +POINT5517730 -1804000 +POINT5575102 -1616803 +POINT5580963 -1597679 +POINT5636490 -1389148 +POINT5679809 -1198204 +POINT5684234 -1178697 +POINT5720424 -986277 +POINT5724121 -966619 +POINT5753125 -772986 +POINT5756088 -753204 +POINT5777879 -558626 +POINT5780105 -538747 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5803425 -127887 +POINT5804168 -107898 +POINT5804168 107896 +POINT5796886 303556 +POINT5796142 323545 +POINT5781592 518798 +POINT5780105 538745 +POINT5756088 753202 +POINT5724121 966617 +POINT5684234 1178697 +POINT5636490 1389146 +POINT5586110 1578348 +POINT5580963 1597677 +POINT5523592 1784874 +POINT5517730 1803999 +POINT5453423 1988934 +POINT5446853 2007827 +POINT5375721 2190245 +POINT5368454 2208881 +POINT5282654 2406881 +POINT5198161 2583512 +POINT5189529 2601556 +POINT5089248 2792635 +POINT4991881 2962499 +POINT4981933 2979852 +POINT4878308 3145982 +POINT4867721 3162954 +POINT4758004 3325117 +POINT4746795 3341684 +POINT4631125 3499656 +POINT4619308 3515794 +POINT4485428 3685045 +POINT4358336 3833987 +POINT4345352 3849203 +POINT4199280 4008043 +POINT4061472 4147131 +POINT4047393 4161340 +POINT3904519 4295213 +POINT3889923 4308889 +POINT3742175 4437359 +POINT3727081 4450483 +POINT3574654 4573370 +POINT3559082 4585924 +POINT3386154 4715025 +POINT3208557 4837614 +POINT3026535 4953512 +POINT2840316 5062567 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2277463 5339072 +POINT2259185 5347196 +POINT2058868 5427458 +POINT1855697 5500215 +POINT1669047 5559331 +POINT1649978 5565370 +POINT1461251 5617509 +POINT1441970 5622835 +POINT1251443 5667923 +POINT1231979 5672529 +POINT1020278 5714384 +POINT826927 5745195 +POINT807174 5748342 +POINT592941 5774351 +POINT397831 5790712 +POINT377899 5792383 +POINT182318 5801479 +POINT162338 5802408 +POINT-33449 5804229 +POINT-53451 5804415 +POINT-269165 5798399 +POINT-464537 5785669 +POINT-484497 5784368 +POINT-679274 5764384 +POINT-699173 5762342 +POINT-912872 5732355 +POINT-1125320 5694441 +POINT-1316650 5652904 +POINT-1336196 5648660 +POINT-1545242 5595072 +POINT-1732959 5539434 +POINT-1752136 5533750 +POINT-1937665 5471174 +POINT-1956619 5464781 +POINT-2139684 5395351 +POINT-2158386 5388258 +POINT-2357177 5304289 +POINT-2534594 5221451 +POINT-2552719 5212988 +POINT-2744720 5114481 +POINT-2932922 5008905 +POINT-3100011 4906837 +POINT-3117080 4896410 +POINT-3280251 4788202 +POINT-3296920 4777147 +POINT-3455965 4662944 +POINT-3472213 4651277 +POINT-3642700 4518984 +POINT-3792815 4393283 +POINT-3808151 4380441 +POINT-3953490 4249252 +POINT-3968338 4235849 +POINT-4108707 4099343 +POINT-4123047 4085397 +POINT-4272049 3929304 +POINT-4415146 3767778 +POINT-4539455 3616496 +POINT-4552154 3601041 +POINT-4670732 3445247 +POINT-4682846 3429330 +POINT-4807083 3252882 +POINT-4924667 3071935 +POINT-5025178 2903909 +POINT-5035446 2886743 +POINT-5129644 2715096 +POINT-5139267 2697561 +POINT-5227027 2522533 +POINT-5235992 2504652 +POINT-5325470 2308279 +POINT-5407593 2108719 +POINT-5475320 1925010 +POINT-5482239 1906242 +POINT-5543085 1720143 +POINT-5549301 1701131 +POINT-5603184 1512899 +POINT-5608688 1493669 +POINT-5655552 1303564 +POINT-5660339 1284143 +POINT-5700100 1092427 +POINT-5704162 1072841 +POINT-5740097 860057 +POINT-5768097 646085 +POINT-5788116 431221 +POINT-5799040 235730 +POINT-5800155 215759 +POINT-5803797 19998 +OBJECT_ID188 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804165 0 +POINT-5800152 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740093 -860059 +POINT-5704159 -1072843 +POINT-5660339 -1284145 +POINT-5608696 -1493671 +POINT-5549301 -1701133 +POINT-5482231 -1906244 +POINT-5407589 -2108720 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035454 -2886745 +POINT-4924675 -3071935 +POINT-4807087 -3252882 +POINT-4682853 -3429332 +POINT-4552150 -3601043 +POINT-4415153 -3767778 +POINT-4272053 -3929304 +POINT-4123047 -4085399 +POINT-3968341 -4235849 +POINT-3808155 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3296924 -4777147 +POINT-3117080 -4896410 +POINT-2932926 -5008907 +POINT-2744716 -5114483 +POINT-2552715 -5212988 +POINT-2357181 -5304289 +POINT-2158393 -5388258 +POINT-1956619 -5464781 +POINT-1752140 -5533750 +POINT-1545238 -5595072 +POINT-1336200 -5648660 +POINT-1125316 -5694443 +POINT-912876 -5732355 +POINT-699173 -5762344 +POINT-484504 -5784368 +POINT-269161 -5798399 +POINT-53451 -5804415 +POINT162338 -5802410 +POINT377903 -5792385 +POINT592945 -5774353 +POINT807167 -5748342 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1441974 -5622839 +POINT1649978 -5565372 +POINT1855701 -5500215 +POINT2058864 -5427458 +POINT2259182 -5347196 +POINT2456375 -5259546 +POINT2650177 -5164627 +POINT2840313 -5062568 +POINT3026527 -4953516 +POINT3208561 -4837614 +POINT3386158 -4715029 +POINT3559074 -4585924 +POINT3727073 -4450483 +POINT3889923 -4308891 +POINT4047397 -4161342 +POINT4199280 -4008045 +POINT4345356 -3849205 +POINT4485428 -3685047 +POINT4619304 -3515796 +POINT4746792 -3341684 +POINT4867725 -3162956 +POINT4981930 -2979854 +POINT5089248 -2792637 +POINT5189533 -2601556 +POINT5282646 -2406883 +POINT5368461 -2208883 +POINT5446857 -2007829 +POINT5517723 -1804000 +POINT5580967 -1597677 +POINT5636493 -1389148 +POINT5684234 -1178697 +POINT5724121 -966619 +POINT5756092 -753204 +POINT5780113 -538747 +POINT5796142 -323547 +POINT5804165 -107898 +POINT5804165 107898 +POINT5796142 323545 +POINT5780113 538745 +POINT5756092 753202 +POINT5724121 966619 +POINT5684234 1178697 +POINT5636493 1389146 +POINT5580967 1597677 +POINT5517723 1803999 +POINT5446857 2007829 +POINT5368461 2208883 +POINT5282646 2406881 +POINT5189533 2601556 +POINT5089248 2792635 +POINT4981930 2979856 +POINT4867725 3162954 +POINT4746792 3341684 +POINT4619304 3515794 +POINT4485428 3685045 +POINT4345356 3849203 +POINT4199280 4008043 +POINT4047397 4161340 +POINT3889923 4308889 +POINT3727073 4450483 +POINT3559074 4585924 +POINT3386158 4715029 +POINT3208561 4837614 +POINT3026527 4953516 +POINT2840313 5062570 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2259182 5347196 +POINT2058864 5427458 +POINT1855701 5500215 +POINT1649978 5565370 +POINT1441974 5622839 +POINT1231975 5672533 +POINT1020275 5714384 +POINT807167 5748342 +POINT592945 5774351 +POINT377903 5792383 +POINT162338 5802408 +POINT-53451 5804415 +POINT-269161 5798399 +POINT-484504 5784368 +POINT-699173 5762342 +POINT-912876 5732355 +POINT-1125316 5694441 +POINT-1336200 5648660 +POINT-1545238 5595072 +POINT-1752140 5533750 +POINT-1956619 5464781 +POINT-2158393 5388258 +POINT-2357181 5304289 +POINT-2552715 5212988 +POINT-2744716 5114481 +POINT-2932926 5008909 +POINT-3117080 4896410 +POINT-3296924 4777147 +POINT-3472213 4651277 +POINT-3642700 4518984 +POINT-3808155 4380441 +POINT-3968341 4235849 +POINT-4123047 4085397 +POINT-4272053 3929304 +POINT-4415153 3767778 +POINT-4552150 3601041 +POINT-4682853 3429330 +POINT-4807087 3252882 +POINT-4924675 3071935 +POINT-5035454 2886743 +POINT-5139274 2697561 +POINT-5235992 2504652 +POINT-5325470 2308282 +POINT-5407589 2108720 +POINT-5482231 1906244 +POINT-5549301 1701131 +POINT-5608696 1493669 +POINT-5660339 1284143 +POINT-5704159 1072843 +POINT-5740093 860059 +POINT-5768097 646085 +POINT-5788124 431221 +POINT-5800152 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804165 0 +POINT-5800152 -215759 +POINT-5788124 -431221 +POINT-5785186 -462745 +POINT-5768097 -646087 +POINT-5740093 -860059 +POINT-5734821 -891278 +POINT-5704159 -1072843 +POINT-5660339 -1284145 +POINT-5608696 -1493671 +POINT-5599982 -1524109 +POINT-5549301 -1701133 +POINT-5539461 -1731226 +POINT-5482231 -1906244 +POINT-5471280 -1935950 +POINT-5407589 -2108720 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5124042 -2725319 +POINT-5035454 -2886745 +POINT-5019201 -2913916 +POINT-4924675 -3071935 +POINT-4907423 -3098483 +POINT-4807087 -3252882 +POINT-4788860 -3278770 +POINT-4682853 -3429332 +POINT-4663677 -3454525 +POINT-4552150 -3601043 +POINT-4532051 -3625506 +POINT-4415153 -3767778 +POINT-4272053 -3929304 +POINT-4123047 -4085399 +POINT-4100349 -4107473 +POINT-3968341 -4235849 +POINT-3944840 -4257064 +POINT-3808155 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3446496 -4669746 +POINT-3296924 -4777147 +POINT-3270538 -4794645 +POINT-3117080 -4896410 +POINT-3090062 -4912915 +POINT-2932926 -5008907 +POINT-2744716 -5114483 +POINT-2716547 -5128935 +POINT-2552715 -5212988 +POINT-2357181 -5304289 +POINT-2158393 -5388258 +POINT-2128790 -5399485 +POINT-1956619 -5464781 +POINT-1752140 -5533750 +POINT-1721784 -5542747 +POINT-1545238 -5595072 +POINT-1336200 -5648660 +POINT-1305260 -5655378 +POINT-1125316 -5694443 +POINT-912876 -5732355 +POINT-881522 -5736755 +POINT-699173 -5762344 +POINT-667677 -5765576 +POINT-484504 -5784368 +POINT-452910 -5786427 +POINT-269161 -5798399 +POINT-53451 -5804415 +POINT162338 -5802410 +POINT377903 -5792385 +POINT592945 -5774353 +POINT624374 -5770537 +POINT807167 -5748342 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1441974 -5622839 +POINT1649978 -5565372 +POINT1680161 -5555813 +POINT1855701 -5500215 +POINT2058864 -5427458 +POINT2259182 -5347196 +POINT2288113 -5334337 +POINT2456375 -5259546 +POINT2484809 -5245620 +POINT2650177 -5164627 +POINT2840313 -5062568 +POINT2867633 -5046569 +POINT3026527 -4953516 +POINT3208561 -4837614 +POINT3386158 -4715029 +POINT3559074 -4585924 +POINT3583722 -4566053 +POINT3727073 -4450483 +POINT3750966 -4429709 +POINT3889923 -4308891 +POINT4047397 -4161342 +POINT4069681 -4138851 +POINT4199280 -4008045 +POINT4345356 -3849205 +POINT4485428 -3685047 +POINT4619304 -3515796 +POINT4638009 -3490251 +POINT4746792 -3341684 +POINT4764535 -3315462 +POINT4867725 -3162956 +POINT4884481 -3136092 +POINT4981930 -2979854 +POINT5089248 -2792637 +POINT5103962 -2764602 +POINT5189533 -2601556 +POINT5203194 -2572995 +POINT5282646 -2406883 +POINT5368461 -2208883 +POINT5446857 -2007829 +POINT5517723 -1804000 +POINT5527002 -1773729 +POINT5580967 -1597677 +POINT5636493 -1389148 +POINT5643498 -1358272 +POINT5684234 -1178697 +POINT5690087 -1147582 +POINT5724121 -966619 +POINT5728812 -935308 +POINT5756092 -753204 +POINT5780113 -538747 +POINT5782465 -507174 +POINT5796142 -323547 +POINT5804165 -107898 +POINT5804165 107898 +POINT5802988 139537 +POINT5796142 323545 +POINT5793791 355118 +POINT5780113 538745 +POINT5776589 570210 +POINT5756092 753202 +POINT5724121 966619 +POINT5718269 997734 +POINT5684234 1178697 +POINT5677230 1209573 +POINT5636493 1389146 +POINT5628347 1419741 +POINT5580967 1597677 +POINT5517723 1803999 +POINT5507326 1833904 +POINT5446857 2007829 +POINT5435355 2037327 +POINT5368461 2208883 +POINT5355871 2237932 +POINT5282646 2406881 +POINT5268985 2435443 +POINT5189533 2601556 +POINT5174820 2629591 +POINT5089248 2792635 +POINT5073503 2820103 +POINT4981930 2979856 +POINT4867725 3162954 +POINT4746792 3341684 +POINT4619304 3515794 +POINT4599663 3540626 +POINT4485428 3685045 +POINT4345356 3849203 +POINT4199280 4008043 +POINT4047397 4161340 +POINT4024293 4182988 +POINT3889923 4308889 +POINT3727073 4450483 +POINT3559074 4585924 +POINT3386158 4715029 +POINT3208561 4837614 +POINT3026527 4953516 +POINT2840313 5062570 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2427443 5272406 +POINT2259182 5347196 +POINT2229792 5358972 +POINT2058864 5427458 +POINT2029057 5438133 +POINT1855701 5500215 +POINT1649978 5565370 +POINT1619461 5573802 +POINT1441974 5622839 +POINT1411164 5630130 +POINT1231975 5672533 +POINT1020275 5714384 +POINT807167 5748342 +POINT775737 5752158 +POINT592945 5774351 +POINT377903 5792383 +POINT346276 5793854 +POINT162338 5802408 +POINT-53451 5804415 +POINT-269161 5798399 +POINT-484504 5784368 +POINT-515999 5781137 +POINT-699173 5762342 +POINT-912876 5732355 +POINT-1125316 5694441 +POINT-1336200 5648660 +POINT-1366869 5640798 +POINT-1545238 5595072 +POINT-1752140 5533750 +POINT-1956619 5464781 +POINT-2158393 5388258 +POINT-2357181 5304289 +POINT-2552715 5212988 +POINT-2744716 5114481 +POINT-2772330 5098992 +POINT-2932926 5008909 +POINT-2959944 4992404 +POINT-3117080 4896410 +POINT-3296924 4777147 +POINT-3322642 4758680 +POINT-3472213 4651277 +POINT-3497227 4631868 +POINT-3642700 4518984 +POINT-3808155 4380441 +POINT-3831657 4359227 +POINT-3968341 4235849 +POINT-4123047 4085397 +POINT-4272053 3929304 +POINT-4415153 3767778 +POINT-4435253 3743315 +POINT-4552150 3601041 +POINT-4571326 3575849 +POINT-4682853 3429330 +POINT-4701081 3403442 +POINT-4807087 3252882 +POINT-4924675 3071935 +POINT-4940928 3044765 +POINT-5035454 2886743 +POINT-5139274 2697561 +POINT-5153465 2669258 +POINT-5235992 2504652 +POINT-5325470 2308282 +POINT-5407589 2108720 +POINT-5482231 1906244 +POINT-5549301 1701131 +POINT-5608696 1493669 +POINT-5616273 1462928 +POINT-5660339 1284143 +POINT-5704159 1072843 +POINT-5740093 860059 +POINT-5768097 646085 +POINT-5788124 431221 +POINT-5789889 399609 +POINT-5800152 215759 +POLYGON_AT_HEIGHT18000000 +POINT-5804165 0 +POINT-5800152 -215759 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5740093 -860059 +POINT-5704159 -1072843 +POINT-5660339 -1284145 +POINT-5608696 -1493671 +POINT-5549301 -1701133 +POINT-5527809 -1766860 +POINT-5482231 -1906244 +POINT-5407589 -2108720 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5205000 -2566470 +POINT-5139274 -2697563 +POINT-5035454 -2886745 +POINT-4924675 -3071935 +POINT-4807087 -3252882 +POINT-4682853 -3429332 +POINT-4640970 -3484356 +POINT-4552150 -3601043 +POINT-4415153 -3767778 +POINT-4272053 -3929304 +POINT-4123047 -4085399 +POINT-3968341 -4235849 +POINT-3808155 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3416043 -4691613 +POINT-3296924 -4777147 +POINT-3117080 -4896410 +POINT-3058069 -4932459 +POINT-2932926 -5008907 +POINT-2744716 -5114483 +POINT-2552715 -5212988 +POINT-2357181 -5304289 +POINT-2158393 -5388258 +POINT-1956619 -5464781 +POINT-1752140 -5533750 +POINT-1545238 -5595072 +POINT-1478253 -5612244 +POINT-1336200 -5648660 +POINT-1268624 -5663331 +POINT-1125316 -5694443 +POINT-912876 -5732355 +POINT-844396 -5741965 +POINT-699173 -5762344 +POINT-630383 -5769402 +POINT-484504 -5784368 +POINT-269161 -5798399 +POINT-200038 -5800327 +POINT-53451 -5804415 +POINT162338 -5802410 +POINT377903 -5792385 +POINT446812 -5786607 +POINT592945 -5774353 +POINT661591 -5766018 +POINT807167 -5748342 +POINT1020275 -5714386 +POINT1088113 -5700974 +POINT1231975 -5672531 +POINT1441974 -5622839 +POINT1508628 -5604424 +POINT1649978 -5565372 +POINT1715901 -5544493 +POINT1855701 -5500215 +POINT2058864 -5427458 +POINT2259182 -5347196 +POINT2456375 -5259546 +POINT2518478 -5229130 +POINT2650177 -5164627 +POINT2711105 -5131923 +POINT2840313 -5062568 +POINT3026527 -4953516 +POINT3208561 -4837614 +POINT3386158 -4715029 +POINT3441568 -4673658 +POINT3559074 -4585924 +POINT3612908 -4542523 +POINT3727073 -4450483 +POINT3779257 -4405111 +POINT3889923 -4308891 +POINT4047397 -4161342 +POINT4096067 -4112219 +POINT4199280 -4008045 +POINT4345356 -3849205 +POINT4485428 -3685047 +POINT4619304 -3515796 +POINT4660157 -3460003 +POINT4746792 -3341684 +POINT4867725 -3162956 +POINT4981930 -2979854 +POINT5016320 -2919861 +POINT5089248 -2792637 +POINT5121384 -2731406 +POINT5189533 -2601556 +POINT5219371 -2539174 +POINT5282646 -2406883 +POINT5310145 -2343435 +POINT5368461 -2208883 +POINT5393583 -2144456 +POINT5446857 -2007829 +POINT5469566 -1942513 +POINT5517723 -1804000 +POINT5580967 -1597677 +POINT5636493 -1389148 +POINT5651792 -1321710 +POINT5684234 -1178697 +POINT5697016 -1110738 +POINT5724121 -966619 +POINT5734366 -898231 +POINT5756092 -753204 +POINT5780113 -538747 +POINT5796142 -323547 +POINT5798713 -254443 +POINT5804165 -107898 +POINT5804165 107898 +POINT5796142 323545 +POINT5791006 392505 +POINT5780113 538745 +POINT5756092 753202 +POINT5724121 966619 +POINT5684234 1178697 +POINT5668936 1246134 +POINT5636493 1389146 +POINT5618700 1455969 +POINT5580967 1597677 +POINT5517723 1803999 +POINT5446857 2007829 +POINT5421736 2072256 +POINT5368461 2208883 +POINT5282646 2406881 +POINT5189533 2601556 +POINT5157398 2662786 +POINT5089248 2792635 +POINT4981930 2979856 +POINT4867725 3162954 +POINT4828973 3220227 +POINT4746792 3341684 +POINT4705939 3397477 +POINT4619304 3515794 +POINT4576404 3570030 +POINT4485428 3685045 +POINT4345356 3849203 +POINT4199280 4008043 +POINT4047397 4161340 +POINT3996935 4208622 +POINT3889923 4308889 +POINT3837739 4354262 +POINT3727073 4450483 +POINT3559074 4585924 +POINT3386158 4715029 +POINT3208561 4837614 +POINT3026527 4953516 +POINT2966856 4988462 +POINT2840313 5062570 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2259182 5347196 +POINT2194991 5372916 +POINT2058864 5427458 +POINT1993762 5450773 +POINT1855701 5500215 +POINT1789778 5521094 +POINT1649978 5565370 +POINT1583324 5583786 +POINT1441974 5622839 +POINT1231975 5672533 +POINT1164137 5685944 +POINT1020275 5714384 +POINT951985 5725266 +POINT807167 5748342 +POINT592945 5774351 +POINT377903 5792383 +POINT162338 5802408 +POINT-53451 5804415 +POINT-269161 5798399 +POINT-338166 5793903 +POINT-484504 5784368 +POINT-553294 5777310 +POINT-699173 5762342 +POINT-767653 5752733 +POINT-912876 5732355 +POINT-980951 5720206 +POINT-1125316 5694441 +POINT-1192893 5679771 +POINT-1336200 5648660 +POINT-1545238 5595072 +POINT-1611539 5575422 +POINT-1752140 5533750 +POINT-1956619 5464781 +POINT-2158393 5388258 +POINT-2357181 5304289 +POINT-2552715 5212988 +POINT-2614241 5181422 +POINT-2744716 5114481 +POINT-2805027 5080651 +POINT-2932926 5008909 +POINT-3117080 4896410 +POINT-3174710 4858193 +POINT-3296924 4777147 +POINT-3353095 4736813 +POINT-3472213 4651277 +POINT-3526845 4608885 +POINT-3642700 4518984 +POINT-3695719 4474589 +POINT-3808155 4380441 +POINT-3859486 4334108 +POINT-3968341 4235849 +POINT-4123047 4085397 +POINT-4272053 3929304 +POINT-4317909 3877544 +POINT-4415153 3767778 +POINT-4459053 3714348 +POINT-4552150 3601041 +POINT-4594033 3546018 +POINT-4682853 3429330 +POINT-4807087 3252882 +POINT-4924675 3071935 +POINT-5035454 2886743 +POINT-5139274 2697561 +POINT-5170267 2635744 +POINT-5235992 2504652 +POINT-5264665 2441726 +POINT-5325470 2308282 +POINT-5407589 2108720 +POINT-5482231 1906244 +POINT-5549301 1701131 +POINT-5568334 1634651 +POINT-5608696 1493669 +POINT-5660339 1284143 +POINT-5674381 1216433 +POINT-5704159 1072843 +POINT-5715674 1004658 +POINT-5740093 860059 +POINT-5749067 791492 +POINT-5768097 646085 +POINT-5788124 431221 +POINT-5800152 215759 +POINT-5801438 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804165 0 +POINT-5800524 -195760 +POINT-5800152 -215759 +POINT-5789239 -411249 +POINT-5788124 -431221 +POINT-5768097 -646087 +POINT-5742689 -840226 +POINT-5740093 -860059 +POINT-5704159 -1072843 +POINT-5664401 -1264559 +POINT-5660339 -1284145 +POINT-5613483 -1474250 +POINT-5608696 -1493671 +POINT-5549301 -1701133 +POINT-5488448 -1887232 +POINT-5482231 -1906244 +POINT-5414508 -2089953 +POINT-5407589 -2108720 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5148239 -2679682 +POINT-5139274 -2697563 +POINT-5045077 -2869210 +POINT-5035454 -2886745 +POINT-4934943 -3054770 +POINT-4924675 -3071935 +POINT-4807087 -3252882 +POINT-4694369 -3412977 +POINT-4682853 -3429332 +POINT-4564265 -3585127 +POINT-4552150 -3601043 +POINT-4427852 -3752323 +POINT-4415153 -3767778 +POINT-4272053 -3929304 +POINT-4136858 -4070931 +POINT-4123047 -4085399 +POINT-3982681 -4221904 +POINT-3968341 -4235849 +POINT-3823003 -4367041 +POINT-3808155 -4380443 +POINT-3642700 -4518986 +POINT-3488016 -4639017 +POINT-3472213 -4651279 +POINT-3313172 -4765480 +POINT-3296924 -4777147 +POINT-3117080 -4896410 +POINT-2949995 -4998480 +POINT-2932926 -5008907 +POINT-2762162 -5104697 +POINT-2744716 -5114483 +POINT-2552715 -5212988 +POINT-2375306 -5295826 +POINT-2357181 -5304289 +POINT-2158393 -5388258 +POINT-1975322 -5457688 +POINT-1956619 -5464781 +POINT-1752140 -5533750 +POINT-1564416 -5589388 +POINT-1545238 -5595072 +POINT-1355576 -5643693 +POINT-1336200 -5648660 +POINT-1125316 -5694443 +POINT-932567 -5728841 +POINT-912876 -5732355 +POINT-699173 -5762344 +POINT-504402 -5782327 +POINT-484504 -5784368 +POINT-269161 -5798399 +POINT-53451 -5804415 +POINT142336 -5802596 +POINT162338 -5802410 +POINT377903 -5792385 +POINT592945 -5774353 +POINT807167 -5748342 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1422509 -5627445 +POINT1441974 -5622839 +POINT1630698 -5570699 +POINT1649978 -5565372 +POINT1836632 -5506255 +POINT1855701 -5500215 +POINT2058864 -5427458 +POINT2240614 -5354636 +POINT2259182 -5347196 +POINT2456375 -5259546 +POINT2650177 -5164627 +POINT2840313 -5062568 +POINT3026527 -4953516 +POINT3208561 -4837614 +POINT3386158 -4715029 +POINT3559074 -4585924 +POINT3727073 -4450483 +POINT3874828 -4322016 +POINT3889923 -4308891 +POINT4032801 -4175019 +POINT4047397 -4161342 +POINT4199280 -4008045 +POINT4345356 -3849205 +POINT4485428 -3685047 +POINT4606895 -3531484 +POINT4619304 -3515796 +POINT4734975 -3357823 +POINT4746792 -3341684 +POINT4856516 -3179522 +POINT4867725 -3162956 +POINT4981930 -2979854 +POINT5079301 -2809990 +POINT5089248 -2792637 +POINT5180238 -2619268 +POINT5189533 -2601556 +POINT5282646 -2406883 +POINT5360507 -2227236 +POINT5368461 -2208883 +POINT5439591 -2026465 +POINT5446857 -2007829 +POINT5517723 -1804000 +POINT5580967 -1597677 +POINT5636493 -1389148 +POINT5679809 -1198204 +POINT5684234 -1178697 +POINT5720424 -986277 +POINT5724121 -966619 +POINT5756092 -753204 +POINT5777887 -558626 +POINT5780113 -538747 +POINT5794657 -343494 +POINT5796142 -323547 +POINT5804165 -107898 +POINT5804165 107898 +POINT5796886 303556 +POINT5796142 323545 +POINT5781599 518798 +POINT5780113 538745 +POINT5756092 753202 +POINT5724121 966619 +POINT5684234 1178697 +POINT5640918 1369640 +POINT5636493 1389146 +POINT5586114 1578348 +POINT5580967 1597677 +POINT5517723 1803999 +POINT5453426 1988936 +POINT5446857 2007829 +POINT5375728 2190247 +POINT5368461 2208883 +POINT5282646 2406881 +POINT5198164 2583512 +POINT5189533 2601556 +POINT5098544 2774923 +POINT5089248 2792635 +POINT4981930 2979856 +POINT4867725 3162954 +POINT4746792 3341684 +POINT4631121 3499656 +POINT4619304 3515794 +POINT4485428 3685045 +POINT4345356 3849203 +POINT4199280 4008043 +POINT4061475 4147131 +POINT4047397 4161340 +POINT3904519 4295213 +POINT3889923 4308889 +POINT3742168 4437359 +POINT3727073 4450483 +POINT3574646 4573370 +POINT3559074 4585924 +POINT3402186 4703062 +POINT3386158 4715029 +POINT3208561 4837614 +POINT3043400 4942773 +POINT3026527 4953516 +POINT2857573 5052462 +POINT2840313 5062570 +POINT2650177 5164625 +POINT2456375 5259546 +POINT2277460 5339072 +POINT2259182 5347196 +POINT2058864 5427458 +POINT1855701 5500215 +POINT1669047 5559331 +POINT1649978 5565370 +POINT1441974 5622839 +POINT1251440 5667927 +POINT1231975 5672533 +POINT1039897 5710505 +POINT1020275 5714384 +POINT826920 5745195 +POINT807167 5748342 +POINT592945 5774351 +POINT397835 5790712 +POINT377903 5792383 +POINT182319 5801479 +POINT162338 5802408 +POINT-33449 5804229 +POINT-53451 5804415 +POINT-269161 5798399 +POINT-464544 5785669 +POINT-484504 5784368 +POINT-679275 5764384 +POINT-699173 5762342 +POINT-912876 5732355 +POINT-1125316 5694441 +POINT-1316653 5652904 +POINT-1336200 5648660 +POINT-1545238 5595072 +POINT-1752140 5533750 +POINT-1956619 5464781 +POINT-2139691 5395351 +POINT-2158393 5388258 +POINT-2357181 5304289 +POINT-2534591 5221451 +POINT-2552715 5212988 +POINT-2744716 5114481 +POINT-2915480 5018695 +POINT-2932926 5008909 +POINT-3117080 4896410 +POINT-3280254 4788202 +POINT-3296924 4777147 +POINT-3455966 4662944 +POINT-3472213 4651277 +POINT-3642700 4518984 +POINT-3808155 4380441 +POINT-3953493 4249252 +POINT-3968341 4235849 +POINT-4108707 4099343 +POINT-4123047 4085397 +POINT-4272053 3929304 +POINT-4401889 3782750 +POINT-4415153 3767778 +POINT-4539452 3616496 +POINT-4552150 3601041 +POINT-4670738 3445247 +POINT-4682853 3429330 +POINT-4795572 3269237 +POINT-4807087 3252882 +POINT-4924675 3071935 +POINT-5035454 2886743 +POINT-5139274 2697561 +POINT-5235992 2504652 +POINT-5325470 2308282 +POINT-5407589 2108720 +POINT-5482231 1906244 +POINT-5549301 1701131 +POINT-5608696 1493669 +POINT-5660339 1284143 +POINT-5704159 1072843 +POINT-5740093 860059 +POINT-5768097 646085 +POINT-5786268 451137 +POINT-5788124 431221 +POINT-5800152 215759 +OBJECT_ID199 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804153 0 +POINT-5800155 -215759 +POINT-5788116 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704147 -1072845 +POINT-5660339 -1284145 +POINT-5608688 -1493671 +POINT-5549301 -1701133 +POINT-5482223 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4924667 -3071937 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4552139 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085399 +POINT-3968338 -4235847 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3296920 -4777145 +POINT-3117080 -4896412 +POINT-2932922 -5008907 +POINT-2744705 -5114483 +POINT-2552703 -5212986 +POINT-2357177 -5304287 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545242 -5595073 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804416 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774353 +POINT807174 -5748340 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622837 +POINT1649978 -5565372 +POINT1855712 -5500217 +POINT2058868 -5427456 +POINT2259185 -5347198 +POINT2456375 -5259548 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585926 +POINT3727081 -4450481 +POINT3889923 -4308891 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4746795 -3341686 +POINT4867721 -3162956 +POINT4981933 -2979854 +POINT5089248 -2792637 +POINT5189544 -2601558 +POINT5282654 -2406883 +POINT5368469 -2208881 +POINT5446853 -2007827 +POINT5517730 -1804000 +POINT5580963 -1597679 +POINT5636505 -1389148 +POINT5684234 -1178699 +POINT5724121 -966617 +POINT5756103 -753204 +POINT5780121 -538745 +POINT5796142 -323547 +POINT5804168 -107898 +POINT5804168 107898 +POINT5796142 323547 +POINT5780121 538745 +POINT5756103 753204 +POINT5724121 966617 +POINT5684234 1178695 +POINT5636505 1389148 +POINT5580963 1597675 +POINT5517730 1804000 +POINT5446853 2007827 +POINT5368469 2208881 +POINT5282654 2406883 +POINT5189544 2601558 +POINT5089248 2792637 +POINT4981933 2979854 +POINT4867721 3162956 +POINT4746795 3341682 +POINT4619308 3515796 +POINT4485428 3685047 +POINT4345367 3849205 +POINT4199280 4008045 +POINT4047409 4161342 +POINT3889923 4308891 +POINT3727081 4450481 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837612 +POINT3026535 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347194 +POINT2058868 5427456 +POINT1855712 5500213 +POINT1649978 5565372 +POINT1441970 5622837 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748340 +POINT592941 5774353 +POINT377899 5792385 +POINT162338 5802410 +POINT-53451 5804413 +POINT-269165 5798397 +POINT-484497 5784366 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533748 +POINT-1956619 5464779 +POINT-2158386 5388256 +POINT-2357177 5304287 +POINT-2552703 5212986 +POINT-2744705 5114483 +POINT-2932922 5008907 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651279 +POINT-3642700 4518986 +POINT-3808151 4380443 +POINT-3968338 4235847 +POINT-4123047 4085399 +POINT-4272049 3929302 +POINT-4415146 3767776 +POINT-4552139 3601043 +POINT-4682846 3429332 +POINT-4807083 3252880 +POINT-4924667 3071937 +POINT-5035446 2886745 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482223 1906242 +POINT-5549301 1701133 +POINT-5608688 1493671 +POINT-5660339 1284145 +POINT-5704147 1072841 +POINT-5740097 860057 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804153 0 +POINT-5803567 -31655 +POINT-5800155 -215759 +POINT-5798389 -247370 +POINT-5788116 -431221 +POINT-5785179 -462745 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5734823 -891280 +POINT-5704147 -1072845 +POINT-5697720 -1103846 +POINT-5660339 -1284145 +POINT-5652761 -1314886 +POINT-5608688 -1493671 +POINT-5599975 -1524109 +POINT-5549301 -1701133 +POINT-5482223 -1906242 +POINT-5471274 -1935949 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5124035 -2725319 +POINT-5035446 -2886745 +POINT-5019193 -2913916 +POINT-4924667 -3071937 +POINT-4907416 -3098485 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4552139 -3601043 +POINT-4532040 -3625506 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085399 +POINT-4100348 -4107473 +POINT-3968338 -4235847 +POINT-3944836 -4257062 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3446495 -4669746 +POINT-3296920 -4777145 +POINT-3270535 -4794644 +POINT-3117080 -4896412 +POINT-2932922 -5008907 +POINT-2905307 -5024397 +POINT-2744705 -5114483 +POINT-2552703 -5212986 +POINT-2524017 -5226381 +POINT-2357177 -5304287 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1721781 -5542749 +POINT-1545242 -5595073 +POINT-1514572 -5602936 +POINT-1336196 -5648662 +POINT-1305257 -5655379 +POINT-1125320 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-667676 -5765576 +POINT-484497 -5784370 +POINT-452904 -5786429 +POINT-269165 -5798401 +POINT-53451 -5804416 +POINT-21791 -5804122 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774353 +POINT807174 -5748340 +POINT838440 -5743359 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622837 +POINT1472488 -5614406 +POINT1649978 -5565372 +POINT1680163 -5555813 +POINT1855712 -5500217 +POINT1885519 -5489542 +POINT2058868 -5427456 +POINT2088258 -5415681 +POINT2259185 -5347198 +POINT2456375 -5259548 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2867638 -5046568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585926 +POINT3727081 -4450481 +POINT3750972 -4429708 +POINT3889923 -4308891 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4638013 -3490251 +POINT4746795 -3341686 +POINT4867721 -3162956 +POINT4884478 -3136092 +POINT4981933 -2979854 +POINT4997678 -2952386 +POINT5089248 -2792637 +POINT5103964 -2764602 +POINT5189544 -2601558 +POINT5203205 -2572996 +POINT5282654 -2406883 +POINT5368469 -2208881 +POINT5446853 -2007827 +POINT5457252 -1977923 +POINT5517730 -1804000 +POINT5527008 -1773730 +POINT5580963 -1597679 +POINT5589112 -1567084 +POINT5636505 -1389148 +POINT5643508 -1358272 +POINT5684234 -1178699 +POINT5690087 -1147583 +POINT5724121 -966617 +POINT5756103 -753204 +POINT5759627 -721739 +POINT5780121 -538745 +POINT5796142 -323547 +POINT5797320 -291908 +POINT5804168 -107898 +POINT5804168 107898 +POINT5802991 139537 +POINT5796142 323547 +POINT5793792 355120 +POINT5780121 538745 +POINT5756103 753204 +POINT5751411 784515 +POINT5724121 966617 +POINT5718269 997732 +POINT5684234 1178695 +POINT5677232 1209572 +POINT5636505 1389148 +POINT5628356 1419743 +POINT5580963 1597675 +POINT5571686 1627946 +POINT5517730 1804000 +POINT5507332 1833905 +POINT5446853 2007827 +POINT5435353 2037325 +POINT5368469 2208881 +POINT5355879 2237931 +POINT5282654 2406883 +POINT5189544 2601558 +POINT5174829 2629593 +POINT5089248 2792637 +POINT5073504 2820104 +POINT4981933 2979854 +POINT4965177 3006718 +POINT4867721 3162956 +POINT4849980 3189178 +POINT4746795 3341682 +POINT4728091 3367227 +POINT4619308 3515796 +POINT4599666 3540628 +POINT4485428 3685047 +POINT4345367 3849205 +POINT4199280 4008045 +POINT4047409 4161342 +POINT3889923 4308891 +POINT3727081 4450481 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3360098 4733012 +POINT3208557 4837612 +POINT3026535 4953514 +POINT2999214 4969514 +POINT2840316 5062568 +POINT2812420 5077542 +POINT2650177 5164627 +POINT2621743 5178553 +POINT2456375 5259544 +POINT2427444 5272404 +POINT2259185 5347194 +POINT2229796 5358970 +POINT2058868 5427456 +POINT2029062 5438131 +POINT1855712 5500213 +POINT1825528 5509773 +POINT1649978 5565372 +POINT1441970 5622837 +POINT1411161 5630128 +POINT1231979 5672531 +POINT1200919 5678672 +POINT1020278 5714386 +POINT807174 5748340 +POINT775743 5752157 +POINT592941 5774353 +POINT377899 5792385 +POINT346272 5793856 +POINT162338 5802410 +POINT130678 5802704 +POINT-53451 5804413 +POINT-269165 5798397 +POINT-484497 5784366 +POINT-699173 5762344 +POINT-730526 5757944 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533748 +POINT-1956619 5464779 +POINT-2158386 5388256 +POINT-2357177 5304287 +POINT-2552703 5212986 +POINT-2580873 5198534 +POINT-2744705 5114483 +POINT-2932922 5008907 +POINT-2959941 4992402 +POINT-3117080 4896408 +POINT-3143466 4878910 +POINT-3296920 4777145 +POINT-3322639 4758679 +POINT-3472213 4651279 +POINT-3497227 4631870 +POINT-3642700 4518986 +POINT-3808151 4380443 +POINT-3831653 4359229 +POINT-3968338 4235847 +POINT-4123047 4085399 +POINT-4272049 3929302 +POINT-4415146 3767776 +POINT-4435245 3743314 +POINT-4552139 3601043 +POINT-4571316 3575851 +POINT-4682846 3429332 +POINT-4807083 3252880 +POINT-4924667 3071937 +POINT-4940920 3044767 +POINT-5035446 2886745 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5249120 2475843 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482223 1906242 +POINT-5492065 1876149 +POINT-5549301 1701133 +POINT-5608688 1493671 +POINT-5660339 1284145 +POINT-5704147 1072841 +POINT-5740097 860057 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5800155 215759 +POINT-5800742 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804153 0 +POINT-5802872 -69138 +POINT-5800155 -215759 +POINT-5788116 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5728577 -928247 +POINT-5704147 -1072845 +POINT-5690109 -1140555 +POINT-5660339 -1284145 +POINT-5643788 -1351286 +POINT-5608688 -1493671 +POINT-5589658 -1560151 +POINT-5549301 -1701133 +POINT-5482223 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4924667 -3071937 +POINT-4886988 -3129921 +POINT-4807083 -3252884 +POINT-4767272 -3309426 +POINT-4682846 -3429332 +POINT-4552139 -3601043 +POINT-4415146 -3767776 +POINT-4369291 -3819538 +POINT-4272049 -3929306 +POINT-4123047 -4085399 +POINT-3968338 -4235847 +POINT-3917007 -4282182 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3472213 -4651279 +POINT-3416042 -4691612 +POINT-3296920 -4777145 +POINT-3239292 -4815364 +POINT-3117080 -4896412 +POINT-2932922 -5008907 +POINT-2744705 -5114483 +POINT-2552703 -5212986 +POINT-2490048 -5242243 +POINT-2357177 -5304287 +POINT-2293476 -5331196 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1685838 -5553402 +POINT-1545242 -5595073 +POINT-1478254 -5612246 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732353 +POINT-844393 -5741964 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804416 +POINT15697 -5803774 +POINT162338 -5802410 +POINT377899 -5792385 +POINT446808 -5786607 +POINT592941 -5774353 +POINT807174 -5748340 +POINT875462 -5737460 +POINT1020278 -5714386 +POINT1088117 -5700974 +POINT1231979 -5672531 +POINT1299270 -5656607 +POINT1441970 -5622837 +POINT1508625 -5604423 +POINT1649978 -5565372 +POINT1855712 -5500217 +POINT1920813 -5476901 +POINT2058868 -5427456 +POINT2259185 -5347198 +POINT2322374 -5319111 +POINT2456375 -5259548 +POINT2518478 -5229131 +POINT2650177 -5164627 +POINT2711106 -5131923 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585926 +POINT3727081 -4450481 +POINT3889923 -4308891 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515796 +POINT4660161 -3460003 +POINT4746795 -3341686 +POINT4785546 -3284413 +POINT4867721 -3162956 +POINT4904320 -3104282 +POINT4981933 -2979854 +POINT5016322 -2919861 +POINT5089248 -2792637 +POINT5121388 -2731407 +POINT5189544 -2601558 +POINT5219381 -2539176 +POINT5282654 -2406883 +POINT5368469 -2208881 +POINT5393587 -2144454 +POINT5446853 -2007827 +POINT5469566 -1942512 +POINT5517730 -1804000 +POINT5537993 -1737886 +POINT5580963 -1597679 +POINT5636505 -1389148 +POINT5684234 -1178699 +POINT5697016 -1110739 +POINT5724121 -966617 +POINT5734370 -898230 +POINT5756103 -753204 +POINT5780121 -538745 +POINT5785255 -469786 +POINT5796142 -323547 +POINT5798714 -254443 +POINT5804168 -107898 +POINT5804168 107898 +POINT5796142 323547 +POINT5780121 538745 +POINT5756103 753204 +POINT5745855 821591 +POINT5724121 966617 +POINT5684234 1178695 +POINT5668940 1246134 +POINT5636505 1389148 +POINT5618707 1455969 +POINT5580963 1597675 +POINT5517730 1804000 +POINT5495018 1869316 +POINT5446853 2007827 +POINT5421736 2072254 +POINT5368469 2208881 +POINT5340970 2272330 +POINT5282654 2406883 +POINT5189544 2601558 +POINT5157405 2662788 +POINT5089248 2792637 +POINT5054860 2852629 +POINT4981933 2979854 +POINT4945335 3038528 +POINT4867721 3162956 +POINT4828971 3220228 +POINT4746795 3341682 +POINT4705943 3397476 +POINT4619308 3515796 +POINT4576407 3570032 +POINT4485428 3685047 +POINT4345367 3849205 +POINT4199280 4008045 +POINT4047409 4161342 +POINT3996943 4208624 +POINT3889923 4308891 +POINT3837741 4354263 +POINT3727081 4450481 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837612 +POINT3026535 4953514 +POINT2966862 4988460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347194 +POINT2194995 5372914 +POINT2058868 5427456 +POINT1993768 5450771 +POINT1855712 5500213 +POINT1789786 5521093 +POINT1649978 5565372 +POINT1441970 5622837 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748340 +POINT738524 5756676 +POINT592941 5774353 +POINT377899 5792385 +POINT162338 5802410 +POINT93189 5803052 +POINT-53451 5804413 +POINT-269165 5798397 +POINT-338167 5793901 +POINT-484497 5784366 +POINT-553288 5777310 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-980950 5720205 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1611540 5575420 +POINT-1752136 5533748 +POINT-1956619 5464779 +POINT-2158386 5388256 +POINT-2357177 5304287 +POINT-2419833 5275030 +POINT-2552703 5212986 +POINT-2744705 5114483 +POINT-2805018 5080652 +POINT-2932922 5008907 +POINT-2991935 4972857 +POINT-3117080 4896408 +POINT-3174709 4858191 +POINT-3296920 4777145 +POINT-3353092 4736812 +POINT-3472213 4651279 +POINT-3642700 4518986 +POINT-3695718 4474591 +POINT-3808151 4380443 +POINT-3968338 4235847 +POINT-4123047 4085399 +POINT-4170794 4035379 +POINT-4272049 3929302 +POINT-4415146 3767776 +POINT-4552139 3601043 +POINT-4682846 3429332 +POINT-4807083 3252880 +POINT-4924667 3071937 +POINT-4960166 3012593 +POINT-5035446 2886745 +POINT-5068715 2826123 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5264665 2441727 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482223 1906242 +POINT-5503718 1840516 +POINT-5549301 1701133 +POINT-5608688 1493671 +POINT-5625240 1426529 +POINT-5660339 1284145 +POINT-5674377 1216434 +POINT-5704147 1072841 +POINT-5715667 1004656 +POINT-5740097 860057 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5791974 362177 +POINT-5800155 215759 +POINT-5801437 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804153 0 +POINT-5800526 -195760 +POINT-5800155 -215759 +POINT-5789232 -411249 +POINT-5788116 -431221 +POINT-5769953 -626171 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704147 -1072845 +POINT-5664400 -1264559 +POINT-5660339 -1284145 +POINT-5613476 -1474250 +POINT-5608688 -1493671 +POINT-5554806 -1681903 +POINT-5549301 -1701133 +POINT-5488441 -1887230 +POINT-5482223 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139267 -2697563 +POINT-5035446 -2886745 +POINT-4934935 -3054772 +POINT-4924667 -3071937 +POINT-4817982 -3236112 +POINT-4807083 -3252884 +POINT-4682846 -3429332 +POINT-4564255 -3585127 +POINT-4552139 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4136858 -4070931 +POINT-4123047 -4085399 +POINT-3982678 -4221902 +POINT-3968338 -4235847 +POINT-3808151 -4380443 +POINT-3642700 -4518986 +POINT-3488016 -4639017 +POINT-3472213 -4651279 +POINT-3313169 -4765478 +POINT-3296920 -4777145 +POINT-3133750 -4885357 +POINT-3117080 -4896412 +POINT-2949992 -4998480 +POINT-2932922 -5008907 +POINT-2744705 -5114483 +POINT-2552703 -5212986 +POINT-2375301 -5295824 +POINT-2357177 -5304287 +POINT-2158386 -5388260 +POINT-1975321 -5457690 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1564419 -5589390 +POINT-1545242 -5595073 +POINT-1355573 -5643695 +POINT-1336196 -5648662 +POINT-1125320 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-73446 -5803859 +POINT-53451 -5804416 +POINT142336 -5802596 +POINT162338 -5802410 +POINT377899 -5792385 +POINT592941 -5774353 +POINT807174 -5748340 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622837 +POINT1630698 -5570699 +POINT1649978 -5565372 +POINT1855712 -5500217 +POINT2058868 -5427456 +POINT2240618 -5354637 +POINT2259185 -5347198 +POINT2456375 -5259548 +POINT2650177 -5164627 +POINT2822692 -5072028 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543053 -4597893 +POINT3559082 -4585926 +POINT3711509 -4463036 +POINT3727081 -4450481 +POINT3889923 -4308891 +POINT4032811 -4175019 +POINT4047409 -4161342 +POINT4199280 -4008045 +POINT4345367 -3849205 +POINT4485428 -3685047 +POINT4606899 -3531484 +POINT4619308 -3515796 +POINT4746795 -3341686 +POINT4856513 -3179523 +POINT4867721 -3162956 +POINT4971347 -2996826 +POINT4981933 -2979854 +POINT5089248 -2792637 +POINT5180248 -2619269 +POINT5189544 -2601558 +POINT5282654 -2406883 +POINT5360515 -2227234 +POINT5368469 -2208881 +POINT5439588 -2026463 +POINT5446853 -2007827 +POINT5511161 -1822893 +POINT5517730 -1804000 +POINT5575102 -1616803 +POINT5580963 -1597679 +POINT5636505 -1389148 +POINT5679810 -1198206 +POINT5684234 -1178699 +POINT5720424 -986275 +POINT5724121 -966617 +POINT5753139 -772985 +POINT5756103 -753204 +POINT5780121 -538745 +POINT5794657 -343494 +POINT5796142 -323547 +POINT5803425 -127887 +POINT5804168 -107898 +POINT5804168 107898 +POINT5796886 303558 +POINT5796142 323547 +POINT5780121 538745 +POINT5758330 733325 +POINT5756103 753204 +POINT5724121 966617 +POINT5684234 1178695 +POINT5636505 1389148 +POINT5580963 1597675 +POINT5523592 1784876 +POINT5517730 1804000 +POINT5453423 1988934 +POINT5446853 2007827 +POINT5375735 2190245 +POINT5368469 2208881 +POINT5282654 2406883 +POINT5198175 2583514 +POINT5189544 2601558 +POINT5098545 2774925 +POINT5089248 2792637 +POINT4991881 2962501 +POINT4981933 2979854 +POINT4878308 3145984 +POINT4867721 3162956 +POINT4758004 3325116 +POINT4746795 3341682 +POINT4631125 3499658 +POINT4619308 3515796 +POINT4485428 3685047 +POINT4358350 3833989 +POINT4345367 3849205 +POINT4212821 3993322 +POINT4199280 4008045 +POINT4061486 4147133 +POINT4047409 4161342 +POINT3889923 4308891 +POINT3742175 4437357 +POINT3727081 4450481 +POINT3574654 4573368 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837612 +POINT3043407 4942771 +POINT3026535 4953514 +POINT2857577 5052460 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2277463 5339070 +POINT2259185 5347194 +POINT2058868 5427456 +POINT1874543 5493469 +POINT1855712 5500213 +POINT1669048 5559333 +POINT1649978 5565372 +POINT1461251 5617511 +POINT1441970 5622837 +POINT1251443 5667925 +POINT1231979 5672531 +POINT1020278 5714386 +POINT826927 5745193 +POINT807174 5748340 +POINT612798 5771942 +POINT592941 5774353 +POINT397831 5790714 +POINT377899 5792385 +POINT182318 5801481 +POINT162338 5802410 +POINT-53451 5804413 +POINT-269165 5798397 +POINT-464537 5785667 +POINT-484497 5784366 +POINT-699173 5762344 +POINT-893064 5735133 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1732959 5539432 +POINT-1752136 5533748 +POINT-1937665 5471172 +POINT-1956619 5464779 +POINT-2139684 5395349 +POINT-2158386 5388256 +POINT-2357177 5304287 +POINT-2534580 5221449 +POINT-2552703 5212986 +POINT-2744705 5114483 +POINT-2915476 5018693 +POINT-2932922 5008907 +POINT-3117080 4896408 +POINT-3280251 4788200 +POINT-3296920 4777145 +POINT-3455965 4662946 +POINT-3472213 4651279 +POINT-3642700 4518986 +POINT-3792815 4393285 +POINT-3808151 4380443 +POINT-3953490 4249250 +POINT-3968338 4235847 +POINT-4123047 4085399 +POINT-4258238 3943771 +POINT-4272049 3929302 +POINT-4415146 3767776 +POINT-4539441 3616498 +POINT-4552139 3601043 +POINT-4682846 3429332 +POINT-4807083 3252880 +POINT-4913768 3088709 +POINT-4924667 3071937 +POINT-5025178 2903911 +POINT-5035446 2886745 +POINT-5129644 2715098 +POINT-5139267 2697563 +POINT-5227027 2522534 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5475306 1925010 +POINT-5482223 1906242 +POINT-5549301 1701133 +POINT-5603184 1512901 +POINT-5608688 1493671 +POINT-5655552 1303566 +POINT-5660339 1284145 +POINT-5704147 1072841 +POINT-5736765 879781 +POINT-5740097 860057 +POINT-5768097 646087 +POINT-5788116 431221 +POINT-5799040 235730 +POINT-5800155 215759 +POINT-5803783 19998 +OBJECT_ID210 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804165 0 +POINT-5800153 -215759 +POINT-5788126 -431228 +POINT-5768097 -646087 +POINT-5740095 -860061 +POINT-5704160 -1072845 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5549301 -1701126 +POINT-5482233 -1906250 +POINT-5407591 -2108719 +POINT-5325472 -2308288 +POINT-5235992 -2504654 +POINT-5139274 -2697570 +POINT-5035455 -2886749 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4682855 -3429336 +POINT-4552150 -3601043 +POINT-4415153 -3767776 +POINT-4272053 -3929306 +POINT-4123048 -4085403 +POINT-3968343 -4235855 +POINT-3808155 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-2932926 -5008911 +POINT-2744716 -5114486 +POINT-2552715 -5212982 +POINT-2357181 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1752140 -5533752 +POINT-1545238 -5595077 +POINT-1336204 -5648666 +POINT-1125316 -5694443 +POINT-912876 -5732361 +POINT-699173 -5762344 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592945 -5774353 +POINT807167 -5748337 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855701 -5500213 +POINT2058864 -5427459 +POINT2259178 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840313 -5062576 +POINT3026527 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308899 +POINT4047397 -4161346 +POINT4199276 -4008041 +POINT4345356 -3849212 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746792 -3341690 +POINT4867725 -3162964 +POINT4981926 -2979858 +POINT5089245 -2792633 +POINT5189533 -2601562 +POINT5282646 -2406891 +POINT5368458 -2208877 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597671 +POINT5636493 -1389144 +POINT5684234 -1178695 +POINT5724117 -966613 +POINT5756092 -753204 +POINT5780109 -538742 +POINT5796142 -323547 +POINT5804165 -107894 +POINT5804165 107894 +POINT5796142 323547 +POINT5780109 538742 +POINT5756092 753204 +POINT5724117 966613 +POINT5684234 1178695 +POINT5636493 1389144 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368458 2208877 +POINT5282646 2406875 +POINT5189533 2601562 +POINT5089245 2792633 +POINT4981926 2979858 +POINT4867725 3162948 +POINT4746792 3341690 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345356 3849197 +POINT4199276 4008041 +POINT4047397 4161346 +POINT3889923 4308883 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953506 +POINT2840313 5062561 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2058864 5427459 +POINT1855701 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231975 5672531 +POINT1020275 5714386 +POINT807167 5748337 +POINT592945 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-912876 5732361 +POINT-1125316 5694443 +POINT-1336204 5648666 +POINT-1545238 5595077 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357181 5304291 +POINT-2552715 5212982 +POINT-2744716 5114486 +POINT-2932926 5008911 +POINT-3117080 4896408 +POINT-3296924 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808155 4380447 +POINT-3968343 4235855 +POINT-4123048 4085403 +POINT-4272053 3929306 +POINT-4415153 3767776 +POINT-4552150 3601043 +POINT-4682855 3429336 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5035455 2886749 +POINT-5139274 2697555 +POINT-5235992 2504654 +POINT-5325472 2308273 +POINT-5407591 2108719 +POINT-5482233 1906250 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5704160 1072845 +POINT-5740095 860061 +POINT-5768097 646087 +POINT-5788126 431213 +POINT-5800153 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804165 0 +POINT-5800153 -215759 +POINT-5798389 -247372 +POINT-5788126 -431228 +POINT-5768097 -646087 +POINT-5740095 -860061 +POINT-5734823 -891280 +POINT-5704160 -1072845 +POINT-5697731 -1103847 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5599982 -1524105 +POINT-5549301 -1701126 +POINT-5482233 -1906250 +POINT-5471282 -1935955 +POINT-5407591 -2108719 +POINT-5325472 -2308288 +POINT-5235992 -2504654 +POINT-5221802 -2532958 +POINT-5139274 -2697570 +POINT-5124042 -2725326 +POINT-5035455 -2886749 +POINT-5019202 -2913918 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4682855 -3429336 +POINT-4663679 -3454528 +POINT-4552150 -3601043 +POINT-4532051 -3625506 +POINT-4415153 -3767776 +POINT-4394158 -3791475 +POINT-4272053 -3929306 +POINT-4123048 -4085403 +POINT-3968343 -4235855 +POINT-3944841 -4257069 +POINT-3808155 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3446496 -4669742 +POINT-3296924 -4777145 +POINT-3270538 -4794643 +POINT-3117080 -4896408 +POINT-3090062 -4912914 +POINT-2932926 -5008911 +POINT-2744716 -5114486 +POINT-2716547 -5128937 +POINT-2552715 -5212982 +POINT-2357181 -5304291 +POINT-2158393 -5388260 +POINT-2128790 -5399487 +POINT-1956619 -5464782 +POINT-1752140 -5533752 +POINT-1721784 -5542750 +POINT-1545238 -5595077 +POINT-1514569 -5602940 +POINT-1336204 -5648666 +POINT-1125316 -5694443 +POINT-912876 -5732361 +POINT-699173 -5762344 +POINT-667677 -5765575 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT409449 -5789743 +POINT592945 -5774353 +POINT807167 -5748337 +POINT838433 -5743356 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1262785 -5665240 +POINT1441970 -5622833 +POINT1472488 -5614402 +POINT1649978 -5565368 +POINT1680161 -5555809 +POINT1855701 -5500213 +POINT1885508 -5489539 +POINT2058864 -5427459 +POINT2088253 -5415684 +POINT2259178 -5347198 +POINT2288110 -5334339 +POINT2456375 -5259552 +POINT2484809 -5245625 +POINT2650177 -5164627 +POINT2840313 -5062576 +POINT3026527 -4953521 +POINT3053234 -4936516 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3750966 -4429712 +POINT3889923 -4308899 +POINT4047397 -4161346 +POINT4069680 -4138854 +POINT4199276 -4008041 +POINT4345356 -3849212 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746792 -3341690 +POINT4764535 -3315468 +POINT4867725 -3162964 +POINT4981926 -2979858 +POINT5089245 -2792633 +POINT5189533 -2601562 +POINT5203194 -2573001 +POINT5282646 -2406891 +POINT5368458 -2208877 +POINT5446853 -2007827 +POINT5457251 -1977923 +POINT5517723 -1804000 +POINT5580963 -1597671 +POINT5636493 -1389144 +POINT5643498 -1358268 +POINT5684234 -1178695 +POINT5690086 -1147579 +POINT5724117 -966613 +POINT5756092 -753204 +POINT5759616 -721739 +POINT5780109 -538742 +POINT5796142 -323547 +POINT5804165 -107894 +POINT5804165 107894 +POINT5802988 139534 +POINT5796142 323547 +POINT5793790 355119 +POINT5780109 538742 +POINT5756092 753204 +POINT5751401 784514 +POINT5724117 966613 +POINT5718266 997729 +POINT5684234 1178695 +POINT5677230 1209572 +POINT5636493 1389144 +POINT5628346 1419739 +POINT5580963 1597671 +POINT5571685 1627943 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5435352 2037324 +POINT5368458 2208877 +POINT5355868 2237927 +POINT5282646 2406875 +POINT5268985 2435439 +POINT5189533 2601562 +POINT5089245 2792633 +POINT4981926 2979858 +POINT4867725 3162948 +POINT4746792 3341690 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345356 3849197 +POINT4199276 4008041 +POINT4047397 4161346 +POINT3889923 4308883 +POINT3866030 4329659 +POINT3727073 4450485 +POINT3702425 4470356 +POINT3559074 4585922 +POINT3533704 4604864 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953506 +POINT2999206 4969507 +POINT2840313 5062561 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2229789 5358974 +POINT2058864 5427459 +POINT1855701 5500213 +POINT1825518 5509773 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231975 5672531 +POINT1200915 5678672 +POINT1020275 5714386 +POINT807167 5748337 +POINT775737 5752154 +POINT592945 5774353 +POINT377899 5792389 +POINT346272 5793860 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-912876 5732361 +POINT-1125316 5694443 +POINT-1336204 5648666 +POINT-1366873 5640804 +POINT-1545238 5595077 +POINT-1575594 5586080 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357181 5304291 +POINT-2552715 5212982 +POINT-2580885 5198531 +POINT-2744716 5114486 +POINT-2772330 5098997 +POINT-2932926 5008911 +POINT-3117080 4896408 +POINT-3296924 4777145 +POINT-3322642 4758678 +POINT-3472213 4651275 +POINT-3497227 4631866 +POINT-3642700 4518982 +POINT-3666975 4498657 +POINT-3808155 4380447 +POINT-3968343 4235855 +POINT-3991041 4213781 +POINT-4123048 4085403 +POINT-4272053 3929306 +POINT-4415153 3767776 +POINT-4435253 3743314 +POINT-4552150 3601043 +POINT-4571327 3575851 +POINT-4682855 3429336 +POINT-4701082 3403448 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5035455 2886749 +POINT-5050688 2858991 +POINT-5139274 2697555 +POINT-5153465 2669253 +POINT-5235992 2504654 +POINT-5325472 2308273 +POINT-5407591 2108719 +POINT-5482233 1906250 +POINT-5492073 1876155 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5616273 1462928 +POINT-5660339 1284149 +POINT-5704160 1072845 +POINT-5709433 1041626 +POINT-5740095 860061 +POINT-5768097 646087 +POINT-5788126 431213 +POINT-5789891 399602 +POINT-5800153 215759 +POINT-5800742 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804165 0 +POINT-5800153 -215759 +POINT-5788126 -431228 +POINT-5781708 -500079 +POINT-5768097 -646087 +POINT-5759124 -714654 +POINT-5740095 -860061 +POINT-5728580 -928247 +POINT-5704160 -1072845 +POINT-5690118 -1140556 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5549301 -1701126 +POINT-5482233 -1906250 +POINT-5407591 -2108719 +POINT-5325472 -2308288 +POINT-5235992 -2504654 +POINT-5205000 -2566473 +POINT-5139274 -2697570 +POINT-5106006 -2758192 +POINT-5035455 -2886749 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4682855 -3429336 +POINT-4640972 -3484359 +POINT-4552150 -3601043 +POINT-4508250 -3654472 +POINT-4415153 -3767776 +POINT-4369297 -3819538 +POINT-4272053 -3929306 +POINT-4123048 -4085403 +POINT-4073474 -4133615 +POINT-3968343 -4235855 +POINT-3917012 -4282189 +POINT-3808155 -4380447 +POINT-3755136 -4424840 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3416043 -4691610 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-3058069 -4932459 +POINT-2932926 -5008911 +POINT-2744716 -5114486 +POINT-2683190 -5146049 +POINT-2552715 -5212982 +POINT-2357181 -5304291 +POINT-2158393 -5388260 +POINT-2093736 -5412781 +POINT-1956619 -5464782 +POINT-1891095 -5486883 +POINT-1752140 -5533752 +POINT-1685839 -5553404 +POINT-1545238 -5595077 +POINT-1478254 -5612250 +POINT-1336204 -5648666 +POINT-1125316 -5694443 +POINT-912876 -5732361 +POINT-844396 -5741969 +POINT-699173 -5762344 +POINT-630383 -5769400 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592945 -5774353 +POINT807167 -5748337 +POINT1020275 -5714386 +POINT1088113 -5700974 +POINT1231975 -5672531 +POINT1441970 -5622833 +POINT1508625 -5604419 +POINT1649978 -5565368 +POINT1715901 -5544490 +POINT1855701 -5500213 +POINT1920804 -5476900 +POINT2058864 -5427459 +POINT2123054 -5401740 +POINT2259178 -5347198 +POINT2322368 -5319113 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840313 -5062576 +POINT3026527 -4953521 +POINT3084858 -4916380 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308899 +POINT4047397 -4161346 +POINT4199276 -4008041 +POINT4345356 -3849212 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4660155 -3460002 +POINT4746792 -3341690 +POINT4867725 -3162964 +POINT4981926 -2979858 +POINT5016316 -2919863 +POINT5089245 -2792633 +POINT5121382 -2731405 +POINT5189533 -2601562 +POINT5219371 -2539181 +POINT5282646 -2406891 +POINT5368458 -2208877 +POINT5446853 -2007827 +POINT5469563 -1942512 +POINT5517723 -1804000 +POINT5537988 -1737883 +POINT5580963 -1597671 +POINT5598758 -1530850 +POINT5636493 -1389144 +POINT5651792 -1321707 +POINT5684234 -1178695 +POINT5697015 -1110735 +POINT5724117 -966613 +POINT5756092 -753204 +POINT5780109 -538742 +POINT5785247 -469784 +POINT5796142 -323547 +POINT5798713 -254442 +POINT5804165 -107894 +POINT5804165 107894 +POINT5796142 323547 +POINT5780109 538742 +POINT5772413 607465 +POINT5756092 753204 +POINT5745846 821590 +POINT5724117 966613 +POINT5711337 1034574 +POINT5684234 1178695 +POINT5668936 1246133 +POINT5636493 1389144 +POINT5618699 1455966 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5495013 1869316 +POINT5446853 2007827 +POINT5421732 2072253 +POINT5368458 2208877 +POINT5340960 2272325 +POINT5282646 2406875 +POINT5189533 2601562 +POINT5089245 2792633 +POINT4981926 2979858 +POINT4867725 3162948 +POINT4828973 3220225 +POINT4746792 3341690 +POINT4619301 3515792 +POINT4576402 3570028 +POINT4485428 3685043 +POINT4345356 3849197 +POINT4199276 4008041 +POINT4150607 4057167 +POINT4047397 4161346 +POINT3996935 4208624 +POINT3889923 4308883 +POINT3837739 4354259 +POINT3727073 4450485 +POINT3673239 4493885 +POINT3559074 4585922 +POINT3503663 4627293 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953506 +POINT2966856 4988452 +POINT2840313 5062561 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2058864 5427459 +POINT1993762 5450773 +POINT1855701 5500213 +POINT1789778 5521092 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231975 5672531 +POINT1020275 5714386 +POINT807167 5748337 +POINT592945 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-912876 5732361 +POINT-1125316 5694443 +POINT-1192894 5679774 +POINT-1336204 5648666 +POINT-1403188 5631494 +POINT-1545238 5595077 +POINT-1611539 5575426 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2021277 5440261 +POINT-2158393 5388260 +POINT-2357181 5304291 +POINT-2552715 5212982 +POINT-2614241 5181420 +POINT-2744716 5114486 +POINT-2805027 5080655 +POINT-2932926 5008911 +POINT-3117080 4896408 +POINT-3174710 4858191 +POINT-3296924 4777145 +POINT-3353095 4736811 +POINT-3472213 4651275 +POINT-3526845 4608883 +POINT-3642700 4518982 +POINT-3808155 4380447 +POINT-3968343 4235855 +POINT-4017918 4187643 +POINT-4123048 4085403 +POINT-4272053 3929306 +POINT-4317909 3877545 +POINT-4415153 3767776 +POINT-4552150 3601043 +POINT-4594034 3546021 +POINT-4682855 3429336 +POINT-4722665 3372793 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5035455 2886749 +POINT-5139274 2697555 +POINT-5170267 2635741 +POINT-5235992 2504654 +POINT-5325472 2308273 +POINT-5407591 2108719 +POINT-5482233 1906250 +POINT-5549301 1701126 +POINT-5568334 1634647 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5704160 1072845 +POINT-5715676 1004660 +POINT-5740095 860061 +POINT-5768097 646087 +POINT-5788126 431213 +POINT-5791980 362172 +POINT-5800153 215759 +POINT-5801439 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804165 0 +POINT-5800525 -195760 +POINT-5800153 -215759 +POINT-5789241 -411256 +POINT-5788126 -431228 +POINT-5768097 -646087 +POINT-5740095 -860061 +POINT-5707491 -1053122 +POINT-5704160 -1072845 +POINT-5664401 -1264563 +POINT-5660339 -1284149 +POINT-5613483 -1474247 +POINT-5608696 -1493667 +POINT-5549301 -1701126 +POINT-5482233 -1906250 +POINT-5414510 -2089951 +POINT-5407591 -2108719 +POINT-5325472 -2308288 +POINT-5235992 -2504654 +POINT-5148239 -2679689 +POINT-5139274 -2697570 +POINT-5045079 -2869214 +POINT-5035455 -2886749 +POINT-4924675 -3071930 +POINT-4807087 -3252884 +POINT-4694371 -3412981 +POINT-4682855 -3429336 +POINT-4564265 -3585128 +POINT-4552150 -3601043 +POINT-4427852 -3752321 +POINT-4415153 -3767776 +POINT-4272053 -3929306 +POINT-4136860 -4070934 +POINT-4123048 -4085403 +POINT-3968343 -4235855 +POINT-3823003 -4367045 +POINT-3808155 -4380447 +POINT-3642700 -4518982 +POINT-3488016 -4639013 +POINT-3472213 -4651275 +POINT-3313172 -4765478 +POINT-3296924 -4777145 +POINT-3117080 -4896408 +POINT-2932926 -5008911 +POINT-2762162 -5104700 +POINT-2744716 -5114486 +POINT-2552715 -5212982 +POINT-2357181 -5304291 +POINT-2158393 -5388260 +POINT-1975322 -5457690 +POINT-1956619 -5464782 +POINT-1752140 -5533752 +POINT-1564416 -5589393 +POINT-1545238 -5595077 +POINT-1355580 -5643699 +POINT-1336204 -5648666 +POINT-1144864 -5690200 +POINT-1125316 -5694443 +POINT-912876 -5732361 +POINT-718981 -5759565 +POINT-699173 -5762344 +POINT-484504 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT573012 -5776025 +POINT592945 -5774353 +POINT807167 -5748337 +POINT1020275 -5714386 +POINT1231975 -5672531 +POINT1422506 -5627440 +POINT1441970 -5622833 +POINT1630698 -5570695 +POINT1649978 -5565368 +POINT1836632 -5506253 +POINT1855701 -5500213 +POINT2040033 -5434203 +POINT2058864 -5427459 +POINT2240610 -5354638 +POINT2259178 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840313 -5062576 +POINT3009266 -4963630 +POINT3026527 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543046 -4597889 +POINT3559074 -4585922 +POINT3711501 -4463039 +POINT3727073 -4450485 +POINT3874828 -4322023 +POINT3889923 -4308899 +POINT4032801 -4175023 +POINT4047397 -4161346 +POINT4199276 -4008041 +POINT4345356 -3849212 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746792 -3341690 +POINT4856516 -3179530 +POINT4867725 -3162964 +POINT4981926 -2979858 +POINT5089245 -2792633 +POINT5180237 -2619273 +POINT5189533 -2601562 +POINT5282646 -2406891 +POINT5368458 -2208877 +POINT5439587 -2026463 +POINT5446853 -2007827 +POINT5511154 -1822893 +POINT5517723 -1804000 +POINT5580963 -1597671 +POINT5631346 -1408473 +POINT5636493 -1389144 +POINT5679809 -1198202 +POINT5684234 -1178695 +POINT5724117 -966613 +POINT5756092 -753204 +POINT5777883 -558620 +POINT5780109 -538742 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5804165 -107894 +POINT5804165 107894 +POINT5796886 303558 +POINT5796142 323547 +POINT5780109 538742 +POINT5756092 753204 +POINT5727081 946832 +POINT5724117 966613 +POINT5687931 1159037 +POINT5684234 1178695 +POINT5640918 1369638 +POINT5636493 1389144 +POINT5580963 1597671 +POINT5523585 1784876 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368458 2208877 +POINT5282646 2406875 +POINT5198164 2583516 +POINT5189533 2601562 +POINT5089245 2792633 +POINT4981926 2979858 +POINT4867725 3162948 +POINT4746792 3341690 +POINT4631118 3499655 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345356 3849197 +POINT4199276 4008041 +POINT4061475 4147136 +POINT4047397 4161346 +POINT3889923 4308883 +POINT3742168 4437360 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3043400 4942764 +POINT3026527 4953506 +POINT2840313 5062561 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2077431 5420020 +POINT2058864 5427459 +POINT1874532 5493470 +POINT1855701 5500213 +POINT1669047 5559329 +POINT1649978 5565368 +POINT1461251 5617507 +POINT1441970 5622833 +POINT1231975 5672531 +POINT1020275 5714386 +POINT807167 5748337 +POINT592945 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-679275 5764385 +POINT-699173 5762344 +POINT-912876 5732361 +POINT-1125316 5694443 +POINT-1336204 5648666 +POINT-1545238 5595077 +POINT-1732962 5539437 +POINT-1752140 5533752 +POINT-1956619 5464782 +POINT-2139691 5395353 +POINT-2158393 5388260 +POINT-2357181 5304291 +POINT-2552715 5212982 +POINT-2726920 5123616 +POINT-2744716 5114486 +POINT-2932926 5008911 +POINT-3100011 4906836 +POINT-3117080 4896408 +POINT-3280254 4788200 +POINT-3296924 4777145 +POINT-3455966 4662942 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808155 4380447 +POINT-3968343 4235855 +POINT-4108708 4099349 +POINT-4123048 4085403 +POINT-4272053 3929306 +POINT-4401889 3782749 +POINT-4415153 3767776 +POINT-4539452 3616498 +POINT-4552150 3601043 +POINT-4670740 3445252 +POINT-4682855 3429336 +POINT-4807087 3252884 +POINT-4924675 3071930 +POINT-5025187 2903914 +POINT-5035455 2886749 +POINT-5129651 2715092 +POINT-5139274 2697555 +POINT-5235992 2504654 +POINT-5317178 2326476 +POINT-5325472 2308273 +POINT-5407591 2108719 +POINT-5482233 1906250 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5700099 1092431 +POINT-5704160 1072845 +POINT-5740095 860061 +POINT-5768097 646087 +POINT-5788126 431213 +POINT-5799039 235729 +POINT-5800153 215759 +OBJECT_ID221 +TOTAL_HEIGHT40895317 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431228 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608703 -1493675 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-4924682 -3071937 +POINT-4807098 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085403 +POINT-3968353 -4235847 +POINT-3808166 -4380447 +POINT-3642700 -4518989 +POINT-3472213 -4651283 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-2932937 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357193 -5304291 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807159 -5748344 +POINT1020263 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855697 -5500213 +POINT2058853 -5427459 +POINT2259170 -5347198 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3727066 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619293 -3515800 +POINT4746795 -3341682 +POINT4867721 -3162956 +POINT4981918 -2979858 +POINT5089248 -2792640 +POINT5189529 -2601562 +POINT5282638 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107894 +POINT5796142 323547 +POINT5780105 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282638 2406875 +POINT5189529 2601562 +POINT5089248 2792633 +POINT4981918 2979858 +POINT4867721 3162948 +POINT4746795 3341690 +POINT4619293 3515792 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4199280 4008041 +POINT4047393 4161346 +POINT3889923 4308883 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953506 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1855697 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231964 5672531 +POINT1020263 5714386 +POINT807159 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784363 +POINT-699173 5762344 +POINT-912887 5732345 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212982 +POINT-2744720 5114486 +POINT-2932937 5008911 +POINT-3117080 4896408 +POINT-3296936 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808166 4380447 +POINT-3968353 4235840 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4682861 3429336 +POINT-4807098 3252884 +POINT-4924682 3071930 +POINT-5035461 2886749 +POINT-5139282 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5482239 1906234 +POINT-5549301 1701126 +POINT-5608703 1493667 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431213 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803580 -31655 +POINT-5800155 -215759 +POINT-5798391 -247372 +POINT-5788131 -431228 +POINT-5785192 -462751 +POINT-5768097 -646087 +POINT-5763989 -677481 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5697733 -1103847 +POINT-5660339 -1284149 +POINT-5608703 -1493675 +POINT-5599988 -1524112 +POINT-5549301 -1701133 +POINT-5539462 -1731226 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-5019208 -2913919 +POINT-4924682 -3071937 +POINT-4907431 -3098485 +POINT-4807098 -3252884 +POINT-4788871 -3278772 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4532055 -3625506 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4250201 -3952208 +POINT-4123047 -4085403 +POINT-3968353 -4235847 +POINT-3808166 -4380447 +POINT-3783890 -4400773 +POINT-3642700 -4518989 +POINT-3617687 -4538399 +POINT-3472213 -4651283 +POINT-3296936 -4777145 +POINT-3270548 -4794643 +POINT-3117080 -4896408 +POINT-3090064 -4912914 +POINT-2932937 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357193 -5304291 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1721794 -5542749 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-1094153 -5700005 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-667678 -5765576 +POINT-484512 -5784370 +POINT-452917 -5786429 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT409449 -5789743 +POINT592941 -5774353 +POINT807159 -5748344 +POINT838425 -5743362 +POINT1020263 -5714386 +POINT1231964 -5672531 +POINT1262775 -5665241 +POINT1441970 -5622841 +POINT1472488 -5614410 +POINT1649978 -5565376 +POINT1855697 -5500213 +POINT1885503 -5489539 +POINT2058853 -5427459 +POINT2088243 -5415684 +POINT2259170 -5347198 +POINT2288103 -5334338 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3053227 -4936510 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3583715 -4566051 +POINT3727066 -4450485 +POINT3750960 -4429711 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619293 -3515800 +POINT4638000 -3490254 +POINT4746795 -3341682 +POINT4764537 -3315460 +POINT4867721 -3162956 +POINT4884476 -3136093 +POINT4981918 -2979858 +POINT5089248 -2792640 +POINT5103961 -2764606 +POINT5189529 -2601562 +POINT5203190 -2573000 +POINT5282638 -2406883 +POINT5295229 -2377833 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5457250 -1977923 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5589110 -1567083 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5690087 -1147579 +POINT5724121 -966613 +POINT5728811 -935303 +POINT5756088 -753204 +POINT5759612 -721739 +POINT5780105 -538742 +POINT5782458 -507169 +POINT5796142 -323547 +POINT5797318 -291907 +POINT5804153 -107894 +POINT5804153 107894 +POINT5802978 139534 +POINT5796142 323547 +POINT5793790 355119 +POINT5780105 538742 +POINT5776582 570207 +POINT5756088 753204 +POINT5724121 966613 +POINT5718269 997729 +POINT5684234 1178695 +POINT5677230 1209572 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5571684 1627943 +POINT5517715 1804000 +POINT5507319 1833905 +POINT5446853 2007827 +POINT5435351 2037324 +POINT5368454 2208877 +POINT5282638 2406875 +POINT5268978 2435439 +POINT5189529 2601562 +POINT5089248 2792633 +POINT5073501 2820102 +POINT4981918 2979858 +POINT4867721 3162948 +POINT4849980 3189172 +POINT4746795 3341690 +POINT4728089 3367233 +POINT4619293 3515792 +POINT4599653 3540624 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4323921 3872502 +POINT4199280 4008041 +POINT4047393 4161346 +POINT4024290 4182992 +POINT3889923 4308883 +POINT3866029 4329659 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3533697 4604864 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3181849 4854619 +POINT3026519 4953506 +POINT2999200 4969507 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2229780 5358974 +POINT2058853 5427459 +POINT1855697 5500213 +POINT1825515 5509773 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231964 5672531 +POINT1200904 5678672 +POINT1020263 5714386 +POINT807159 5748337 +POINT775730 5752154 +POINT592941 5774353 +POINT377899 5792389 +POINT346272 5793860 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784363 +POINT-699173 5762344 +POINT-730528 5757943 +POINT-912887 5732345 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1366880 5640804 +POINT-1545242 5595077 +POINT-1575599 5586080 +POINT-1752151 5533752 +POINT-1782150 5523633 +POINT-1956619 5464782 +POINT-1986224 5453555 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212982 +POINT-2744720 5114486 +POINT-2772335 5098997 +POINT-2932937 5008911 +POINT-2959954 4992405 +POINT-3117080 4896408 +POINT-3296936 4777145 +POINT-3322652 4758678 +POINT-3472213 4651275 +POINT-3497227 4631866 +POINT-3642700 4518982 +POINT-3808166 4380447 +POINT-3831668 4359231 +POINT-3968353 4235840 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4293059 3905607 +POINT-4415161 3767776 +POINT-4435260 3743314 +POINT-4552154 3601043 +POINT-4571331 3575851 +POINT-4682861 3429336 +POINT-4701089 3403448 +POINT-4807098 3252884 +POINT-4824350 3226335 +POINT-4924682 3071930 +POINT-5035461 2886749 +POINT-5139282 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5418545 2079011 +POINT-5482239 1906234 +POINT-5492078 1876142 +POINT-5549301 1701126 +POINT-5608703 1493667 +POINT-5616279 1462928 +POINT-5660339 1284149 +POINT-5666769 1253147 +POINT-5704162 1072845 +POINT-5709435 1041626 +POINT-5740097 860061 +POINT-5744205 828668 +POINT-5768097 646087 +POINT-5788131 431213 +POINT-5789896 399602 +POINT-5800155 215759 +POINT-5800744 184103 +POLYGON_AT_HEIGHT18000000 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5796303 -284805 +POINT-5788131 -431228 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5728582 -928247 +POINT-5704162 -1072845 +POINT-5690120 -1140556 +POINT-5660339 -1284149 +POINT-5643793 -1351290 +POINT-5608703 -1493675 +POINT-5589668 -1560154 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-4999963 -2946092 +POINT-4924682 -3071937 +POINT-4887003 -3129921 +POINT-4807098 -3252884 +POINT-4767287 -3309427 +POINT-4682861 -3429336 +POINT-4640977 -3484359 +POINT-4552154 -3601043 +POINT-4508256 -3654472 +POINT-4415161 -3767776 +POINT-4369306 -3819538 +POINT-4272064 -3929306 +POINT-4123047 -4085403 +POINT-3968353 -4235847 +POINT-3808166 -4380447 +POINT-3642700 -4518989 +POINT-3472213 -4651283 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-3058073 -4932459 +POINT-2932937 -5008911 +POINT-2872624 -5042742 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357193 -5304291 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-844403 -5741964 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT661586 -5766019 +POINT807159 -5748344 +POINT1020263 -5714386 +POINT1088102 -5700974 +POINT1231964 -5672531 +POINT1441970 -5622841 +POINT1508625 -5604427 +POINT1649978 -5565376 +POINT1715900 -5544495 +POINT1855697 -5500213 +POINT1920797 -5476900 +POINT2058853 -5427459 +POINT2123043 -5401740 +POINT2259170 -5347198 +POINT2322363 -5319110 +POINT2456375 -5259544 +POINT2518478 -5229129 +POINT2650177 -5164627 +POINT2711106 -5131923 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3441563 -4673656 +POINT3559066 -4585922 +POINT3612901 -4542522 +POINT3727066 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4096065 -4112223 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619293 -3515800 +POINT4746795 -3341682 +POINT4785546 -3284410 +POINT4867721 -3162956 +POINT4904315 -3104283 +POINT4981918 -2979858 +POINT5089248 -2792640 +POINT5121383 -2731410 +POINT5189529 -2601562 +POINT5282638 -2406883 +POINT5310138 -2343435 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5469561 -1942512 +POINT5517715 -1804000 +POINT5537983 -1737886 +POINT5580963 -1597679 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5697016 -1110735 +POINT5724121 -966613 +POINT5734365 -898227 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5785244 -469784 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107894 +POINT5801586 176999 +POINT5796142 323547 +POINT5780105 538742 +POINT5772409 607465 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5668935 1246133 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517715 1804000 +POINT5495008 1869316 +POINT5446853 2007827 +POINT5421731 2072253 +POINT5368454 2208877 +POINT5340955 2272325 +POINT5282638 2406875 +POINT5252802 2469262 +POINT5189529 2601562 +POINT5157395 2662790 +POINT5089248 2792633 +POINT5054855 2852628 +POINT4981918 2979858 +POINT4867721 3162948 +POINT4828971 3220225 +POINT4746795 3341690 +POINT4705938 3397480 +POINT4619293 3515792 +POINT4576397 3570028 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4298544 3900098 +POINT4199280 4008041 +POINT4047393 4161346 +POINT3996933 4208624 +POINT3889923 4308883 +POINT3837736 4354259 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953506 +POINT2966852 4988452 +POINT2840316 5062561 +POINT2779387 5095268 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1993753 5450773 +POINT1855697 5500213 +POINT1789776 5521092 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231964 5672531 +POINT1020263 5714386 +POINT807159 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784363 +POINT-699173 5762344 +POINT-912887 5732345 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1403194 5631494 +POINT-1545242 5595077 +POINT-1611545 5575426 +POINT-1752151 5533752 +POINT-1817672 5511651 +POINT-1956619 5464782 +POINT-2021279 5440261 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212982 +POINT-2614245 5181420 +POINT-2744720 5114486 +POINT-2932937 5008911 +POINT-2991945 4972860 +POINT-3117080 4896408 +POINT-3174714 4858191 +POINT-3296936 4777145 +POINT-3353103 4736811 +POINT-3472213 4651275 +POINT-3526845 4608883 +POINT-3642700 4518982 +POINT-3695723 4474589 +POINT-3808166 4380447 +POINT-3859497 4334109 +POINT-3968353 4235840 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4317919 3877545 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4594039 3546021 +POINT-4682861 3429336 +POINT-4807098 3252884 +POINT-4924682 3071930 +POINT-4960181 3012589 +POINT-5035461 2886749 +POINT-5068730 2826123 +POINT-5139282 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5431513 2043834 +POINT-5482239 1906234 +POINT-5549301 1701126 +POINT-5608703 1493667 +POINT-5625250 1426528 +POINT-5660339 1284149 +POINT-5674382 1216438 +POINT-5704162 1072845 +POINT-5715678 1004660 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5774517 577232 +POINT-5788131 431213 +POINT-5800155 215759 +POINT-5801441 146620 +POLYGON_AT_HEIGHT26000000 +POINT-5804168 0 +POINT-5800527 -195760 +POINT-5800155 -215759 +POINT-5789246 -411256 +POINT-5788131 -431228 +POINT-5769954 -626172 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5707493 -1053122 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608703 -1493675 +POINT-5554807 -1681904 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-4934951 -3054772 +POINT-4924682 -3071937 +POINT-4817997 -3236112 +POINT-4807098 -3252884 +POINT-4694377 -3412981 +POINT-4682861 -3429336 +POINT-4564270 -3585128 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085403 +POINT-3982692 -4221903 +POINT-3968353 -4235847 +POINT-3823014 -4367044 +POINT-3808166 -4380447 +POINT-3658037 -4506148 +POINT-3642700 -4518989 +POINT-3488016 -4639021 +POINT-3472213 -4651283 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-2950006 -4998483 +POINT-2932937 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357193 -5304291 +POINT-2158401 -5388260 +POINT-1975322 -5457690 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT573008 -5776025 +POINT592941 -5774353 +POINT787303 -5750755 +POINT807159 -5748344 +POINT1020263 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1836629 -5506253 +POINT1855697 -5500213 +POINT2040022 -5434203 +POINT2058853 -5427459 +POINT2240603 -5354638 +POINT2259170 -5347198 +POINT2438096 -5267669 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2822692 -5072028 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3543039 -4597889 +POINT3559066 -4585922 +POINT3711494 -4463039 +POINT3727066 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4606885 -3531488 +POINT4619293 -3515800 +POINT4734977 -3357821 +POINT4746795 -3341682 +POINT4856513 -3179522 +POINT4867721 -3162956 +POINT4971333 -2996830 +POINT4981918 -2979858 +POINT5079300 -2809994 +POINT5089248 -2792640 +POINT5180234 -2619273 +POINT5189529 -2601562 +POINT5274008 -2424928 +POINT5282638 -2406883 +POINT5360500 -2227238 +POINT5368454 -2208885 +POINT5439586 -2026464 +POINT5446853 -2007827 +POINT5511147 -1822893 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5631343 -1408474 +POINT5636490 -1389144 +POINT5679809 -1198202 +POINT5684234 -1178695 +POINT5720424 -986271 +POINT5724121 -966613 +POINT5753125 -772985 +POINT5756088 -753204 +POINT5777879 -558620 +POINT5780105 -538742 +POINT5794656 -343494 +POINT5796142 -323547 +POINT5803411 -127883 +POINT5804153 -107894 +POINT5804153 107894 +POINT5796885 303558 +POINT5796142 323547 +POINT5781592 518795 +POINT5780105 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5586110 1578342 +POINT5580963 1597671 +POINT5523578 1784876 +POINT5517715 1804000 +POINT5453422 1988934 +POINT5446853 2007827 +POINT5375721 2190242 +POINT5368454 2208877 +POINT5282638 2406875 +POINT5189529 2601562 +POINT5089248 2792633 +POINT4991867 2962504 +POINT4981918 2979858 +POINT4867721 3162948 +POINT4758004 3325122 +POINT4746795 3341690 +POINT4631111 3499655 +POINT4619293 3515792 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4199280 4008041 +POINT4061472 4147136 +POINT4047393 4161346 +POINT3904519 4295208 +POINT3889923 4308883 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3043393 4942764 +POINT3026519 4953506 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259170 5347198 +POINT2077420 5420020 +POINT2058853 5427459 +POINT1874528 5493470 +POINT1855697 5500213 +POINT1669047 5559329 +POINT1649978 5565368 +POINT1461251 5617507 +POINT1441970 5622833 +POINT1231964 5672531 +POINT1020263 5714386 +POINT807159 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784363 +POINT-699173 5762344 +POINT-893078 5735126 +POINT-912887 5732345 +POINT-1125320 5694443 +POINT-1336212 5648666 +POINT-1545242 5595077 +POINT-1732972 5539437 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2139698 5395353 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212982 +POINT-2726923 5123616 +POINT-2744720 5114486 +POINT-2915491 5018697 +POINT-2932937 5008911 +POINT-3100012 4906836 +POINT-3117080 4896408 +POINT-3280265 4788200 +POINT-3296936 4777145 +POINT-3455967 4662942 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3792829 4393288 +POINT-3808166 4380447 +POINT-3968353 4235840 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4401897 3782749 +POINT-4415161 3767776 +POINT-4539456 3616498 +POINT-4552154 3601043 +POINT-4670746 3445252 +POINT-4682861 3429336 +POINT-4795583 3269239 +POINT-4807098 3252884 +POINT-4924682 3071930 +POINT-5025193 2903914 +POINT-5035461 2886749 +POINT-5129659 2715092 +POINT-5139282 2697555 +POINT-5227028 2522534 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5475320 1925003 +POINT-5482239 1906234 +POINT-5549301 1701126 +POINT-5603197 1512897 +POINT-5608703 1493667 +POINT-5655553 1303569 +POINT-5660339 1284149 +POINT-5700100 1092431 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431213 +POINT-5799041 235729 +POINT-5800155 215759 +POINT-5803797 19998 +OBJECT_ID232 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804161 0 +POINT-5800148 -215759 +POINT-5788124 -431228 +POINT-5768097 -646087 +POINT-5740089 -860061 +POINT-5704155 -1072845 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5549293 -1701141 +POINT-5482231 -1906250 +POINT-5407585 -2108719 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139274 -2697570 +POINT-5035454 -2886749 +POINT-4924667 -3071945 +POINT-4807083 -3252884 +POINT-4682853 -3429336 +POINT-4552147 -3601043 +POINT-4415153 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472206 -4651275 +POINT-3296920 -4777145 +POINT-3117073 -4896408 +POINT-2932922 -5008911 +POINT-2744712 -5114486 +POINT-2552711 -5212982 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545234 -5595077 +POINT-1336196 -5648666 +POINT-1125312 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-484497 -5784363 +POINT-269157 -5798401 +POINT-53443 -5804413 +POINT162338 -5802414 +POINT377906 -5792389 +POINT592948 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441978 -5622833 +POINT1649978 -5565368 +POINT1855705 -5500213 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT3026527 -4953521 +POINT3208564 -4837616 +POINT3386161 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308899 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849212 +POINT4485435 -3685043 +POINT4619308 -3515792 +POINT4746795 -3341690 +POINT4867721 -3162964 +POINT4981933 -2979858 +POINT5089248 -2792633 +POINT5189529 -2601562 +POINT5282654 -2406891 +POINT5368469 -2208877 +POINT5446853 -2007827 +POINT5517730 -1804000 +POINT5580963 -1597686 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756088 -753204 +POINT5780121 -538742 +POINT5796142 -323547 +POINT5804168 -107894 +POINT5804168 107894 +POINT5796142 323547 +POINT5780121 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517730 1804000 +POINT5446853 2007827 +POINT5368469 2208877 +POINT5282654 2406875 +POINT5189529 2601562 +POINT5089248 2792633 +POINT4981933 2979858 +POINT4867721 3162948 +POINT4746795 3341690 +POINT4619308 3515792 +POINT4485435 3685043 +POINT4345360 3849197 +POINT4199280 4008041 +POINT4047401 4161346 +POINT3889923 4308883 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386161 4715027 +POINT3208564 4837616 +POINT3026527 4953506 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259537 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855705 5500213 +POINT1649978 5565368 +POINT1441978 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748337 +POINT592948 5774353 +POINT377906 5792389 +POINT162338 5802414 +POINT-53443 5804413 +POINT-269157 5798401 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-912872 5732345 +POINT-1125312 5694443 +POINT-1336196 5648666 +POINT-1545234 5595077 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2552711 5212982 +POINT-2744712 5114486 +POINT-2932922 5008911 +POINT-3117073 4896408 +POINT-3296920 4777145 +POINT-3472206 4651275 +POINT-3642700 4518982 +POINT-3808151 4380447 +POINT-3968338 4235840 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4682853 3429336 +POINT-4807083 3252884 +POINT-4924667 3071930 +POINT-5035454 2886749 +POINT-5139274 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407585 2108719 +POINT-5482231 1906234 +POINT-5549293 1701126 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5704155 1072845 +POINT-5740089 860061 +POINT-5768097 646087 +POINT-5788124 431213 +POINT-5800148 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804161 0 +POINT-5800148 -215759 +POINT-5788124 -431228 +POINT-5768097 -646087 +POINT-5763088 -684355 +POINT-5740089 -860061 +POINT-5733663 -898116 +POINT-5704155 -1072845 +POINT-5696319 -1110635 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5549293 -1701141 +POINT-5537300 -1737823 +POINT-5482231 -1906250 +POINT-5407585 -2108719 +POINT-5325470 -2308288 +POINT-5309468 -2343406 +POINT-5235992 -2504654 +POINT-5139274 -2697570 +POINT-5120707 -2731403 +POINT-5035454 -2886749 +POINT-4924667 -3071945 +POINT-4807083 -3252884 +POINT-4784866 -3284441 +POINT-4682853 -3429336 +POINT-4552147 -3601043 +POINT-4527647 -3630862 +POINT-4415153 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3939690 -4261714 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472206 -4651275 +POINT-3440858 -4673786 +POINT-3296920 -4777145 +POINT-3117073 -4896408 +POINT-2932922 -5008911 +POINT-2744712 -5114486 +POINT-2710375 -5132101 +POINT-2552711 -5212982 +POINT-2517742 -5229312 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1920049 -5477117 +POINT-1752136 -5533752 +POINT-1545234 -5595077 +POINT-1507850 -5604661 +POINT-1336196 -5648666 +POINT-1298482 -5656853 +POINT-1125312 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-660780 -5766282 +POINT-484497 -5784363 +POINT-269157 -5798401 +POINT-53443 -5804413 +POINT162338 -5802414 +POINT377906 -5792389 +POINT592948 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441978 -5622833 +POINT1479177 -5612556 +POINT1649978 -5565368 +POINT1686771 -5553716 +POINT1855705 -5500213 +POINT1892039 -5487202 +POINT2058868 -5427459 +POINT2094693 -5413105 +POINT2259185 -5347198 +POINT2294451 -5331524 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2684182 -5146376 +POINT2840316 -5062576 +POINT3026527 -4953521 +POINT3059083 -4932793 +POINT3208564 -4837616 +POINT3240326 -4815692 +POINT3386161 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3756198 -4425164 +POINT3889923 -4308899 +POINT4047401 -4161346 +POINT4074563 -4133929 +POINT4199280 -4008041 +POINT4225405 -3979636 +POINT4345360 -3849212 +POINT4485435 -3685043 +POINT4509377 -3654774 +POINT4619308 -3515792 +POINT4642108 -3484656 +POINT4746795 -3341690 +POINT4768422 -3309726 +POINT4867721 -3162964 +POINT4888147 -3130217 +POINT4981933 -2979858 +POINT5001126 -2946375 +POINT5089248 -2792633 +POINT5107183 -2758461 +POINT5189529 -2601562 +POINT5206184 -2566747 +POINT5282654 -2406891 +POINT5368469 -2208877 +POINT5382488 -2172921 +POINT5446853 -2007827 +POINT5459529 -1971375 +POINT5517730 -1804000 +POINT5529039 -1767103 +POINT5580963 -1597686 +POINT5590894 -1560390 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5691368 -1140766 +POINT5724121 -966613 +POINT5729838 -928447 +POINT5756088 -753204 +POINT5780121 -538742 +POINT5796142 -323547 +POINT5797578 -284979 +POINT5804168 -107894 +POINT5804168 107894 +POINT5802733 146462 +POINT5796142 323547 +POINT5793277 362033 +POINT5780121 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5675696 1216332 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517730 1804000 +POINT5505055 1840453 +POINT5446853 2007827 +POINT5432835 2043783 +POINT5368469 2208877 +POINT5353122 2244287 +POINT5282654 2406875 +POINT5189529 2601562 +POINT5171595 2635733 +POINT5089248 2792633 +POINT5070056 2826116 +POINT4981933 2979858 +POINT4961508 3012602 +POINT4867721 3162948 +POINT4846095 3194915 +POINT4746795 3341690 +POINT4619308 3515792 +POINT4485435 3685043 +POINT4345360 3849197 +POINT4319235 3877605 +POINT4199280 4008041 +POINT4047401 4161346 +POINT4019238 4187732 +POINT3889923 4308883 +POINT3860798 4334208 +POINT3727073 4450485 +POINT3697028 4474707 +POINT3559074 4585922 +POINT3386161 4715027 +POINT3354400 4736951 +POINT3208564 4837616 +POINT3176009 4858342 +POINT3026527 4953506 +POINT2993225 4973010 +POINT2840316 5062561 +POINT2806311 5080815 +POINT2650177 5164627 +POINT2615517 5181601 +POINT2456375 5259537 +POINT2259185 5347198 +POINT2058868 5427459 +POINT2022534 5440471 +POINT1855705 5500213 +POINT1818912 5511866 +POINT1649978 5565368 +POINT1612779 5575646 +POINT1441978 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748337 +POINT768856 5752990 +POINT592948 5774353 +POINT377906 5792389 +POINT339354 5794182 +POINT162338 5802414 +POINT-53443 5804413 +POINT-269157 5798401 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-737391 5756979 +POINT-912872 5732345 +POINT-950865 5725567 +POINT-1125312 5694443 +POINT-1336196 5648666 +POINT-1373581 5639082 +POINT-1545234 5595077 +POINT-1582237 5584110 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-1992703 5451097 +POINT-2158386 5388260 +POINT-2193938 5373243 +POINT-2357177 5304291 +POINT-2392147 5287961 +POINT-2552711 5212982 +POINT-2587049 5195367 +POINT-2744712 5114486 +POINT-2778372 5095605 +POINT-2932922 5008911 +POINT-2965856 4988791 +POINT-3117073 4896408 +POINT-3149237 4875079 +POINT-3296920 4777145 +POINT-3328269 4754635 +POINT-3472206 4651275 +POINT-3502697 4627616 +POINT-3642700 4518982 +POINT-3808151 4380447 +POINT-3968338 4235840 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4575523 3570335 +POINT-4682853 3429336 +POINT-4705071 3397779 +POINT-4807083 3252884 +POINT-4828112 3220522 +POINT-4924667 3071930 +POINT-5035454 2886749 +POINT-5139274 2697555 +POINT-5156572 2663056 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407585 2108719 +POINT-5420935 2072506 +POINT-5482231 1906234 +POINT-5549293 1701126 +POINT-5559917 1664024 +POINT-5608696 1493667 +POINT-5617932 1456197 +POINT-5660339 1284149 +POINT-5704155 1072845 +POINT-5740089 860061 +POINT-5745098 821794 +POINT-5768097 646087 +POINT-5788124 431213 +POINT-5800148 215759 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID253 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804153 0 +POINT-5800140 -215759 +POINT-5788116 -431213 +POINT-5768097 -646087 +POINT-5740097 -860046 +POINT-5704147 -1072845 +POINT-5660339 -1284133 +POINT-5608688 -1493667 +POINT-5549301 -1701126 +POINT-5482223 -1906234 +POINT-5407577 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139267 -2697555 +POINT-5035446 -2886734 +POINT-4924667 -3071930 +POINT-4807083 -3252884 +POINT-4682846 -3429321 +POINT-4552139 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085388 +POINT-3968338 -4235840 +POINT-3808151 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2744705 -5114471 +POINT-2552703 -5212982 +POINT-2357177 -5304275 +POINT-2158386 -5388260 +POINT-1956619 -5464767 +POINT-1752136 -5533752 +POINT-1545227 -5595062 +POINT-1336196 -5648651 +POINT-1125305 -5694443 +POINT-912872 -5732345 +POINT-699173 -5762344 +POINT-484497 -5784363 +POINT-269165 -5798385 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT377914 -5792373 +POINT592956 -5774353 +POINT807174 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855712 -5500213 +POINT2058868 -5427444 +POINT2259185 -5347198 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3026535 -4953506 +POINT3208557 -4837616 +POINT3386169 -4715027 +POINT3559082 -4585922 +POINT3727081 -4450470 +POINT3889923 -4308883 +POINT4047409 -4161331 +POINT4199280 -4008041 +POINT4345367 -3849197 +POINT4485428 -3685043 +POINT4619308 -3515792 +POINT4746795 -3341674 +POINT4867737 -3162948 +POINT4981933 -2979843 +POINT5089248 -2792633 +POINT5189544 -2601547 +POINT5282654 -2406875 +POINT5368469 -2208877 +POINT5446853 -2007827 +POINT5517730 -1804000 +POINT5580978 -1597671 +POINT5636505 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756103 -753204 +POINT5780121 -538742 +POINT5796142 -323547 +POINT5804168 -107894 +POINT5804168 107910 +POINT5796142 323547 +POINT5780121 538757 +POINT5756103 753204 +POINT5724121 966629 +POINT5684234 1178695 +POINT5636505 1389160 +POINT5580978 1597686 +POINT5517730 1804000 +POINT5446853 2007827 +POINT5368469 2208892 +POINT5282654 2406891 +POINT5189544 2601562 +POINT5089248 2792648 +POINT4981933 2979858 +POINT4867737 3162964 +POINT4746795 3341690 +POINT4619308 3515808 +POINT4485428 3685058 +POINT4345367 3849212 +POINT4199280 4008056 +POINT4047409 4161346 +POINT3889923 4308899 +POINT3727081 4450485 +POINT3559082 4585922 +POINT3386169 4715027 +POINT3208557 4837616 +POINT3026535 4953521 +POINT2840316 5062576 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855712 5500213 +POINT1649978 5565384 +POINT1441970 5622848 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748352 +POINT592956 5774353 +POINT377914 5792389 +POINT162338 5802414 +POINT-53451 5804428 +POINT-269165 5798401 +POINT-484497 5784378 +POINT-699173 5762344 +POINT-912872 5732361 +POINT-1125305 5694443 +POINT-1336196 5648666 +POINT-1545227 5595077 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2552703 5212997 +POINT-2744705 5114486 +POINT-2932922 5008911 +POINT-3117080 4896423 +POINT-3296920 4777145 +POINT-3472213 4651291 +POINT-3642700 4518997 +POINT-3808151 4380447 +POINT-3968338 4235855 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415146 3767776 +POINT-4552139 3601043 +POINT-4682846 3429336 +POINT-4807083 3252884 +POINT-4924667 3071945 +POINT-5035446 2886749 +POINT-5139267 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407577 2108719 +POINT-5482223 1906250 +POINT-5549301 1701141 +POINT-5608688 1493682 +POINT-5660339 1284149 +POINT-5704147 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788116 431228 +POINT-5800140 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804153 0 +POINT-5803436 -38586 +POINT-5800140 -215759 +POINT-5797990 -254291 +POINT-5788116 -431213 +POINT-5784536 -469641 +POINT-5768097 -646087 +POINT-5740097 -860046 +POINT-5733668 -898103 +POINT-5704147 -1072845 +POINT-5696313 -1110632 +POINT-5660339 -1284133 +POINT-5651102 -1321607 +POINT-5608688 -1493667 +POINT-5549301 -1701126 +POINT-5537305 -1737808 +POINT-5482223 -1906234 +POINT-5407577 -2108719 +POINT-5325470 -2308273 +POINT-5309468 -2343394 +POINT-5235992 -2504654 +POINT-5139267 -2697555 +POINT-5035446 -2886734 +POINT-4924667 -3071930 +POINT-4807083 -3252884 +POINT-4682846 -3429321 +POINT-4552139 -3601043 +POINT-4527639 -3630862 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085388 +POINT-3968338 -4235840 +POINT-3808151 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3440864 -4673786 +POINT-3296920 -4777145 +POINT-3264758 -4798474 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2744705 -5114471 +POINT-2710367 -5132089 +POINT-2552703 -5212982 +POINT-2517735 -5229309 +POINT-2357177 -5304275 +POINT-2321625 -5319295 +POINT-2158386 -5388260 +POINT-1956619 -5464767 +POINT-1752136 -5533752 +POINT-1715132 -5544717 +POINT-1545227 -5595062 +POINT-1336196 -5648651 +POINT-1125305 -5694443 +POINT-912872 -5732345 +POINT-699173 -5762344 +POINT-660780 -5766282 +POINT-484497 -5784363 +POINT-269165 -5798385 +POINT-230586 -5799464 +POINT-53451 -5804413 +POINT-14859 -5804053 +POINT162338 -5802398 +POINT200892 -5800606 +POINT377914 -5792373 +POINT592956 -5774353 +POINT807174 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1269534 -5663643 +POINT1441970 -5622833 +POINT1479171 -5612556 +POINT1649978 -5565368 +POINT1686772 -5553716 +POINT1855712 -5500213 +POINT1892045 -5487199 +POINT2058868 -5427444 +POINT2094693 -5413093 +POINT2259185 -5347198 +POINT2294451 -5331521 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3026535 -4953506 +POINT3208557 -4837616 +POINT3386169 -4715027 +POINT3559082 -4585922 +POINT3589127 -4561698 +POINT3727081 -4450470 +POINT3889923 -4308883 +POINT3918088 -4282495 +POINT4047409 -4161331 +POINT4199280 -4008041 +POINT4345367 -3849197 +POINT4370416 -3819840 +POINT4485428 -3685043 +POINT4619308 -3515792 +POINT4642108 -3484653 +POINT4746795 -3341674 +POINT4768425 -3309711 +POINT4867737 -3162948 +POINT4981933 -2979843 +POINT5001126 -2946362 +POINT5089248 -2792633 +POINT5107186 -2758459 +POINT5189544 -2601547 +POINT5206196 -2566732 +POINT5282654 -2406875 +POINT5368469 -2208877 +POINT5382488 -2172921 +POINT5446853 -2007827 +POINT5459529 -1971375 +POINT5517730 -1804000 +POINT5529042 -1767100 +POINT5580978 -1597671 +POINT5590909 -1560378 +POINT5636505 -1389144 +POINT5645041 -1351507 +POINT5684234 -1178695 +POINT5691368 -1140766 +POINT5724121 -966613 +POINT5729841 -928447 +POINT5756103 -753204 +POINT5760399 -714849 +POINT5780121 -538742 +POINT5796142 -323547 +POINT5797578 -284979 +POINT5804168 -107894 +POINT5804168 107910 +POINT5802733 146474 +POINT5796142 323547 +POINT5793277 362035 +POINT5780121 538757 +POINT5756103 753204 +POINT5750384 791373 +POINT5724121 966629 +POINT5684234 1178695 +POINT5675699 1216335 +POINT5636505 1389160 +POINT5580978 1597686 +POINT5569667 1634584 +POINT5517730 1804000 +POINT5505055 1840453 +POINT5446853 2007827 +POINT5432835 2043786 +POINT5368469 2208892 +POINT5353122 2244303 +POINT5282654 2406891 +POINT5189544 2601562 +POINT5171607 2635736 +POINT5089248 2792648 +POINT5070056 2826129 +POINT4981933 2979858 +POINT4961510 3012605 +POINT4867737 3162964 +POINT4746795 3341690 +POINT4619308 3515808 +POINT4595365 3546077 +POINT4485428 3685058 +POINT4460379 3714416 +POINT4345367 3849212 +POINT4319241 3877620 +POINT4199280 4008056 +POINT4172119 4035471 +POINT4047409 4161346 +POINT4019244 4187735 +POINT3889923 4308899 +POINT3727081 4450485 +POINT3697036 4474707 +POINT3559082 4585922 +POINT3386169 4715027 +POINT3354405 4736951 +POINT3208557 4837616 +POINT3026535 4953521 +POINT2993231 4973025 +POINT2840316 5062576 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259185 5347198 +POINT2058868 5427459 +POINT2022535 5440471 +POINT1855712 5500213 +POINT1818919 5511869 +POINT1649978 5565384 +POINT1612778 5575661 +POINT1441970 5622848 +POINT1404415 5631734 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748352 +POINT592956 5774353 +POINT377914 5792389 +POINT339360 5794182 +POINT162338 5802414 +POINT-53451 5804428 +POINT-269165 5798401 +POINT-484497 5784378 +POINT-699173 5762344 +POINT-737391 5756982 +POINT-912872 5732361 +POINT-950864 5725580 +POINT-1125305 5694443 +POINT-1336196 5648666 +POINT-1373580 5639082 +POINT-1545227 5595077 +POINT-1582230 5584110 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-1992703 5451097 +POINT-2158386 5388260 +POINT-2193938 5373243 +POINT-2357177 5304291 +POINT-2392146 5287964 +POINT-2552703 5212997 +POINT-2744705 5114486 +POINT-2778366 5095605 +POINT-2932922 5008911 +POINT-2965857 4988794 +POINT-3117080 4896423 +POINT-3296920 4777145 +POINT-3328270 4754637 +POINT-3472213 4651291 +POINT-3642700 4518997 +POINT-3672289 4494219 +POINT-3808151 4380447 +POINT-3968338 4235855 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415146 3767776 +POINT-4552139 3601043 +POINT-4575515 3570335 +POINT-4682846 3429336 +POINT-4705065 3397779 +POINT-4807083 3252884 +POINT-4924667 3071945 +POINT-5035446 2886749 +POINT-5139267 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407577 2108719 +POINT-5420927 2072509 +POINT-5482223 1906250 +POINT-5494220 1869568 +POINT-5549301 1701141 +POINT-5559922 1664039 +POINT-5608688 1493682 +POINT-5660339 1284149 +POINT-5668174 1246359 +POINT-5704147 1072845 +POINT-5740097 860061 +POINT-5745105 821794 +POINT-5768097 646087 +POINT-5788116 431228 +POINT-5790267 392693 +POINT-5800140 215759 +POINT-5800858 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID264 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804161 0 +POINT-5800155 -215759 +POINT-5788124 -431228 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704155 -1072845 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5549301 -1701141 +POINT-5482231 -1906250 +POINT-5407585 -2108719 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139274 -2697570 +POINT-5035454 -2886749 +POINT-4924675 -3071945 +POINT-4807083 -3252884 +POINT-4682853 -3429336 +POINT-4552147 -3601043 +POINT-4415153 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968345 -4235855 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2744712 -5114486 +POINT-2552711 -5212982 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545234 -5595077 +POINT-1336204 -5648666 +POINT-1125312 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-484504 -5784378 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855705 -5500213 +POINT2058868 -5427459 +POINT2259178 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT3026527 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3889923 -4308899 +POINT4047401 -4161346 +POINT4199280 -4008041 +POINT4345360 -3849212 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746795 -3341690 +POINT4867729 -3162964 +POINT4981926 -2979858 +POINT5089248 -2792633 +POINT5189537 -2601562 +POINT5282646 -2406891 +POINT5368461 -2208877 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597686 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5796142 -323547 +POINT5804168 -107894 +POINT5804168 107894 +POINT5796142 323547 +POINT5780113 538742 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636497 1389144 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208877 +POINT5282646 2406875 +POINT5189537 2601562 +POINT5089248 2792633 +POINT4981926 2979858 +POINT4867729 3162948 +POINT4746795 3341690 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849197 +POINT4199280 4008041 +POINT4047401 4161346 +POINT3889923 4308883 +POINT3727073 4450485 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953506 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259537 +POINT2259178 5347198 +POINT2058868 5427459 +POINT1855705 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-912872 5732345 +POINT-1125312 5694443 +POINT-1336204 5648651 +POINT-1545234 5595062 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357185 5304291 +POINT-2552711 5212982 +POINT-2744712 5114486 +POINT-2932922 5008911 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380447 +POINT-3968345 4235840 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4682853 3429336 +POINT-4807083 3252884 +POINT-4924675 3071930 +POINT-5035454 2886749 +POINT-5139274 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407585 2108719 +POINT-5482231 1906234 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5660339 1284149 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431213 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804161 0 +POINT-5803445 -38586 +POINT-5800155 -215759 +POINT-5788124 -431228 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704155 -1072845 +POINT-5696319 -1110635 +POINT-5660339 -1284149 +POINT-5608696 -1493667 +POINT-5598074 -1530772 +POINT-5549301 -1701141 +POINT-5482231 -1906250 +POINT-5407585 -2108719 +POINT-5325470 -2308288 +POINT-5309468 -2343406 +POINT-5235992 -2504654 +POINT-5139274 -2697570 +POINT-5120707 -2731403 +POINT-5035454 -2886749 +POINT-5015642 -2919870 +POINT-4924675 -3071945 +POINT-4807083 -3252884 +POINT-4784866 -3284441 +POINT-4682853 -3429336 +POINT-4552147 -3601043 +POINT-4527647 -3630862 +POINT-4415153 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968345 -4235855 +POINT-3939696 -4261714 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3440864 -4673786 +POINT-3296920 -4777145 +POINT-3264758 -4798474 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2744712 -5114486 +POINT-2710375 -5132101 +POINT-2552711 -5212982 +POINT-2517743 -5229312 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1920049 -5477117 +POINT-1752136 -5533752 +POINT-1545234 -5595077 +POINT-1507851 -5604661 +POINT-1336204 -5648666 +POINT-1298488 -5656853 +POINT-1125312 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-660781 -5766285 +POINT-484504 -5784378 +POINT-445993 -5786886 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1269534 -5663643 +POINT1441970 -5622833 +POINT1479171 -5612556 +POINT1649978 -5565368 +POINT1686771 -5553716 +POINT1855705 -5500213 +POINT1892039 -5487202 +POINT2058868 -5427459 +POINT2094692 -5413105 +POINT2259178 -5347198 +POINT2294445 -5331524 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2684182 -5146376 +POINT2840316 -5062576 +POINT3026527 -4953521 +POINT3059081 -4932793 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450485 +POINT3756198 -4425164 +POINT3889923 -4308899 +POINT4047401 -4161346 +POINT4074563 -4133929 +POINT4199280 -4008041 +POINT4225405 -3979636 +POINT4345360 -3849212 +POINT4370410 -3819852 +POINT4485428 -3685043 +POINT4509370 -3654774 +POINT4619301 -3515792 +POINT4642102 -3484656 +POINT4746795 -3341690 +POINT4867729 -3162964 +POINT4981926 -2979858 +POINT5089248 -2792633 +POINT5189537 -2601562 +POINT5282646 -2406891 +POINT5368461 -2208877 +POINT5382481 -2172921 +POINT5446853 -2007827 +POINT5459528 -1971375 +POINT5517723 -1804000 +POINT5529033 -1767103 +POINT5580963 -1597686 +POINT5590895 -1560390 +POINT5636497 -1389144 +POINT5645035 -1351507 +POINT5684234 -1178695 +POINT5691368 -1140766 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5782980 -500256 +POINT5796142 -323547 +POINT5797578 -284979 +POINT5804168 -107894 +POINT5804168 107894 +POINT5802733 146462 +POINT5796142 323547 +POINT5793276 362033 +POINT5780113 538742 +POINT5775818 577096 +POINT5756096 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5675697 1216332 +POINT5636497 1389144 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5505049 1840453 +POINT5446853 2007827 +POINT5432834 2043783 +POINT5368461 2208877 +POINT5353114 2244287 +POINT5282646 2406875 +POINT5189537 2601562 +POINT5089248 2792633 +POINT5070055 2826116 +POINT4981926 2979858 +POINT4961503 3012602 +POINT4867729 3162948 +POINT4846101 3194915 +POINT4746795 3341690 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345360 3849197 +POINT4319235 3877605 +POINT4199280 4008041 +POINT4047401 4161346 +POINT4019238 4187732 +POINT3889923 4308883 +POINT3860798 4334208 +POINT3727073 4450485 +POINT3697028 4474707 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953506 +POINT2993225 4973010 +POINT2840316 5062561 +POINT2806311 5080815 +POINT2650177 5164627 +POINT2615517 5181601 +POINT2456375 5259537 +POINT2259178 5347198 +POINT2058868 5427459 +POINT2022534 5440471 +POINT1855705 5500213 +POINT1818912 5511866 +POINT1649978 5565368 +POINT1612778 5575646 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748337 +POINT768854 5752990 +POINT592941 5774353 +POINT377899 5792389 +POINT339348 5794182 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484504 5784363 +POINT-699173 5762344 +POINT-737391 5756979 +POINT-912872 5732345 +POINT-950865 5725567 +POINT-1125312 5694443 +POINT-1336204 5648651 +POINT-1545234 5595062 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-1992704 5451097 +POINT-2158393 5388260 +POINT-2193946 5373243 +POINT-2357185 5304291 +POINT-2552711 5212982 +POINT-2587049 5195367 +POINT-2744712 5114486 +POINT-2778372 5095605 +POINT-2932922 5008911 +POINT-2965857 4988791 +POINT-3117080 4896408 +POINT-3149243 4875079 +POINT-3296920 4777145 +POINT-3328270 4754635 +POINT-3472213 4651275 +POINT-3502703 4627616 +POINT-3642700 4518982 +POINT-3808151 4380447 +POINT-3968345 4235840 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4575523 3570335 +POINT-4682853 3429336 +POINT-4705071 3397779 +POINT-4807083 3252884 +POINT-4924675 3071930 +POINT-5035454 2886749 +POINT-5139274 2697555 +POINT-5156572 2663056 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407585 2108719 +POINT-5420935 2072506 +POINT-5482231 1906234 +POINT-5494226 1869552 +POINT-5549301 1701126 +POINT-5608696 1493667 +POINT-5617932 1456197 +POINT-5660339 1284149 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5745105 821794 +POINT-5768097 646087 +POINT-5788124 431213 +POINT-5790276 392681 +POINT-5800155 215759 +POINT-5800872 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID275 +TOTAL_HEIGHT4017085 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788116 -431228 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608688 -1493682 +POINT-5549301 -1701141 +POINT-5482223 -1906250 +POINT-5407593 -2108719 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139267 -2697570 +POINT-5035446 -2886749 +POINT-4924667 -3071945 +POINT-4807083 -3252884 +POINT-4682846 -3429336 +POINT-4552154 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3808151 -4380447 +POINT-3642700 -4518997 +POINT-3472213 -4651291 +POINT-3296920 -4777145 +POINT-3117080 -4896423 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212997 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545242 -5595077 +POINT-1336196 -5648666 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-484497 -5784378 +POINT-269165 -5798401 +POINT-53451 -5804428 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807174 -5748352 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622848 +POINT1649978 -5565384 +POINT1855712 -5500229 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT3026535 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585937 +POINT3727081 -4450485 +POINT3889923 -4308899 +POINT4047393 -4161346 +POINT4199280 -4008056 +POINT4345352 -3849212 +POINT4485428 -3685058 +POINT4619308 -3515808 +POINT4746795 -3341690 +POINT4867721 -3162964 +POINT4981933 -2979858 +POINT5089248 -2792648 +POINT5189529 -2601562 +POINT5282654 -2406891 +POINT5368469 -2208892 +POINT5446853 -2007827 +POINT5517730 -1804000 +POINT5580963 -1597686 +POINT5636490 -1389160 +POINT5684234 -1178711 +POINT5724121 -966629 +POINT5756088 -753204 +POINT5780121 -538757 +POINT5796142 -323547 +POINT5804168 -107910 +POINT5804168 107894 +POINT5796142 323547 +POINT5780121 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517730 1804000 +POINT5446853 2007827 +POINT5368469 2208877 +POINT5282654 2406875 +POINT5189529 2601547 +POINT5089248 2792633 +POINT4981933 2979843 +POINT4867721 3162948 +POINT4746795 3341674 +POINT4619308 3515792 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4199280 4008041 +POINT4047393 4161331 +POINT3889923 4308883 +POINT3727081 4450470 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837600 +POINT3026535 4953506 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259537 +POINT2259185 5347183 +POINT2058868 5427444 +POINT1855712 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT592941 5774353 +POINT377899 5792373 +POINT162338 5802398 +POINT-53451 5804413 +POINT-269165 5798385 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-912872 5732345 +POINT-1125320 5694443 +POINT-1336196 5648651 +POINT-1545242 5595062 +POINT-1752136 5533737 +POINT-1956619 5464767 +POINT-2158386 5388244 +POINT-2357177 5304275 +POINT-2552719 5212982 +POINT-2744720 5114471 +POINT-2932922 5008896 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380432 +POINT-3968338 4235840 +POINT-4123047 4085388 +POINT-4272049 3929290 +POINT-4415146 3767776 +POINT-4552154 3601043 +POINT-4682846 3429321 +POINT-4807083 3252868 +POINT-4924667 3071930 +POINT-5035446 2886734 +POINT-5139267 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5482223 1906234 +POINT-5549301 1701126 +POINT-5608688 1493667 +POINT-5660339 1284133 +POINT-5704162 1072830 +POINT-5740097 860046 +POINT-5768097 646087 +POINT-5788116 431213 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5802188 -106503 +POINT-5800155 -215759 +POINT-5794213 -322119 +POINT-5788116 -431228 +POINT-5768097 -646087 +POINT-5754276 -751709 +POINT-5740097 -860061 +POINT-5722359 -965096 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5634843 -1387579 +POINT-5608688 -1493682 +POINT-5579374 -1596088 +POINT-5549301 -1701141 +POINT-5516190 -1802387 +POINT-5482223 -1906250 +POINT-5407593 -2108719 +POINT-5325470 -2308288 +POINT-5281302 -2405218 +POINT-5235992 -2504654 +POINT-5139267 -2697570 +POINT-5088019 -2790953 +POINT-5035446 -2886749 +POINT-4924667 -3071945 +POINT-4807083 -3252884 +POINT-4682846 -3429336 +POINT-4618334 -3514094 +POINT-4552154 -3601043 +POINT-4484524 -3683346 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3808151 -4380447 +POINT-3642700 -4518997 +POINT-3472213 -4651291 +POINT-3385685 -4713415 +POINT-3296920 -4777145 +POINT-3208148 -4836023 +POINT-3117080 -4896423 +POINT-2932922 -5008911 +POINT-2840022 -5061025 +POINT-2744720 -5114486 +POINT-2552719 -5212997 +POINT-2456195 -5258062 +POINT-2357177 -5304291 +POINT-2259050 -5345740 +POINT-2158386 -5388260 +POINT-2058790 -5426033 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1650009 -5564024 +POINT-1545242 -5595077 +POINT-1442053 -5621530 +POINT-1336196 -5648666 +POINT-1232104 -5671263 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-484497 -5784378 +POINT-269165 -5798401 +POINT-53451 -5804428 +POINT53066 -5803434 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807174 -5748352 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1335635 -5648007 +POINT1441970 -5622848 +POINT1544647 -5594483 +POINT1649978 -5565384 +POINT1855712 -5500229 +POINT1955994 -5464309 +POINT2058868 -5427459 +POINT2157749 -5387841 +POINT2259185 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT3026535 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585937 +POINT3642010 -4519075 +POINT3727081 -4450485 +POINT3889923 -4308899 +POINT4047393 -4161346 +POINT4199280 -4008056 +POINT4271384 -3929648 +POINT4345352 -3849212 +POINT4414496 -3768183 +POINT4485428 -3685058 +POINT4551514 -3601513 +POINT4619308 -3515808 +POINT4746795 -3341690 +POINT4806487 -3253467 +POINT4867721 -3162964 +POINT4924099 -3072579 +POINT4981933 -2979858 +POINT5089248 -2792648 +POINT5138749 -2698324 +POINT5189529 -2601562 +POINT5282654 -2406891 +POINT5325014 -2309155 +POINT5368469 -2208892 +POINT5407161 -2109643 +POINT5446853 -2007827 +POINT5481840 -1907214 +POINT5517730 -1804000 +POINT5548943 -1702160 +POINT5580963 -1597686 +POINT5636490 -1389160 +POINT5684234 -1178711 +POINT5724121 -966629 +POINT5756088 -753204 +POINT5780121 -538757 +POINT5796142 -323547 +POINT5800104 -217104 +POINT5804168 -107910 +POINT5804168 107894 +POINT5796142 323547 +POINT5788234 429771 +POINT5780121 538742 +POINT5768258 644605 +POINT5756088 753204 +POINT5740309 858547 +POINT5724121 966613 +POINT5704432 1071301 +POINT5684234 1178695 +POINT5660667 1282577 +POINT5636490 1389144 +POINT5609081 1492077 +POINT5580963 1597671 +POINT5549750 1699519 +POINT5517730 1804000 +POINT5482744 1904614 +POINT5446853 2007827 +POINT5408161 2107070 +POINT5368469 2208877 +POINT5326109 2306613 +POINT5282654 2406875 +POINT5236686 2502969 +POINT5189529 2601547 +POINT5140029 2695871 +POINT5089248 2792633 +POINT5036276 2885043 +POINT4981933 2979843 +POINT4925556 3070227 +POINT4867721 3162948 +POINT4808030 3251171 +POINT4746795 3341674 +POINT4683865 3427623 +POINT4619308 3515792 +POINT4553222 3599338 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4199280 4008041 +POINT4047393 4161331 +POINT3969663 4234166 +POINT3889923 4308883 +POINT3727081 4450470 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3298488 4775532 +POINT3208557 4837600 +POINT3118707 4894814 +POINT3026535 4953506 +POINT2934614 5007338 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259537 +POINT2259185 5347183 +POINT2058868 5427444 +POINT1855712 5500213 +POINT1754158 5532375 +POINT1649978 5565368 +POINT1547301 5593734 +POINT1441970 5622833 +POINT1338314 5647365 +POINT1231979 5672531 +POINT1020278 5714386 +POINT915086 5731145 +POINT807174 5748337 +POINT592941 5774353 +POINT377899 5792373 +POINT271493 5797322 +POINT162338 5802398 +POINT55820 5803393 +POINT-53451 5804413 +POINT-159932 5801438 +POINT-269165 5798385 +POINT-375457 5791464 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-804659 5747536 +POINT-912872 5732345 +POINT-1017740 5713636 +POINT-1125320 5694443 +POINT-1336196 5648651 +POINT-1545242 5595062 +POINT-1752136 5533737 +POINT-1853073 5499692 +POINT-1956619 5464767 +POINT-2056215 5426994 +POINT-2158386 5388244 +POINT-2357177 5304275 +POINT-2453701 5259211 +POINT-2552719 5212982 +POINT-2744720 5114471 +POINT-2932922 5008896 +POINT-3117080 4896408 +POINT-3205853 4837538 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3556369 4585973 +POINT-3642700 4518982 +POINT-3724370 4450591 +POINT-3808151 4380432 +POINT-3968338 4235840 +POINT-4123047 4085388 +POINT-4272049 3929290 +POINT-4415146 3767776 +POINT-4482776 3685474 +POINT-4552154 3601043 +POINT-4616666 3516278 +POINT-4682846 3429321 +POINT-4807083 3252868 +POINT-4924667 3071930 +POINT-5035446 2886734 +POINT-5139267 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5444432 2008768 +POINT-5482223 1906234 +POINT-5515334 1804989 +POINT-5549301 1701126 +POINT-5608688 1493667 +POINT-5634184 1390237 +POINT-5660339 1284133 +POINT-5681971 1179830 +POINT-5704162 1072830 +POINT-5740097 860046 +POINT-5768097 646087 +POINT-5777979 540021 +POINT-5788116 431213 +POINT-5794059 324860 +POINT-5800155 215759 +POINT-5802136 109256 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID288 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5704162 -1072837 +POINT-5660339 -1284141 +POINT-5608703 -1493667 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-4924682 -3071937 +POINT-4807098 -3252884 +POINT-4682861 -3429329 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085395 +POINT-3968353 -4235847 +POINT-3808166 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-2932937 -5008903 +POINT-2744720 -5114479 +POINT-2552719 -5212982 +POINT-2357193 -5304283 +POINT-2158401 -5388260 +POINT-1956619 -5464775 +POINT-1752151 -5533745 +POINT-1545242 -5595070 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798393 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020263 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855697 -5500213 +POINT2058853 -5427452 +POINT2259170 -5347198 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3727066 -4450477 +POINT3889923 -4308891 +POINT4047393 -4161338 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4746795 -3341682 +POINT4867721 -3162956 +POINT4981918 -2979850 +POINT5089248 -2792633 +POINT5189529 -2601555 +POINT5282638 -2406883 +POINT5368454 -2208877 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5796142 -323547 +POINT5804153 -107894 +POINT5804153 107902 +POINT5796142 323547 +POINT5780105 538749 +POINT5756088 753204 +POINT5724121 966621 +POINT5684234 1178695 +POINT5636490 1389152 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208885 +POINT5282638 2406883 +POINT5189529 2601562 +POINT5089248 2792640 +POINT4981918 2979858 +POINT4867721 3162956 +POINT4746795 3341690 +POINT4619293 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4047393 4161346 +POINT3889923 4308891 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259170 5347198 +POINT2058853 5427459 +POINT1855697 5500213 +POINT1649978 5565376 +POINT1441970 5622841 +POINT1231964 5672531 +POINT1020263 5714386 +POINT807159 5748344 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804420 +POINT-269165 5798401 +POINT-484512 5784370 +POINT-699173 5762344 +POINT-912887 5732353 +POINT-1125320 5694443 +POINT-1336212 5648659 +POINT-1545242 5595077 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-2158401 5388260 +POINT-2357193 5304291 +POINT-2552719 5212990 +POINT-2744720 5114486 +POINT-2932937 5008911 +POINT-3117080 4896415 +POINT-3296936 4777145 +POINT-3472213 4651283 +POINT-3642700 4518989 +POINT-3808166 4380447 +POINT-3968353 4235847 +POINT-4123047 4085403 +POINT-4272064 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4682861 3429336 +POINT-4807098 3252884 +POINT-4924682 3071937 +POINT-5035461 2886749 +POINT-5139282 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493675 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803451 -38586 +POINT-5800155 -215759 +POINT-5798005 -254292 +POINT-5788131 -431221 +POINT-5784549 -469648 +POINT-5768097 -646087 +POINT-5740097 -860054 +POINT-5704162 -1072837 +POINT-5696325 -1110627 +POINT-5660339 -1284141 +POINT-5651105 -1321613 +POINT-5608703 -1493667 +POINT-5598080 -1530771 +POINT-5549301 -1701133 +POINT-5537308 -1737815 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5309468 -2343400 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-5015650 -2919862 +POINT-4924682 -3071937 +POINT-4903653 -3104298 +POINT-4807098 -3252884 +POINT-4682861 -3429329 +POINT-4552154 -3601043 +POINT-4527654 -3630862 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4245414 -3957221 +POINT-4123047 -4085395 +POINT-3968353 -4235847 +POINT-3808166 -4380440 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3440867 -4673786 +POINT-3296936 -4777145 +POINT-3117080 -4896408 +POINT-3084148 -4916527 +POINT-2932937 -5008903 +POINT-2899276 -5027785 +POINT-2744720 -5114479 +POINT-2552719 -5212982 +POINT-2357193 -5304283 +POINT-2158401 -5388260 +POINT-1956619 -5464775 +POINT-1920052 -5477110 +POINT-1752151 -5533745 +POINT-1545242 -5595070 +POINT-1507859 -5604654 +POINT-1336212 -5648659 +POINT-1125320 -5694443 +POINT-1087328 -5701223 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-445999 -5786878 +POINT-269165 -5798393 +POINT-230586 -5799470 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT416357 -5789157 +POINT592941 -5774353 +POINT807159 -5748337 +POINT1020263 -5714386 +POINT1231964 -5672531 +POINT1269522 -5663643 +POINT1441970 -5622833 +POINT1479171 -5612556 +POINT1649978 -5565368 +POINT1686769 -5553716 +POINT1855697 -5500213 +POINT1892030 -5487201 +POINT2058853 -5427452 +POINT2259170 -5347198 +POINT2456375 -5259544 +POINT2491035 -5242569 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2873617 -5043065 +POINT3026519 -4953514 +POINT3059075 -4932787 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3589112 -4561699 +POINT3727066 -4450477 +POINT3889923 -4308891 +POINT4047393 -4161338 +POINT4074557 -4133923 +POINT4199280 -4008041 +POINT4225404 -3979635 +POINT4345352 -3849205 +POINT4485428 -3685043 +POINT4619293 -3515792 +POINT4642096 -3484654 +POINT4746795 -3341682 +POINT4768422 -3309718 +POINT4867721 -3162956 +POINT4981918 -2979850 +POINT5001113 -2946368 +POINT5089248 -2792633 +POINT5107183 -2758460 +POINT5189529 -2601555 +POINT5282638 -2406883 +POINT5297986 -2371471 +POINT5368454 -2208877 +POINT5382475 -2172921 +POINT5446853 -2007827 +POINT5459526 -1971375 +POINT5517715 -1804000 +POINT5529027 -1767102 +POINT5580963 -1597679 +POINT5590894 -1560384 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5691368 -1140766 +POINT5724121 -966613 +POINT5729838 -928447 +POINT5756088 -753204 +POINT5780105 -538742 +POINT5782974 -500256 +POINT5796142 -323547 +POINT5797575 -284979 +POINT5804153 -107894 +POINT5804153 107902 +POINT5796142 323547 +POINT5793274 362034 +POINT5780105 538749 +POINT5775810 577103 +POINT5756088 753204 +POINT5750371 791372 +POINT5724121 966621 +POINT5684234 1178695 +POINT5675696 1216334 +POINT5636490 1389152 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5505042 1840453 +POINT5446853 2007827 +POINT5432832 2043785 +POINT5368454 2208885 +POINT5282638 2406883 +POINT5265987 2441700 +POINT5189529 2601562 +POINT5171595 2635735 +POINT5089248 2792640 +POINT5070053 2826123 +POINT4981918 2979858 +POINT4867721 3162956 +POINT4846095 3194921 +POINT4746795 3341690 +POINT4723993 3372828 +POINT4619293 3515800 +POINT4485428 3685051 +POINT4345352 3849205 +POINT4199280 4008049 +POINT4047393 4161346 +POINT3889923 4308891 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3528143 4609011 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2993219 4973017 +POINT2840316 5062568 +POINT2806311 5080821 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259170 5347198 +POINT2058853 5427459 +POINT2022520 5440471 +POINT1855697 5500213 +POINT1818906 5511867 +POINT1649978 5565376 +POINT1612778 5575653 +POINT1441970 5622841 +POINT1231964 5672531 +POINT1020263 5714386 +POINT807159 5748344 +POINT768848 5752996 +POINT592941 5774353 +POINT377899 5792389 +POINT339348 5794182 +POINT162338 5802414 +POINT123746 5802773 +POINT-53451 5804420 +POINT-92030 5803344 +POINT-269165 5798401 +POINT-307678 5795892 +POINT-484512 5784370 +POINT-522902 5780431 +POINT-699173 5762344 +POINT-737394 5756981 +POINT-912887 5732353 +POINT-1125320 5694443 +POINT-1336212 5648659 +POINT-1545242 5595077 +POINT-1582246 5584110 +POINT-1752151 5533752 +POINT-1956619 5464782 +POINT-1992706 5451097 +POINT-2158401 5388260 +POINT-2193953 5373243 +POINT-2357193 5304291 +POINT-2552719 5212990 +POINT-2744720 5114486 +POINT-2778381 5095605 +POINT-2932937 5008911 +POINT-2965870 4988792 +POINT-3117080 4896415 +POINT-3149246 4875085 +POINT-3296936 4777145 +POINT-3472213 4651283 +POINT-3642700 4518989 +POINT-3808166 4380447 +POINT-3836814 4354587 +POINT-3968353 4235847 +POINT-3996019 4208942 +POINT-4123047 4085403 +POINT-4149697 4057487 +POINT-4272064 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4575530 3570335 +POINT-4682861 3429336 +POINT-4705080 3397779 +POINT-4807098 3252884 +POINT-4924682 3071937 +POINT-4944494 3038818 +POINT-5035461 2886749 +POINT-5054029 2852915 +POINT-5139282 2697563 +POINT-5156578 2663063 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493675 +POINT-5617938 1456203 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5710589 1034791 +POINT-5740097 860061 +POINT-5745105 821794 +POINT-5768097 646087 +POINT-5771680 607660 +POINT-5788131 431221 +POINT-5790282 392687 +POINT-5800155 215759 +POINT-5800873 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID299 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284141 +POINT-5608703 -1493675 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-4924682 -3071937 +POINT-4807083 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235847 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651283 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2744720 -5114479 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545242 -5595070 +POINT-1336196 -5648659 +POINT-1125320 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807159 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855697 -5500213 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3727066 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619293 -3515792 +POINT4746795 -3341682 +POINT4867721 -3162956 +POINT4981918 -2979858 +POINT5089248 -2792640 +POINT5189529 -2601555 +POINT5282638 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5796142 -323547 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796142 323547 +POINT5780105 538749 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282638 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT4981918 2979850 +POINT4867721 3162956 +POINT4746795 3341682 +POINT4619293 3515792 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT3889923 4308891 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855697 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807159 5748344 +POINT592941 5774353 +POINT377899 5792381 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484512 5784370 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158401 5388260 +POINT-2357177 5304291 +POINT-2552719 5212990 +POINT-2744720 5114479 +POINT-2932922 5008903 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4682861 3429329 +POINT-4807083 3252884 +POINT-4924682 3071937 +POINT-5035461 2886741 +POINT-5139282 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493667 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803451 -38586 +POINT-5800155 -215759 +POINT-5798005 -254292 +POINT-5788131 -431221 +POINT-5784549 -469648 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5696325 -1110633 +POINT-5660339 -1284141 +POINT-5651105 -1321614 +POINT-5608703 -1493675 +POINT-5598080 -1530777 +POINT-5549301 -1701133 +POINT-5537308 -1737815 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5309468 -2343400 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886741 +POINT-5015650 -2919862 +POINT-4924682 -3071937 +POINT-4903651 -3104298 +POINT-4807083 -3252884 +POINT-4784867 -3284441 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4527654 -3630862 +POINT-4415161 -3767776 +POINT-4389567 -3796664 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235847 +POINT-3939690 -4261708 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3612210 -4542643 +POINT-3472213 -4651283 +POINT-3440864 -4673792 +POINT-3296920 -4777145 +POINT-3264758 -4798474 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2899264 -5027791 +POINT-2744720 -5114479 +POINT-2710382 -5132097 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2321628 -5319308 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1920049 -5477117 +POINT-1752136 -5533752 +POINT-1715135 -5544719 +POINT-1545242 -5595070 +POINT-1507856 -5604654 +POINT-1336196 -5648659 +POINT-1298483 -5656847 +POINT-1125320 -5694443 +POINT-1087325 -5701223 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792381 +POINT416357 -5789157 +POINT592941 -5774353 +POINT807159 -5748344 +POINT845274 -5742271 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855697 -5500213 +POINT1892033 -5487202 +POINT2058868 -5427459 +POINT2094693 -5413105 +POINT2259185 -5347198 +POINT2294451 -5331522 +POINT2456375 -5259544 +POINT2491035 -5242569 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2873617 -5043065 +POINT3026519 -4953514 +POINT3059075 -4932787 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585922 +POINT3589112 -4561700 +POINT3727066 -4450485 +POINT3889923 -4308891 +POINT3918085 -4282504 +POINT4047393 -4161346 +POINT4074557 -4133929 +POINT4199280 -4008041 +POINT4225404 -3979635 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619293 -3515792 +POINT4642096 -3484654 +POINT4746795 -3341682 +POINT4768422 -3309718 +POINT4867721 -3162956 +POINT4888144 -3130211 +POINT4981918 -2979858 +POINT5001113 -2946376 +POINT5089248 -2792640 +POINT5107183 -2758466 +POINT5189529 -2601555 +POINT5282638 -2406883 +POINT5297986 -2371473 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5459526 -1971375 +POINT5517715 -1804000 +POINT5529027 -1767102 +POINT5580963 -1597679 +POINT5590894 -1560384 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5691368 -1140768 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5782974 -500262 +POINT5796142 -323547 +POINT5797578 -284981 +POINT5804168 -107902 +POINT5804168 107894 +POINT5802733 146462 +POINT5796142 323547 +POINT5793274 362034 +POINT5780105 538749 +POINT5775810 577103 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5675696 1216332 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5505042 1840453 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282638 2406883 +POINT5265987 2441698 +POINT5189529 2601555 +POINT5171595 2635727 +POINT5089248 2792633 +POINT4981918 2979850 +POINT4961495 3012597 +POINT4867721 3162956 +POINT4846095 3194919 +POINT4746795 3341682 +POINT4723993 3372820 +POINT4619293 3515792 +POINT4485428 3685043 +POINT4460377 3714402 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT4019231 4187727 +POINT3889923 4308891 +POINT3727066 4450485 +POINT3559066 4585922 +POINT3528143 4609011 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2993219 4973017 +POINT2840316 5062568 +POINT2806311 5080821 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347198 +POINT2058868 5427459 +POINT2022533 5440471 +POINT1855697 5500213 +POINT1818906 5511866 +POINT1649978 5565368 +POINT1612778 5575646 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807159 5748344 +POINT768848 5752996 +POINT592941 5774353 +POINT377899 5792381 +POINT339348 5794174 +POINT162338 5802406 +POINT123746 5802765 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-307678 5795892 +POINT-484512 5784370 +POINT-522902 5780431 +POINT-699173 5762344 +POINT-737391 5756981 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-1992706 5451097 +POINT-2158401 5388260 +POINT-2193951 5373243 +POINT-2357177 5304291 +POINT-2552719 5212990 +POINT-2744720 5114479 +POINT-2778378 5095598 +POINT-2932922 5008903 +POINT-2965857 4988785 +POINT-3117080 4896408 +POINT-3149243 4875079 +POINT-3296920 4777145 +POINT-3328270 4754635 +POINT-3472213 4651275 +POINT-3502703 4627616 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3836799 4354581 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929306 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4575530 3570334 +POINT-4682861 3429329 +POINT-4807083 3252884 +POINT-4828115 3220523 +POINT-4924682 3071937 +POINT-4944494 3038817 +POINT-5035461 2886741 +POINT-5054029 2852908 +POINT-5139282 2697563 +POINT-5156578 2663063 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493667 +POINT-5617938 1456195 +POINT-5660339 1284141 +POINT-5704162 1072845 +POINT-5710589 1034791 +POINT-5740097 860061 +POINT-5745105 821794 +POINT-5768097 646087 +POINT-5771680 607660 +POINT-5788131 431221 +POINT-5790282 392687 +POINT-5800155 215759 +POINT-5800873 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID310 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804161 0 +POINT-5800155 -215759 +POINT-5788124 -431213 +POINT-5768097 -646087 +POINT-5740097 -860046 +POINT-5704155 -1072830 +POINT-5660339 -1284133 +POINT-5608696 -1493667 +POINT-5549301 -1701126 +POINT-5482231 -1906234 +POINT-5407585 -2108719 +POINT-5325470 -2308273 +POINT-5235992 -2504654 +POINT-5139274 -2697555 +POINT-5035454 -2886734 +POINT-4924675 -3071930 +POINT-4807083 -3252868 +POINT-4682853 -3429321 +POINT-4552147 -3601043 +POINT-4415153 -3767776 +POINT-4272049 -3929290 +POINT-4123047 -4085388 +POINT-3968345 -4235840 +POINT-3808151 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2744712 -5114471 +POINT-2552711 -5212982 +POINT-2357177 -5304275 +POINT-2158393 -5388244 +POINT-1956619 -5464767 +POINT-1752136 -5533737 +POINT-1545234 -5595062 +POINT-1336204 -5648651 +POINT-1125312 -5694443 +POINT-912872 -5732345 +POINT-699173 -5762344 +POINT-484504 -5784363 +POINT-269165 -5798385 +POINT-53451 -5804413 +POINT162338 -5802398 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855705 -5500213 +POINT2058868 -5427444 +POINT2259178 -5347183 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3026527 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3727073 -4450470 +POINT3889923 -4308883 +POINT4047401 -4161331 +POINT4199280 -4008041 +POINT4345360 -3849197 +POINT4485428 -3685043 +POINT4619301 -3515792 +POINT4746795 -3341674 +POINT4867729 -3162948 +POINT4981926 -2979843 +POINT5089248 -2792633 +POINT5189537 -2601547 +POINT5282646 -2406875 +POINT5368461 -2208877 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597671 +POINT5636497 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5796142 -323547 +POINT5804168 -107894 +POINT5804168 107910 +POINT5796142 323547 +POINT5780113 538757 +POINT5756096 753204 +POINT5724121 966629 +POINT5684234 1178711 +POINT5636497 1389160 +POINT5580963 1597686 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368461 2208892 +POINT5282646 2406891 +POINT5189537 2601562 +POINT5089248 2792648 +POINT4981926 2979858 +POINT4867729 3162964 +POINT4746795 3341690 +POINT4619301 3515808 +POINT4485428 3685058 +POINT4345360 3849212 +POINT4199280 4008056 +POINT4047401 4161346 +POINT3889923 4308899 +POINT3727073 4450485 +POINT3559074 4585937 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953521 +POINT2840316 5062576 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2058868 5427459 +POINT1855705 5500229 +POINT1649978 5565384 +POINT1441970 5622848 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748352 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804428 +POINT-269165 5798401 +POINT-484504 5784378 +POINT-699173 5762344 +POINT-912872 5732361 +POINT-1125312 5694443 +POINT-1336204 5648666 +POINT-1545234 5595077 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158393 5388260 +POINT-2357177 5304291 +POINT-2552711 5212997 +POINT-2744712 5114486 +POINT-2932922 5008911 +POINT-3117080 4896423 +POINT-3296920 4777145 +POINT-3472213 4651291 +POINT-3642700 4518997 +POINT-3808151 4380447 +POINT-3968345 4235855 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4682853 3429336 +POINT-4807083 3252884 +POINT-4924675 3071945 +POINT-5035454 2886749 +POINT-5139274 2697570 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407585 2108719 +POINT-5482231 1906250 +POINT-5549301 1701141 +POINT-5608696 1493682 +POINT-5660339 1284149 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788124 431228 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804161 0 +POINT-5803445 -38586 +POINT-5800155 -215759 +POINT-5788124 -431213 +POINT-5768097 -646087 +POINT-5740097 -860046 +POINT-5704155 -1072830 +POINT-5696319 -1110620 +POINT-5660339 -1284133 +POINT-5651103 -1321607 +POINT-5608696 -1493667 +POINT-5598074 -1530769 +POINT-5549301 -1701126 +POINT-5482231 -1906234 +POINT-5407585 -2108719 +POINT-5325470 -2308273 +POINT-5309468 -2343394 +POINT-5235992 -2504654 +POINT-5139274 -2697555 +POINT-5120707 -2731388 +POINT-5035454 -2886734 +POINT-4924675 -3071930 +POINT-4807083 -3252868 +POINT-4784866 -3284425 +POINT-4682853 -3429321 +POINT-4552147 -3601043 +POINT-4527647 -3630862 +POINT-4415153 -3767776 +POINT-4272049 -3929290 +POINT-4123047 -4085388 +POINT-3968345 -4235840 +POINT-3808151 -4380432 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3440864 -4673786 +POINT-3296920 -4777145 +POINT-3264758 -4798474 +POINT-3117080 -4896408 +POINT-2932922 -5008896 +POINT-2744712 -5114471 +POINT-2710375 -5132089 +POINT-2552711 -5212982 +POINT-2517742 -5229309 +POINT-2357177 -5304275 +POINT-2321627 -5319292 +POINT-2158393 -5388244 +POINT-2122308 -5401930 +POINT-1956619 -5464767 +POINT-1920049 -5477102 +POINT-1752136 -5533737 +POINT-1545234 -5595062 +POINT-1507851 -5604646 +POINT-1336204 -5648651 +POINT-1125312 -5694443 +POINT-912872 -5732345 +POINT-699173 -5762344 +POINT-660781 -5766282 +POINT-484504 -5784363 +POINT-269165 -5798385 +POINT-230586 -5799464 +POINT-53451 -5804413 +POINT-14859 -5804053 +POINT162338 -5802398 +POINT200889 -5800606 +POINT377899 -5792373 +POINT592941 -5774353 +POINT807167 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1269534 -5663643 +POINT1441970 -5622833 +POINT1479171 -5612556 +POINT1649978 -5565368 +POINT1686771 -5553716 +POINT1855705 -5500213 +POINT1892039 -5487199 +POINT2058868 -5427444 +POINT2094692 -5413090 +POINT2259178 -5347183 +POINT2456375 -5259537 +POINT2650177 -5164627 +POINT2840316 -5062561 +POINT3026527 -4953506 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585922 +POINT3589119 -4561698 +POINT3727073 -4450470 +POINT3756198 -4425148 +POINT3889923 -4308883 +POINT4047401 -4161331 +POINT4199280 -4008041 +POINT4345360 -3849197 +POINT4370410 -3819840 +POINT4485428 -3685043 +POINT4509370 -3654774 +POINT4619301 -3515792 +POINT4642102 -3484653 +POINT4746795 -3341674 +POINT4768423 -3309711 +POINT4867729 -3162948 +POINT4981926 -2979843 +POINT5089248 -2792633 +POINT5107184 -2758459 +POINT5189537 -2601547 +POINT5282646 -2406875 +POINT5368461 -2208877 +POINT5382481 -2172921 +POINT5446853 -2007827 +POINT5459528 -1971375 +POINT5517723 -1804000 +POINT5529033 -1767100 +POINT5580963 -1597671 +POINT5590895 -1560378 +POINT5636497 -1389144 +POINT5645035 -1351507 +POINT5684234 -1178695 +POINT5691368 -1140766 +POINT5724121 -966613 +POINT5756096 -753204 +POINT5780113 -538742 +POINT5782980 -500256 +POINT5796142 -323547 +POINT5797578 -284979 +POINT5804168 -107894 +POINT5804168 107910 +POINT5802733 146474 +POINT5796142 323547 +POINT5793276 362035 +POINT5780113 538757 +POINT5775818 577109 +POINT5756096 753204 +POINT5724121 966629 +POINT5684234 1178711 +POINT5675697 1216347 +POINT5636497 1389160 +POINT5580963 1597686 +POINT5569653 1634584 +POINT5517723 1804000 +POINT5505049 1840453 +POINT5446853 2007827 +POINT5432834 2043786 +POINT5368461 2208892 +POINT5353114 2244303 +POINT5282646 2406891 +POINT5189537 2601562 +POINT5089248 2792648 +POINT5070055 2826129 +POINT4981926 2979858 +POINT4961503 3012605 +POINT4867729 3162964 +POINT4746795 3341690 +POINT4619301 3515808 +POINT4595359 3546077 +POINT4485428 3685058 +POINT4345360 3849212 +POINT4319235 3877620 +POINT4199280 4008056 +POINT4047401 4161346 +POINT4019238 4187735 +POINT3889923 4308899 +POINT3727073 4450485 +POINT3559074 4585937 +POINT3528149 4609024 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953521 +POINT2993225 4973025 +POINT2840316 5062576 +POINT2650177 5164627 +POINT2456375 5259552 +POINT2259178 5347198 +POINT2058868 5427459 +POINT2022534 5440474 +POINT1855705 5500229 +POINT1649978 5565384 +POINT1612778 5575661 +POINT1441970 5622848 +POINT1404415 5631734 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807167 5748352 +POINT592941 5774353 +POINT377899 5792389 +POINT339348 5794182 +POINT162338 5802414 +POINT-53451 5804428 +POINT-269165 5798401 +POINT-484504 5784378 +POINT-699173 5762344 +POINT-737391 5756982 +POINT-912872 5732361 +POINT-950865 5725580 +POINT-1125312 5694443 +POINT-1336204 5648666 +POINT-1545234 5595077 +POINT-1582237 5584110 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-1992704 5451097 +POINT-2158393 5388260 +POINT-2193944 5373243 +POINT-2357177 5304291 +POINT-2392147 5287964 +POINT-2552711 5212997 +POINT-2744712 5114486 +POINT-2778372 5095605 +POINT-2932922 5008911 +POINT-2965857 4988794 +POINT-3117080 4896423 +POINT-3296920 4777145 +POINT-3328270 4754637 +POINT-3472213 4651291 +POINT-3642700 4518997 +POINT-3672289 4494219 +POINT-3808151 4380447 +POINT-3968345 4235855 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415153 3767776 +POINT-4552147 3601043 +POINT-4575523 3570335 +POINT-4682853 3429336 +POINT-4705071 3397779 +POINT-4807083 3252884 +POINT-4924675 3071945 +POINT-5035454 2886749 +POINT-5139274 2697570 +POINT-5156572 2663069 +POINT-5235992 2504654 +POINT-5325470 2308288 +POINT-5407585 2108719 +POINT-5420935 2072509 +POINT-5482231 1906250 +POINT-5494226 1869568 +POINT-5549301 1701141 +POINT-5608696 1493682 +POINT-5617932 1456209 +POINT-5660339 1284149 +POINT-5704155 1072845 +POINT-5740097 860061 +POINT-5745105 821794 +POINT-5768097 646087 +POINT-5788124 431228 +POINT-5790276 392693 +POINT-5800155 215759 +POINT-5800872 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID321 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608696 -1493675 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325477 -2308281 +POINT-5235992 -2504654 +POINT-5139274 -2697563 +POINT-5035461 -2886749 +POINT-4924675 -3071937 +POINT-4807091 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4415153 -3767776 +POINT-4272056 -3929306 +POINT-4123054 -4085403 +POINT-3968345 -4235847 +POINT-3808159 -4380447 +POINT-3642707 -4518989 +POINT-3472213 -4651283 +POINT-3296928 -4777145 +POINT-3117080 -4896415 +POINT-2932930 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1752143 -5533752 +POINT-1545242 -5595077 +POINT-1336204 -5648666 +POINT-1125320 -5694443 +POINT-912879 -5732353 +POINT-699180 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162330 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807167 -5748344 +POINT1020271 -5714386 +POINT1231971 -5672531 +POINT1441970 -5622841 +POINT1649971 -5565376 +POINT1855697 -5500221 +POINT2058860 -5427459 +POINT2259178 -5347198 +POINT2456375 -5259552 +POINT2650169 -5164627 +POINT2840309 -5062568 +POINT3026527 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585930 +POINT3727073 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199272 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619301 -3515800 +POINT4746788 -3341690 +POINT4867721 -3162956 +POINT4981926 -2979858 +POINT5089241 -2792640 +POINT5189529 -2601562 +POINT5282646 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5517723 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389152 +POINT5684234 -1178703 +POINT5724113 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5796142 -323547 +POINT5804161 -107902 +POINT5804161 107894 +POINT5796142 323547 +POINT5780105 538742 +POINT5756088 753204 +POINT5724113 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282646 2406883 +POINT5189529 2601555 +POINT5089241 2792633 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4746788 3341682 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199272 4008041 +POINT4047393 4161338 +POINT3889923 4308891 +POINT3727073 4450477 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2840309 5062568 +POINT2650169 5164627 +POINT2456375 5259544 +POINT2259178 5347191 +POINT2058860 5427452 +POINT1855697 5500213 +POINT1649971 5565368 +POINT1441970 5622833 +POINT1231971 5672531 +POINT1020271 5714386 +POINT807167 5748337 +POINT592941 5774353 +POINT377899 5792381 +POINT162330 5802406 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-484504 5784363 +POINT-699180 5762344 +POINT-912879 5732353 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1545242 5595070 +POINT-1752143 5533745 +POINT-1956619 5464775 +POINT-2158393 5388252 +POINT-2357185 5304283 +POINT-2552719 5212982 +POINT-2744720 5114479 +POINT-2932930 5008903 +POINT-3117080 4896408 +POINT-3296928 4777145 +POINT-3472213 4651275 +POINT-3642707 4518982 +POINT-3808159 4380440 +POINT-3968345 4235847 +POINT-4123054 4085395 +POINT-4272056 3929298 +POINT-4415153 3767776 +POINT-4552154 3601043 +POINT-4682861 3429329 +POINT-4807091 3252876 +POINT-4924675 3071937 +POINT-5035461 2886741 +POINT-5139274 2697563 +POINT-5235992 2504654 +POINT-5325477 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5660339 1284141 +POINT-5704162 1072837 +POINT-5740097 860054 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803451 -38586 +POINT-5800155 -215759 +POINT-5798005 -254292 +POINT-5788131 -431221 +POINT-5784549 -469648 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5696325 -1110635 +POINT-5660339 -1284149 +POINT-5608696 -1493675 +POINT-5598074 -1530777 +POINT-5549301 -1701133 +POINT-5537308 -1737815 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325477 -2308281 +POINT-5309474 -2343400 +POINT-5235992 -2504654 +POINT-5218695 -2539154 +POINT-5139274 -2697563 +POINT-5035461 -2886749 +POINT-4924675 -3071937 +POINT-4903646 -3104298 +POINT-4807091 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4527653 -3630862 +POINT-4415153 -3767776 +POINT-4272056 -3929306 +POINT-4245409 -3957222 +POINT-4123054 -4085403 +POINT-4095386 -4112309 +POINT-3968345 -4235847 +POINT-3939697 -4261708 +POINT-3808159 -4380447 +POINT-3642707 -4518989 +POINT-3612216 -4542649 +POINT-3472213 -4651283 +POINT-3296928 -4777145 +POINT-3264764 -4798476 +POINT-3117080 -4896415 +POINT-3084147 -4916534 +POINT-2932930 -5008911 +POINT-2744720 -5114486 +POINT-2710382 -5132103 +POINT-2552719 -5212990 +POINT-2357185 -5304291 +POINT-2158393 -5388260 +POINT-1956619 -5464782 +POINT-1920050 -5477117 +POINT-1752143 -5533752 +POINT-1545242 -5595077 +POINT-1336204 -5648666 +POINT-1298489 -5656853 +POINT-1125320 -5694443 +POINT-1087327 -5701223 +POINT-912879 -5732353 +POINT-699180 -5762344 +POINT-484504 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162330 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807167 -5748344 +POINT1020271 -5714386 +POINT1231971 -5672531 +POINT1441970 -5622841 +POINT1649971 -5565376 +POINT1686763 -5553724 +POINT1855697 -5500221 +POINT2058860 -5427459 +POINT2259178 -5347198 +POINT2294445 -5331524 +POINT2456375 -5259552 +POINT2650169 -5164627 +POINT2840309 -5062568 +POINT2873612 -5043065 +POINT3026527 -4953514 +POINT3059081 -4932787 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559074 -4585930 +POINT3589119 -4561707 +POINT3727073 -4450485 +POINT3756198 -4425162 +POINT3889923 -4308891 +POINT3918085 -4282504 +POINT4047393 -4161346 +POINT4074556 -4133930 +POINT4199272 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4509370 -3654782 +POINT4619301 -3515800 +POINT4642101 -3484662 +POINT4746788 -3341690 +POINT4768416 -3309725 +POINT4867721 -3162956 +POINT4888146 -3130211 +POINT4981926 -2979858 +POINT5089241 -2792640 +POINT5107177 -2758468 +POINT5189529 -2601562 +POINT5282646 -2406883 +POINT5297992 -2371473 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5459528 -1971375 +POINT5517723 -1804000 +POINT5529033 -1767102 +POINT5580963 -1597679 +POINT5590894 -1560386 +POINT5636490 -1389152 +POINT5684234 -1178703 +POINT5724113 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5782974 -500262 +POINT5796142 -323547 +POINT5804161 -107902 +POINT5804161 107894 +POINT5802727 146462 +POINT5796142 323547 +POINT5793274 362033 +POINT5780105 538742 +POINT5775810 577096 +POINT5756088 753204 +POINT5750370 791370 +POINT5724113 966613 +POINT5716981 1004542 +POINT5684234 1178695 +POINT5675696 1216332 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517723 1804000 +POINT5505049 1840453 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5353108 2244289 +POINT5282646 2406883 +POINT5189529 2601555 +POINT5089241 2792633 +POINT5070049 2826115 +POINT4981926 2979850 +POINT4867721 3162956 +POINT4746788 3341682 +POINT4619301 3515792 +POINT4485428 3685043 +POINT4460377 3714402 +POINT4345352 3849205 +POINT4199272 4008041 +POINT4172110 4035457 +POINT4047393 4161338 +POINT4019231 4187727 +POINT3889923 4308891 +POINT3727073 4450477 +POINT3697028 4474701 +POINT3559074 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026527 4953514 +POINT2840309 5062568 +POINT2806304 5080821 +POINT2650169 5164627 +POINT2615511 5181602 +POINT2456375 5259544 +POINT2421108 5275219 +POINT2259178 5347191 +POINT2223353 5361545 +POINT2058860 5427452 +POINT2022526 5440465 +POINT1855697 5500213 +POINT1818905 5511866 +POINT1649971 5565368 +POINT1612772 5575646 +POINT1441970 5622833 +POINT1404414 5631721 +POINT1231971 5672531 +POINT1020271 5714386 +POINT807167 5748337 +POINT768854 5752990 +POINT592941 5774353 +POINT377899 5792381 +POINT339346 5794174 +POINT162330 5802406 +POINT123739 5802765 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-307676 5795884 +POINT-484504 5784363 +POINT-699180 5762344 +POINT-737398 5756981 +POINT-912879 5732353 +POINT-950873 5725573 +POINT-1125320 5694443 +POINT-1336204 5648659 +POINT-1373589 5639075 +POINT-1545242 5595070 +POINT-1752143 5533745 +POINT-1956619 5464775 +POINT-1992704 5451090 +POINT-2158393 5388252 +POINT-2193946 5373235 +POINT-2357185 5304283 +POINT-2392155 5287955 +POINT-2552719 5212982 +POINT-2587057 5195366 +POINT-2744720 5114479 +POINT-2778380 5095598 +POINT-2932930 5008903 +POINT-2965863 4988785 +POINT-3117080 4896408 +POINT-3296928 4777145 +POINT-3328276 4754635 +POINT-3472213 4651275 +POINT-3502705 4627616 +POINT-3642707 4518982 +POINT-3672297 4494205 +POINT-3808159 4380440 +POINT-3968345 4235847 +POINT-3996014 4208940 +POINT-4123054 4085395 +POINT-4149702 4057479 +POINT-4272056 3929298 +POINT-4297648 3900411 +POINT-4415153 3767776 +POINT-4439655 3737957 +POINT-4552154 3601043 +POINT-4575530 3570334 +POINT-4682861 3429329 +POINT-4807091 3252876 +POINT-4828120 3220517 +POINT-4924675 3071937 +POINT-4944488 3038817 +POINT-5035461 2886741 +POINT-5139274 2697563 +POINT-5156572 2663063 +POINT-5235992 2504654 +POINT-5251996 2469534 +POINT-5325477 2308281 +POINT-5340163 2272591 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608696 1493667 +POINT-5617932 1456195 +POINT-5660339 1284141 +POINT-5704162 1072837 +POINT-5710589 1034783 +POINT-5740097 860054 +POINT-5745105 821788 +POINT-5768097 646087 +POINT-5771680 607660 +POINT-5788131 431221 +POINT-5790282 392687 +POINT-5800155 215759 +POINT-5800873 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID332 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608703 -1493675 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-4924682 -3071937 +POINT-4807098 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085403 +POINT-3968353 -4235847 +POINT-3808166 -4380447 +POINT-3642700 -4518989 +POINT-3472213 -4651283 +POINT-3296936 -4777145 +POINT-3117080 -4896415 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357193 -5304291 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1752151 -5533752 +POINT-1545242 -5595077 +POINT-1336212 -5648666 +POINT-1125320 -5694443 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807159 -5748344 +POINT1020263 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855697 -5500221 +POINT2058853 -5427459 +POINT2259170 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026519 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559066 -4585930 +POINT3727066 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619293 -3515800 +POINT4746795 -3341690 +POINT4867721 -3162956 +POINT4981918 -2979858 +POINT5089248 -2792640 +POINT5189529 -2601562 +POINT5282638 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389152 +POINT5684234 -1178695 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5796142 -323547 +POINT5804153 -107902 +POINT5804153 107894 +POINT5796142 323547 +POINT5780105 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282638 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT4981918 2979850 +POINT4867721 3162956 +POINT4746795 3341682 +POINT4619293 3515792 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT3889923 4308891 +POINT3727066 4450477 +POINT3559066 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259170 5347198 +POINT2058853 5427452 +POINT1855697 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231964 5672531 +POINT1020263 5714386 +POINT807159 5748337 +POINT592941 5774353 +POINT377899 5792381 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-484512 5784363 +POINT-699173 5762344 +POINT-912887 5732353 +POINT-1125320 5694443 +POINT-1336212 5648659 +POINT-1545242 5595070 +POINT-1752151 5533745 +POINT-1956619 5464775 +POINT-2158401 5388252 +POINT-2357193 5304283 +POINT-2552719 5212982 +POINT-2744720 5114479 +POINT-2932922 5008903 +POINT-3117080 4896408 +POINT-3296936 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808166 4380440 +POINT-3968353 4235847 +POINT-4123047 4085395 +POINT-4272064 3929298 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4682861 3429329 +POINT-4807098 3252884 +POINT-4924682 3071937 +POINT-5035461 2886741 +POINT-5139282 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493667 +POINT-5660339 1284141 +POINT-5704162 1072837 +POINT-5740097 860054 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803451 -38586 +POINT-5800155 -215759 +POINT-5798005 -254292 +POINT-5788131 -431221 +POINT-5784549 -469648 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5696325 -1110635 +POINT-5660339 -1284149 +POINT-5651105 -1321621 +POINT-5608703 -1493675 +POINT-5598080 -1530777 +POINT-5549301 -1701133 +POINT-5537308 -1737815 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5309468 -2343400 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-5015650 -2919868 +POINT-4924682 -3071937 +POINT-4903653 -3104298 +POINT-4807098 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4527654 -3630862 +POINT-4415161 -3767776 +POINT-4272064 -3929306 +POINT-4123047 -4085403 +POINT-4095381 -4112309 +POINT-3968353 -4235847 +POINT-3939705 -4261708 +POINT-3808166 -4380447 +POINT-3778574 -4405224 +POINT-3642700 -4518989 +POINT-3612210 -4542649 +POINT-3472213 -4651283 +POINT-3440867 -4673792 +POINT-3296936 -4777145 +POINT-3264770 -4798476 +POINT-3117080 -4896415 +POINT-3084145 -4916534 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2710382 -5132103 +POINT-2552719 -5212990 +POINT-2357193 -5304291 +POINT-2158401 -5388260 +POINT-1956619 -5464782 +POINT-1920052 -5477117 +POINT-1752151 -5533752 +POINT-1545242 -5595077 +POINT-1507859 -5604661 +POINT-1336212 -5648666 +POINT-1298496 -5656853 +POINT-1125320 -5694443 +POINT-1087328 -5701223 +POINT-912887 -5732353 +POINT-699173 -5762344 +POINT-484512 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807159 -5748344 +POINT845271 -5742271 +POINT1020263 -5714386 +POINT1231964 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1686769 -5553724 +POINT1855697 -5500221 +POINT2058853 -5427459 +POINT2094678 -5413105 +POINT2259170 -5347198 +POINT2294438 -5331524 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2873617 -5043065 +POINT3026519 -4953514 +POINT3059075 -4932787 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3417078 -4691939 +POINT3559066 -4585930 +POINT3589112 -4561707 +POINT3727066 -4450485 +POINT3889923 -4308891 +POINT3918085 -4282504 +POINT4047393 -4161346 +POINT4074557 -4133930 +POINT4199280 -4008049 +POINT4225404 -3979641 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619293 -3515800 +POINT4642096 -3484662 +POINT4746795 -3341690 +POINT4768422 -3309725 +POINT4867721 -3162956 +POINT4888144 -3130211 +POINT4981918 -2979858 +POINT5001113 -2946376 +POINT5089248 -2792640 +POINT5107183 -2758468 +POINT5189529 -2601562 +POINT5206181 -2566745 +POINT5282638 -2406883 +POINT5297986 -2371473 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5459526 -1971375 +POINT5517715 -1804000 +POINT5529027 -1767102 +POINT5580963 -1597679 +POINT5590894 -1560386 +POINT5636490 -1389152 +POINT5684234 -1178695 +POINT5691368 -1140768 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5782974 -500262 +POINT5796142 -323547 +POINT5797575 -284981 +POINT5804153 -107902 +POINT5804153 107894 +POINT5796142 323547 +POINT5793274 362033 +POINT5780105 538742 +POINT5775810 577096 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5675696 1216332 +POINT5636490 1389144 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5505042 1840453 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282638 2406883 +POINT5265987 2441698 +POINT5189529 2601555 +POINT5171595 2635727 +POINT5089248 2792633 +POINT4981918 2979850 +POINT4961495 3012597 +POINT4867721 3162956 +POINT4846095 3194919 +POINT4746795 3341682 +POINT4723993 3372820 +POINT4619293 3515792 +POINT4485428 3685043 +POINT4460377 3714402 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT4019231 4187727 +POINT3889923 4308891 +POINT3860797 4334213 +POINT3727066 4450477 +POINT3559066 4585922 +POINT3528143 4609011 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026519 4953514 +POINT2993219 4973017 +POINT2840316 5062568 +POINT2806311 5080821 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259170 5347198 +POINT2223345 5361551 +POINT2058853 5427452 +POINT2022520 5440465 +POINT1855697 5500213 +POINT1818906 5511866 +POINT1649978 5565368 +POINT1612778 5575646 +POINT1441970 5622833 +POINT1404413 5631721 +POINT1231964 5672531 +POINT1020263 5714386 +POINT807159 5748337 +POINT768848 5752990 +POINT592941 5774353 +POINT377899 5792381 +POINT339348 5794174 +POINT162338 5802406 +POINT123746 5802765 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-307678 5795884 +POINT-484512 5784363 +POINT-699173 5762344 +POINT-737394 5756981 +POINT-912887 5732353 +POINT-1125320 5694443 +POINT-1336212 5648659 +POINT-1545242 5595070 +POINT-1752151 5533745 +POINT-1956619 5464775 +POINT-1992706 5451090 +POINT-2158401 5388252 +POINT-2193953 5373235 +POINT-2357193 5304283 +POINT-2392161 5287955 +POINT-2552719 5212982 +POINT-2587057 5195366 +POINT-2744720 5114479 +POINT-2778378 5095598 +POINT-2932922 5008903 +POINT-2965857 4988785 +POINT-3117080 4896408 +POINT-3149246 4875079 +POINT-3296936 4777145 +POINT-3328282 4754635 +POINT-3472213 4651275 +POINT-3502703 4627616 +POINT-3642700 4518982 +POINT-3808166 4380440 +POINT-3836814 4354581 +POINT-3968353 4235847 +POINT-3996019 4208940 +POINT-4123047 4085395 +POINT-4149697 4057479 +POINT-4272064 3929298 +POINT-4297656 3900411 +POINT-4415161 3767776 +POINT-4552154 3601043 +POINT-4575530 3570334 +POINT-4682861 3429329 +POINT-4705080 3397773 +POINT-4807098 3252884 +POINT-4924682 3071937 +POINT-4944494 3038817 +POINT-5035461 2886741 +POINT-5054029 2852908 +POINT-5139282 2697563 +POINT-5156578 2663063 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608703 1493667 +POINT-5617938 1456195 +POINT-5660339 1284141 +POINT-5704162 1072837 +POINT-5710589 1034783 +POINT-5740097 860054 +POINT-5745105 821788 +POINT-5768097 646087 +POINT-5771680 607660 +POINT-5788131 431221 +POINT-5790282 392687 +POINT-5800155 215759 +POINT-5800873 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID343 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431221 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608688 -1493675 +POINT-5549301 -1701133 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-4924667 -3071937 +POINT-4807083 -3252884 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235847 +POINT-3808151 -4380447 +POINT-3642700 -4518989 +POINT-3472213 -4651283 +POINT-3296920 -4777145 +POINT-3117080 -4896415 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545242 -5595077 +POINT-1336196 -5648666 +POINT-1125320 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807174 -5748344 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1855697 -5500221 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585930 +POINT3727081 -4450485 +POINT3889923 -4308891 +POINT4047393 -4161346 +POINT4199280 -4008049 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619308 -3515800 +POINT4746795 -3341690 +POINT4867721 -3162956 +POINT4981933 -2979858 +POINT5089248 -2792640 +POINT5189529 -2601562 +POINT5282654 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5517715 -1804000 +POINT5580963 -1597679 +POINT5636490 -1389152 +POINT5684234 -1178703 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5796142 -323547 +POINT5804168 -107902 +POINT5804168 107894 +POINT5796142 323547 +POINT5780105 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517715 1804000 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5089248 2792633 +POINT4981933 2979850 +POINT4867721 3162956 +POINT4746795 3341682 +POINT4619308 3515792 +POINT4485428 3685043 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT3889923 4308891 +POINT3727081 4450477 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837608 +POINT3026535 4953514 +POINT2840316 5062568 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347191 +POINT2058868 5427452 +POINT1855697 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT592941 5774353 +POINT377899 5792381 +POINT162338 5802406 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533745 +POINT-1956619 5464775 +POINT-2158386 5388252 +POINT-2357177 5304283 +POINT-2552719 5212982 +POINT-2744720 5114479 +POINT-2932922 5008903 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929298 +POINT-4415146 3767776 +POINT-4552154 3601043 +POINT-4682861 3429329 +POINT-4807083 3252876 +POINT-4924667 3071930 +POINT-5035461 2886741 +POINT-5139282 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5608688 1493667 +POINT-5660339 1284141 +POINT-5704162 1072837 +POINT-5740097 860054 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803451 -38586 +POINT-5800155 -215759 +POINT-5798005 -254292 +POINT-5788131 -431221 +POINT-5784549 -469648 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5696325 -1110635 +POINT-5660339 -1284149 +POINT-5651102 -1321621 +POINT-5608688 -1493675 +POINT-5549301 -1701133 +POINT-5537308 -1737815 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5309468 -2343400 +POINT-5235992 -2504654 +POINT-5139282 -2697563 +POINT-5035461 -2886749 +POINT-5015647 -2919868 +POINT-4924667 -3071937 +POINT-4903638 -3104298 +POINT-4807083 -3252884 +POINT-4784867 -3284441 +POINT-4682861 -3429336 +POINT-4552154 -3601043 +POINT-4527652 -3630862 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235847 +POINT-3939690 -4261708 +POINT-3808151 -4380447 +POINT-3642700 -4518989 +POINT-3612210 -4542649 +POINT-3472213 -4651283 +POINT-3440864 -4673792 +POINT-3296920 -4777145 +POINT-3264758 -4798476 +POINT-3117080 -4896415 +POINT-3084145 -4916534 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2710382 -5132103 +POINT-2552719 -5212990 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1920049 -5477117 +POINT-1752136 -5533752 +POINT-1545242 -5595077 +POINT-1507856 -5604661 +POINT-1336196 -5648666 +POINT-1298483 -5656853 +POINT-1125320 -5694443 +POINT-1087325 -5701223 +POINT-912872 -5732353 +POINT-699173 -5762344 +POINT-484497 -5784370 +POINT-269165 -5798401 +POINT-53451 -5804420 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807174 -5748344 +POINT845286 -5742271 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622841 +POINT1649978 -5565376 +POINT1686769 -5553724 +POINT1855697 -5500221 +POINT1892033 -5487208 +POINT2058868 -5427459 +POINT2094693 -5413105 +POINT2259185 -5347198 +POINT2294451 -5331524 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2873620 -5043065 +POINT3026535 -4953514 +POINT3059088 -4932787 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3417081 -4691939 +POINT3559082 -4585930 +POINT3589127 -4561707 +POINT3727081 -4450485 +POINT3889923 -4308891 +POINT3918085 -4282504 +POINT4047393 -4161346 +POINT4074557 -4133930 +POINT4199280 -4008049 +POINT4225404 -3979641 +POINT4345352 -3849205 +POINT4485428 -3685051 +POINT4619308 -3515800 +POINT4642108 -3484662 +POINT4746795 -3341690 +POINT4768422 -3309725 +POINT4867721 -3162956 +POINT4888147 -3130211 +POINT4981933 -2979858 +POINT5001126 -2946376 +POINT5089248 -2792640 +POINT5107183 -2758468 +POINT5189529 -2601562 +POINT5206184 -2566745 +POINT5282654 -2406883 +POINT5368454 -2208885 +POINT5446853 -2007827 +POINT5459526 -1971375 +POINT5517715 -1804000 +POINT5529027 -1767102 +POINT5580963 -1597679 +POINT5590894 -1560386 +POINT5636490 -1389152 +POINT5684234 -1178703 +POINT5691368 -1140774 +POINT5724121 -966621 +POINT5756088 -753204 +POINT5780105 -538749 +POINT5782974 -500262 +POINT5796142 -323547 +POINT5797578 -284981 +POINT5804168 -107902 +POINT5804168 107894 +POINT5802733 146462 +POINT5796142 323547 +POINT5793274 362033 +POINT5780105 538742 +POINT5775810 577096 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5675696 1216332 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517715 1804000 +POINT5505042 1840453 +POINT5446853 2007827 +POINT5368454 2208877 +POINT5282654 2406883 +POINT5189529 2601555 +POINT5171595 2635727 +POINT5089248 2792633 +POINT5070056 2826115 +POINT4981933 2979850 +POINT4961508 3012597 +POINT4867721 3162956 +POINT4846095 3194919 +POINT4746795 3341682 +POINT4619308 3515792 +POINT4595365 3546061 +POINT4485428 3685043 +POINT4460377 3714402 +POINT4345352 3849205 +POINT4199280 4008041 +POINT4047393 4161338 +POINT4019231 4187727 +POINT3889923 4308891 +POINT3860800 4334213 +POINT3727081 4450477 +POINT3697036 4474701 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837608 +POINT3176004 4858337 +POINT3026535 4953514 +POINT2840316 5062568 +POINT2806311 5080821 +POINT2650177 5164627 +POINT2456375 5259544 +POINT2259185 5347191 +POINT2058868 5427452 +POINT2022533 5440465 +POINT1855697 5500213 +POINT1818906 5511866 +POINT1649978 5565368 +POINT1612778 5575646 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT768860 5752990 +POINT592941 5774353 +POINT377899 5792381 +POINT339348 5794174 +POINT162338 5802406 +POINT123746 5802765 +POINT-53451 5804413 +POINT-269165 5798393 +POINT-307675 5795884 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-737391 5756981 +POINT-912872 5732353 +POINT-1125320 5694443 +POINT-1336196 5648659 +POINT-1545242 5595070 +POINT-1752136 5533745 +POINT-1956619 5464775 +POINT-1992703 5451090 +POINT-2158386 5388252 +POINT-2193938 5373235 +POINT-2357177 5304283 +POINT-2392148 5287955 +POINT-2552719 5212982 +POINT-2587057 5195366 +POINT-2744720 5114479 +POINT-2778378 5095598 +POINT-2932922 5008903 +POINT-2965857 4988785 +POINT-3117080 4896408 +POINT-3149243 4875079 +POINT-3296920 4777145 +POINT-3328270 4754635 +POINT-3472213 4651275 +POINT-3502703 4627616 +POINT-3642700 4518982 +POINT-3808151 4380440 +POINT-3836799 4354581 +POINT-3968338 4235847 +POINT-4123047 4085395 +POINT-4272049 3929298 +POINT-4297641 3900411 +POINT-4415146 3767776 +POINT-4552154 3601043 +POINT-4575530 3570334 +POINT-4682861 3429329 +POINT-4807083 3252876 +POINT-4924667 3071930 +POINT-4944482 3038810 +POINT-5035461 2886741 +POINT-5054029 2852908 +POINT-5139282 2697563 +POINT-5156578 2663063 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108719 +POINT-5482239 1906242 +POINT-5549301 1701133 +POINT-5559922 1664030 +POINT-5608688 1493667 +POINT-5660339 1284141 +POINT-5704162 1072837 +POINT-5710589 1034783 +POINT-5740097 860054 +POINT-5745105 821788 +POINT-5768097 646087 +POINT-5771680 607660 +POINT-5788131 431221 +POINT-5790282 392687 +POINT-5800155 215759 +POINT-5800873 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID354 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788131 -431221 +POINT-5768097 -646083 +POINT-5740097 -860057 +POINT-5704162 -1072841 +POINT-5660339 -1284141 +POINT-5608688 -1493667 +POINT-5549301 -1701129 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504650 +POINT-5139267 -2697563 +POINT-5035461 -2886741 +POINT-4924667 -3071933 +POINT-4807083 -3252880 +POINT-4682861 -3429332 +POINT-4552154 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929302 +POINT-4123047 -4085399 +POINT-3968338 -4235847 +POINT-3808151 -4380443 +POINT-3642700 -4518982 +POINT-3472213 -4651279 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008907 +POINT-2744720 -5114479 +POINT-2552719 -5212986 +POINT-2357177 -5304287 +POINT-2158386 -5388256 +POINT-1956619 -5464779 +POINT-1752136 -5533748 +POINT-1545242 -5595070 +POINT-1336196 -5648659 +POINT-1125320 -5694443 +POINT-912872 -5732353 +POINT-699173 -5762340 +POINT-484497 -5784366 +POINT-269165 -5798397 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT592941 -5774353 +POINT807174 -5748340 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622837 +POINT1649978 -5565372 +POINT1855697 -5500213 +POINT2058868 -5427456 +POINT2259185 -5347194 +POINT2456375 -5259544 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT3026535 -4953514 +POINT3208557 -4837612 +POINT3386154 -4715027 +POINT3559082 -4585922 +POINT3727081 -4450481 +POINT3889923 -4308887 +POINT4047393 -4161342 +POINT4199280 -4008041 +POINT4345352 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515792 +POINT4746795 -3341682 +POINT4867721 -3162952 +POINT4981933 -2979854 +POINT5089248 -2792633 +POINT5189529 -2601555 +POINT5282654 -2406883 +POINT5368454 -2208881 +POINT5446853 -2007827 +POINT5517715 -1803997 +POINT5580963 -1597675 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966617 +POINT5756088 -753200 +POINT5780105 -538745 +POINT5796142 -323543 +POINT5804168 -107898 +POINT5804168 107898 +POINT5796142 323547 +POINT5780105 538749 +POINT5756088 753204 +POINT5724121 966621 +POINT5684234 1178699 +POINT5636490 1389148 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5446853 2007831 +POINT5368454 2208885 +POINT5282654 2406883 +POINT5189529 2601558 +POINT5089248 2792637 +POINT4981933 2979854 +POINT4867721 3162956 +POINT4746795 3341686 +POINT4619308 3515796 +POINT4485428 3685047 +POINT4345352 3849205 +POINT4199280 4008045 +POINT4047393 4161342 +POINT3889923 4308891 +POINT3727081 4450485 +POINT3559082 4585926 +POINT3386154 4715030 +POINT3208557 4837616 +POINT3026535 4953518 +POINT2840316 5062572 +POINT2650177 5164627 +POINT2456375 5259548 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855697 5500217 +POINT1649978 5565372 +POINT1441970 5622841 +POINT1231979 5672535 +POINT1020278 5714386 +POINT807174 5748344 +POINT592941 5774353 +POINT377899 5792385 +POINT162338 5802410 +POINT-53451 5804416 +POINT-269165 5798401 +POINT-484497 5784370 +POINT-699173 5762344 +POINT-912872 5732357 +POINT-1125320 5694443 +POINT-1336196 5648662 +POINT-1545242 5595073 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2552719 5212990 +POINT-2744720 5114483 +POINT-2932922 5008907 +POINT-3117080 4896412 +POINT-3296920 4777149 +POINT-3472213 4651279 +POINT-3642700 4518986 +POINT-3808151 4380443 +POINT-3968338 4235851 +POINT-4123047 4085399 +POINT-4272049 3929306 +POINT-4415146 3767780 +POINT-4552154 3601043 +POINT-4682861 3429332 +POINT-4807083 3252884 +POINT-4924667 3071937 +POINT-5035461 2886745 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108722 +POINT-5482239 1906246 +POINT-5549301 1701133 +POINT-5608688 1493671 +POINT-5660339 1284145 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788131 431221 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803451 -38586 +POINT-5800155 -215759 +POINT-5798005 -254292 +POINT-5788131 -431221 +POINT-5784549 -469647 +POINT-5768097 -646083 +POINT-5740097 -860057 +POINT-5704162 -1072841 +POINT-5696325 -1110630 +POINT-5660339 -1284141 +POINT-5651102 -1321613 +POINT-5608688 -1493667 +POINT-5549301 -1701129 +POINT-5537308 -1737812 +POINT-5482239 -1906242 +POINT-5407593 -2108719 +POINT-5325470 -2308281 +POINT-5235992 -2504650 +POINT-5139267 -2697563 +POINT-5035461 -2886741 +POINT-5015647 -2919861 +POINT-4924667 -3071933 +POINT-4903638 -3104294 +POINT-4807083 -3252880 +POINT-4784867 -3284437 +POINT-4682861 -3429332 +POINT-4552154 -3601043 +POINT-4527652 -3630862 +POINT-4415146 -3767776 +POINT-4389554 -3796664 +POINT-4272049 -3929302 +POINT-4245401 -3957219 +POINT-4123047 -4085399 +POINT-4095378 -4112306 +POINT-3968338 -4235847 +POINT-3939690 -4261707 +POINT-3808151 -4380443 +POINT-3778561 -4405220 +POINT-3642700 -4518982 +POINT-3472213 -4651279 +POINT-3440864 -4673789 +POINT-3296920 -4777145 +POINT-3264758 -4798474 +POINT-3117080 -4896408 +POINT-3084145 -4916528 +POINT-2932922 -5008907 +POINT-2744720 -5114479 +POINT-2552719 -5212986 +POINT-2357177 -5304287 +POINT-2158386 -5388256 +POINT-1956619 -5464779 +POINT-1752136 -5533748 +POINT-1715135 -5544715 +POINT-1545242 -5595070 +POINT-1507856 -5604654 +POINT-1336196 -5648659 +POINT-1298483 -5656847 +POINT-1125320 -5694443 +POINT-1087325 -5701223 +POINT-912872 -5732353 +POINT-874654 -5737716 +POINT-699173 -5762340 +POINT-484497 -5784366 +POINT-269165 -5798397 +POINT-230586 -5799473 +POINT-53451 -5804413 +POINT162338 -5802406 +POINT377899 -5792381 +POINT416357 -5789157 +POINT592941 -5774353 +POINT631255 -5769701 +POINT807174 -5748340 +POINT845286 -5742268 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1269534 -5663644 +POINT1441970 -5622837 +POINT1479171 -5612560 +POINT1649978 -5565372 +POINT1686769 -5553719 +POINT1855697 -5500213 +POINT1892033 -5487201 +POINT2058868 -5427456 +POINT2259185 -5347194 +POINT2294451 -5331519 +POINT2456375 -5259544 +POINT2491035 -5242569 +POINT2650177 -5164627 +POINT2840316 -5062568 +POINT2873620 -5043065 +POINT3026535 -4953514 +POINT3059088 -4932786 +POINT3208557 -4837612 +POINT3386154 -4715027 +POINT3559082 -4585922 +POINT3589127 -4561700 +POINT3727081 -4450481 +POINT3889923 -4308887 +POINT3918085 -4282500 +POINT4047393 -4161342 +POINT4074557 -4133926 +POINT4199280 -4008041 +POINT4225404 -3979635 +POINT4345352 -3849205 +POINT4485428 -3685047 +POINT4619308 -3515792 +POINT4642108 -3484654 +POINT4746795 -3341682 +POINT4768422 -3309718 +POINT4867721 -3162952 +POINT4888147 -3130207 +POINT4981933 -2979854 +POINT5001126 -2946371 +POINT5089248 -2792633 +POINT5107183 -2758460 +POINT5189529 -2601555 +POINT5206184 -2566739 +POINT5282654 -2406883 +POINT5368454 -2208881 +POINT5446853 -2007827 +POINT5459526 -1971374 +POINT5517715 -1803997 +POINT5529027 -1767098 +POINT5580963 -1597675 +POINT5590894 -1560381 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5691368 -1140767 +POINT5724121 -966617 +POINT5756088 -753200 +POINT5780105 -538745 +POINT5782974 -500258 +POINT5796142 -323543 +POINT5797578 -284977 +POINT5804168 -107898 +POINT5804168 107898 +POINT5802733 146465 +POINT5796142 323547 +POINT5793274 362034 +POINT5780105 538749 +POINT5775810 577103 +POINT5756088 753204 +POINT5750371 791372 +POINT5724121 966621 +POINT5684234 1178699 +POINT5675696 1216336 +POINT5636490 1389148 +POINT5580963 1597679 +POINT5517715 1804000 +POINT5505042 1840454 +POINT5446853 2007831 +POINT5432832 2043788 +POINT5368454 2208885 +POINT5282654 2406883 +POINT5189529 2601558 +POINT5171595 2635731 +POINT5089248 2792637 +POINT5070056 2826119 +POINT4981933 2979854 +POINT4961508 3012600 +POINT4867721 3162956 +POINT4846095 3194920 +POINT4746795 3341686 +POINT4619308 3515796 +POINT4595365 3546065 +POINT4485428 3685047 +POINT4460377 3714405 +POINT4345352 3849205 +POINT4199280 4008045 +POINT4047393 4161342 +POINT4019231 4187730 +POINT3889923 4308891 +POINT3860800 4334214 +POINT3727081 4450485 +POINT3559082 4585926 +POINT3386154 4715030 +POINT3208557 4837616 +POINT3026535 4953518 +POINT2840316 5062572 +POINT2806311 5080824 +POINT2650177 5164627 +POINT2615517 5181603 +POINT2456375 5259548 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855697 5500217 +POINT1818906 5511870 +POINT1649978 5565372 +POINT1612778 5575650 +POINT1441970 5622841 +POINT1231979 5672535 +POINT1194118 5680020 +POINT1020278 5714386 +POINT982167 5720459 +POINT807174 5748344 +POINT768860 5752996 +POINT592941 5774353 +POINT554482 5777578 +POINT377899 5792385 +POINT339348 5794178 +POINT162338 5802410 +POINT123746 5802769 +POINT-53451 5804416 +POINT-92030 5803341 +POINT-269165 5798401 +POINT-307675 5795892 +POINT-484497 5784370 +POINT-522889 5780431 +POINT-699173 5762344 +POINT-912872 5732357 +POINT-1125320 5694443 +POINT-1336196 5648662 +POINT-1545242 5595073 +POINT-1582243 5584107 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-1992703 5451097 +POINT-2158386 5388260 +POINT-2193938 5373243 +POINT-2357177 5304291 +POINT-2552719 5212990 +POINT-2744720 5114483 +POINT-2932922 5008907 +POINT-3117080 4896412 +POINT-3149243 4875083 +POINT-3296920 4777149 +POINT-3328270 4754638 +POINT-3472213 4651279 +POINT-3502703 4627620 +POINT-3642700 4518986 +POINT-3808151 4380443 +POINT-3968338 4235851 +POINT-4123047 4085399 +POINT-4272049 3929306 +POINT-4415146 3767780 +POINT-4552154 3601043 +POINT-4575530 3570334 +POINT-4682861 3429332 +POINT-4705077 3397776 +POINT-4807083 3252884 +POINT-4924667 3071937 +POINT-4944482 3038817 +POINT-5035461 2886745 +POINT-5054026 2852912 +POINT-5139267 2697563 +POINT-5235992 2504654 +POINT-5325470 2308281 +POINT-5407593 2108722 +POINT-5420943 2072511 +POINT-5482239 1906246 +POINT-5549301 1701133 +POINT-5559922 1664030 +POINT-5608688 1493671 +POINT-5660339 1284145 +POINT-5704162 1072845 +POINT-5710589 1034791 +POINT-5740097 860061 +POINT-5745105 821794 +POINT-5768097 646087 +POINT-5771680 607660 +POINT-5788131 431221 +POINT-5790282 392687 +POINT-5800155 215759 +POINT-5800873 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID365 +TOTAL_HEIGHT2753757 +POLYGON_AT_HEIGHT0 +POINT-5804168 0 +POINT-5800155 -215759 +POINT-5788116 -431228 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5660339 -1284149 +POINT-5608688 -1493667 +POINT-5549301 -1701141 +POINT-5482223 -1906250 +POINT-5407593 -2108719 +POINT-5325470 -2308288 +POINT-5235992 -2504654 +POINT-5139267 -2697570 +POINT-5035446 -2886749 +POINT-4924667 -3071945 +POINT-4807083 -3252884 +POINT-4682846 -3429336 +POINT-4552154 -3601043 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3296920 -4777145 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2552703 -5212982 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1752136 -5533752 +POINT-1545242 -5595077 +POINT-1336196 -5648666 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-484497 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807174 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1441970 -5622833 +POINT1649978 -5565368 +POINT1855712 -5500213 +POINT2058868 -5427459 +POINT2259185 -5347198 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2840316 -5062576 +POINT3026535 -4953521 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585922 +POINT3727081 -4450485 +POINT3889923 -4308899 +POINT4047393 -4161346 +POINT4199280 -4008041 +POINT4345352 -3849212 +POINT4485428 -3685043 +POINT4619308 -3515792 +POINT4746795 -3341690 +POINT4867721 -3162964 +POINT4981933 -2979858 +POINT5089248 -2792633 +POINT5189529 -2601562 +POINT5282654 -2406891 +POINT5368469 -2208877 +POINT5446853 -2007827 +POINT5517730 -1804000 +POINT5580963 -1597686 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5724121 -966613 +POINT5756088 -753204 +POINT5780121 -538742 +POINT5796142 -323547 +POINT5804168 -107894 +POINT5804168 107894 +POINT5796142 323547 +POINT5780121 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517730 1804000 +POINT5446853 2007827 +POINT5368469 2208877 +POINT5282654 2406875 +POINT5189529 2601562 +POINT5089248 2792633 +POINT4981933 2979858 +POINT4867721 3162948 +POINT4746795 3341690 +POINT4619308 3515792 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4199280 4008041 +POINT4047393 4161346 +POINT3889923 4308883 +POINT3727081 4450485 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3026535 4953506 +POINT2840316 5062561 +POINT2650177 5164627 +POINT2456375 5259537 +POINT2259185 5347198 +POINT2058868 5427459 +POINT1855712 5500213 +POINT1649978 5565368 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT592941 5774353 +POINT377899 5792389 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-912872 5732345 +POINT-1125320 5694443 +POINT-1336196 5648666 +POINT-1545242 5595077 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-2158386 5388260 +POINT-2357177 5304291 +POINT-2552703 5212982 +POINT-2744720 5114486 +POINT-2932922 5008911 +POINT-3117080 4896408 +POINT-3296920 4777145 +POINT-3472213 4651275 +POINT-3642700 4518982 +POINT-3808151 4380447 +POINT-3968338 4235840 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415146 3767776 +POINT-4552154 3601043 +POINT-4682846 3429336 +POINT-4807083 3252884 +POINT-4924667 3071930 +POINT-5035446 2886749 +POINT-5139267 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5482223 1906234 +POINT-5549301 1701126 +POINT-5608688 1493667 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5740097 860061 +POINT-5768097 646087 +POINT-5788116 431213 +POINT-5800155 215759 +POLYGON_AT_HEIGHT2000000 +POINT-5804168 0 +POINT-5803451 -38586 +POINT-5800155 -215759 +POINT-5798002 -254294 +POINT-5788116 -431228 +POINT-5784536 -469654 +POINT-5768097 -646087 +POINT-5740097 -860061 +POINT-5704162 -1072845 +POINT-5696325 -1110635 +POINT-5660339 -1284149 +POINT-5651102 -1321619 +POINT-5608688 -1493667 +POINT-5549301 -1701141 +POINT-5537305 -1737823 +POINT-5482223 -1906250 +POINT-5407593 -2108719 +POINT-5325470 -2308288 +POINT-5309468 -2343406 +POINT-5235992 -2504654 +POINT-5139267 -2697570 +POINT-5035446 -2886749 +POINT-5015634 -2919870 +POINT-4924667 -3071945 +POINT-4807083 -3252884 +POINT-4682846 -3429336 +POINT-4552154 -3601043 +POINT-4527652 -3630862 +POINT-4415146 -3767776 +POINT-4272049 -3929306 +POINT-4123047 -4085403 +POINT-3968338 -4235855 +POINT-3939690 -4261714 +POINT-3808151 -4380447 +POINT-3642700 -4518982 +POINT-3472213 -4651275 +POINT-3440864 -4673786 +POINT-3296920 -4777145 +POINT-3264758 -4798474 +POINT-3117080 -4896408 +POINT-2932922 -5008911 +POINT-2744720 -5114486 +POINT-2710380 -5132101 +POINT-2552703 -5212982 +POINT-2517735 -5229312 +POINT-2357177 -5304291 +POINT-2158386 -5388260 +POINT-1956619 -5464782 +POINT-1920049 -5477117 +POINT-1752136 -5533752 +POINT-1545242 -5595077 +POINT-1507856 -5604661 +POINT-1336196 -5648666 +POINT-1298483 -5656853 +POINT-1125320 -5694443 +POINT-912872 -5732361 +POINT-699173 -5762344 +POINT-660780 -5766282 +POINT-484497 -5784363 +POINT-269165 -5798401 +POINT-53451 -5804413 +POINT162338 -5802414 +POINT377899 -5792389 +POINT592941 -5774353 +POINT807174 -5748337 +POINT1020278 -5714386 +POINT1231979 -5672531 +POINT1269534 -5663643 +POINT1441970 -5622833 +POINT1479171 -5612556 +POINT1649978 -5565368 +POINT1686772 -5553716 +POINT1855712 -5500213 +POINT1892045 -5487202 +POINT2058868 -5427459 +POINT2094693 -5413105 +POINT2259185 -5347198 +POINT2294451 -5331524 +POINT2456375 -5259552 +POINT2650177 -5164627 +POINT2684182 -5146376 +POINT2840316 -5062576 +POINT3026535 -4953521 +POINT3059088 -4932793 +POINT3208557 -4837616 +POINT3386154 -4715027 +POINT3559082 -4585922 +POINT3727081 -4450485 +POINT3756204 -4425164 +POINT3889923 -4308899 +POINT4047393 -4161346 +POINT4074557 -4133929 +POINT4199280 -4008041 +POINT4225404 -3979636 +POINT4345352 -3849212 +POINT4485428 -3685043 +POINT4619308 -3515792 +POINT4642108 -3484656 +POINT4746795 -3341690 +POINT4768422 -3309726 +POINT4867721 -3162964 +POINT4888147 -3130217 +POINT4981933 -2979858 +POINT5001126 -2946375 +POINT5089248 -2792633 +POINT5107183 -2758461 +POINT5189529 -2601562 +POINT5206184 -2566747 +POINT5282654 -2406891 +POINT5368469 -2208877 +POINT5382488 -2172921 +POINT5446853 -2007827 +POINT5459529 -1971375 +POINT5517730 -1804000 +POINT5529039 -1767103 +POINT5580963 -1597686 +POINT5590894 -1560390 +POINT5636490 -1389144 +POINT5684234 -1178695 +POINT5691368 -1140766 +POINT5724121 -966613 +POINT5729838 -928447 +POINT5756088 -753204 +POINT5780121 -538742 +POINT5796142 -323547 +POINT5797578 -284979 +POINT5804168 -107894 +POINT5804168 107894 +POINT5802733 146462 +POINT5796142 323547 +POINT5793277 362033 +POINT5780121 538742 +POINT5756088 753204 +POINT5724121 966613 +POINT5684234 1178695 +POINT5675696 1216332 +POINT5636490 1389144 +POINT5580963 1597671 +POINT5517730 1804000 +POINT5505055 1840453 +POINT5446853 2007827 +POINT5432835 2043783 +POINT5368469 2208877 +POINT5353122 2244287 +POINT5282654 2406875 +POINT5189529 2601562 +POINT5171595 2635733 +POINT5089248 2792633 +POINT5070056 2826116 +POINT4981933 2979858 +POINT4961508 3012602 +POINT4867721 3162948 +POINT4846095 3194915 +POINT4746795 3341690 +POINT4619308 3515792 +POINT4595365 3546061 +POINT4485428 3685043 +POINT4345352 3849197 +POINT4199280 4008041 +POINT4047393 4161346 +POINT4019231 4187732 +POINT3889923 4308883 +POINT3860800 4334208 +POINT3727081 4450485 +POINT3697036 4474707 +POINT3559082 4585922 +POINT3386154 4715027 +POINT3208557 4837616 +POINT3176004 4858342 +POINT3026535 4953506 +POINT2993231 4973010 +POINT2840316 5062561 +POINT2806311 5080815 +POINT2650177 5164627 +POINT2615517 5181601 +POINT2456375 5259537 +POINT2259185 5347198 +POINT2058868 5427459 +POINT2022535 5440471 +POINT1855712 5500213 +POINT1818919 5511866 +POINT1649978 5565368 +POINT1612778 5575646 +POINT1441970 5622833 +POINT1231979 5672531 +POINT1020278 5714386 +POINT807174 5748337 +POINT768860 5752990 +POINT592941 5774353 +POINT377899 5792389 +POINT339348 5794182 +POINT162338 5802414 +POINT-53451 5804413 +POINT-269165 5798401 +POINT-484497 5784363 +POINT-699173 5762344 +POINT-737391 5756979 +POINT-912872 5732345 +POINT-950866 5725567 +POINT-1125320 5694443 +POINT-1336196 5648666 +POINT-1545242 5595077 +POINT-1582243 5584110 +POINT-1752136 5533752 +POINT-1956619 5464782 +POINT-1992703 5451097 +POINT-2158386 5388260 +POINT-2193938 5373243 +POINT-2357177 5304291 +POINT-2392146 5287961 +POINT-2552703 5212982 +POINT-2587044 5195367 +POINT-2744720 5114486 +POINT-2778378 5095605 +POINT-2932922 5008911 +POINT-2965857 4988791 +POINT-3117080 4896408 +POINT-3149243 4875079 +POINT-3296920 4777145 +POINT-3328270 4754635 +POINT-3472213 4651275 +POINT-3502703 4627616 +POINT-3642700 4518982 +POINT-3808151 4380447 +POINT-3968338 4235840 +POINT-4123047 4085403 +POINT-4272049 3929306 +POINT-4415146 3767776 +POINT-4552154 3601043 +POINT-4575527 3570335 +POINT-4682846 3429336 +POINT-4705065 3397779 +POINT-4807083 3252884 +POINT-4828112 3220522 +POINT-4924667 3071930 +POINT-4944479 3038812 +POINT-5035446 2886749 +POINT-5139267 2697555 +POINT-5235992 2504654 +POINT-5325470 2308273 +POINT-5407593 2108719 +POINT-5482223 1906234 +POINT-5494220 1869552 +POINT-5549301 1701126 +POINT-5559922 1664024 +POINT-5608688 1493667 +POINT-5660339 1284149 +POINT-5704162 1072845 +POINT-5710589 1034791 +POINT-5740097 860061 +POINT-5745105 821794 +POINT-5768097 646087 +POINT-5788116 431213 +POINT-5800155 215759 +POINT-5800873 177172 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.6 b/src/libseqarrange/data/arrange_data_export.txt.6 new file mode 100644 index 0000000000..3df8886cb3 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.6 @@ -0,0 +1,300 @@ +OBJECT_ID131 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID66 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID44 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 11999992 +POINT17000000 15999992 +POINT-17000000 15999992 +POINT-21000000 11999992 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 3999992 +POINT-21000000 3999992 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID88 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID77 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000008 +POINT17000000 16000008 +POINT-17000000 16000008 +POINT-21000000 12000008 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID120 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -15999992 +POINT21000000 -15999992 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID99 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID151 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID162 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 12000000 +POINT24439178 16000000 +POINT-24439194 16000000 +POINT-30189590 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 12000000 +POINT26286238 14715178 +POINT24439178 16000000 +POINT-24439194 16000000 +POINT-28342532 13284822 +POINT-30189590 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 4000000 +POINT-30189590 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-30189590 -16000000 +POINT30189576 -16000000 +POINT30189576 4000000 +POINT-30189590 4000000 +OBJECT_ID192 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID203 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 12000002 +POINT17000000 16000002 +POINT-17000000 16000002 +POINT-21000000 12000002 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 12000002 +POINT17000000 16000002 +POINT-17000000 16000002 +POINT-21000000 12000002 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -15999999 +POINT21000000 -15999999 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID223 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 12000000 +POINT17000004 16000000 +POINT-16999998 16000000 +POINT-20999998 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 12000000 +POINT17000004 16000000 +POINT-16999998 16000000 +POINT-20999998 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 4000000 +POINT-20999998 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-20999998 -16000000 +POINT21000004 -16000000 +POINT21000004 4000000 +POINT-20999998 4000000 +OBJECT_ID234 +TOTAL_HEIGHT62265434 +POLYGON_AT_HEIGHT0 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000002 16000000 +POINT-21000002 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000002 16000000 +POINT-21000002 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000002 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000002 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000002 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.7 b/src/libseqarrange/data/arrange_data_export.txt.7 new file mode 100644 index 0000000000..05022fe1bf --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.7 @@ -0,0 +1,995 @@ +OBJECT_ID86 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID66 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID193 +TOTAL_HEIGHT12500000 +POLYGON_AT_HEIGHT0 +POINT-26999998 0 +POINT-26995364 -500228 +POINT-26981462 -1000286 +POINT-26975326 -1153968 +POINT-26974998 -1161602 +POINT-26958300 -1500000 +POINT-26778226 -3453476 +POINT-26775286 -3476200 +POINT-26385466 -5727745 +POINT-26377336 -5765064 +POINT-25799916 -7960167 +POINT-25784100 -8011245 +POINT-25025852 -10134426 +POINT-24999968 -10198116 +POINT-24068934 -12234638 +POINT-24030742 -12309479 +POINT-22936150 -14245453 +POINT-22883602 -14329712 +POINT-21635780 -16152184 +POINT-21567044 -16243851 +POINT-20177326 -17940888 +POINT-20123058 -18001740 +POINT-20090806 -18037724 +POINT-19786084 -18371468 +POINT-19442322 -18734890 +POINT-19091880 -19091882 +POINT-18734890 -19442322 +POINT-18571438 -19598510 +POINT-18465824 -19698054 +POINT-18371468 -19786086 +POINT-18001736 -20123058 +POINT-16829856 -21112930 +POINT-16704128 -21212546 +POINT-14965305 -22473086 +POINT-14818760 -22569988 +POINT-12991406 -23669036 +POINT-12823677 -23760330 +POINT-10922585 -24692046 +POINT-10733654 -24774758 +POINT-8773953 -25534638 +POINT-8564163 -25605762 +POINT-6561214 -26190656 +POINT-6331264 -26247190 +POINT-4300533 -26655308 +POINT-4051494 -26694296 +POINT-2008430 -26925196 +POINT-1741725 -26943764 +POINT-1500000 -26958302 +POINT-1000286 -26981464 +POINT-500228 -26995366 +POINT0 -27000000 +POINT23000000 -27000000 +POINT26639062 -4400032 +POINT26900054 -2321048 +POINT26909614 -2207405 +POINT26958306 -1500000 +POINT26981468 -1000286 +POINT26995370 -500228 +POINT27000000 0 +POINT26995370 500228 +POINT26981468 1000286 +POINT26958306 1500000 +POINT26909614 2207405 +POINT26900054 2321048 +POINT26639062 4400032 +POINT23000000 27000000 +POINT0 27000000 +POINT-500228 26995362 +POINT-1000286 26981460 +POINT-1500000 26958298 +POINT-1741725 26943764 +POINT-2008430 26925194 +POINT-4051494 26694298 +POINT-4300533 26655304 +POINT-6331264 26247192 +POINT-6561214 26190658 +POINT-8564163 25605758 +POINT-8773953 25534638 +POINT-10733654 24774758 +POINT-10922585 24692048 +POINT-12823677 23760330 +POINT-12991406 23669036 +POINT-14818760 22569992 +POINT-14965305 22473084 +POINT-16704128 21212548 +POINT-16829856 21112930 +POINT-18001736 20123062 +POINT-18371468 19786088 +POINT-18465824 19698052 +POINT-18571438 19598510 +POINT-18734890 19442322 +POINT-19091880 19091880 +POINT-19442322 18734894 +POINT-19786084 18371468 +POINT-20090806 18037720 +POINT-20123058 18001740 +POINT-20177326 17940888 +POINT-21567044 16243851 +POINT-21635780 16152184 +POINT-22883602 14329712 +POINT-22936150 14245453 +POINT-24030742 12309479 +POINT-24068934 12234638 +POINT-24999968 10198116 +POINT-25025852 10134426 +POINT-25784100 8011245 +POINT-25799916 7960167 +POINT-26377336 5765064 +POINT-26385466 5727745 +POINT-26775286 3476200 +POINT-26778226 3453476 +POINT-26958300 1500000 +POINT-26974998 1161602 +POINT-26975326 1153968 +POINT-26981462 1000286 +POINT-26995364 500228 +POLYGON_AT_HEIGHT2000000 +POINT-26999998 0 +POINT-26995364 -500228 +POINT-26981462 -1000286 +POINT-26975326 -1153968 +POINT-26958300 -1500000 +POINT-26778226 -3453476 +POINT-26775756 -3472564 +POINT-26712916 -3836447 +POINT-26385466 -5727745 +POINT-26378638 -5759093 +POINT-26284948 -6116280 +POINT-25799916 -7960167 +POINT-25786630 -8003073 +POINT-25662780 -8350955 +POINT-25025852 -10134426 +POINT-25004108 -10187926 +POINT-24851002 -10523960 +POINT-24068934 -12234638 +POINT-24036854 -12297504 +POINT-23855608 -12619235 +POINT-22936150 -14245453 +POINT-22892010 -14316231 +POINT-22683950 -14621307 +POINT-21635780 -16152184 +POINT-21578042 -16229183 +POINT-20177326 -17940888 +POINT-20123058 -18001740 +POINT-19786084 -18371468 +POINT-19442322 -18734890 +POINT-19091880 -19091882 +POINT-18734890 -19442322 +POINT-18571438 -19598510 +POINT-18371468 -19786086 +POINT-18001736 -20123058 +POINT-16829856 -21112930 +POINT-16724245 -21196608 +POINT-16425917 -21414232 +POINT-14965305 -22473086 +POINT-14842207 -22554484 +POINT-14526383 -22745836 +POINT-12991406 -23669036 +POINT-12850513 -23745724 +POINT-12519503 -23909404 +POINT-10922585 -24692046 +POINT-10763883 -24761524 +POINT-10420102 -24896338 +POINT-8773953 -25534638 +POINT-8597730 -25594384 +POINT-8243691 -25699344 +POINT-6561214 -26190656 +POINT-6368056 -26238146 +POINT-6006347 -26312488 +POINT-4300533 -26655308 +POINT-4091341 -26688058 +POINT-2008430 -26925196 +POINT-1580575 -26953456 +POINT-1500000 -26958302 +POINT-1000286 -26981464 +POINT-500228 -26995366 +POINT0 -27000000 +POINT23000000 -27000000 +POINT26639062 -4400032 +POINT26858296 -2653686 +POINT26901584 -2302865 +POINT26909614 -2207405 +POINT26958306 -1500000 +POINT26981468 -1000286 +POINT26995370 -500228 +POINT27000000 0 +POINT26995370 500228 +POINT26981468 1000286 +POINT26958306 1500000 +POINT26909614 2207405 +POINT26901584 2302865 +POINT26858296 2653686 +POINT26639062 4400032 +POINT23000000 27000000 +POINT0 27000000 +POINT-500228 26995362 +POINT-1000286 26981460 +POINT-1500000 26958298 +POINT-1580575 26953454 +POINT-2008430 26925194 +POINT-4091341 26688058 +POINT-4300533 26655304 +POINT-6006347 26312490 +POINT-6368056 26238148 +POINT-6561214 26190658 +POINT-8243691 25699342 +POINT-8597730 25594380 +POINT-8773953 25534638 +POINT-10420102 24896338 +POINT-10763883 24761524 +POINT-10922585 24692048 +POINT-12519503 23909404 +POINT-12850513 23745724 +POINT-12991406 23669036 +POINT-14526383 22745840 +POINT-14842207 22554488 +POINT-14965305 22473084 +POINT-16425917 21414232 +POINT-16724245 21196610 +POINT-16829856 21112930 +POINT-18001736 20123062 +POINT-18371468 19786088 +POINT-18571438 19598510 +POINT-18734890 19442322 +POINT-19091880 19091880 +POINT-19442322 18734894 +POINT-19786084 18371468 +POINT-20123058 18001740 +POINT-20177326 17940888 +POINT-21578042 16229183 +POINT-21635780 16152184 +POINT-22683950 14621307 +POINT-22892010 14316231 +POINT-22936150 14245453 +POINT-23855608 12619235 +POINT-24036854 12297504 +POINT-24068934 12234638 +POINT-24851002 10523960 +POINT-25004108 10187926 +POINT-25025852 10134426 +POINT-25662780 8350955 +POINT-25786630 8003073 +POINT-25799916 7960167 +POINT-26284948 6116280 +POINT-26378638 5759093 +POINT-26385466 5727745 +POINT-26712916 3836447 +POINT-26775756 3472564 +POINT-26778226 3453476 +POINT-26958300 1500000 +POINT-26975326 1153968 +POINT-26981462 1000286 +POINT-26995364 500228 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID170 +TOTAL_HEIGHT97534781 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID138 +TOTAL_HEIGHT41580278 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 11999998 +POINT17000000 15999998 +POINT-17000000 15999998 +POINT-21000000 11999998 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 11999998 +POINT17000000 15999998 +POINT-17000000 15999998 +POINT-19076012 13923987 +POINT-21000000 11999998 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 3999998 +POINT-21000000 3999998 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 3999998 +POINT-21000000 3999998 +OBJECT_ID44 +TOTAL_HEIGHT10000000 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT20999992 -16000000 +POINT20999992 12000000 +POINT16999992 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT20999992 -16000000 +POINT20999992 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +OBJECT_ID149 +TOTAL_HEIGHT97534781 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID118 +TOTAL_HEIGHT41580278 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-19076012 13923989 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID97 +TOTAL_HEIGHT41580278 +POLYGON_AT_HEIGHT0 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT2000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 12000000 +POINT17000000 16000000 +POINT-17000000 16000000 +POINT-19076012 13923989 +POINT-21000000 12000000 +POLYGON_AT_HEIGHT18000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +POLYGON_AT_HEIGHT26000000 +POINT-21000000 -16000000 +POINT21000000 -16000000 +POINT21000000 4000000 +POINT-21000000 4000000 +OBJECT_ID216 +TOTAL_HEIGHT49742861 +POLYGON_AT_HEIGHT0 +POINT-27000000 0 +POINT-26995362 -500228 +POINT-26981446 -1000289 +POINT-26975312 -1153968 +POINT-26975006 -1161598 +POINT-26958282 -1500000 +POINT-26778228 -3453476 +POINT-26775268 -3476204 +POINT-26385468 -5727745 +POINT-26377320 -5765068 +POINT-25799896 -7960167 +POINT-25784088 -8011245 +POINT-25025848 -10134430 +POINT-24999970 -10198113 +POINT-24068940 -12234634 +POINT-24030732 -12309479 +POINT-22936158 -14245453 +POINT-22883606 -14329712 +POINT-21635772 -16152184 +POINT-21567048 -16243851 +POINT-20177308 -17940888 +POINT-20123046 -18001740 +POINT-20090790 -18037720 +POINT-19786072 -18371468 +POINT-19442322 -18734894 +POINT-19091888 -19091880 +POINT-18734894 -19442322 +POINT-18571442 -19598510 +POINT-18465820 -19698052 +POINT-18371460 -19786088 +POINT-18001740 -20123062 +POINT-16829864 -21112930 +POINT-16704132 -21212548 +POINT-14965302 -22473084 +POINT-14818756 -22569992 +POINT-12991394 -23669036 +POINT-12823669 -23760330 +POINT-10922577 -24692048 +POINT-10733643 -24774758 +POINT-8773956 -25534638 +POINT-8564148 -25605758 +POINT-6561218 -26190658 +POINT-6331268 -26247192 +POINT-4300537 -26655304 +POINT-4051483 -26694298 +POINT-2008422 -26925194 +POINT-1741729 -26943764 +POINT-1500000 -26958298 +POINT-1000274 -26981460 +POINT-500213 -26995362 +POINT0 -27000000 +POINT23000000 -27000000 +POINT26639068 -4400032 +POINT26900054 -2321052 +POINT26909608 -2207405 +POINT26958314 -1500000 +POINT26981476 -1000289 +POINT26995362 -500228 +POINT27000000 0 +POINT26995362 500228 +POINT26981476 1000289 +POINT26958314 1500000 +POINT26909608 2207405 +POINT26900054 2321052 +POINT26639068 4400032 +POINT23000000 27000000 +POINT0 27000000 +POINT-500213 26995362 +POINT-1000274 26981460 +POINT-1500000 26958298 +POINT-1741729 26943756 +POINT-2008422 26925202 +POINT-4051483 26694290 +POINT-4300537 26655304 +POINT-6331268 26247192 +POINT-6561218 26190658 +POINT-8564148 25605758 +POINT-8773956 25534638 +POINT-10733643 24774750 +POINT-10922577 24692048 +POINT-12823669 23760330 +POINT-12991394 23669036 +POINT-14818756 22569992 +POINT-14965302 22473084 +POINT-16704132 21212548 +POINT-16829864 21112930 +POINT-18001740 20123062 +POINT-18371460 19786088 +POINT-18465820 19698052 +POINT-18571442 19598510 +POINT-18734894 19442322 +POINT-19091888 19091880 +POINT-19442322 18734894 +POINT-19786072 18371468 +POINT-20090790 18037720 +POINT-20123046 18001740 +POINT-20177308 17940888 +POINT-21567048 16243851 +POINT-21635772 16152184 +POINT-22883606 14329712 +POINT-22936158 14245453 +POINT-24030732 12309479 +POINT-24068940 12234634 +POINT-24999970 10198113 +POINT-25025848 10134430 +POINT-25784088 8011245 +POINT-25799896 7960167 +POINT-26377320 5765068 +POINT-26385468 5727745 +POINT-26775268 3476204 +POINT-26778228 3453476 +POINT-26958282 1500000 +POINT-26975006 1161598 +POINT-26975312 1153968 +POINT-26981446 1000289 +POINT-26995362 500228 +POLYGON_AT_HEIGHT2000000 +POINT-27000000 0 +POINT-26995362 -500228 +POINT-26981446 -1000289 +POINT-26975312 -1153968 +POINT-26970804 -1246636 +POINT-26958282 -1500000 +POINT-26778228 -3453476 +POINT-26775386 -3475290 +POINT-26759596 -3566731 +POINT-26385468 -5727745 +POINT-26377648 -5763567 +POINT-26354104 -5853326 +POINT-25799896 -7960167 +POINT-25784724 -8009192 +POINT-25753602 -8096612 +POINT-25025848 -10134430 +POINT-25001010 -10195552 +POINT-24962536 -10279995 +POINT-24068940 -12234634 +POINT-24032266 -12306470 +POINT-23986722 -12387318 +POINT-22936158 -14245453 +POINT-22885720 -14326324 +POINT-22833436 -14402988 +POINT-21635772 -16152184 +POINT-21569810 -16240166 +POINT-20177308 -17940888 +POINT-20123046 -18001740 +POINT-20098896 -18028678 +POINT-20014218 -18121588 +POINT-19786072 -18371468 +POINT-19442322 -18734894 +POINT-19091888 -19091880 +POINT-18734894 -19442322 +POINT-18571442 -19598510 +POINT-18442108 -19720174 +POINT-18371460 -19786088 +POINT-18001740 -20123062 +POINT-16829864 -21112930 +POINT-16709187 -21208542 +POINT-16634220 -21263230 +POINT-14965302 -22473084 +POINT-14824648 -22566096 +POINT-14745284 -22614182 +POINT-12991394 -23669036 +POINT-12830413 -23756660 +POINT-12747232 -23797792 +POINT-10922577 -24692048 +POINT-10741239 -24771432 +POINT-10654850 -24805310 +POINT-8773956 -25534638 +POINT-8572584 -25602900 +POINT-8483617 -25629276 +POINT-6561218 -26190658 +POINT-6340513 -26244918 +POINT-6249619 -26263602 +POINT-4300537 -26655304 +POINT-4061496 -26692730 +POINT-2008422 -26925194 +POINT-1701233 -26946200 +POINT-1500000 -26958298 +POINT-1000274 -26981460 +POINT-500213 -26995362 +POINT0 -27000000 +POINT23000000 -27000000 +POINT26639068 -4400032 +POINT26889560 -2404641 +POINT26900438 -2316483 +POINT26909608 -2207405 +POINT26958314 -1500000 +POINT26981476 -1000289 +POINT26995362 -500228 +POINT27000000 0 +POINT26995362 500228 +POINT26981476 1000289 +POINT26958314 1500000 +POINT26909608 2207405 +POINT26900438 2316483 +POINT26889560 2404641 +POINT26639068 4400032 +POINT23000000 27000000 +POINT0 27000000 +POINT-500213 26995362 +POINT-1000274 26981460 +POINT-1500000 26958298 +POINT-1701233 26946192 +POINT-2008422 26925202 +POINT-4061496 26692722 +POINT-4300537 26655304 +POINT-6249619 26263602 +POINT-6340513 26244918 +POINT-6561218 26190658 +POINT-8483617 25629276 +POINT-8572584 25602900 +POINT-8773956 25534638 +POINT-10654850 24805302 +POINT-10741239 24771426 +POINT-10922577 24692048 +POINT-12747232 23797792 +POINT-12830413 23756660 +POINT-12991394 23669036 +POINT-14745284 22614182 +POINT-14824648 22566096 +POINT-14965302 22473084 +POINT-16634220 21263230 +POINT-16709187 21208542 +POINT-16829864 21112930 +POINT-18001740 20123062 +POINT-18371460 19786088 +POINT-18442108 19720174 +POINT-18571442 19598510 +POINT-18734894 19442322 +POINT-19091888 19091880 +POINT-19442322 18734894 +POINT-19786072 18371468 +POINT-20014218 18121588 +POINT-20098896 18028678 +POINT-20123046 18001740 +POINT-20177308 17940888 +POINT-21569810 16240166 +POINT-21635772 16152184 +POINT-22833436 14402988 +POINT-22885720 14326324 +POINT-22936158 14245453 +POINT-23986722 12387318 +POINT-24032266 12306470 +POINT-24068940 12234634 +POINT-24962536 10279995 +POINT-25001010 10195552 +POINT-25025848 10134430 +POINT-25753602 8096612 +POINT-25784724 8009192 +POINT-25799896 7960167 +POINT-26354104 5853326 +POINT-26377648 5763567 +POINT-26385468 5727745 +POINT-26759596 3566731 +POINT-26775386 3475290 +POINT-26778228 3453476 +POINT-26958282 1500000 +POINT-26970804 1246636 +POINT-26975312 1153968 +POINT-26981446 1000289 +POINT-26995362 500228 +POLYGON_AT_HEIGHT18000000 +POINT-26996042 -185031 +POINT-26992146 -605051 +POINT-26980462 -1024931 +POINT-26975312 -1153968 +POINT-26961014 -1444516 +POINT-26929412 -1813227 +POINT-26778228 -3453476 +POINT-26776340 -3467979 +POINT-26634214 -4290949 +POINT-26385468 -5727745 +POINT-26380268 -5751562 +POINT-26168374 -6559388 +POINT-25799896 -7960167 +POINT-25789808 -7992762 +POINT-25509710 -8779543 +POINT-25025848 -10134430 +POINT-25009334 -10175068 +POINT-24663066 -10935050 +POINT-24068940 -12234634 +POINT-24044558 -12282395 +POINT-23634648 -13010033 +POINT-22936158 -14245453 +POINT-22902622 -14299222 +POINT-22432064 -14989193 +POINT-21635772 -16152184 +POINT-21591918 -16210680 +POINT-20177308 -17940888 +POINT-20131746 -17991982 +POINT-19848804 -18302428 +POINT-19560172 -18607580 +POINT-19302682 -18873370 +POINT-19008438 -19173114 +POINT-18708684 -19467366 +POINT-18571442 -19598510 +POINT-18403526 -19756010 +POINT-18093088 -20038954 +POINT-17813838 -20281780 +POINT-16829864 -21112930 +POINT-16749630 -21176500 +POINT-16074917 -21668686 +POINT-14965302 -22473084 +POINT-14871785 -22534926 +POINT-14157505 -22967694 +POINT-12991394 -23669036 +POINT-12884362 -23727294 +POINT-12135738 -24097482 +POINT-10922577 -24692048 +POINT-10802011 -24744828 +POINT-10024509 -25049728 +POINT-8773956 -25534638 +POINT-8640069 -25580022 +POINT-7839366 -25817412 +POINT-6561218 -26190658 +POINT-6414478 -26226734 +POINT-5596426 -26394872 +POINT-4300537 -26655304 +POINT-4141605 -26680188 +POINT-2008422 -26925194 +POINT-1581522 -26952990 +POINT-1161924 -26972438 +POINT-792050 -26984170 +POINT-372170 -26995840 +POINT0 -27000000 +POINT23000000 -27000000 +POINT26639068 -4400032 +POINT26805614 -3073354 +POINT26903512 -2279928 +POINT26909608 -2207405 +POINT26950502 -1613427 +POINT26969952 -1193842 +POINT26984446 -839900 +POINT26996106 -420020 +POINT27000000 0 +POINT26996106 420020 +POINT26984446 839900 +POINT26969952 1193842 +POINT26950502 1613427 +POINT26909608 2207405 +POINT26903512 2279928 +POINT26805614 3073354 +POINT26639068 4400032 +POINT23000000 27000000 +POINT0 27000000 +POINT-372170 26995840 +POINT-792050 26984170 +POINT-1161924 26972440 +POINT-1581522 26952992 +POINT-2008422 26925202 +POINT-4141605 26680184 +POINT-4300537 26655304 +POINT-5596426 26394872 +POINT-6414478 26226734 +POINT-6561218 26190658 +POINT-7839366 25817412 +POINT-8640069 25580022 +POINT-8773956 25534638 +POINT-10024509 25049722 +POINT-10802011 24744824 +POINT-10922577 24692048 +POINT-12135738 24097482 +POINT-12884362 23727294 +POINT-12991394 23669036 +POINT-14157505 22967694 +POINT-14871785 22534926 +POINT-14965302 22473084 +POINT-16074917 21668686 +POINT-16749630 21176500 +POINT-16829864 21112930 +POINT-17813838 20281780 +POINT-18093088 20038954 +POINT-18403526 19756010 +POINT-18571442 19598510 +POINT-18708684 19467366 +POINT-19008438 19173114 +POINT-19302682 18873370 +POINT-19560172 18607580 +POINT-19848804 18302428 +POINT-20131746 17991982 +POINT-20177308 17940888 +POINT-21591918 16210680 +POINT-21635772 16152184 +POINT-22432064 14989193 +POINT-22902622 14299222 +POINT-22936158 14245453 +POINT-23634648 13010033 +POINT-24044558 12282395 +POINT-24068940 12234634 +POINT-24663066 10935050 +POINT-25009334 10175068 +POINT-25025848 10134430 +POINT-25509710 8779543 +POINT-25789808 7992762 +POINT-25799896 7960167 +POINT-26168374 6559388 +POINT-26380268 5751562 +POINT-26385468 5727745 +POINT-26634214 4290949 +POINT-26776340 3467979 +POINT-26778228 3453476 +POINT-26929412 1813227 +POINT-26961014 1444516 +POINT-26975312 1153968 +POINT-26980462 1024931 +POINT-26992146 605051 +POINT-26996042 185031 +POLYGON_AT_HEIGHT26000000 +POINT-26990816 -429227 +POINT-26987904 -743392 +POINT-26979164 -1057452 +POINT-26975312 -1153968 +POINT-26964616 -1371290 +POINT-26891310 -2226611 +POINT-26778228 -3453476 +POINT-26776816 -3464324 +POINT-26571524 -4653057 +POINT-26385468 -5727745 +POINT-26381578 -5745559 +POINT-26075508 -6912420 +POINT-25799896 -7960167 +POINT-25792350 -7984547 +POINT-25387766 -9121009 +POINT-25025848 -10134430 +POINT-25013496 -10164826 +POINT-24513330 -11262578 +POINT-24068940 -12234634 +POINT-24050702 -12270358 +POINT-23458610 -13321389 +POINT-22936158 -14245453 +POINT-22911074 -14285670 +POINT-22231378 -15282296 +POINT-21635772 -16152184 +POINT-21602968 -16195938 +POINT-20177308 -17940888 +POINT-20143228 -17979106 +POINT-19931594 -18211310 +POINT-19715706 -18439556 +POINT-19118392 -19056124 +POINT-18898304 -19280324 +POINT-18674098 -19500418 +POINT-18571442 -19598510 +POINT-18445844 -19716316 +POINT-18213644 -19927952 +POINT-17565852 -20491252 +POINT-16829864 -21112930 +POINT-16769852 -21160478 +POINT-15795266 -21871414 +POINT-14965302 -22473084 +POINT-14895353 -22519338 +POINT-13863616 -23144450 +POINT-12991394 -23669036 +POINT-12911337 -23712612 +POINT-11829991 -24247328 +POINT-10922577 -24692048 +POINT-10832397 -24731526 +POINT-9709338 -25171938 +POINT-8773956 -25534638 +POINT-8673812 -25568584 +POINT-7517240 -25911478 +POINT-6561218 -26190658 +POINT-6451460 -26217644 +POINT-5269829 -26460508 +POINT-4300537 -26655304 +POINT-4181660 -26673916 +POINT-2008422 -26925194 +POINT-1689112 -26945984 +POINT-1375263 -26960532 +POINT-517244 -26987744 +POINT-203185 -26996474 +POINT0 -27000000 +POINT23000000 -27000000 +POINT26639068 -4400032 +POINT26763642 -3407710 +POINT26905048 -2261650 +POINT26909608 -2207405 +POINT26940198 -1763125 +POINT26954744 -1449286 +POINT26988366 -628224 +POINT26997088 -314164 +POINT27000000 0 +POINT26997088 314164 +POINT26988366 628224 +POINT26954744 1449286 +POINT26940198 1763125 +POINT26909608 2207405 +POINT26905048 2261650 +POINT26763642 3407710 +POINT26639068 4400032 +POINT23000000 27000000 +POINT0 27000000 +POINT-203185 26996474 +POINT-517244 26987744 +POINT-1375263 26960536 +POINT-1689112 26945988 +POINT-2008422 26925202 +POINT-4181660 26673912 +POINT-4300537 26655304 +POINT-5269829 26460508 +POINT-6451460 26217644 +POINT-6561218 26190658 +POINT-7517240 25911478 +POINT-8673812 25568584 +POINT-8773956 25534638 +POINT-9709338 25171934 +POINT-10832397 24731522 +POINT-10922577 24692048 +POINT-11829991 24247328 +POINT-12911337 23712612 +POINT-12991394 23669036 +POINT-13863616 23144450 +POINT-14895353 22519338 +POINT-14965302 22473084 +POINT-15795266 21871414 +POINT-16769852 21160478 +POINT-16829864 21112930 +POINT-17565852 20491252 +POINT-18213644 19927952 +POINT-18445844 19716316 +POINT-18571442 19598510 +POINT-18674098 19500418 +POINT-18898304 19280324 +POINT-19118392 19056124 +POINT-19715706 18439556 +POINT-19931594 18211310 +POINT-20143228 17979106 +POINT-20177308 17940888 +POINT-21602968 16195938 +POINT-21635772 16152184 +POINT-22231378 15282296 +POINT-22911074 14285670 +POINT-22936158 14245453 +POINT-23458610 13321389 +POINT-24050702 12270358 +POINT-24068940 12234634 +POINT-24513330 11262578 +POINT-25013496 10164826 +POINT-25025848 10134430 +POINT-25387766 9121009 +POINT-25792350 7984547 +POINT-25799896 7960167 +POINT-26075508 6912420 +POINT-26381578 5745559 +POINT-26385468 5727745 +POINT-26571524 4653057 +POINT-26776816 3464324 +POINT-26778228 3453476 +POINT-26891310 2226611 +POINT-26964616 1371290 +POINT-26975312 1153968 +POINT-26979164 1057452 +POINT-26987904 743392 +POINT-26990816 429227 diff --git a/src/libseqarrange/data/arrange_data_export.txt.8 b/src/libseqarrange/data/arrange_data_export.txt.8 new file mode 100644 index 0000000000..872390fd60 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.8 @@ -0,0 +1,203 @@ +OBJECT_ID59718 +TOTAL_HEIGHT116368285 +POLYGON_AT_HEIGHT0 +POINT-7710861 -2930458 +POINT-7707222 -3083679 +POINT-7699829 -3209861 +POINT-7685402 -3363395 +POINT-2260902 -55237504 +POINT-1260887 -58487504 +POINT6989113 -62487504 +POINT7486778 -62487504 +POINT61788988 -38312500 +POINT62038988 -38062500 +POINT66539124 -16912506 +POINT67539120 9062737 +POINT67539120 13962257 +POINT67531600 14029007 +POINT67509416 14092415 +POINT67473664 14149292 +POINT62544312 19337638 +POINT61544252 20337502 +POINT54889100 21987496 +POINT40431564 22095054 +POINT20646660 22095054 +POINT6189102 21987496 +POINT-460884 20337502 +POINT-1460884 19337502 +POINT-2610908 16437492 +POINT-7560394 -1825576 +POINT-7598305 -1970169 +POINT-7626922 -2097168 +POINT-7654808 -2244987 +POINT-7674316 -2372749 +POINT-7691887 -2523094 +POINT-7702331 -2650962 +POINT-7709389 -2803115 +POLYGON_AT_HEIGHT2000000 +POINT-7710861 -2930458 +POINT-7707222 -3083679 +POINT-7699829 -3209861 +POINT-7685402 -3363395 +POINT-2260902 -55237504 +POINT-1260887 -58487504 +POINT6989113 -62487504 +POINT7486778 -62487504 +POINT61788988 -38312500 +POINT62038988 -38062500 +POINT66539124 -16912506 +POINT67539120 9062737 +POINT67539120 13962257 +POINT67531600 14029007 +POINT67509416 14092415 +POINT67473664 14149292 +POINT62544312 19337638 +POINT61544252 20337502 +POINT54889100 21987496 +POINT40431564 22095054 +POINT20646660 22095054 +POINT6189102 21987496 +POINT-460884 20337502 +POINT-1460884 19337502 +POINT-2610908 16437492 +POINT-7560394 -1825576 +POINT-7598305 -1970169 +POINT-7626922 -2097168 +POINT-7654808 -2244987 +POINT-7674316 -2372749 +POINT-7691887 -2523094 +POINT-7702331 -2650962 +POINT-7709389 -2803115 +POLYGON_AT_HEIGHT18000000 +POINT-7710861 -2930458 +POINT-7707222 -3083679 +POINT-7699829 -3209861 +POINT-7685402 -3363395 +POINT-2260902 -55237504 +POINT-1260887 -58487504 +POINT6989113 -62487504 +POINT7486778 -62487504 +POINT61788988 -38312500 +POINT62038988 -38062500 +POINT66539124 -16912506 +POINT67539120 9062737 +POINT67539120 13962257 +POINT67531600 14029007 +POINT67509416 14092415 +POINT67473664 14149292 +POINT62544312 19337638 +POINT61544252 20337502 +POINT54889100 21987496 +POINT40431564 22095054 +POINT20646660 22095054 +POINT6189102 21987496 +POINT-460884 20337502 +POINT-1460884 19337502 +POINT-2610908 16437492 +POINT-7560394 -1825576 +POINT-7598305 -1970169 +POINT-7626922 -2097168 +POINT-7654808 -2244987 +POINT-7674316 -2372749 +POINT-7691887 -2523094 +POINT-7702331 -2650962 +POINT-7709389 -2803115 +POLYGON_AT_HEIGHT26000000 +POINT-7710861 -2930458 +POINT-7707222 -3083679 +POINT-7699829 -3209861 +POINT-7685402 -3363395 +POINT-1260887 -58487504 +POINT6989113 -62487504 +POINT7486778 -62487504 +POINT61788988 -38312500 +POINT62038988 -38062500 +POINT66539124 -16912506 +POINT67539120 9062737 +POINT67539120 13962257 +POINT67531600 14029007 +POINT67509416 14092415 +POINT67473664 14149292 +POINT62544312 19337638 +POINT61544252 20337502 +POINT40289108 22095054 +POINT20789108 22095054 +POINT-460884 20337502 +POINT-1460884 19337502 +POINT-2610908 16437492 +POINT-7560394 -1825576 +POINT-7598305 -1970169 +POINT-7626922 -2097168 +POINT-7654808 -2244987 +POINT-7674316 -2372749 +POINT-7691887 -2523094 +POINT-7702331 -2650962 +POINT-7709389 -2803115 +OBJECT_ID60283 +TOTAL_HEIGHT4881713 +POLYGON_AT_HEIGHT0 +POINT25329362 -20516270 +POINT25485672 -20632454 +POINT26588958 -21452420 +POINT28265686 -22698566 +POINT28573074 -22927010 +POINT29412644 -22564042 +POINT30698128 -22008292 +POINT31931172 -21475212 +POINT32282688 -21323238 +POINT32305150 -21129768 +POINT32477166 -19647592 +POINT32714222 -17604950 +POINT32731174 -17458848 +POINT32748584 -17308732 +POINT32592274 -17192550 +POINT31747394 -16564632 +POINT29898408 -15190464 +POINT29639892 -14998341 +POINT29504868 -14897995 +POINT29099488 -15073250 +POINT28970840 -15128868 +POINT28122376 -15495682 +POINT26507690 -16193756 +POINT25974030 -16424473 +POINT25795258 -16501766 +POINT25777832 -16651882 +POINT25709610 -17239712 +POINT25632752 -17901958 +POINT25559860 -18530036 +POINT25394532 -19954612 +POINT25346772 -20366154 +POLYGON_AT_HEIGHT2000000 +POINT25329362 -20516270 +POINT25485672 -20632454 +POINT26588958 -21452420 +POINT28265686 -22698566 +POINT28573074 -22927010 +POINT29412644 -22564042 +POINT30698128 -22008292 +POINT31931172 -21475212 +POINT32282688 -21323238 +POINT32305150 -21129768 +POINT32477166 -19647592 +POINT32714222 -17604950 +POINT32731174 -17458848 +POINT32748584 -17308732 +POINT32592274 -17192550 +POINT31747394 -16564632 +POINT29898408 -15190464 +POINT29639892 -14998341 +POINT29504868 -14897995 +POINT29099488 -15073250 +POINT28970840 -15128868 +POINT28122376 -15495682 +POINT26507690 -16193756 +POINT25974030 -16424473 +POINT25795258 -16501766 +POINT25777832 -16651882 +POINT25709610 -17239712 +POINT25632752 -17901958 +POINT25559860 -18530036 +POINT25394532 -19954612 +POINT25346772 -20366154 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.9 b/src/libseqarrange/data/arrange_data_export.txt.9 new file mode 100644 index 0000000000..1ef0c7f003 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.9 @@ -0,0 +1,209 @@ +OBJECT_ID59718 +TOTAL_HEIGHT116368285 +POLYGON_AT_HEIGHT0 +POINT-7710865 -2930461 +POINT-7707222 -3083680 +POINT-7699833 -3209864 +POINT-7685402 -3363396 +POINT-2260904 -55237504 +POINT-1260889 -58487504 +POINT6989111 -62487504 +POINT7486776 -62487504 +POINT61788980 -38312500 +POINT62038984 -38062500 +POINT66539116 -16912502 +POINT67539120 9062737 +POINT67539120 13962261 +POINT67531592 14029011 +POINT67509408 14092415 +POINT67473656 14149292 +POINT62544304 19337636 +POINT61544256 20337498 +POINT54889104 21987500 +POINT40431556 22095054 +POINT20646656 22095054 +POINT6189096 21987500 +POINT-460887 20337498 +POINT-1460887 19337498 +POINT-2610914 16437496 +POINT-7560398 -1825574 +POINT-7598305 -1970165 +POINT-7626926 -2097170 +POINT-7654808 -2244987 +POINT-7674320 -2372747 +POINT-7691887 -2523094 +POINT-7702335 -2650964 +POINT-7709389 -2803115 +POLYGON_AT_HEIGHT2000000 +POINT-7710865 -2930461 +POINT-7707222 -3083680 +POINT-7699833 -3209864 +POINT-7685402 -3363396 +POINT-2260904 -55237504 +POINT-1260889 -58487504 +POINT6989111 -62487504 +POINT7486776 -62487504 +POINT61788980 -38312500 +POINT62038984 -38062500 +POINT66539116 -16912502 +POINT67539120 9062737 +POINT67539120 13962261 +POINT67531592 14029011 +POINT67509408 14092415 +POINT67473656 14149292 +POINT62544304 19337636 +POINT61544256 20337498 +POINT54889104 21987500 +POINT40431556 22095054 +POINT20646656 22095054 +POINT6189096 21987500 +POINT-460887 20337498 +POINT-1460887 19337498 +POINT-2610914 16437496 +POINT-7560398 -1825574 +POINT-7598305 -1970165 +POINT-7626926 -2097170 +POINT-7654808 -2244987 +POINT-7674320 -2372747 +POINT-7691887 -2523094 +POINT-7702335 -2650964 +POINT-7709389 -2803115 +POLYGON_AT_HEIGHT18000000 +POINT-7710865 -2930461 +POINT-7707222 -3083680 +POINT-7699833 -3209864 +POINT-7685402 -3363396 +POINT-2260904 -55237504 +POINT-1260889 -58487504 +POINT6989111 -62487504 +POINT7486776 -62487504 +POINT61788980 -38312500 +POINT62038984 -38062500 +POINT66539116 -16912502 +POINT67539120 9062737 +POINT67539120 13962261 +POINT67531592 14029011 +POINT67509408 14092415 +POINT67473656 14149292 +POINT62544304 19337636 +POINT61544256 20337498 +POINT54889104 21987500 +POINT40431556 22095054 +POINT20646656 22095054 +POINT6189096 21987500 +POINT-460887 20337498 +POINT-1460887 19337498 +POINT-2610914 16437496 +POINT-7560398 -1825574 +POINT-7598305 -1970165 +POINT-7626926 -2097170 +POINT-7654808 -2244987 +POINT-7674320 -2372747 +POINT-7691887 -2523094 +POINT-7702335 -2650964 +POINT-7709389 -2803115 +POLYGON_AT_HEIGHT26000000 +POINT-7710865 -2930461 +POINT-7707222 -3083680 +POINT-7699833 -3209864 +POINT-7685402 -3363396 +POINT-1260889 -58487504 +POINT6989111 -62487504 +POINT7486776 -62487504 +POINT61788980 -38312500 +POINT62038984 -38062500 +POINT66539116 -16912502 +POINT67539120 9062737 +POINT67539120 13962261 +POINT67531592 14029011 +POINT67509408 14092415 +POINT67473656 14149292 +POINT62544304 19337636 +POINT61544256 20337498 +POINT40289112 22095054 +POINT20789108 22095054 +POINT-460887 20337498 +POINT-1460887 19337498 +POINT-2610914 16437496 +POINT-7560398 -1825574 +POINT-7598305 -1970165 +POINT-7626926 -2097170 +POINT-7654808 -2244987 +POINT-7674320 -2372747 +POINT-7691887 -2523094 +POINT-7702335 -2650964 +POINT-7709389 -2803115 +OBJECT_ID60283 +TOTAL_HEIGHT4881713 +POLYGON_AT_HEIGHT0 +POINT25329362 -20516266 +POINT25485672 -20632454 +POINT27703170 -22280502 +POINT28119248 -22589730 +POINT28265686 -22698562 +POINT28416748 -22810830 +POINT28573074 -22927010 +POINT29412644 -22564042 +POINT31931172 -21475212 +POINT32103916 -21400528 +POINT32282688 -21323234 +POINT32305150 -21129768 +POINT32393956 -20364570 +POINT32477166 -19647590 +POINT32714222 -17604950 +POINT32731174 -17458848 +POINT32748584 -17308732 +POINT32592274 -17192550 +POINT32076130 -16808944 +POINT31670582 -16507538 +POINT30390914 -15556488 +POINT29898408 -15190460 +POINT29639892 -14998337 +POINT29504868 -14897995 +POINT29099488 -15073242 +POINT27817310 -15627564 +POINT25974030 -16424469 +POINT25933976 -16441788 +POINT25795258 -16501770 +POINT25777832 -16651886 +POINT25744340 -16940460 +POINT25559860 -18530030 +POINT25394532 -19954612 +POINT25346772 -20366150 +POLYGON_AT_HEIGHT2000000 +POINT25329362 -20516266 +POINT25485672 -20632454 +POINT27703170 -22280502 +POINT28119248 -22589730 +POINT28265686 -22698562 +POINT28416748 -22810830 +POINT28573074 -22927010 +POINT29412644 -22564042 +POINT31931172 -21475212 +POINT32103916 -21400528 +POINT32282688 -21323234 +POINT32305150 -21129768 +POINT32393956 -20364570 +POINT32477166 -19647590 +POINT32714222 -17604950 +POINT32731174 -17458848 +POINT32748584 -17308732 +POINT32592274 -17192550 +POINT32076130 -16808944 +POINT31670582 -16507538 +POINT30390914 -15556488 +POINT29898408 -15190460 +POINT29639892 -14998337 +POINT29504868 -14897995 +POINT29099488 -15073242 +POINT27817310 -15627564 +POINT25974030 -16424469 +POINT25933976 -16441788 +POINT25795258 -16501770 +POINT25777832 -16651886 +POINT25744340 -16940460 +POINT25559860 -18530030 +POINT25394532 -19954612 +POINT25346772 -20366150 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.body.mk4 b/src/libseqarrange/data/arrange_data_export.txt.body.mk4 new file mode 100644 index 0000000000..397360516e --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.body.mk4 @@ -0,0 +1,116 @@ +OBJECT_ID844 +TOTAL_HEIGHT100535185 +POLYGON_AT_HEIGHT0 +POINT-67539112 -13962263 +POINT-67531584 -14029013 +POINT-67509400 -14092413 +POINT-67473648 -14149290 +POINT-62544304 -19337634 +POINT-61544260 -20337500 +POINT-54889104 -21987498 +POINT-37039112 -25487498 +POINT-24039110 -25487498 +POINT-6189104 -21987498 +POINT460889 -20337500 +POINT1460889 -19337500 +POINT2610906 -16437498 +POINT7598310 1970165 +POINT7654814 2244987 +POINT7691892 2523094 +POINT7709394 2803115 +POINT7707227 3083678 +POINT7685407 3363394 +POINT7644010 3640895 +POINT7583280 3914813 +POINT7503492 4183798 +POINT-574258 26112630 +POINT-1574243 27112630 +POINT-20288972 38312500 +POINT-23090548 38312504 +POINT-58986944 38312504 +POINT-61788980 38312500 +POINT-62038980 38062500 +POINT-66539108 16912500 +POINT-67539112 -9062737 +POLYGON_AT_HEIGHT2000000 +POINT-29076068 18896464 +POINT-29072996 18894178 +POINT-29063468 18887096 +POINT-29046294 18874332 +POINT-29043632 18872356 +POINT-29038292 18874664 +POINT-29030694 18877948 +POINT-29023838 18880912 +POINT-29010590 18886640 +POINT-29008324 18887620 +POINT-29006536 18888394 +POINT-29006094 18892198 +POINT-29005422 18897984 +POINT-29002050 18927038 +POINT-29001876 18928540 +POINT-29018264 18940720 +POINT-29028350 18948216 +POINT-29031240 18950362 +POINT-29034316 18952646 +POINT-29035702 18952048 +POINT-29039506 18950404 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-29074128 18913206 +POINT-29075846 18898398 +POINT-29075896 18897964 +POLYGON_AT_HEIGHT18000000 +POINT-29076068 18896464 +POINT-29072996 18894178 +POINT-29063468 18887096 +POINT-29046294 18874332 +POINT-29043632 18872356 +POINT-29038292 18874664 +POINT-29030694 18877948 +POINT-29023838 18880912 +POINT-29010590 18886640 +POINT-29008324 18887620 +POINT-29006536 18888394 +POINT-29006094 18892198 +POINT-29005422 18897984 +POINT-29002050 18927038 +POINT-29001876 18928540 +POINT-29018264 18940720 +POINT-29028350 18948216 +POINT-29031240 18950362 +POINT-29034316 18952646 +POINT-29035702 18952048 +POINT-29039506 18950404 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-29074128 18913206 +POINT-29075846 18898398 +POINT-29075896 18897964 +POLYGON_AT_HEIGHT26000000 +POINT-29076068 18896464 +POINT-29074718 18895460 +POINT-29068944 18891166 +POINT-29065226 18888402 +POINT-29052324 18878814 +POINT-29043632 18872356 +POINT-29043144 18872566 +POINT-29020034 18882556 +POINT-29010390 18886726 +POINT-29008324 18887620 +POINT-29006536 18888394 +POINT-29006130 18891884 +POINT-29005338 18898702 +POINT-29004310 18907558 +POINT-29002830 18920314 +POINT-29001876 18928540 +POINT-29028350 18948216 +POINT-29033550 18952078 +POINT-29034316 18952646 +POINT-29034804 18952436 +POINT-29035702 18952048 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-29072198 18929840 +POINT-29075408 18902182 +POINT-29075846 18898398 +POINT-29075960 18897410 diff --git a/src/libseqarrange/data/arrange_data_export.txt.composed.mk4 b/src/libseqarrange/data/arrange_data_export.txt.composed.mk4 new file mode 100644 index 0000000000..409083015d --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.composed.mk4 @@ -0,0 +1,88 @@ +OBJECT_ID635 +TOTAL_HEIGHT68920356 +POLYGON_AT_HEIGHT0 +POLYGON_AT_HEIGHT1 +POINT-40000000 -45000000 +POINT38000000 -45000000 +POINT38000000 20000000 +POINT-40000000 20000000 +POLYGON_AT_HEIGHT2 +POINT-1000000 -21000000 +POINT37000000 -21000000 +POINT37000000 44000000 +POINT-1000000 44000000 +POLYGON_AT_HEIGHT3 +POINT-12000000 -350000000 +POINT9000000 -350000000 +POINT9000000 -39000000 +POINT-12000000 -39000000 +POLYGON_AT_HEIGHT4 +POINT-350000000 -4000000 +POINT350000000 -4000000 +POINT350000000 -14000000 +POINT-350000000 -14000000 +POLYGON_AT_HEIGHT10000 +POINT-39105202 -33269412 +POINT-33019977 -39740757 +POINT-8145411 -44968391 +POINT5050568 -44968391 +POINT29919905 -39740757 +POINT32102334 -35781961 +POINT37275483 -15966504 +POINT28869155 7409612 +POINT8857241 19793397 +POINT-33268386 19793397 +POINT-38090122 -1929211 +POLYGON_AT_HEIGHT200000 +POINT-242277 -223805 +POINT16952801 -15334520 +POINT32166346 -20375028 +POINT34384145 -20136906 +POINT36137556 -18758219 +POINT36889619 -16094705 +POINT31396166 36454515 +POINT30386126 39737097 +POINT22053422 43777197 +POINT16447788 40999636 +POINT-217030 9440457 +POLYGON_AT_HEIGHT18000000 +POINT-206972968 -12664471 +POINT-206470468 -13167301 +POINT164374531 -13167301 +POINT164877031 -12664471 +POINT164877031 -5630724 +POINT164374531 -5128674 +POINT-206470468 -5128674 +POINT-206972968 -5630724 +POLYGON_AT_HEIGHT26000000 +POINT-11485580 -41756934 +POINT-8680166 -81797949 +POINT-8170091 -82308024 +POINT5091868 -82308024 +POINT5601944 -81797949 +POINT8407358 -39461522 +POINT-3994 773174 +POINT-11485580 -39461522 +POLYGON_AT_HEIGHT27000000 +POINT -5000000 -5000000 +POINT 5000000 -5000000 +POINT5000000 5000000 +POINT-5000000 5000000 +POLYGON_AT_HEIGHT28000000 +POINT-3728158 -1611789 +POINT-468223 -4034578 +POINT2543938 -2732339 +POINT3259933 -2422789 +POINT3728160 1611785 +POINT468227 4034579 +POINT-1666062 3111867 +POINT-3259931 2422789 +POLYGON_AT_HEIGHT30000000 +POINT-12000000 -350000000 +POINT250000000 -350000000 +POINT250000000 -82000000 +POINT-12000000 -82000000 + + + + diff --git a/src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 b/src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 new file mode 100644 index 0000000000..06e647aef2 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 @@ -0,0 +1,24 @@ +OBJECT_ID635 +TOTAL_HEIGHT68920356 +POLYGON_AT_HEIGHT0 +POLYGON_AT_HEIGHT1 +POLYGON_AT_HEIGHT2 +POLYGON_AT_HEIGHT3 +POINT-12000000 -350000000 +POINT9000000 -350000000 +POINT9000000 -39000000 +POINT-12000000 -39000000 +POLYGON_AT_HEIGHT4 +POLYGON_AT_HEIGHT10000 +POLYGON_AT_HEIGHT200000 +POLYGON_AT_HEIGHT18000000 +POLYGON_AT_HEIGHT26000000 +POINT-11485580 -41756934 +POINT-8680166 -81797949 +POINT-8170091 -82308024 +POINT5091868 -82308024 +POINT5601944 -81797949 +POINT8407358 -39461522 +POINT-3994 773174 +POINT-11485580 -39461522 + diff --git a/src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 b/src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 new file mode 100644 index 0000000000..46def95c30 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 @@ -0,0 +1,135 @@ +OBJECT_ID635 +TOTAL_HEIGHT121250000 +POLYGON_AT_HEIGHT0 +POINT-67539112 -13962261 +POINT-67531584 -14029011 +POINT-67509400 -14092415 +POINT-67473648 -14149292 +POINT-62544296 -19337636 +POINT-61544252 -20337498 +POINT-54889104 -21987500 +POINT-37039112 -25487500 +POINT-24039108 -25487500 +POINT-6189102 -21987500 +POINT460891 -20337498 +POINT1460891 -19337498 +POINT2610908 -16437496 +POINT7598310 1970165 +POINT7654814 2244987 +POINT7691892 2523094 +POINT7709394 2803115 +POINT7707227 3083679 +POINT7685407 3363395 +POINT7644010 3640895 +POINT7583280 3914814 +POINT7503492 4183799 +POINT-574258 26112630 +POINT-1574243 27112630 +POINT-20288970 38312500 +POINT-23090546 38312504 +POINT-58986944 38312504 +POINT-61788972 38312500 +POINT-62038972 38062500 +POINT-66539108 16912502 +POINT-67539112 -9062737 +POLYGON_AT_HEIGHT2000000 +POINT-67539112 -13962261 +POINT-67531584 -14029011 +POINT-67509400 -14092415 +POINT-67473648 -14149292 +POINT-62544296 -19337636 +POINT-61544252 -20337498 +POINT-54889104 -21987500 +POINT-37039112 -25487500 +POINT-24039108 -25487500 +POINT-6189102 -21987500 +POINT460891 -20337498 +POINT1460891 -19337498 +POINT2610908 -16437496 +POINT7598310 1970165 +POINT7654814 2244987 +POINT7691892 2523094 +POINT7709394 2803115 +POINT7707227 3083679 +POINT7685407 3363395 +POINT7644010 3640895 +POINT7583280 3914814 +POINT7503492 4183799 +POINT-574258 26112630 +POINT-1574243 27112630 +POINT-20288970 38312500 +POINT-23090546 38312504 +POINT-58986944 38312504 +POINT-61788972 38312500 +POINT-62038972 38062500 +POINT-66539108 16912502 +POINT-67539112 -9062737 +POLYGON_AT_HEIGHT18000000 +POINT-67539112 -13962261 +POINT-67531584 -14029011 +POINT-67509400 -14092415 +POINT-67473648 -14149292 +POINT-62544296 -19337636 +POINT-61544252 -20337498 +POINT-54889104 -21987500 +POINT-37039112 -25487500 +POINT-24039108 -25487500 +POINT-6189102 -21987500 +POINT460891 -20337498 +POINT1460891 -19337498 +POINT2610908 -16437496 +POINT7598310 1970165 +POINT7654814 2244987 +POINT7691892 2523094 +POINT7693351 2546429 +POINT7709394 2803115 +POINT7707408 3060298 +POINT7707227 3083679 +POINT7687226 3340085 +POINT7685407 3363395 +POINT7644010 3640895 +POINT7588341 3891987 +POINT7583280 3914814 +POINT7576631 3937230 +POINT7503492 4183799 +POINT-574258 26112630 +POINT-1574243 27112630 +POINT-20288970 38312500 +POINT-23090546 38312504 +POINT-58986944 38312504 +POINT-61788972 38312500 +POINT-62038972 38062500 +POINT-66539108 16912502 +POINT-67539112 -9062737 +POLYGON_AT_HEIGHT26000000 +POINT-67539112 -13962261 +POINT-67531584 -14029011 +POINT-67509400 -14092415 +POINT-67473648 -14149292 +POINT-62544296 -19337636 +POINT-61544252 -20337498 +POINT-54889104 -21987500 +POINT-37039112 -25487500 +POINT-24039108 -25487500 +POINT-6189102 -21987500 +POINT460891 -20337498 +POINT1460891 -19337498 +POINT2610908 -16437496 +POINT7598310 1970165 +POINT7654814 2244987 +POINT7691892 2523094 +POINT7709394 2803115 +POINT7707227 3083679 +POINT7685407 3363395 +POINT7644010 3640895 +POINT7583280 3914814 +POINT7503492 4183799 +POINT-574258 26112630 +POINT-1574243 27112630 +POINT-20288970 38312500 +POINT-23090546 38312504 +POINT-58986944 38312504 +POINT-61788972 38312500 +POINT-62038972 38062500 +POINT-66539108 16912502 +POINT-67539112 -9062737 diff --git a/src/libseqarrange/data/arrange_data_export.txt.fan.mk4 b/src/libseqarrange/data/arrange_data_export.txt.fan.mk4 new file mode 100644 index 0000000000..488347917c --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.fan.mk4 @@ -0,0 +1,139 @@ +OBJECT_ID844 +TOTAL_HEIGHT104183003 +POLYGON_AT_HEIGHT0 +POINT-29063518 18923234 +POINT-12039110 3962501 +POINT2480909 -893693 +POINT2749830 -970325 +POINT3023435 -1027980 +POINT3300413 -1066381 +POINT3579404 -1085336 +POINT3859022 -1084755 +POINT4137922 -1064638 +POINT4414732 -1025087 +POINT4688108 -966293 +POINT4956709 -888546 +POINT5219221 -792221 +POINT5474348 -677793 +POINT5720869 -545820 +POINT5957578 -396945 +POINT6183286 -231899 +POINT6396925 -51486 +POINT6597440 143409 +POINT6783842 351839 +POINT6955229 572784 +POINT7110761 805160 +POINT7249677 1047836 +POINT7371305 1299621 +POINT7475050 1559291 +POINT7560392 1825573 +POINT7626920 2097168 +POINT7674314 2372745 +POINT7702329 2650962 +POINT7710859 2930458 +POINT7699827 3209861 +POINT2260900 55237504 +POINT1260885 58487504 +POINT-6989115 62487504 +POINT-7486780 62487504 +POINT-12039110 60237512 +POINT-12539110 59737512 +POINT-28116342 30356946 +POINT-28304102 29998840 +POINT-28436518 29739158 +POINT-28679972 29249420 +POINT-28745004 29115146 +POINT-29038522 28491574 +POLYGON_AT_HEIGHT2000000 +POINT-29063518 18923234 +POINT-29058982 18919862 +POINT-29056178 18917778 +POINT-29042088 18907306 +POINT-29035018 18902052 +POINT-29033742 18901104 +POINT-29031082 18899128 +POINT-29029694 18899726 +POINT-29027028 18900878 +POINT-29023956 18902206 +POINT-29009454 18908476 +POINT-29000804 18912216 +POINT-28993986 18915164 +POINT-28993810 18916666 +POINT-28993640 18918128 +POINT-28992658 18926588 +POINT-28991134 18939720 +POINT-28990438 18945718 +POINT-28989326 18955310 +POINT-28990888 18956472 +POINT-28993864 18958684 +POINT-29000010 18963252 +POINT-29021762 18979418 +POINT-29023552 18978646 +POINT-29040118 18971484 +POINT-29057072 18964154 +POINT-29058858 18963378 +POINT-29059034 18961878 +POINT-29059302 18959576 +POINT-29063346 18924736 +POLYGON_AT_HEIGHT18000000 +POINT-29063518 18923234 +POINT-29058982 18919862 +POINT-29056178 18917778 +POINT-29042088 18907306 +POINT-29035018 18902052 +POINT-29033742 18901104 +POINT-29031082 18899128 +POINT-29029694 18899726 +POINT-29027028 18900878 +POINT-29023956 18902206 +POINT-29009454 18908476 +POINT-29000804 18912216 +POINT-28993986 18915164 +POINT-28993810 18916666 +POINT-28993640 18918128 +POINT-28992658 18926588 +POINT-28991134 18939720 +POINT-28990438 18945718 +POINT-28989326 18955310 +POINT-28990888 18956472 +POINT-28993864 18958684 +POINT-29000010 18963252 +POINT-29021762 18979418 +POINT-29023552 18978646 +POINT-29040118 18971484 +POINT-29057072 18964154 +POINT-29058858 18963378 +POINT-29059034 18961878 +POINT-29059302 18959576 +POINT-29063346 18924736 +POLYGON_AT_HEIGHT26000000 +POINT-29063518 18923234 +POINT-29058982 18919862 +POINT-29056178 18917778 +POINT-29042088 18907306 +POINT-29035018 18902052 +POINT-29033742 18901104 +POINT-29031082 18899128 +POINT-29029694 18899726 +POINT-29027028 18900878 +POINT-29023956 18902206 +POINT-29009454 18908476 +POINT-29000804 18912216 +POINT-28993986 18915164 +POINT-28993810 18916666 +POINT-28993640 18918128 +POINT-28992658 18926588 +POINT-28991134 18939720 +POINT-28990438 18945718 +POINT-28989326 18955310 +POINT-28990888 18956472 +POINT-28993864 18958684 +POINT-29000010 18963252 +POINT-29021762 18979418 +POINT-29023552 18978646 +POINT-29040118 18971484 +POINT-29057072 18964154 +POINT-29058858 18963378 +POINT-29059034 18961878 +POINT-29059302 18959576 +POINT-29063346 18924736 diff --git a/src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 b/src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 new file mode 100644 index 0000000000..c5061931ad --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 @@ -0,0 +1,416 @@ +OBJECT_ID844 +TOTAL_HEIGHT90415563 +POLYGON_AT_HEIGHT0 +POINT-206047968 -12586874 +POINT-205547968 -13087202 +POINT163452032 -13087202 +POINT163952032 -12586874 +POINT163952032 -5588121 +POINT163452032 -5088569 +POINT-29034316 18952646 +POINT-205547968 -5088569 +POINT-206047968 -5588121 +POLYGON_AT_HEIGHT2000000 +POINT-29076068 18896464 +POINT-29072996 18894178 +POINT-29063468 18887096 +POINT-29046294 18874332 +POINT-29043632 18872356 +POINT-29038292 18874664 +POINT-29030694 18877948 +POINT-29023838 18880912 +POINT-29010590 18886640 +POINT-29008324 18887620 +POINT-29006536 18888394 +POINT-29006094 18892198 +POINT-29005422 18897984 +POINT-29002050 18927038 +POINT-29001876 18928540 +POINT-29018264 18940720 +POINT-29028350 18948216 +POINT-29031240 18950362 +POINT-29034316 18952646 +POINT-29035702 18952048 +POINT-29039506 18950404 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-29074128 18913206 +POINT-29075846 18898398 +POINT-29075896 18897964 +POLYGON_AT_HEIGHT18000000 +POINT-29068974 18912342 +POINT-29068930 18910868 +POINT-29068862 18909930 +POINT-29068698 18908432 +POINT-29068560 18907532 +POINT-29068266 18906024 +POINT-29068064 18905166 +POINT-29067640 18903656 +POINT-29067380 18902852 +POINT-29066824 18901350 +POINT-29066510 18900596 +POINT-29065822 18899116 +POINT-29065462 18898418 +POINT-29064642 18896972 +POINT-29064244 18896334 +POINT-29063292 18894932 +POINT-29062860 18894352 +POINT-29061778 18893010 +POINT-29061324 18892488 +POINT-29060114 18891214 +POINT-29059640 18890754 +POINT-29058308 18889562 +POINT-29057824 18889162 +POINT-29056374 18888064 +POINT-29055884 18887722 +POINT-29054324 18886726 +POINT-29053834 18886442 +POINT-29052172 18885562 +POINT-29051692 18885330 +POINT-29049932 18884574 +POINT-29049464 18884396 +POINT-29047618 18883774 +POINT-29047166 18883642 +POINT-29045248 18883166 +POINT-29044818 18883076 +POINT-29042838 18882752 +POINT-29042430 18882702 +POINT-29040400 18882534 +POINT-29040022 18882518 +POINT-29037952 18882518 +POINT-29037608 18882532 +POINT-29035512 18882702 +POINT-29035200 18882740 +POINT-29033094 18883084 +POINT-29032818 18883138 +POINT-29030716 18883660 +POINT-29030474 18883730 +POINT-29028392 18884430 +POINT-29028186 18884508 +POINT-29026140 18885386 +POINT-29025968 18885466 +POINT-29023972 18886520 +POINT-29023836 18886600 +POINT-29021904 18887830 +POINT-29021802 18887902 +POINT-29019950 18889304 +POINT-29019876 18889364 +POINT-29018122 18890932 +POINT-29018078 18890976 +POINT-29016434 18892702 +POINT-29016412 18892726 +POINT-29014894 18894606 +POINT-29013532 18896600 +POINT-29012336 18898700 +POINT-29012308 18898756 +POINT-29011312 18900888 +POINT-29011276 18900974 +POINT-29010468 18903152 +POINT-29010430 18903270 +POINT-29009808 18905476 +POINT-29009772 18905628 +POINT-29009336 18907846 +POINT-29009308 18908032 +POINT-29009058 18910246 +POINT-29009042 18910466 +POINT-29008974 18912660 +POINT-29008976 18912910 +POINT-29009084 18915074 +POINT-29009110 18915354 +POINT-29009388 18917470 +POINT-29009442 18917780 +POINT-29009884 18919834 +POINT-29009970 18920170 +POINT-29010568 18922152 +POINT-29010690 18922508 +POINT-29011436 18924406 +POINT-29011600 18924780 +POINT-29012484 18926582 +POINT-29012694 18926970 +POINT-29013702 18928670 +POINT-29013960 18929064 +POINT-29015086 18930650 +POINT-29015392 18931048 +POINT-29016624 18932514 +POINT-29016984 18932908 +POINT-29018306 18934246 +POINT-29018718 18934632 +POINT-29020122 18935838 +POINT-29020590 18936208 +POINT-29022062 18937280 +POINT-29022584 18937630 +POINT-29024110 18938560 +POINT-29024686 18938880 +POINT-29026256 18939672 +POINT-29026884 18939958 +POINT-29028484 18940608 +POINT-29029164 18940852 +POINT-29030778 18941360 +POINT-29031508 18941556 +POINT-29033128 18941928 +POINT-29033900 18942068 +POINT-29035514 18942300 +POINT-29036328 18942384 +POINT-29037924 18942482 +POINT-29038770 18942502 +POINT-29040340 18942470 +POINT-29041218 18942418 +POINT-29042748 18942262 +POINT-29043648 18942134 +POINT-29045130 18941862 +POINT-29046048 18941654 +POINT-29047472 18941272 +POINT-29048400 18940980 +POINT-29049758 18940494 +POINT-29050692 18940118 +POINT-29051978 18939538 +POINT-29052902 18939072 +POINT-29054112 18938402 +POINT-29055022 18937848 +POINT-29056146 18937100 +POINT-29057036 18936454 +POINT-29058070 18935638 +POINT-29058928 18934902 +POINT-29059870 18934026 +POINT-29060686 18933202 +POINT-29061534 18932276 +POINT-29062302 18931364 +POINT-29063052 18930398 +POINT-29063760 18929400 +POINT-29064414 18928400 +POINT-29065056 18927322 +POINT-29065610 18926302 +POINT-29066178 18925148 +POINT-29066636 18924114 +POINT-29067118 18922888 +POINT-29067480 18921850 +POINT-29067872 18920558 +POINT-29068140 18919528 +POINT-29068432 18918176 +POINT-29068610 18917156 +POINT-29068796 18915756 +POINT-29068888 18914756 +POINT-29068962 18913314 +POLYGON_AT_HEIGHT26000000 +POINT-29068966 18912996 +POINT-29068946 18911352 +POINT-29068930 18910868 +POINT-29068908 18910560 +POINT-29068752 18908924 +POINT-29068698 18908432 +POINT-29068652 18908136 +POINT-29068364 18906518 +POINT-29068266 18906024 +POINT-29068200 18905742 +POINT-29067780 18904152 +POINT-29067640 18903656 +POINT-29067554 18903392 +POINT-29067006 18901842 +POINT-29066824 18901350 +POINT-29066722 18901102 +POINT-29066048 18899602 +POINT-29065822 18899116 +POINT-29065704 18898888 +POINT-29064910 18897448 +POINT-29064642 18896972 +POINT-29064510 18896762 +POINT-29063604 18895392 +POINT-29063292 18894932 +POINT-29063150 18894742 +POINT-29062132 18893450 +POINT-29061778 18893010 +POINT-29061628 18892838 +POINT-29060510 18891632 +POINT-29060114 18891214 +POINT-29059960 18891064 +POINT-29058744 18889954 +POINT-29058308 18889562 +POINT-29058150 18889432 +POINT-29056848 18888424 +POINT-29056374 18888064 +POINT-29056214 18887950 +POINT-29054834 18887052 +POINT-29054324 18886726 +POINT-29054164 18886632 +POINT-29052718 18885850 +POINT-29052172 18885562 +POINT-29052014 18885484 +POINT-29050508 18884822 +POINT-29049932 18884574 +POINT-29049778 18884516 +POINT-29048224 18883978 +POINT-29047618 18883774 +POINT-29047470 18883730 +POINT-29045878 18883322 +POINT-29045248 18883166 +POINT-29045106 18883136 +POINT-29043488 18882858 +POINT-29042838 18882752 +POINT-29042704 18882734 +POINT-29041066 18882590 +POINT-29040400 18882534 +POINT-29040276 18882528 +POINT-29038632 18882518 +POINT-29037952 18882518 +POINT-29037840 18882522 +POINT-29036200 18882646 +POINT-29035512 18882702 +POINT-29035410 18882716 +POINT-29033784 18882970 +POINT-29033094 18883084 +POINT-29033002 18883102 +POINT-29031404 18883488 +POINT-29030716 18883660 +POINT-29030636 18883682 +POINT-29028392 18884430 +POINT-29028326 18884454 +POINT-29026812 18885098 +POINT-29026140 18885386 +POINT-29026084 18885412 +POINT-29024626 18886176 +POINT-29023972 18886520 +POINT-29022538 18887426 +POINT-29021904 18887830 +POINT-29021870 18887854 +POINT-29020558 18888844 +POINT-29019926 18889322 +POINT-29018122 18890932 +POINT-29018106 18890948 +POINT-29016426 18892710 +POINT-29014894 18894606 +POINT-29014448 18895260 +POINT-29013524 18896618 +POINT-29013518 18896628 +POINT-29013130 18897308 +POINT-29012318 18898738 +POINT-29012308 18898756 +POINT-29011288 18900946 +POINT-29011276 18900974 +POINT-29010442 18903232 +POINT-29010430 18903270 +POINT-29010226 18903994 +POINT-29009782 18905578 +POINT-29009772 18905628 +POINT-29009628 18906356 +POINT-29009318 18907970 +POINT-29009308 18908032 +POINT-29009226 18908758 +POINT-29009048 18910392 +POINT-29009042 18910466 +POINT-29009020 18911186 +POINT-29008976 18912828 +POINT-29008976 18912910 +POINT-29009012 18913620 +POINT-29009102 18915262 +POINT-29009110 18915354 +POINT-29009202 18916048 +POINT-29009424 18917678 +POINT-29009442 18917780 +POINT-29009586 18918454 +POINT-29009942 18920060 +POINT-29009970 18920170 +POINT-29010166 18920820 +POINT-29010650 18922392 +POINT-29010690 18922508 +POINT-29010934 18923130 +POINT-29011548 18924658 +POINT-29011600 18924780 +POINT-29011890 18925372 +POINT-29012624 18926842 +POINT-29012694 18926970 +POINT-29013026 18927526 +POINT-29013876 18928934 +POINT-29013960 18929064 +POINT-29014330 18929584 +POINT-29015292 18930918 +POINT-29015392 18931048 +POINT-29015796 18931528 +POINT-29016864 18932778 +POINT-29016984 18932908 +POINT-29017418 18933346 +POINT-29018584 18934506 +POINT-29018718 18934632 +POINT-29019178 18935028 +POINT-29020438 18936086 +POINT-29020590 18936208 +POINT-29021072 18936560 +POINT-29022414 18937516 +POINT-29022584 18937630 +POINT-29023084 18937934 +POINT-29024498 18938776 +POINT-29024686 18938880 +POINT-29025202 18939140 +POINT-29026678 18939866 +POINT-29026884 18939958 +POINT-29027408 18940172 +POINT-29028940 18940772 +POINT-29029164 18940852 +POINT-29029694 18941020 +POINT-29031270 18941492 +POINT-29031508 18941556 +POINT-29032040 18941680 +POINT-29033646 18942022 +POINT-29033900 18942068 +POINT-29034430 18942144 +POINT-29036060 18942358 +POINT-29036328 18942384 +POINT-29036852 18942418 +POINT-29038492 18942496 +POINT-29038770 18942502 +POINT-29039286 18942492 +POINT-29040930 18942434 +POINT-29041218 18942418 +POINT-29041720 18942366 +POINT-29043352 18942176 +POINT-29043648 18942134 +POINT-29044134 18942046 +POINT-29045746 18941722 +POINT-29046048 18941654 +POINT-29046514 18941528 +POINT-29048096 18941076 +POINT-29048400 18940980 +POINT-29048848 18940820 +POINT-29050386 18940242 +POINT-29050692 18940118 +POINT-29051114 18939928 +POINT-29052600 18939224 +POINT-29052902 18939072 +POINT-29053300 18938852 +POINT-29054724 18938028 +POINT-29055022 18937848 +POINT-29055392 18937602 +POINT-29056744 18936666 +POINT-29057036 18936454 +POINT-29057376 18936188 +POINT-29058646 18935144 +POINT-29058928 18934902 +POINT-29059236 18934614 +POINT-29060420 18933474 +POINT-29060686 18933202 +POINT-29060964 18932900 +POINT-29062050 18931664 +POINT-29062302 18931364 +POINT-29062548 18931048 +POINT-29063528 18929728 +POINT-29063760 18929400 +POINT-29063974 18929072 +POINT-29064844 18927676 +POINT-29065056 18927322 +POINT-29065238 18926986 +POINT-29065992 18925526 +POINT-29066178 18925148 +POINT-29066328 18924808 +POINT-29066960 18923290 +POINT-29067118 18922888 +POINT-29067236 18922548 +POINT-29067744 18920982 +POINT-29067872 18920558 +POINT-29067958 18920222 +POINT-29068336 18918620 +POINT-29068432 18918176 +POINT-29068492 18917842 +POINT-29068736 18916216 +POINT-29068796 18915756 +POINT-29068826 18915428 +POINT-29068938 18913788 +POINT-29068962 18913314 diff --git a/src/libseqarrange/data/arrange_data_export.txt.hose.mk4 b/src/libseqarrange/data/arrange_data_export.txt.hose.mk4 new file mode 100644 index 0000000000..86f0cc0a03 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.hose.mk4 @@ -0,0 +1,102 @@ +OBJECT_ID844 +TOTAL_HEIGHT106960644 +POLYGON_AT_HEIGHT0 +POINT-40289112 -22737390 +POINT-37539112 -61987496 +POINT-37039112 -62487496 +POINT-24039110 -62487496 +POINT-23541246 -61989640 +POINT-23539110 -61987496 +POINT-20789110 -22737390 +POINT-20789110 -20487318 +POINT-29001876 18928540 +POINT-29018264 18940720 +POINT-29028350 18948216 +POINT-29031240 18950362 +POINT-29034316 18952646 +POINT-29035702 18952048 +POINT-29039506 18950404 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-40289112 -20487318 +POLYGON_AT_HEIGHT2000000 +POINT-29076068 18896464 +POINT-29072996 18894178 +POINT-29063468 18887096 +POINT-29046294 18874332 +POINT-29043632 18872356 +POINT-29038292 18874664 +POINT-29030694 18877948 +POINT-29023838 18880912 +POINT-29010590 18886640 +POINT-29008324 18887620 +POINT-29006536 18888394 +POINT-29006094 18892198 +POINT-29005422 18897984 +POINT-29002050 18927038 +POINT-29001876 18928540 +POINT-29018264 18940720 +POINT-29028350 18948216 +POINT-29031240 18950362 +POINT-29034316 18952646 +POINT-29035702 18952048 +POINT-29039506 18950404 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-29074128 18913206 +POINT-29075846 18898398 +POINT-29075896 18897964 +POLYGON_AT_HEIGHT18000000 +POINT-29076068 18896464 +POINT-29072996 18894178 +POINT-29063468 18887096 +POINT-29046294 18874332 +POINT-29043632 18872356 +POINT-29038292 18874664 +POINT-29030694 18877948 +POINT-29023838 18880912 +POINT-29010590 18886640 +POINT-29008324 18887620 +POINT-29006536 18888394 +POINT-29006094 18892198 +POINT-29005422 18897984 +POINT-29002050 18927038 +POINT-29001876 18928540 +POINT-29018264 18940720 +POINT-29028350 18948216 +POINT-29031240 18950362 +POINT-29034316 18952646 +POINT-29035702 18952048 +POINT-29039506 18950404 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-29074128 18913206 +POINT-29075846 18898398 +POINT-29075896 18897964 +POLYGON_AT_HEIGHT26000000 +POINT-29076068 18896464 +POINT-29072996 18894178 +POINT-29063468 18887096 +POINT-29046294 18874332 +POINT-29043632 18872356 +POINT-29038292 18874664 +POINT-29030694 18877948 +POINT-29023838 18880912 +POINT-29010590 18886640 +POINT-29008324 18887620 +POINT-29006536 18888394 +POINT-29006094 18892198 +POINT-29005422 18897984 +POINT-29002050 18927038 +POINT-29001876 18928540 +POINT-29018264 18940720 +POINT-29028350 18948216 +POINT-29031240 18950362 +POINT-29034316 18952646 +POINT-29035702 18952048 +POINT-29039506 18950404 +POINT-29063016 18940240 +POINT-29071412 18936610 +POINT-29074128 18913206 +POINT-29075846 18898398 +POINT-29075896 18897964 diff --git a/src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 b/src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 new file mode 100644 index 0000000000..a524b449d2 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 @@ -0,0 +1,385 @@ +OBJECT_ID635 +TOTAL_HEIGHT77699996 +POLYGON_AT_HEIGHT0 +POINT-3709610 -1603771 +POINT-3553299 -1719951 +POINT-2708418 -2347870 +POINT-859434 -3722037 +POINT-773283 -3786063 +POINT-600919 -3914160 +POINT-465894 -4014506 +POINT-60514 -3839251 +POINT2531282 -2718746 +POINT3064943 -2488029 +POINT3243715 -2410736 +POINT3261140 -2260620 +POINT3294633 -1972038 +POINT3329363 -1672790 +POINT3406221 -1010543 +POINT3644441 1042110 +POINT3692201 1453651 +POINT3709612 1603767 +POINT3553300 1719951 +POINT2450014 2539917 +POINT773286 3786064 +POINT465898 4014507 +POINT-1657774 3096386 +POINT-2098707 2905758 +POINT-2724714 2635116 +POINT-3064941 2488025 +POINT-3243713 2410736 +POINT-3266174 2217266 +POINT-3387527 1171619 +POINT-3556167 -281486 +POINT-3675247 -1307552 +POINT-3692199 -1453655 +POLYGON_AT_HEIGHT2000000 +POINT-3709610 -1603771 +POINT-3553299 -1719951 +POINT-2708418 -2347870 +POINT-859434 -3722037 +POINT-773283 -3786063 +POINT-600919 -3914160 +POINT-465894 -4014506 +POINT-60514 -3839251 +POINT2531282 -2718746 +POINT3064943 -2488029 +POINT3243715 -2410736 +POINT3261140 -2260620 +POINT3294633 -1972038 +POINT3329363 -1672790 +POINT3406221 -1010543 +POINT3644441 1042110 +POINT3692201 1453651 +POINT3709612 1603767 +POINT3553300 1719951 +POINT2450014 2539917 +POINT773286 3786064 +POINT465898 4014507 +POINT-1657774 3096386 +POINT-2098707 2905758 +POINT-2724714 2635116 +POINT-3064941 2488025 +POINT-3243713 2410736 +POINT-3266174 2217266 +POINT-3387527 1171619 +POINT-3556167 -281486 +POINT-3675247 -1307552 +POINT-3692199 -1453655 +POLYGON_AT_HEIGHT18000000 +POINT-2449483 -44880 +POINT-2448576 -83435 +POINT-2440202 -206542 +POINT-2435758 -262735 +POINT-2431242 -302589 +POINT-2412157 -422933 +POINT-2402693 -478502 +POINT-2394331 -519306 +POINT-2364967 -635971 +POINT-2350561 -690467 +POINT-2338148 -731842 +POINT-2298992 -843966 +POINT-2279754 -896951 +POINT-2263120 -938484 +POINT-2214762 -1045267 +POINT-2190857 -1096314 +POINT-2169889 -1137569 +POINT-2112953 -1238270 +POINT-2084568 -1286970 +POINT-2059187 -1327499 +POINT-1994365 -1421446 +POINT-1961727 -1467405 +POINT-1931898 -1506740 +POINT-1859940 -1593344 +POINT-1823315 -1636191 +POINT-1789060 -1673847 +POINT-1710748 -1752593 +POINT-1670430 -1791986 +POINT-1631818 -1827480 +POINT-1547969 -1897932 +POINT-1504278 -1933551 +POINT-1461423 -1966396 +POINT-1372900 -2028205 +POINT-1326196 -2059765 +POINT-1279279 -2089481 +POINT-1186932 -2142380 +POINT-1137587 -2169627 +POINT-1086835 -2195743 +POINT-991527 -2239548 +POINT-939936 -2262262 +POINT-885633 -2284328 +POINT-788248 -2318937 +POINT-734830 -2336935 +POINT-677305 -2354519 +POINT-578717 -2379917 +POINT-523899 -2393054 +POINT-463514 -2405754 +POINT-364574 -2422007 +POINT-308802 -2430178 +POINT-246000 -2437618 +POINT-147548 -2444865 +POINT-91267 -2448003 +POINT-26502 -2449855 +POINT70667 -2448315 +POINT127003 -2446396 +POINT193208 -2442371 +POINT288313 -2432330 +POINT344250 -2425367 +POINT411363 -2415218 +POINT503677 -2397030 +POINT558765 -2385082 +POINT626207 -2368621 +POINT715048 -2342701 +POINT768841 -2325863 +POINT836000 -2302955 +POINT920745 -2269773 +POINT972817 -2248181 +POINT1039079 -2218746 +POINT1119139 -2178824 +POINT1169062 -2152651 +POINT1233781 -2116672 +POINT1308656 -2070572 +POINT1356032 -2040029 +POINT1418550 -1997554 +POINT1487774 -1945883 +POINT1532220 -1911217 +POINT1591890 -1862354 +POINT1655089 -1805744 +POINT1696252 -1767234 +POINT1752428 -1712162 +POINT1809261 -1651266 +POINT1846805 -1609220 +POINT1898851 -1548183 +POINT1949081 -1483676 +POINT1982705 -1438434 +POINT2029985 -1371738 +POINT2071853 -1306860 +POINT2101287 -1258786 +POINT2144777 -1184249 +POINT2178623 -1119942 +POINT2203628 -1069423 +POINT2242296 -987228 +POINT2268574 -924369 +POINT2288950 -871812 +POINT2321764 -782253 +POINT2341007 -721647 +POINT2356590 -667475 +POINT2382539 -570983 +POINT2395361 -513347 +POINT2406026 -457997 +POINT2424135 -355117 +POINT2431226 -301075 +POINT2436884 -244991 +POINT2446199 -136390 +POINT2448298 -86469 +POINT2448908 -30104 +POINT2448579 83435 +POINT2446469 128808 +POINT2442024 185002 +POINT2431245 302589 +POINT2425742 343095 +POINT2416278 398663 +POINT2394334 519306 +POINT2386278 554737 +POINT2371869 609234 +POINT2338136 731842 +POINT2328379 762099 +POINT2309145 815084 +POINT2263124 938484 +POINT2252504 963579 +POINT2228599 1014626 +POINT2169893 1137569 +POINT2159227 1157618 +POINT2130842 1206318 +POINT2059190 1327499 +POINT2049262 1342720 +POINT2016624 1388678 +POINT1931901 1506736 +POINT1923483 1517453 +POINT1886858 1560302 +POINT1789064 1673847 +POINT1782835 1680464 +POINT1742517 1719857 +POINT1631822 1827480 +POINT1628430 1830501 +POINT1584739 1866120 +POINT1461427 1966396 +POINT1327303 2057115 +POINT1280599 2088675 +POINT1279283 2089481 +POINT1138941 2167127 +POINT1089596 2194373 +POINT1086839 2195743 +POINT941539 2259935 +POINT889948 2282649 +POINT885637 2284328 +POINT736649 2334805 +POINT683231 2352802 +POINT677309 2354519 +POINT525904 2391142 +POINT471086 2404279 +POINT463518 2405754 +POINT310978 2428495 +POINT255205 2436665 +POINT246004 2437618 +POINT93589 2446570 +POINT37308 2449708 +POINT26506 2449855 +POINT-124558 2445221 +POINT-180894 2443301 +POINT-193204 2442371 +POINT-341727 2424458 +POINT-397664 2417496 +POINT-411359 2415218 +POINT-556183 2384450 +POINT-611271 2372502 +POINT-626203 2368621 +POINT-766228 2325508 +POINT-820021 2308671 +POINT-835996 2302955 +POINT-970200 2248102 +POINT-1022272 2226508 +POINT-1039075 2218742 +POINT-1166472 2152845 +POINT-1216395 2126673 +POINT-1233778 2116668 +POINT-1353492 2040495 +POINT-1400869 2009953 +POINT-1418546 1997554 +POINT-1529763 1911944 +POINT-1574212 1877277 +POINT-1591901 1862354 +POINT-1693893 1768208 +POINT-1735053 1729697 +POINT-1752424 1712162 +POINT-1844590 1610434 +POINT-1882134 1568388 +POINT-1898847 1548183 +POINT-1980631 1439868 +POINT-2014255 1394626 +POINT-2029981 1371738 +POINT-2100964 1257867 +POINT-2130397 1209793 +POINT-2144773 1184249 +POINT-2204614 1065876 +POINT-2229618 1015357 +POINT-2242292 987224 +POINT-2290763 865416 +POINT-2311140 812859 +POINT-2321760 782253 +POINT-2358737 658085 +POINT-2374321 603913 +POINT-2382536 570983 +POINT-2407974 445522 +POINT-2418640 390172 +POINT-2424131 355117 +POINT-2438110 229417 +POINT-2443767 173334 +POINT-2446195 136390 +POINT-2448873 11485 +POLYGON_AT_HEIGHT26000000 +POINT-1982709 -95417 +POINT-1976094 -163262 +POINT-1963804 -289295 +POINT-1925993 -480388 +POINT-1869627 -666854 +POINT-1843607 -729860 +POINT-1795270 -846900 +POINT-1763195 -907052 +POINT-1703611 -1018791 +POINT-1665796 -1075507 +POINT-1595548 -1180866 +POINT-1472120 -1331573 +POINT-1423967 -1379822 +POINT-1334516 -1469451 +POINT-1184049 -1593181 +POINT-1127412 -1631110 +POINT-1022199 -1701568 +POINT-850492 -1793567 +POINT-787538 -1819717 +POINT-670591 -1868293 +POINT-605378 -1888148 +POINT-484235 -1925029 +POINT-293226 -1963222 +POINT-99378 -1982509 +POINT95415 -1982704 +POINT163260 -1976091 +POINT289293 -1963806 +POINT480394 -1925994 +POINT545644 -1906271 +POINT666856 -1869632 +POINT846895 -1795269 +POINT907046 -1763195 +POINT1018785 -1703613 +POINT1075503 -1665798 +POINT1180864 -1595550 +POINT1233604 -1552358 +POINT1331575 -1472122 +POINT1379824 -1423968 +POINT1469453 -1334514 +POINT1512753 -1281864 +POINT1593187 -1184059 +POINT1663643 -1078839 +POINT1701570 -1022197 +POINT1761373 -910577 +POINT1793565 -850490 +POINT1868303 -670597 +POINT1925035 -484241 +POINT1949863 -360068 +POINT1963228 -293224 +POINT1982515 -99384 +POINT1982644 27245 +POINT1982713 95414 +POINT1982713 95417 +POINT1970424 221449 +POINT1963808 289295 +POINT1925996 480388 +POINT1889355 601603 +POINT1869630 666854 +POINT1843610 729860 +POINT1795274 846900 +POINT1735690 958640 +POINT1703615 1018791 +POINT1595552 1180866 +POINT1552360 1233604 +POINT1472124 1331573 +POINT1423971 1379822 +POINT1334520 1469451 +POINT1281866 1512749 +POINT1184053 1593181 +POINT1022203 1701568 +POINT850496 1793567 +POINT733549 1842144 +POINT670595 1868293 +POINT605382 1888148 +POINT484239 1925029 +POINT360071 1949857 +POINT293230 1963222 +POINT167217 1975760 +POINT99382 1982509 +POINT-27245 1982636 +POINT-95411 1982704 +POINT-289289 1963806 +POINT-480390 1925994 +POINT-601602 1889356 +POINT-666852 1869632 +POINT-846906 1795265 +POINT-1018781 1703613 +POINT-1180860 1595550 +POINT-1233600 1552358 +POINT-1331571 1472122 +POINT-1379820 1423968 +POINT-1469450 1334514 +POINT-1512749 1281864 +POINT-1593183 1184059 +POINT-1631111 1127417 +POINT-1701566 1022197 +POINT-1761369 910577 +POINT-1793562 850490 +POINT-1868299 670597 +POINT-1888152 605384 +POINT-1925031 484241 +POINT-1963224 293224 +POINT-1975762 167216 +POINT-1982511 99384 +POINT-1982640 -27248 diff --git a/src/libseqarrange/data/arrange_data_import.txt b/src/libseqarrange/data/arrange_data_import.txt new file mode 100644 index 0000000000..1cafb49efc --- /dev/null +++ b/src/libseqarrange/data/arrange_data_import.txt @@ -0,0 +1,103 @@ +[0] +{ + { 59805001, 104837501}, + { 138194999, 104837501}, + { 138194999, 170162499}, + { 59805001, 170162499}, +} +[1] +{ + { 98905001, 128837501}, + { 137094999, 128837501}, + { 137094999, 194162499}, + { 98905001, 194162499}, +} +[2] +{ + { 87947501, -200777500}, + { 109052499, -200777500}, + { 109052499, 111777500}, + { 87947501, 111777500}, +} +[3] +{ + { -251749999, 135975000}, + { 451749999, 135975000}, + { 451749999, 146025000}, + { -251749999, 146025000}, +} +[4] +{ + { 60703847, 116627178}, + { 66819499, 110123477}, + { 91818437, 104869705}, + { 105080395, 104869705}, + { 130074079, 110123477}, + { 132267420, 114102067}, + { 137466435, 134016601}, + { 129018075, 157509597}, + { 108906102, 169955300}, + { 66569848, 169955300}, + { 61724003, 148124080}, +} +[5] +{ + { 99664894, 149716571}, + { 116945947, 134530303}, + { 132235559, 129464592}, + { 134464447, 129703905}, + { 136226625, 131089485}, + { 136982449, 133766317}, + { 131461528, 186578282}, + { 130446438, 189877277}, + { 122072071, 193937577}, + { 116438408, 191146129}, + { 99690267, 159429154}, +} +[6] +{ + { -107902592, 137317947}, + { -107397580, 136812603}, + { 265301643, 136812603}, + { 265806656, 137317947}, + { 265806656, 144386863}, + { 265301643, 144891423}, + { -107397580, 144891423}, + { -107902592, 144386863}, +} +[7] +{ + { 88464688, 108238119}, + { 91284129, 67996899}, + { 91796754, 67484273}, + { 105125022, 67484273}, + { 105637648, 67996899}, + { 108457089, 110545008}, + { 100003682, 150980876}, + { 88464688, 110545008}, +} +[8] +{ + { 94975001, 144975001}, + { 105024999, 144975001}, + { 105024999, 155024999}, + { 94975001, 155024999}, +} +[9] +{ + { 96253202, 148380153}, + { 99529436, 145945250}, + { 102556657, 147254000}, + { 103276232, 147565098}, + { 103746800, 151619843}, + { 100470568, 154054751}, + { 98325608, 153127426}, + { 96723770, 152434902}, +} +[10] +{ + { 87345001, -200670000}, + { 350654999, -200670000}, + { 350654999, 68670000}, + { 87345001, 68670000}, +} diff --git a/src/libseqarrange/data/arrange_data_import.txt.1 b/src/libseqarrange/data/arrange_data_import.txt.1 new file mode 100644 index 0000000000..8389034b28 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_import.txt.1 @@ -0,0 +1,3 @@ +1 80300000 67400000 +0 80200000 67400000 +2 115400000 88200000 diff --git a/src/libseqarrange/data/arrange_data_import.txt.2 b/src/libseqarrange/data/arrange_data_import.txt.2 new file mode 100644 index 0000000000..d88abffb18 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_import.txt.2 @@ -0,0 +1,5 @@ +2 76700000 64400000 +3 76800000 64400000 +1 118900000 73978723 +0 76800000 113508353 +4 159800000 125700000 diff --git a/src/libseqarrange/data/arrange_data_import.txt.3 b/src/libseqarrange/data/arrange_data_import.txt.3 new file mode 100644 index 0000000000..ce7befdc13 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_import.txt.3 @@ -0,0 +1,4 @@ +1 81800000 68600000 +2 81999642 109400000 +3 126200000 68600000 +0 126200000 109400000 diff --git a/src/libseqarrange/data/arrange_data_import_000.txt b/src/libseqarrange/data/arrange_data_import_000.txt new file mode 100644 index 0000000000..19dc369735 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_import_000.txt @@ -0,0 +1,6 @@ +88 84900000 76299800 +99 213000000 17600000 +66 84900000 140300000 +44 165100000 69700000 +131 164900100 133600100 +151 41800000 180400000 diff --git a/src/libseqarrange/data/arrange_data_import_001.txt b/src/libseqarrange/data/arrange_data_import_001.txt new file mode 100644 index 0000000000..83acd50da1 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_import_001.txt @@ -0,0 +1,5 @@ +77 75800000 67999800 +162 165100000 62100000 +120 75800000 131899900 +192 174200000 147900000 +234 32700000 183999900 diff --git a/src/libseqarrange/data/arrange_data_import_002.txt b/src/libseqarrange/data/arrange_data_import_002.txt new file mode 100644 index 0000000000..db932d2145 --- /dev/null +++ b/src/libseqarrange/data/arrange_data_import_002.txt @@ -0,0 +1,2 @@ +203 154100000 78999900 +223 95800000 131000000 diff --git a/src/libseqarrange/data/combo_body.txt b/src/libseqarrange/data/combo_body.txt new file mode 100644 index 0000000000..fe2994f0b5 --- /dev/null +++ b/src/libseqarrange/data/combo_body.txt @@ -0,0 +1,38 @@ +---------------------------------------------------------------- +Polygon decimation utility - build 173 +(C) 2024 Prusa Research +================================================================ +Decimation ... + Decimating objects (polygons) ... + Decimating objects (polygons) ... finished + [0] + -39105202 -33269412 + -33019977 -39740757 + -8145411 -44968391 + 5050568 -44968391 + 29919905 -39740757 + 32102334 -35781961 + 37275483 -15966504 + 28869155 7409612 + 8857241 19793397 + -33268386 19793397 + -38090122 -1929211 + [1] + -76068 -127644 + -1876 -127644 + -1876 -47354 + -76068 -47354 + [2] + -76068 -127644 + -1876 -127644 + -1876 -47354 + -76068 -47354 + [3] + -76068 -127644 + -1876 -127644 + -1876 -47354 + -76068 -47354 + Displaying ... finised +Decimation ... finished +Total CPU time: 0.002 +---------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_fac.txt b/src/libseqarrange/data/combo_fac.txt new file mode 100644 index 0000000000..9c97373ccb --- /dev/null +++ b/src/libseqarrange/data/combo_fac.txt @@ -0,0 +1,38 @@ +---------------------------------------------------------------- +Polygon decimation utility - build 173 +(C) 2024 Prusa Research +================================================================ +Decimation ... + Decimating objects (polygons) ... + Decimating objects (polygons) ... finished + [0] + 70757723 18776195 + 87952801 3665480 + 103166346 -1375028 + 105384145 -1136906 + 107137556 241781 + 107889619 2905295 + 102396166 55454515 + 101386126 58737097 + 93053422 62777197 + 87447788 59999636 + 70782970 28440457 + [1] + 70936482 18899128 + 71010674 18899128 + 71010674 18979418 + 70936482 18979418 + [2] + 70936482 18899128 + 71010674 18899128 + 71010674 18979418 + 70936482 18979418 + [3] + 70936482 18899128 + 71010674 18899128 + 71010674 18979418 + 70936482 18979418 + Displaying ... finised +Decimation ... finished +Total CPU time: 0.002 +---------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_fan.txt b/src/libseqarrange/data/combo_fan.txt new file mode 100644 index 0000000000..343b7e0abf --- /dev/null +++ b/src/libseqarrange/data/combo_fan.txt @@ -0,0 +1,38 @@ +---------------------------------------------------------------- +Polygon decimation utility - build 173 +(C) 2024 Prusa Research +================================================================ +Decimation ... + Decimating objects (polygons) ... + Decimating objects (polygons) ... finished + [0] + -242277 -223805 + 16952801 -15334520 + 32166346 -20375028 + 34384145 -20136906 + 36137556 -18758219 + 36889619 -16094705 + 31396166 36454515 + 30386126 39737097 + 22053422 43777197 + 16447788 40999636 + -217030 9440457 + [1] + -63518 -100872 + 10674 -100872 + 10674 -20582 + -63518 -20582 + [2] + -63518 -100872 + 10674 -100872 + 10674 -20582 + -63518 -20582 + [3] + -63518 -100872 + 10674 -100872 + 10674 -20582 + -63518 -20582 + Displaying ... finised +Decimation ... finished +Total CPU time: 0.002 +---------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_gantry.txt b/src/libseqarrange/data/combo_gantry.txt new file mode 100644 index 0000000000..a2531d436d --- /dev/null +++ b/src/libseqarrange/data/combo_gantry.txt @@ -0,0 +1,36 @@ +---------------------------------------------------------------- +Polygon decimation utility - build 173 +(C) 2024 Prusa Research +================================================================ +Decimation ... + Decimating objects (polygons) ... + Decimating objects (polygons) ... finished + [0] + -206972968 -12664471 + -206470468 -13167301 + 164374531 -13167301 + 164877031 -12664471 + 164877031 -5630724 + 164374531 -5128674 + -29074248 19032746 + -206470468 -5128674 + -206972968 -5630724 + [1] + -29076068 18872356 + -29001876 18872356 + -29001876 18952646 + -29076068 18952646 + [2] + -29068974 18882518 + -29008974 18882518 + -29008974 18942502 + -29068974 18942502 + [3] + -29068966 18882518 + -29008976 18882518 + -29008976 18942502 + -29068966 18942502 + Displaying ... finised +Decimation ... finished +Total CPU time: 0.003 +---------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_hose.txt b/src/libseqarrange/data/combo_hose.txt new file mode 100644 index 0000000000..f371e218e6 --- /dev/null +++ b/src/libseqarrange/data/combo_hose.txt @@ -0,0 +1,32 @@ +---------------------------------------------------------------- +Polygon decimation utility - build 173 +(C) 2024 Prusa Research +================================================================ +Decimation ... + Decimating objects (polygons) ... + Decimating objects (polygons) ... finished + [0] + -11942228 -3802359 + -9008017 -45681679 + 5396300 -46215173 + 8864005 -1401563 + 66483 40680323 + [1] + -76068 37872356 + -1876 37872356 + -1876 37952646 + -76068 37952646 + [2] + -76068 37872356 + -1876 37872356 + -1876 37952646 + -76068 37952646 + [3] + -76068 37872356 + -1876 37872356 + -1876 37952646 + -76068 37952646 + Displaying ... finised +Decimation ... finished +Total CPU time: 0.002 +---------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_nozzle.txt b/src/libseqarrange/data/combo_nozzle.txt new file mode 100644 index 0000000000..a53a3446ca --- /dev/null +++ b/src/libseqarrange/data/combo_nozzle.txt @@ -0,0 +1,47 @@ +---------------------------------------------------------------- +Polygon decimation utility - build 173 +(C) 2024 Prusa Research +================================================================ +Decimation ... + Decimating objects (polygons) ... + Decimating objects (polygons) ... finished + [0] + -3728158 -1611789 + -468223 -4034578 + 2543938 -2732339 + 3259933 -2422789 + 3728160 1611785 + 468227 4034579 + -1666062 3111867 + -3259931 2422789 + [1] + -3728158 -1611789 + -468223 -4034578 + 2543938 -2732339 + 3259933 -2422789 + 3728160 1611785 + 468227 4034579 + -1666062 3111867 + -3259931 2422789 + [2] + -2666014 -49680 + -1818027 -1951384 + 77116 -2665786 + 1907693 -1864493 + 2665439 89970 + 1896904 1871196 + 29049 2665786 + -1888367 1881903 + [3] + -2147405 -103336 + -1445368 -1591511 + 103333 -2147400 + 1591513 -1445366 + 2147410 103336 + 1445372 1591511 + -103328 2147400 + -1591509 1445366 + Displaying ... finised +Decimation ... finished +Total CPU time: 0.004 +---------------------------------------------------------------- diff --git a/src/libseqarrange/data/export.body.mk4 b/src/libseqarrange/data/export.body.mk4 new file mode 100644 index 0000000000..c7fc21ea8b --- /dev/null +++ b/src/libseqarrange/data/export.body.mk4 @@ -0,0 +1,35 @@ +[0] +{ + { -68105202, -14269412}, + { -62019977, -20740757}, + { -37145411, -25968391}, + { -23949432, -25968391}, + { 919905, -20740757}, + { 3102334, -16781961}, + { 8275483, 3033496}, + { -130845, 26409612}, + { -20142759, 38793397}, + { -62268386, 38793397}, + { -67090122, 17070789}, +} +[1] +{ + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, +} +[2] +{ + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, +} +[3] +{ + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, +} diff --git a/src/libseqarrange/data/export.composed.mk4 b/src/libseqarrange/data/export.composed.mk4 new file mode 100644 index 0000000000..17d813ceed --- /dev/null +++ b/src/libseqarrange/data/export.composed.mk4 @@ -0,0 +1,90 @@ +[0] +{ + { 92965001, -18561998}, + { 93467501, -19064498}, + { 106532499, -19064498}, + { 107032853, -18564152}, + { 107034999, -18561998}, + { 107034999, 19064502}, + { 92965001, 19064502}, +} +[1] +{ + { 32272767, -14064134}, + { 32280333, -14131218}, + { 32302627, -14194939}, + { 32338558, -14252100}, + { 37292553, -19466386}, + { 38297597, -20471247}, + { 44986025, -22129499}, + { 62925267, -25646999}, + { 75990267, -25646999}, + { 93929527, -22129499}, + { 100612767, -20471247}, + { 101617767, -19466247}, + { 102773534, -16551745}, + { 107785873, 1947953}, + { 107842660, 2224149}, + { 107879923, 2503647}, + { 107897512, 2785068}, + { 107895336, 3067036}, + { 107873407, 3348150}, + { 107831802, 3627038}, + { 107770768, 3902327}, + { 107690581, 4172657}, + { 99572443, 26211131}, + { 98567458, 27216131}, + { 79759156, 38472000}, + { 76943572, 38472004}, + { 40867696, 38472004}, + { 38051650, 38472000}, + { 37800400, 38220750}, + { 33277771, 16965000}, + { 32272767, -9140112}, +} +[2] +{ + { -85924999, -3516481}, + { -85422499, -4019311}, + { 285422499, -4019311}, + { 285924999, -3516481}, + { 285924999, 3517263}, + { 285422499, 4019313}, + { -85422499, 4019313}, + { -85924999, 3517263}, +} +[3] +{ + { 96271842, -1611789}, + { 96428935, -1728550}, + { 97278040, -2359609}, + { 99136269, -3740647}, + { 99222851, -3804993}, + { 99396077, -3933730}, + { 99531777, -4034578}, + { 99939184, -3858447}, + { 102543938, -2732339}, + { 103080267, -2500469}, + { 103259933, -2422789}, + { 103277445, -2271923}, + { 103311106, -1981898}, + { 103346009, -1681153}, + { 103423252, -1015595}, + { 103662663, 1047320}, + { 103710662, 1460919}, + { 103728160, 1611785}, + { 103571066, 1728550}, + { 102462264, 2552616}, + { 100777152, 3804994}, + { 100468227, 4034579}, + { 98333938, 3111867}, + { 97890800, 2920286}, + { 97261663, 2648291}, + { 96919735, 2500465}, + { 96740069, 2422789}, + { 96717496, 2228352}, + { 96595536, 1177477}, + { 96426053, -282893}, + { 96306377, -1314089}, + { 96289341, -1460923}, +} diff --git a/src/libseqarrange/data/export.fan.mk4 b/src/libseqarrange/data/export.fan.mk4 new file mode 100644 index 0000000000..2a22b9aa68 --- /dev/null +++ b/src/libseqarrange/data/export.fan.mk4 @@ -0,0 +1,35 @@ +[0] +{ + { -29242277, 18776195}, + { -12047199, 3665480}, + { 3166346, -1375028}, + { 5384145, -1136906}, + { 7137556, 241781}, + { 7889619, 2905295}, + { 2396166, 55454515}, + { 1386126, 58737097}, + { -6946578, 62777197}, + { -12552212, 59999636}, + { -29217030, 28440457}, +} +[1] +{ + { -29063518, 18899128}, + { -28989326, 18899128}, + { -28989326, 18979418}, + { -29063518, 18979418}, +} +[2] +{ + { -29063518, 18899128}, + { -28989326, 18899128}, + { -28989326, 18979418}, + { -29063518, 18979418}, +} +[3] +{ + { -29063518, 18899128}, + { -28989326, 18899128}, + { -28989326, 18979418}, + { -29063518, 18979418}, +} diff --git a/src/libseqarrange/data/export.gantry.mk4 b/src/libseqarrange/data/export.gantry.mk4 new file mode 100644 index 0000000000..458e9f49b4 --- /dev/null +++ b/src/libseqarrange/data/export.gantry.mk4 @@ -0,0 +1,33 @@ +[0] +{ + { -206972968, -12664471}, + { -206470468, -13167301}, + { 164374531, -13167301}, + { 164877031, -12664471}, + { 164877031, -5630724}, + { 164374531, -5128674}, + { -29074248, 19032746}, + { -206470468, -5128674}, + { -206972968, -5630724}, +} +[1] +{ + { -29111351, 18877954}, + { -29022835, 18841825}, + { -28966594, 18940523}, + { -29040014, 18983178}, +} +[2] +{ + { -29082150, 18912265}, + { -29037501, 18869349}, + { -28995798, 18912729}, + { -29038668, 18955671}, +} +[3] +{ + { -29082142, 18913210}, + { -29038481, 18869349}, + { -28995801, 18912970}, + { -29038668, 18955671}, +} diff --git a/src/libseqarrange/data/export.hose.mk4 b/src/libseqarrange/data/export.hose.mk4 new file mode 100644 index 0000000000..2988c87b0f --- /dev/null +++ b/src/libseqarrange/data/export.hose.mk4 @@ -0,0 +1,29 @@ +[0] +{ + { -40942228, -22802359}, + { -38008017, -64681679}, + { -23603700, -65215173}, + { -20135995, -20401563}, + { -28933517, 21680323}, +} +[1] +{ + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, +} +[2] +{ + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, +} +[3] +{ + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, +} diff --git a/src/libseqarrange/data/export.nozzle.mk4 b/src/libseqarrange/data/export.nozzle.mk4 new file mode 100644 index 0000000000..c142366be6 --- /dev/null +++ b/src/libseqarrange/data/export.nozzle.mk4 @@ -0,0 +1,44 @@ +[0] +{ + { -3728158, -1611789}, + { -468223, -4034578}, + { 2543938, -2732339}, + { 3259933, -2422789}, + { 3728160, 1611785}, + { 468227, 4034579}, + { -1666062, 3111867}, + { -3259931, 2422789}, +} +[1] +{ + { -3728158, -1611789}, + { -468223, -4034578}, + { 2543938, -2732339}, + { 3259933, -2422789}, + { 3728160, 1611785}, + { 468227, 4034579}, + { -1666062, 3111867}, + { -3259931, 2422789}, +} +[2] +{ + { -2666014, -49680}, + { -1818027, -1951384}, + { 77116, -2665786}, + { 1907693, -1864493}, + { 2665439, 89970}, + { 1896904, 1871196}, + { 29049, 2665786}, + { -1888367, 1881903}, +} +[3] +{ + { -2147405, -103336}, + { -1445368, -1591511}, + { 103333, -2147400}, + { 1591513, -1445366}, + { 2147410, 103336}, + { 1445372, 1591511}, + { -103328, 2147400}, + { -1591509, 1445366}, +} diff --git a/src/libseqarrange/data/extruder_bounding_boxes.mk4.svg b/src/libseqarrange/data/extruder_bounding_boxes.mk4.svg new file mode 100644 index 0000000000..5510bd66a7 --- /dev/null +++ b/src/libseqarrange/data/extruder_bounding_boxes.mk4.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_10.svg b/src/libseqarrange/data/polygon_test_10.svg new file mode 100644 index 0000000000..066965be10 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_10.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_11.svg b/src/libseqarrange/data/polygon_test_11.svg new file mode 100644 index 0000000000..bf86bf1797 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_11.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_12.svg b/src/libseqarrange/data/polygon_test_12.svg new file mode 100644 index 0000000000..31fae7c9b6 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_12.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_13.svg b/src/libseqarrange/data/polygon_test_13.svg new file mode 100644 index 0000000000..fe37996b40 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_13.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_14.svg b/src/libseqarrange/data/polygon_test_14.svg new file mode 100644 index 0000000000..261d7b5043 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_14.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_15.svg b/src/libseqarrange/data/polygon_test_15.svg new file mode 100644 index 0000000000..2235605166 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_15.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_7.svg b/src/libseqarrange/data/polygon_test_7.svg new file mode 100644 index 0000000000..b644da6297 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_7.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_8.svg b/src/libseqarrange/data/polygon_test_8.svg new file mode 100644 index 0000000000..c4c291a960 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_8.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/libseqarrange/data/polygon_test_9.svg b/src/libseqarrange/data/polygon_test_9.svg new file mode 100644 index 0000000000..b3103e86f5 --- /dev/null +++ b/src/libseqarrange/data/polygon_test_9.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/libseqarrange/data/preprocess_test_1.svg b/src/libseqarrange/data/preprocess_test_1.svg new file mode 100644 index 0000000000..3aa6f039ce --- /dev/null +++ b/src/libseqarrange/data/preprocess_test_1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/libseqarrange/data/preprocess_test_2.svg b/src/libseqarrange/data/preprocess_test_2.svg new file mode 100644 index 0000000000..ce04d17394 --- /dev/null +++ b/src/libseqarrange/data/preprocess_test_2.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/preprocess_test_3.svg b/src/libseqarrange/data/preprocess_test_3.svg new file mode 100644 index 0000000000..1d47c3627a --- /dev/null +++ b/src/libseqarrange/data/preprocess_test_3.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/libseqarrange/data/preprocess_test_4.svg b/src/libseqarrange/data/preprocess_test_4.svg new file mode 100644 index 0000000000..12b66e42f8 --- /dev/null +++ b/src/libseqarrange/data/preprocess_test_4.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/preprocess_test_5.svg b/src/libseqarrange/data/preprocess_test_5.svg new file mode 100644 index 0000000000..1d9cc83d87 --- /dev/null +++ b/src/libseqarrange/data/preprocess_test_5.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/libseqarrange/data/preprocess_test_6.svg b/src/libseqarrange/data/preprocess_test_6.svg new file mode 100644 index 0000000000..f998b9397e --- /dev/null +++ b/src/libseqarrange/data/preprocess_test_6.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/sequential_decimator.svg b/src/libseqarrange/data/sequential_decimator.svg new file mode 100644 index 0000000000..5510bd66a7 --- /dev/null +++ b/src/libseqarrange/data/sequential_decimator.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/sequential_prusa.svg b/src/libseqarrange/data/sequential_prusa.svg new file mode 100644 index 0000000000..43d2b9b719 --- /dev/null +++ b/src/libseqarrange/data/sequential_prusa.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/sequential_prusa_000.svg b/src/libseqarrange/data/sequential_prusa_000.svg new file mode 100644 index 0000000000..692747af00 --- /dev/null +++ b/src/libseqarrange/data/sequential_prusa_000.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ID:88 T:32ID:44 T:416ID:66 T:288ID:131 T:544ID:151 T:672ID:99 T:160 + diff --git a/src/libseqarrange/data/sequential_prusa_001.svg b/src/libseqarrange/data/sequential_prusa_001.svg new file mode 100644 index 0000000000..b36a255499 --- /dev/null +++ b/src/libseqarrange/data/sequential_prusa_001.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ID:192 T:416ID:162 T:160ID:120 T:288ID:77 T:32ID:234 T:544 + diff --git a/src/libseqarrange/data/sequential_prusa_002.svg b/src/libseqarrange/data/sequential_prusa_002.svg new file mode 100644 index 0000000000..eb2d3d95ac --- /dev/null +++ b/src/libseqarrange/data/sequential_prusa_002.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +ID:223 T:160ID:203 T:32 + diff --git a/src/libseqarrange/data/sequential_test_4.svg b/src/libseqarrange/data/sequential_test_4.svg new file mode 100644 index 0000000000..f48d4b82c6 --- /dev/null +++ b/src/libseqarrange/data/sequential_test_4.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/sequential_test_5.svg b/src/libseqarrange/data/sequential_test_5.svg new file mode 100644 index 0000000000..57806281ba --- /dev/null +++ b/src/libseqarrange/data/sequential_test_5.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/sequential_test_6.svg b/src/libseqarrange/data/sequential_test_6.svg new file mode 100644 index 0000000000..a2639cc07d --- /dev/null +++ b/src/libseqarrange/data/sequential_test_6.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/data/sequential_test_7.svg b/src/libseqarrange/data/sequential_test_7.svg new file mode 100644 index 0000000000..a544539b56 --- /dev/null +++ b/src/libseqarrange/data/sequential_test_7.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libseqarrange/include/seq_defs.hpp b/src/libseqarrange/include/seq_defs.hpp new file mode 100644 index 0000000000..88104d8301 --- /dev/null +++ b/src/libseqarrange/include/seq_defs.hpp @@ -0,0 +1,73 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2023 + * + * File: seq_defs.h + * + * Definitions of useful macros. + */ +/*================================================================*/ + +#ifndef __SEQ_DEFS_HPP__ +#define __SEQ_DEFS_HPP__ + +/*----------------------------------------------------------------*/ + +#include +#include + +#include +#include +#include + + +/*----------------------------------------------------------------*/ + + +using namespace std; + +#define SEQ_UNUSED(x) + +//#define DEBUG +//#define PROFILE + +typedef wchar_t wchar; + +typedef std::basic_string string; +typedef std::vector strings_vector; +typedef std::set strings_set; + + +/*----------------------------------------------------------------*/ + +extern const string INDENT; + +/*----------------------------------------------------------------*/ + +#define MIN(x,y) (((x) < (y)) ? (x) : (y)) +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) +#define DFR(x,y) (((x) < (y)) ? ((y) - (x)) : ((x) - (y))) +#define ABS(x) (((x) < 0) ? -(x) : (x)) +#define SGN(x) (((x) < 0) ? -(-1) : ((x) > 0) ? 1 : 0) + + +/*----------------------------------------------------------------*/ + +#ifdef DEBUG + #define ASSERT(condition) \ + { \ + if (!(condition)) \ + { \ + printf("ASSERT: assertion failed (file: %s, line:%d).\n", __FILE__, __LINE__); \ + fflush(NULL); \ + exit(-1); \ + } \ + } +#else + #define ASSERT(condition) +#endif /* DEBUG */ + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_DEFS_HPP__ */ diff --git a/src/libseqarrange/include/seq_interface.hpp b/src/libseqarrange/include/seq_interface.hpp new file mode 100644 index 0000000000..a9e41d2a9c --- /dev/null +++ b/src/libseqarrange/include/seq_interface.hpp @@ -0,0 +1,123 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_interface.hpp + * + * Interface of the sequential printing SMT model for Prusa Slic3r + */ +/*================================================================*/ + +#ifndef __SEQ_INTERFACE_HPP__ +#define __SEQ_INTERFACE_HPP__ + + +/*----------------------------------------------------------------*/ + +#include "libslic3r/Polygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" + +#include "seq_defs.hpp" +#include "seq_sequential.hpp" +#include "seq_preprocess.hpp" + + +/*----------------------------------------------------------------*/ + +using namespace Slic3r; + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + +/*----------------------------------------------------------------*/ + +struct ObjectToPrint +{ + int id = 0; + coord_t total_height = 0; + std::vector> pgns_at_height; +}; + + +struct ScheduledObject { + ScheduledObject(int _id, coord_t _x, coord_t _y) + : id(_id) + , x(_x) + , y(_y) { /* */ } + + int id = 0; + coord_t x, y; +}; + + +struct ScheduledPlate { + std::vector scheduled_objects; +}; + + +/*----------------------------------------------------------------*/ +/* + This is the recommended interface for testing sequential printability. + + Please see the corresponding example of usage (seq_test_interface.cpp) + + Note: The function always succeeds, does not throw any exception. +*/ + +bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const std::vector &objects_to_print, + const std::vector &scheduled_plates); + + +/*----------------------------------------------------------------*/ +/* + This is the recommended interface for sequential scheduling/arranging. + + Please see the corresponding example of usage (seq_test_interface.cpp) + + Note: The function should succeed except the case when there is an + object that does not fit on the plate and in the case when the solver + is unable to scedule even single object on the plate. The latter case + is detected by timeout and should not normally happen. These failures + are reported via exceptions. +*/ + +std::vector schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const std::vector &objects_to_print); + +void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const std::vector &objects_to_print, + std::vector &scheduled_plates); + + +/*----------------------------------------------------------------*/ + +int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const std::vector &objects_to_print, + std::vector &scheduled_plates); + +void setup_ExtruderUnreachableZones(const SolverConfiguration &solver_configuration, + std::vector > &convex_unreachable_zones, + std::vector > &box_unreachable_zones); + +int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const std::vector &objects_to_print, + const std::vector > &convex_unreachable_zones, + const std::vector > &box_unreachable_zones, + std::vector &scheduled_plates); + +/*----------------------------------------------------------------*/ + +} // namespace Sequential + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_INTERFACE_HPP__ */ diff --git a/src/libseqarrange/include/seq_preprocess.hpp b/src/libseqarrange/include/seq_preprocess.hpp new file mode 100644 index 0000000000..b1f76cee40 --- /dev/null +++ b/src/libseqarrange/include/seq_preprocess.hpp @@ -0,0 +1,220 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_preprocess.hpp + * + * Object preprocessing for the sequential printing SMT model. + */ +/*================================================================*/ + +#ifndef __SEQ_PREPROCESS_HPP__ +#define __SEQ_PREPROCESS_HPP__ + + +/*----------------------------------------------------------------*/ + +#include "seq_sequential.hpp" + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + +/*----------------------------------------------------------------*/ + +const double SEQ_POLYGON_DECIMATION_GROW_FACTOR = 1.005; + + +/*----------------------------------------------------------------*/ + +struct ObjectToPrint; + + +/*----------------------------------------------------------------*/ + +extern const std::vector SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S; +extern const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S; +extern const std::vector SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S; +extern const std::vector SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S; + +extern const std::vector > SEQ_UNREACHABLE_POLYGON_ALL_LEVELS_MK3S; +extern const std::vector > SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S; +extern const std::vector > SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S; + + +extern const std::vector SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK4; +extern const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK4; +extern const std::vector SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK4; +extern const std::vector SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK4; + +extern const std::vector > SEQ_UNREACHABLE_POLYGON_ALL_LEVELS_MK4; +extern const std::vector > SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK4; +extern const std::vector > SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4; + +extern const std::vector SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_XL; +extern const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_XL; +extern const std::vector SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_XL; +extern const std::vector SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_XL; + +extern const std::vector > SEQ_UNREACHABLE_POLYGON_ALL_LEVELS_XL; +extern const std::vector > SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_XL; +extern const std::vector > SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_XL; + + +/*----------------------------------------------------------------*/ + +Rational scaleDown_CoordinateForSequentialSolver(coord_t x); + +void scaleDown_PolygonForSequentialSolver(const Slic3r::Polygon &polygon, + Slic3r::Polygon &scaled_polygon); + +void scaleDown_PolygonForSequentialSolver(coord_t scale_factor, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &scaled_polygon); + +Slic3r::Polygon scaleDown_PolygonForSequentialSolver(coord_t scale_factor, const Slic3r::Polygon &polygon); + + +void scaleUp_PositionForSlicer(const Rational &position_X, + const Rational &position_Y, + coord_t &scaled_position_X, + coord_t &scaled_position_Y); + +void scaleUp_PositionForSlicer(coord_t scale_factor, + const Rational &position_X, + const Rational &position_Y, + coord_t &scaled_position_X, + coord_t &scaled_position_Y); + +void scaleUp_PositionForSlicer(double position_X, + double position_Y, + coord_t &scaled_position_X, + coord_t &scaled_position_Y); + +void scaleUp_PositionForSlicer(coord_t scale_factor, + double position_X, + double position_Y, + coord_t &scaled_position_X, + coord_t &scaled_position_Y); + +Slic3r::Polygon scaleUp_PolygonForSlicer(const Slic3r::Polygon &polygon); +Slic3r::Polygon scaleUp_PolygonForSlicer(coord_t scale_factor, const Slic3r::Polygon &polygon); + +Slic3r::Polygon scaleUp_PolygonForSlicer(const Slic3r::Polygon &polygon, double x_pos, double y_pos); +Slic3r::Polygon scaleUp_PolygonForSlicer(coord_t scale_factor, const Slic3r::Polygon &polygon, double x_pos, double y_pos); + +void ground_PolygonByBoundingBox(Slic3r::Polygon &polygon); +void ground_PolygonByFirstPoint(Slic3r::Polygon &polygon); + +void shift_Polygon(Slic3r::Polygon &polygon, coord_t x_offset, coord_t y_offset); +void shift_Polygon(Slic3r::Polygon &polygon, const Slic3r::Point &offset); + + +/*----------------------------------------------------------------*/ + +Slic3r::Polygon transform_UpsideDown(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon); +Slic3r::Polygon transform_UpsideDown(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon); + +void transform_UpsideDown(const SolverConfiguration &solver_configuration, + const coord_t &scaled_x_pos, + const coord_t &scaled_y_pos, + coord_t &transformed_x_pos, + coord_t &transformed_y_pos); + +void transform_UpsideDown(const SolverConfiguration &solver_configuration, + coord_t scale_factor, + const coord_t &scaled_x_pos, + const coord_t &scaled_y_pos, + coord_t &transformed_x_pos, + coord_t &transformed_y_pos); + + +/*----------------------------------------------------------------*/ + +void decimate_PolygonForSequentialSolver(const SolverConfiguration &solver_configuration, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &scale_down_polygon); + +void decimate_PolygonForSequentialSolver(double DP_tolerance, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &decimated_polygon); + +void extend_PolygonConvexUnreachableZone(const SolverConfiguration &solver_configuration, + const Slic3r::Polygon &polygon, + const std::vector &extruder_polygons, + std::vector &unreachable_polygons); + +void extend_PolygonBoxUnreachableZone(const SolverConfiguration &solver_configuration, + const Slic3r::Polygon &polygon, + const std::vector &extruder_polygons, + std::vector &unreachable_polygons); + +void extend_PolygonBoxUnreachableZone(const SolverConfiguration &solver_configuration, + const Slic3r::Polygon &polygon, + const std::vector &extruder_polygons, + std::vector &unreachable_polygons); + +void prepare_ExtruderPolygons(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const ObjectToPrint &object_to_print, + std::vector &convex_level_polygons, + std::vector &box_level_polygons, + std::vector > &extruder_convex_level_polygons, + std::vector > &extruder_box_level_polygons); + +void prepare_ObjectPolygons(const SolverConfiguration &solver_configuration, + const std::vector &convex_level_polygons, + const std::vector &box_level_polygons, + const std::vector > &extruder_convex_level_polygons, + const std::vector > &extruder_box_level_polygons, + Slic3r::Polygon &object_polygon, + std::vector &unreachable_polygons); + +void prepare_UnreachableZonePolygons(const SolverConfiguration &solver_configuration, + const Slic3r::Polygon &polygon, + const std::vector > &extruder_convex_level_polygons, + const std::vector > &extruder_box_level_polygons, + std::vector &unreachable_polygons); + +void prepare_UnreachableZonePolygons(const SolverConfiguration &solver_configuration, + const std::vector &convex_level_polygons, + const std::vector &box_level_polygons, + const std::vector > &extruder_convex_level_polygons, + const std::vector > &extruder_box_level_polygons, + std::vector &unreachable_polygons); + +bool check_PolygonSize(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon); +bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon); + +void simplify_ConvexUnreachablePolygons(const std::vector > &unreachable_convex_polygons, + std::vector &simplified_unreachable_polygons); + + +/*----------------------------------------------------------------*/ + +double calc_PolygonArea(const Slic3r::Polygon &polygon); + +double calc_PolygonUnreachableZoneArea(const Slic3r::Polygon &polygon, + const std::vector &unreachable_polygons); + +double calc_PolygonArea(const std::vector &polygons); +double calc_PolygonArea(const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons); + +double calc_PolygonUnreachableZoneArea(const std::vector &polygons, + const std::vector > &unreachable_polygons); + + +/*----------------------------------------------------------------*/ + +} // namespace Sequential + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_PREPROCESS_HPP__ */ diff --git a/src/libseqarrange/include/seq_sequential.hpp b/src/libseqarrange/include/seq_sequential.hpp new file mode 100644 index 0000000000..b0cfa51036 --- /dev/null +++ b/src/libseqarrange/include/seq_sequential.hpp @@ -0,0 +1,1713 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_sequential.hpp + * + * SMT models for sequential printing. + */ +/*================================================================*/ + +#ifndef __SEQ_SEQUENTIAL_HPP__ +#define __SEQ_SEQUENTIAL_HPP__ + + +/*----------------------------------------------------------------*/ + +#include +#include +#include + +#include + +#include + +#include "libslic3r/Geometry.hpp" +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" + +#include + +#include "seq_defs.hpp" + + +/*----------------------------------------------------------------*/ + +using namespace Slic3r; + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + + +/*----------------------------------------------------------------*/ + +const coord_t SEQ_SLICER_SCALE_FACTOR = 100000; +const coord_t SEQ_SVG_SCALE_FACTOR = 50000; + + +#define SEQ_INTERSECTION_REPULSION_MIN "-0.01" +#define SEQ_INTERSECTION_REPULSION_MAX "1.01" +#define SEQ_TEMPORAL_ABSENCE_THRESHOLD "-16" +#define SEQ_TEMPORAL_PRESENCE_THRESHOLD "16" + +#define SEQ_Z3_SOLVER_TIMEOUT "8000" + +const int SEQ_GROUND_PRESENCE_TIME = 32; +const int64_t SEQ_RATIONAL_PRECISION = 1000; +const double SEQ_DECIMATION_TOLERANCE = 400000.0; + +const double SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED = 0.0; +const double SEQ_DECIMATION_TOLERANCE_VALUE_LOW = 150000.0; +const double SEQ_DECIMATION_TOLERANCE_VALUE_HIGH = 450000.0; + + +/*----------------------------------------------------------------*/ + +typedef std::basic_string string; +typedef std::unordered_map string_map; + + +/*----------------------------------------------------------------*/ + +struct PrinterGeometry +{ + coord_t x_size; + coord_t y_size; + + std::set convex_heights; + std::set box_heights; + + std::map > extruder_slices; +}; + + +/*----------------------------------------------------------------*/ + +enum PrinterType +{ + SEQ_PRINTER_TYPE_UNDEFINED, + SEQ_PRINTER_TYPE_PRUSA_MK3S, + SEQ_PRINTER_TYPE_PRUSA_MK4, + SEQ_PRINTER_TYPE_PRUSA_XL, +}; + + +enum DecimationPrecision +{ + SEQ_DECIMATION_PRECISION_UNDEFINED, + SEQ_DECIMATION_PRECISION_LOW, + SEQ_DECIMATION_PRECISION_HIGH +}; + + +/*----------------------------------------------------------------*/ + +const int SEQ_PRUSA_MK3S_X_SIZE = 2500; +const int SEQ_PRUSA_MK3S_Y_SIZE = 2100; + +const coord_t SEQ_PRUSA_MK3S_NOZZLE_LEVEL = 0; +const coord_t SEQ_PRUSA_MK3S_EXTRUDER_LEVEL = 2000000; +const coord_t SEQ_PRUSA_MK3S_HOSE_LEVEL = 18000000; +const coord_t SEQ_PRUSA_MK3S_GANTRY_LEVEL = 26000000; + + +const int SEQ_PRUSA_MK4_X_SIZE = 2500; +const int SEQ_PRUSA_MK4_Y_SIZE = 2100; + +// TODO: measure for true values +const coord_t SEQ_PRUSA_MK4_NOZZLE_LEVEL = 0; +const coord_t SEQ_PRUSA_MK4_EXTRUDER_LEVEL = 2000000; +const coord_t SEQ_PRUSA_MK4_HOSE_LEVEL = 18000000; +const coord_t SEQ_PRUSA_MK4_GANTRY_LEVEL = 26000000; + +const int SEQ_PRUSA_XL_X_SIZE = 3600; +const int SEQ_PRUSA_XL_Y_SIZE = 3600; + +// TODO: measure for true values +const coord_t SEQ_PRUSA_XL_NOZZLE_LEVEL = 0; +const coord_t SEQ_PRUSA_XL_EXTRUDER_LEVEL = 2000000; +const coord_t SEQ_PRUSA_XL_HOSE_LEVEL = 18000000; +const coord_t SEQ_PRUSA_XL_GANTRY_LEVEL = 26000000; + + +/*----------------------------------------------------------------*/ + +struct SolverConfiguration +{ + SolverConfiguration() + : bounding_box_size_optimization_step(4) + , minimum_X_bounding_box_size(10) + , minimum_Y_bounding_box_size(10) + , maximum_X_bounding_box_size(SEQ_PRUSA_MK3S_X_SIZE) + , maximum_Y_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) + , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) + , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) + , object_group_size(4) + , temporal_spread(16) + , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) + , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) + , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) + { + /* nothing */ + } + + SolverConfiguration(const PrinterGeometry &printer_geometry) + : bounding_box_size_optimization_step(4) + , minimum_X_bounding_box_size(10) + , minimum_Y_bounding_box_size(10) + , maximum_X_bounding_box_size(printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR) + , maximum_Y_bounding_box_size(printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR) + , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) + , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) + , object_group_size(4) + , temporal_spread(16) + , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) + , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) + , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) + { + /* nothing */ + } + + static double convert_DecimationPrecision2Tolerance(DecimationPrecision decimation_precision) + { + switch (decimation_precision) + { + case SEQ_DECIMATION_PRECISION_UNDEFINED: + { + return SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED; + break; + } + case SEQ_DECIMATION_PRECISION_LOW: + { + return SEQ_DECIMATION_TOLERANCE_VALUE_HIGH; + break; + } + case SEQ_DECIMATION_PRECISION_HIGH: + { + return SEQ_DECIMATION_TOLERANCE_VALUE_LOW; + break; + } + default: + { + break; + } + } + return SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED; + } + + void setup(const PrinterGeometry &printer_geometry) + { + maximum_X_bounding_box_size = printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR; + maximum_Y_bounding_box_size = printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR; + minimum_bounding_box_size = MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size); + maximum_bounding_box_size = MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size); + } + + int bounding_box_size_optimization_step; + int minimum_X_bounding_box_size; + int minimum_Y_bounding_box_size; + int maximum_X_bounding_box_size; + int maximum_Y_bounding_box_size; + int minimum_bounding_box_size; + int maximum_bounding_box_size; + int object_group_size; + int temporal_spread; + + DecimationPrecision decimation_precision; + PrinterType printer_type; + + string optimization_timeout; +}; + + +/*----------------------------------------------------------------*/ + +struct Rational +{ + Rational() + : numerator(0) + , denominator(1) + { + /* nothing */ + } + + Rational(int64_t n) + : numerator(n) + , denominator(1) + { + /* nothing */ + } + + Rational(int64_t n, int64_t d) + : numerator(n) + , denominator(d) + { + /* nothing */ + } + + Rational(const z3::expr &expr) + { + if (expr.denominator().as_int64() != 0) + { + if (expr.numerator().as_int64() != 0) + { + numerator = expr.numerator().as_int64(); + denominator = expr.denominator().as_int64(); + } + else + { + double expr_val = expr.as_double(); + if (fabs(expr_val) > EPSILON) + { + numerator = expr_val * SEQ_RATIONAL_PRECISION; + denominator = SEQ_RATIONAL_PRECISION; + } + else + { + numerator = 0; + denominator = 1; + } + } + } + else + { + numerator = expr.as_double() * SEQ_RATIONAL_PRECISION; + denominator = SEQ_RATIONAL_PRECISION; + } + } + + bool is_Positive(void) const + { + return ((numerator > 0 && denominator > 0) || (numerator < 0 && denominator < 0)); + } + + bool is_Negative(void) const + { + return ((numerator > 0 && denominator < 0) || (numerator < 0 && denominator > 0)); + } + + double as_double() const + { + return (double)numerator / denominator; + } + + int64_t as_int64() const + { + return numerator / denominator; + } + + Rational operator+(int64_t val) const + { + return Rational(numerator + val * denominator, denominator); + } + + Rational operator*(int64_t val) const + { + return Rational(numerator * val, denominator); + } + + Rational normalize(void) const + { + return Rational(as_double() * SEQ_RATIONAL_PRECISION, SEQ_RATIONAL_PRECISION); + } + + bool operator<(const Rational &rational) const + { + return (as_double() < rational.as_double()); + } + + bool operator>(const Rational &rational) const + { + return (as_double() > rational.as_double()); + } + + int64_t numerator; + int64_t denominator; +}; + + +/*----------------------------------------------------------------*/ + +bool lines_intersect_(coord_t ax, coord_t ay, coord_t ux, coord_t uy, coord_t bx, coord_t by, coord_t vx, coord_t vy); +bool lines_intersect(double ax, double ay, double ux, double uy, double bx, double by, double vx, double vy); +bool lines_intersect_closed(double ax, double ay, double ux, double uy, double bx, double by, double vx, double vy); +bool lines_intersect_open(double ax, double ay, double ux, double uy, double bx, double by, double vx, double vy); + + +/*----------------------------------------------------------------*/ + +void introduce_DecisionBox(z3::solver &Solver, + const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + int box_size_x, + int box_size_y); + +void assume_DecisionBox(const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + int box_size_x, + int box_size_y, + z3::expr_vector &box_constraints); + + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_size_x, + int box_size_y); + +void assume_BedBoundingBox(const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_size_x, + int box_size_y, + z3::expr_vector &bounding_constraints); + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y); + + +void assume_BedBoundingBox(const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y, + z3::expr_vector &bounding_constraints); + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_size_x, + int box_size_y); + +void assume_BedBoundingBox(const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_size_x, + int box_size_y, + z3::expr_vector &bounding_constraints); + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y); + +void assume_BedBoundingBox(const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y, + z3::expr_vector &bounding_constraints); + +void assume_ConsequentialObjectPresence(z3::context &Context, + const z3::expr_vector &dec_vars_T, + const std::vector &present, + const std::vector &missing, + z3::expr_vector &presence_constraints); + + +/*----------------------------------------------------------------*/ + +void introduce_TemporalOrdering(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_T, + int temporal_spread, + const std::vector &polygons); + +void introduce_SequentialTemporalOrderingAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + int temporal_spread, + const std::vector &polygons); + +void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + int temporal_spread, + const std::vector &polygons); + +/*----------------------------------------------------------------*/ + +void introduce_LineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2); + +void introduce_SequentialLineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_ConsequentialLineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_LineNonIntersection_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2); + +void introduce_SequentialLineNonIntersection_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_ConsequentialLineNonIntersection_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_LineNonIntersection_explicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2); + +void introduce_LineNonIntersectionAgainstFixedLine(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2); + +void introduce_SequentialLineNonIntersectionAgainstFixedLine(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_SequentialFixedLineNonIntersectionAgainstLine(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_ConsequentialLineNonIntersectionAgainstFixedLine(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_ConsequentialFixedLineNonIntersectionAgainstLine(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_LineNonIntersectionAgainstFixedLine_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2); + +void introduce_LineNonIntersectionAgainstFixedLine_explicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2); + +void introduce_SequentialLineNonIntersectionAgainstFixedLine_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_SequentialFixedLineNonIntersectionAgainstLine_implicit(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_ConsequentialLineNonIntersectionAgainstFixedLine_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + +void introduce_ConsequentialFixedLineNonIntersectionAgainstLine_implicit(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2); + + +/*----------------------------------------------------------------*/ + +void introduce_PointInsideHalfPlane(z3::solver &Solver, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Line &halving_line); + +void introduce_PointOutsideHalfPlane(z3::solver &Solver, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Line &halving_line); + +void introduce_PointInsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon); + +void introduce_PointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon); + +void introduce_SequentialPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon); + +void introduce_ConsequentialPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon); + +void introduce_FixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + double dec_value_X1, + double dec_value_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon); + +void introduce_FixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon); + +void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon); + +void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon); + +void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon); + +void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon); + +void introduce_PointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + double dec_value_X2, + double dec_value_Y2, + const Slic3r::Polygon &polygon); + +void introduce_PointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Slic3r::Polygon &polygon); + +void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon); + +void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Rational &dec_value_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon); + +void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon); + +void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Rational &dec_value_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon); + +void introduce_PolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Slic3r::Polygon &polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon2); + +void introduce_PolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Slic3r::Polygon &polygon1, + double dec_value_X2, + double dec_value_Y2, + const Slic3r::Polygon &polygon2); + +void introduce_PolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Slic3r::Polygon &polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Slic3r::Polygon &polygon2); + +void introduce_SequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2); + +void introduce_SequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2); + +void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2); + +void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2); + +void introduce_ConsequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2); + +void introduce_ConsequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2); + +void introduce_ConsequentialPolygonExternalPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2); + +void introduce_ConsequentialPolygonExternalPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2); + +void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2); + +void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2); + +void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2); + +void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2); + +void introduce_PolygonLineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Slic3r::Polygon &polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon2); + + +/*----------------------------------------------------------------*/ + +void introduce_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons); + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +void introduce_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons); + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +void introduce_PolygonStrongNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons); + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &polygons); + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_values_X, + const z3::expr_vector &dec_values_Y, + const std::vector &polygons); + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &polygons); + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + + +/*----------------------------------------------------------------*/ + +void introduce_PolygonWeakNonoverlappingAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_values_X, + const z3::expr_vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons); + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_values_X, + const z3::expr_vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons); + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons); + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + + +/*----------------------------------------------------------------*/ + +bool check_PointsOutsidePolygons(const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool check_PolygonLineIntersections(const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + + +/*----------------------------------------------------------------*/ + +void extract_DecisionValuesFromModel(const z3::model &Model, + const string_map &dec_var_names_map, + std::vector &dec_values_X, + std::vector &dec_values_Y); + +void extract_DecisionValuesFromModel(const z3::model &Model, + z3::context &Context, + const string_map &dec_var_names_map, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y); + +void extract_DecisionValuesFromModel(const z3::model &Model, + const string_map &dec_var_names_map, + std::vector &dec_values_X, + std::vector &dec_values_Y); + +void extract_DecisionValuesFromModel(const z3::model &Model, + const string_map &dec_var_names_map, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T); + +void build_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + string_map &dec_var_names_map); + +void build_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y, + string_map &dec_var_names_map); + +void build_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + string_map &dec_var_names_map); + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const string_map &dec_var_names_map, + const std::vector &polygons); + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y, + const string_map &dec_var_names_map, + const std::vector &polygons); + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const string_map &dec_var_names_map, + const std::vector &polygons); + +/*----------------------------------------------------------------*/ + +void build_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map); + +void build_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map); + +void build_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map); + +void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map); + +void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map); + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons); + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons); + +bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector &unreachable_polygons); + +bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool optimize_SequentialWeakPolygonNonoverlappingCentered(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool checkArea_SequentialWeakPolygonNonoverlapping(coord_t box_min_x, + coord_t box_min_y, + coord_t box_max_x, + coord_t box_max_y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool checkExtens_SequentialWeakPolygonNonoverlapping(coord_t box_min_x, + coord_t box_min_y, + coord_t box_max_x, + coord_t box_max_y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + int &box_half_x_max, + int &box_half_y_max, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + +bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + int &box_half_x_max, + int &box_half_y_max, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons); + + +/*----------------------------------------------------------------*/ + +void augment_TemporalSpread(const SolverConfiguration &solver_configuration, + std::vector &dec_values_T, + const std::vector &decided_polygons); + + +bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + + +bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons); + +/*----------------------------------------------------------------*/ + +} // namespace Sequential + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_SEQUENTIAL_HPP__ */ diff --git a/src/libseqarrange/include/seq_step b/src/libseqarrange/include/seq_step new file mode 100644 index 0000000000..66321c084c --- /dev/null +++ b/src/libseqarrange/include/seq_step @@ -0,0 +1 @@ +189 \ No newline at end of file diff --git a/src/libseqarrange/include/seq_utilities.hpp b/src/libseqarrange/include/seq_utilities.hpp new file mode 100644 index 0000000000..76b95bb8b4 --- /dev/null +++ b/src/libseqarrange/include/seq_utilities.hpp @@ -0,0 +1,47 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_utilities.hpp + * + * Various utilities for sequential print. + */ +/*================================================================*/ + +#ifndef __SEQ_UTILITIES_HPP__ +#define __SEQ_UTILITIES_HPP__ + + +/*----------------------------------------------------------------*/ + +#include "seq_sequential.hpp" +#include "seq_interface.hpp" + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + +bool find_and_remove(std::string& src, const std::string& key); +std::vector load_exported_data(const std::string& filename); + +int load_printer_geometry(const std::string& filename, PrinterGeometry &printer_geometry); + +void save_import_data(const std::string &filename, + const std::map &scheduled_polygons, + const map &original_index_map, + const vector &poly_positions_X, + const vector &poly_positions_Y); + + +/*----------------------------------------------------------------*/ + +} // namespace Sequential + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_UTILITIES_HPP__ */ diff --git a/src/libseqarrange/include/seq_version.hpp b/src/libseqarrange/include/seq_version.hpp new file mode 100644 index 0000000000..803b4440dc --- /dev/null +++ b/src/libseqarrange/include/seq_version.hpp @@ -0,0 +1,7 @@ +#ifndef __SEQ_VERSION_HPP__ +#define __SEQ_VERSION_HPP__ + + +#define SEQ_SEQUENTIAL_BUILD "189" + +#endif /* __SEQ_VERSION_HPP__ */ diff --git a/src/libseqarrange/include/seq_version.sh b/src/libseqarrange/include/seq_version.sh new file mode 100644 index 0000000000..2e4b64d125 --- /dev/null +++ b/src/libseqarrange/include/seq_version.sh @@ -0,0 +1,7 @@ +echo "#ifndef __SEQ_VERSION_HPP__" +echo "#define __SEQ_VERSION_HPP__" +echo "" +echo "" +echo "#define SEQ_SEQUENTIAL_BUILD "\"`cat ./SEQUENTIAL-Prusa/include/seq_step`\" +echo "" +echo "#endif /* __SEQ_VERSION_HPP__ */" diff --git a/src/libseqarrange/printers/printer_geometry.mk3s.txt b/src/libseqarrange/printers/printer_geometry.mk3s.txt new file mode 100644 index 0000000000..514216fc13 --- /dev/null +++ b/src/libseqarrange/printers/printer_geometry.mk3s.txt @@ -0,0 +1,31 @@ +X_SIZE250000000 +Y_SIZE210000000 + +CONVEX_HEIGHT0 +CONVEX_HEIGHT2000000 +BOX_HEIGHT18000000 +BOX_HEIGHT26000000 + +POLYGON_AT_HEIGHT0 +POINT-500000 -500000 +POINT500000 -500000 +POINT500000 500000 +POINT-500000 500000 + +POLYGON_AT_HEIGHT2000000 +POINT-2000000 -10000000 +POINT2000000 -10000000 +POINT2000000 2000000 +POINT-2000000 2000000 + +POLYGON_AT_HEIGHT18000000 +POINT-1000000 500000 +POINT1000000 500000 +POINT1000000 -250000000 +POINT-1000000 -250000000 + +POLYGON_AT_HEIGHT26000000 +POINT-250000000 2000000 +POINT250000000 2000000 +POINT250000000 2100000 +POINT-250000000 2100000 diff --git a/src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt b/src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt new file mode 100644 index 0000000000..3b1cd0706c --- /dev/null +++ b/src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt @@ -0,0 +1,43 @@ +X_SIZE250000000 +Y_SIZE210000000 + +CONVEX_HEIGHT0 +CONVEX_HEIGHT2000000 +BOX_HEIGHT18000000 +BOX_HEIGHT26000000 + +POLYGON_AT_HEIGHT0 +POINT-500000 -500000 +POINT500000 -500000 +POINT500000 500000 +POINT-500000 500000 + +POLYGON_AT_HEIGHT2000000 +POINT-1000000 -21000000 +POINT37000000 -21000000 +POINT37000000 44000000 +POINT-1000000 44000000 + +POLYGON_AT_HEIGHT2000000 +POINT-40000000 -45000000 +POINT38000000 -45000000 +POINT38000000 20000000 +POINT-40000000 20000000 + +POLYGON_AT_HEIGHT18000000 +POINT-350000000 -4000000 +POINT350000000 -4000000 +POINT350000000 -14000000 +POINT-350000000 -14000000 + +POLYGON_AT_HEIGHT26000000 +POINT-12000000 -350000000 +POINT9000000 -350000000 +POINT9000000 -39000000 +POINT-12000000 -39000000 + +POLYGON_AT_HEIGHT26000000 +POINT-12000000 -350000000 +POINT250000000 -350000000 +POINT250000000 -82000000 +POINT-12000000 -82000000 diff --git a/src/libseqarrange/printers/printer_geometry.mk4.txt b/src/libseqarrange/printers/printer_geometry.mk4.txt new file mode 100644 index 0000000000..159a779980 --- /dev/null +++ b/src/libseqarrange/printers/printer_geometry.mk4.txt @@ -0,0 +1,45 @@ +X_SIZE250000000 +Y_SIZE210000000 + +CONVEX_HEIGHT0 +CONVEX_HEIGHT3000000 +BOX_HEIGHT11000000 +BOX_HEIGHT13000000 + +POLYGON_AT_HEIGHT0 +POINT-500000 -500000 +POINT500000 -500000 +POINT500000 500000 +POINT-500000 500000 + +POLYGON_AT_HEIGHT3000000 +POINT-1000000 -21000000 +POINT37000000 -21000000 +POINT37000000 44000000 +POINT-1000000 44000000 + +POLYGON_AT_HEIGHT3000000 +POINT-40000000 -45000000 +POINT38000000 -45000000 +POINT38000000 20000000 +POINT-40000000 20000000 + +POLYGON_AT_HEIGHT11000000 +POINT-350000000 -4000000 +POINT350000000 -4000000 +POINT350000000 -14000000 +POINT-350000000 -14000000 + +POLYGON_AT_HEIGHT13000000 +POINT-12000000 -350000000 +POINT9000000 -350000000 +POINT9000000 -39000000 +POINT-12000000 -39000000 + +POLYGON_AT_HEIGHT13000000 +POINT-12000000 -350000000 +POINT250000000 -350000000 +POINT250000000 -82000000 +POINT-12000000 -82000000 + + diff --git a/src/libseqarrange/src/CMakeLists.txt b/src/libseqarrange/src/CMakeLists.txt new file mode 100644 index 0000000000..c533254064 --- /dev/null +++ b/src/libseqarrange/src/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.10) + +project(Surynek LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_CXX_EXTENSIONS False) + +add_library(libseqarrange STATIC seq_interface.cpp seq_preprocess.cpp seq_sequential.cpp seq_utilities.cpp) +add_executable(sequential_arrange sequential_prusa.cpp) +add_executable(sequential_decimator sequential_decimator.cpp) + +target_include_directories(libseqarrange PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include) + +find_package(Z3 REQUIRED) +slic3r_remap_configs("z3::libz3" RelWithDebInfo Release) + +target_link_libraries(libseqarrange libslic3r z3::libz3) +target_link_libraries(sequential_arrange libseqarrange) +target_link_libraries(sequential_decimator libseqarrange) + + + diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp new file mode 100644 index 0000000000..fee987926f --- /dev/null +++ b/src/libseqarrange/src/seq_interface.cpp @@ -0,0 +1,1101 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_interface.cpp + * + * Interface of the sequential printing SMT model for Prusa Slic3r + */ +/*================================================================*/ + +#include "seq_defs.hpp" + +#include "seq_sequential.hpp" +#include "seq_preprocess.hpp" +#include "seq_interface.hpp" + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + + +/*----------------------------------------------------------------*/ + +bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const std::vector &objects_to_print, + const std::vector &scheduled_plates) +{ + std::vector polygons; + std::vector > unreachable_polygons; + + map flat_index_map; + + for (int i = 0; i < objects_to_print.size(); ++i) + { + std::vector convex_level_polygons; + std::vector box_level_polygons; + + std::vector > extruder_convex_level_polygons; + std::vector > extruder_box_level_polygons; + + std::vector scale_down_unreachable_polygons; + + flat_index_map[objects_to_print[i].id] = i; + + Polygon scale_down_object_polygon; + + prepare_ExtruderPolygons(solver_configuration, + printer_geometry, + objects_to_print[i], + convex_level_polygons, + box_level_polygons, + extruder_convex_level_polygons, + extruder_box_level_polygons); + + prepare_ObjectPolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + extruder_convex_level_polygons, + extruder_box_level_polygons, + scale_down_object_polygon, + scale_down_unreachable_polygons); + + unreachable_polygons.push_back(scale_down_unreachable_polygons); + polygons.push_back(scale_down_object_polygon); + } + + for (const auto& scheduled_plate: scheduled_plates) + { + int time = SEQ_GROUND_PRESENCE_TIME; + + std::vector plate_polygons; + std::vector > plate_unreachable_polygons; + + std::vector dec_values_X; + std::vector dec_values_Y; + std::vector dec_values_T; + + for (const auto& scheduled_object: scheduled_plate.scheduled_objects) + { + const auto& flat_index = flat_index_map.find(scheduled_object.id)->second; + + plate_polygons.push_back(polygons[flat_index]); + plate_unreachable_polygons.push_back(unreachable_polygons[flat_index]); + + dec_values_X.push_back(scaleDown_CoordinateForSequentialSolver(scheduled_object.x)); + dec_values_Y.push_back(scaleDown_CoordinateForSequentialSolver(scheduled_object.y)); + + time += 2 * solver_configuration.temporal_spread * solver_configuration.object_group_size; + dec_values_T.push_back(Rational(time)); + } + + #ifdef DEBUG + { + printf("Point check ...\n"); + } + #endif + if (!check_PointsOutsidePolygons(dec_values_X, + dec_values_Y, + dec_values_T, + plate_polygons, + plate_unreachable_polygons)) + { + return false; + } + #ifdef DEBUG + { + printf("Point check ... finished\n"); + } + #endif + + #ifdef DEBUG + { + printf("Line check ...\n"); + } + #endif + if (!check_PolygonLineIntersections(dec_values_X, + dec_values_Y, + dec_values_T, + plate_polygons, + plate_unreachable_polygons)) + { + return false; + } + #ifdef DEBUG + { + printf("Line check ... finished\n"); + } + #endif + } + #ifdef DEBUG + { + printf("Seems to be printable (you can try physically).\n"); + } + #endif + + return true; +} + + +/*----------------------------------------------------------------*/ + +std::vector schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const std::vector &objects_to_print) +{ + std::vector scheduled_plates; + + schedule_ObjectsForSequentialPrint(solver_configuration, + printer_geometry, + objects_to_print, + scheduled_plates); + return scheduled_plates; +} + + +void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const std::vector &objects_to_print, + std::vector &scheduled_plates) +{ + #ifdef PROFILE + clock_t start, finish; + start = clock(); + #endif + + #ifdef DEBUG + { + printf("Sequential scheduling/arranging ...\n"); + } + #endif + + std::vector polygons; + std::vector > unreachable_polygons; + + map original_index_map; + + #ifdef DEBUG + { + printf(" Preparing objects ...\n"); + } + #endif + + for (int i = 0; i < objects_to_print.size(); ++i) + { + std::vector convex_level_polygons; + std::vector box_level_polygons; + + std::vector > extruder_convex_level_polygons; + std::vector > extruder_box_level_polygons; + + std::vector scale_down_unreachable_polygons; + + original_index_map[i] = objects_to_print[i].id; + + Polygon scale_down_object_polygon; + + prepare_ExtruderPolygons(solver_configuration, + printer_geometry, + objects_to_print[i], + convex_level_polygons, + box_level_polygons, + extruder_convex_level_polygons, + extruder_box_level_polygons); + + prepare_ObjectPolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + extruder_convex_level_polygons, + extruder_box_level_polygons, + scale_down_object_polygon, + scale_down_unreachable_polygons); + + unreachable_polygons.push_back(scale_down_unreachable_polygons); + polygons.push_back(scale_down_object_polygon); + } + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + #ifdef DEBUG + { + printf(" Preparing objects ... finished\n"); + } + #endif + + do + { + ScheduledPlate scheduled_plate; + + decided_polygons.clear(); + remaining_polygons.clear(); + + #ifdef DEBUG + { + printf(" Object scheduling/arranging ...\n"); + } + #endif + + bool optimized; + + optimized = optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + #ifdef DEBUG + { + printf(" Object scheduling/arranging ... finished\n"); + } + #endif + + if (optimized) + { + #ifdef DEBUG + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", + original_index_map[decided_polygons[i]], + decided_polygons[i], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double(), + times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); + } + } + #endif + + std::map scheduled_polygons; + for (int i = 0; i < decided_polygons.size(); ++i) + { + scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); + } + + for (const auto& scheduled_polygon: scheduled_polygons) + { + coord_t X, Y; + + scaleUp_PositionForSlicer(poly_positions_X[scheduled_polygon.second], + poly_positions_Y[scheduled_polygon.second], + X, + Y); + const auto& original_index = original_index_map.find(scheduled_polygon.second); + + scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); + } + } + else + { + #ifdef DEBUG + { + printf("Polygon sequential schedule optimization FAILED.\n"); + } + #endif + + throw std::runtime_error("COMPLETE SCHEDULING FAILURE (UNABLE TO SCHEDULE EVEN SINGLE OBJECT)"); + } + #ifdef PROFILE + { + finish = clock(); + } + #endif + + #ifdef PROFILE + { + printf("Intermediate CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + } + #endif + + vector next_polygons; + vector > next_unreachable_polygons; + + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + vector next_polygon_index_map; + map next_original_index_map; + + for (int index = 0; index < polygons.size(); ++index) + { + next_polygon_index_map.push_back(index); + next_original_index_map[index] = original_index_map[remaining_polygons[index]]; + } + polygon_index_map = next_polygon_index_map; + original_index_map = next_original_index_map; + + scheduled_plates.push_back(scheduled_plate); + } + while (!remaining_polygons.empty()); + + #ifdef PROFILE + { + finish = clock(); + } + #endif + + #ifdef DEBUG + { + printf("Sequential scheduling/arranging ... finished\n"); + } + #endif + + #ifdef PROFILE + { + printf("Total CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + } + #endif +} + + +/*----------------------------------------------------------------*/ + +int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const std::vector &objects_to_print, + std::vector &scheduled_plates) +{ + #ifdef PROFILE + clock_t start, finish; + start = clock(); + #endif + + #ifdef DEBUG + { + printf("Sequential scheduling/arranging ...\n"); + } + #endif + + std::vector polygons; + std::vector > unreachable_polygons; + + map original_index_map; + + #ifdef DEBUG + { + printf(" Preparing objects ...\n"); + } + #endif + + for (int i = 0; i < objects_to_print.size(); ++i) + { + Polygon nozzle_polygon; + Polygon extruder_polygon; + Polygon hose_polygon; + Polygon gantry_polygon; + + original_index_map[i] = objects_to_print[i].id; + + for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + { + coord_t height = objects_to_print[i].pgns_at_height[j].first; + + if (!objects_to_print[i].pgns_at_height[j].second.points.empty()) + { + Polygon decimated_polygon; + + if (solver_configuration.decimation_precision != SEQ_DECIMATION_PRECISION_UNDEFINED) + { + decimate_PolygonForSequentialSolver(solver_configuration, + objects_to_print[i].pgns_at_height[j].second, + decimated_polygon); + } + else + { + decimated_polygon = objects_to_print[i].pgns_at_height[j].second; + decimated_polygon.make_counter_clockwise(); + } + if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + { + #ifdef DEBUG + { + printf("Object too large to fit onto plate [ID:%d RID:%d].\n", original_index_map[i], i); + } + #endif + return -1; + } + + switch (solver_configuration.printer_type) + { + case SEQ_PRINTER_TYPE_PRUSA_MK3S: + { + switch (height) + { + case SEQ_PRUSA_MK3S_NOZZLE_LEVEL: // nozzle + { + nozzle_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_MK3S_EXTRUDER_LEVEL: // extruder + { + extruder_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_MK3S_HOSE_LEVEL: // hose + { + hose_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_MK3S_GANTRY_LEVEL: // gantry + { + gantry_polygon = decimated_polygon; + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED POLYGON HEIGHT"); + break; + } + } + break; + } + case SEQ_PRINTER_TYPE_PRUSA_MK4: + { + switch (height) + { + case SEQ_PRUSA_MK4_NOZZLE_LEVEL: // nozzle + { + nozzle_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_MK4_EXTRUDER_LEVEL: // extruder + { + extruder_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_MK4_HOSE_LEVEL: // hose + { + hose_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_MK4_GANTRY_LEVEL: // gantry + { + gantry_polygon = decimated_polygon; + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED POLYGON HEIGHT"); + break; + } + } + break; + } + case SEQ_PRINTER_TYPE_PRUSA_XL: + { + switch (height) + { + case SEQ_PRUSA_XL_NOZZLE_LEVEL: // nozzle + { + nozzle_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_XL_EXTRUDER_LEVEL: // extruder + { + extruder_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_XL_HOSE_LEVEL: // hose (no hose in XL) + { + hose_polygon = decimated_polygon; + break; + } + case SEQ_PRUSA_XL_GANTRY_LEVEL: // gantry + { + gantry_polygon = decimated_polygon; + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED POLYGON HEIGHT"); + break; + } + } + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED PRINTER TYPE"); + break; + } + } + } + } + + Polygon scale_down_polygon; + scaleDown_PolygonForSequentialSolver(nozzle_polygon, scale_down_polygon); + polygons.push_back(scale_down_polygon); + + std::vector convex_level_polygons; + convex_level_polygons.push_back(nozzle_polygon); + convex_level_polygons.push_back(extruder_polygon); + std::vector box_level_polygons; + box_level_polygons.push_back(hose_polygon); + box_level_polygons.push_back(gantry_polygon); + + std::vector scale_down_unreachable_polygons; + + switch (solver_configuration.printer_type) + { + case SEQ_PRINTER_TYPE_PRUSA_MK3S: + { + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S, + scale_down_unreachable_polygons); + break; + } + case SEQ_PRINTER_TYPE_PRUSA_MK4: + { + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK4, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4, + scale_down_unreachable_polygons); + break; + } + case SEQ_PRINTER_TYPE_PRUSA_XL: + { + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_XL, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_XL, + scale_down_unreachable_polygons); + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED PRINTER TYPE"); + break; + } + } + + unreachable_polygons.push_back(scale_down_unreachable_polygons); + } + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + #ifdef DEBUG + { + printf(" Preparing objects ... finished\n"); + } + #endif + + do + { + ScheduledPlate scheduled_plate; + + decided_polygons.clear(); + remaining_polygons.clear(); + + #ifdef DEBUG + { + printf(" Object scheduling/arranging ...\n"); + } + #endif + + bool optimized; + + optimized = optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + #ifdef DEBUG + { + printf(" Object scheduling/arranging ... finished\n"); + } + #endif + + if (optimized) + { + #ifdef DEBUG + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", + original_index_map[decided_polygons[i]], + decided_polygons[i], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double(), + times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); + } + } + #endif + + std::map scheduled_polygons; + for (int i = 0; i < decided_polygons.size(); ++i) + { + scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); + } + + for (const auto& scheduled_polygon: scheduled_polygons) + { + coord_t X, Y; + + scaleUp_PositionForSlicer(poly_positions_X[scheduled_polygon.second], + poly_positions_Y[scheduled_polygon.second], + X, + Y); + const auto& original_index = original_index_map.find(scheduled_polygon.second); + + scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); + } + } + else + { + #ifdef DEBUG + { + printf("Polygon sequential schedule optimization FAILED.\n"); + } + #endif + return -2; + } + #ifdef PROFILE + { + finish = clock(); + } + #endif + + #ifdef PROFILE + { + printf("Intermediate CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + } + #endif + + vector next_polygons; + vector > next_unreachable_polygons; + + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + vector next_polygon_index_map; + map next_original_index_map; + + for (int index = 0; index < polygons.size(); ++index) + { + next_polygon_index_map.push_back(index); + next_original_index_map[index] = original_index_map[remaining_polygons[index]]; + } + polygon_index_map = next_polygon_index_map; + original_index_map = next_original_index_map; + + scheduled_plates.push_back(scheduled_plate); + } + while (!remaining_polygons.empty()); + + #ifdef PROFILE + { + finish = clock(); + } + #endif + + #ifdef DEBUG + { + printf("Sequential scheduling/arranging ... finished\n"); + } + #endif + + #ifdef PROFILE + { + printf("Total CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + } + #endif + + return 0; +} + + +void setup_ExtruderUnreachableZones(const SolverConfiguration &solver_configuration, + std::vector > &convex_unreachable_zones, + std::vector > &box_unreachable_zones) +{ + switch (solver_configuration.printer_type) + { + case SEQ_PRINTER_TYPE_PRUSA_MK3S: + { + convex_unreachable_zones = SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S; + box_unreachable_zones = SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S; + break; + } + case SEQ_PRINTER_TYPE_PRUSA_MK4: + { + convex_unreachable_zones = SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK4; + box_unreachable_zones = SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4; + break; + } + case SEQ_PRINTER_TYPE_PRUSA_XL: + { + convex_unreachable_zones = SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_XL; + box_unreachable_zones = SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_XL; + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED PRINTER TYPE"); + break; + } + } +} + + +int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, + const std::vector &objects_to_print, + const std::vector > &convex_unreachable_zones, + const std::vector > &box_unreachable_zones, + std::vector &scheduled_plates) +{ + #ifdef PROFILE + clock_t start, finish; + start = clock(); + #endif + + #ifdef DEBUG + { + printf("Sequential scheduling/arranging ...\n"); + } + #endif + + std::vector polygons; + std::vector > unreachable_polygons; + + map original_index_map; + + #ifdef DEBUG + { + printf(" Preparing objects ...\n"); + } + #endif + + for (int i = 0; i < objects_to_print.size(); ++i) + { + Polygon nozzle_polygon; + Polygon extruder_polygon; + Polygon hose_polygon; + Polygon gantry_polygon; + + original_index_map[i] = objects_to_print[i].id; + + int ht = 0; + + for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + { + if (!objects_to_print[i].pgns_at_height[j].second.points.empty()) + { + Polygon decimated_polygon; + + if (solver_configuration.decimation_precision != SEQ_DECIMATION_PRECISION_UNDEFINED) + { + decimate_PolygonForSequentialSolver(solver_configuration, + objects_to_print[i].pgns_at_height[j].second, + decimated_polygon); + } + else + { + decimated_polygon = objects_to_print[i].pgns_at_height[j].second; + decimated_polygon.make_counter_clockwise(); + } + + if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + { + #ifdef DEBUG + { + printf("Object too large to fit onto plate [ID:%d RID:%d].\n", original_index_map[i], i); + } + #endif + return -1; + } + + switch (ht) + { + case 0: // nozzle + { + nozzle_polygon = decimated_polygon; + break; + } + case 1: // extruder + { + extruder_polygon = decimated_polygon; + break; + } + case 2: // hose + { + hose_polygon = decimated_polygon; + break; + } + case 3: // gantry + { + gantry_polygon = decimated_polygon; + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED POLYGON HEIGHT"); + break; + } + } + } + ++ht; + } + + Polygon scale_down_polygon; + scaleDown_PolygonForSequentialSolver(nozzle_polygon, scale_down_polygon); + polygons.push_back(scale_down_polygon); + + std::vector convex_level_polygons; + convex_level_polygons.push_back(nozzle_polygon); + convex_level_polygons.push_back(extruder_polygon); + + std::vector box_level_polygons; + box_level_polygons.push_back(hose_polygon); + box_level_polygons.push_back(gantry_polygon); + + std::vector scale_down_unreachable_polygons; + + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + convex_unreachable_zones, + box_unreachable_zones, + scale_down_unreachable_polygons); + + unreachable_polygons.push_back(scale_down_unreachable_polygons); + } + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + #ifdef DEBUG + { + printf(" Preparing objects ... finished\n"); + } + #endif + + do + { + ScheduledPlate scheduled_plate; + + decided_polygons.clear(); + remaining_polygons.clear(); + + #ifdef DEBUG + { + printf(" Object scheduling/arranging ...\n"); + } + #endif + + bool optimized; + + optimized = optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + #ifdef DEBUG + { + printf(" Object scheduling/arranging ... finished\n"); + } + #endif + + if (optimized) + { + #ifdef DEBUG + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", + original_index_map[decided_polygons[i]], + decided_polygons[i], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double(), + times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); + } + } + #endif + + std::map scheduled_polygons; + for (int i = 0; i < decided_polygons.size(); ++i) + { + scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); + } + + for (const auto& scheduled_polygon: scheduled_polygons) + { + coord_t X, Y; + + scaleUp_PositionForSlicer(poly_positions_X[scheduled_polygon.second], + poly_positions_Y[scheduled_polygon.second], + X, + Y); + const auto& original_index = original_index_map.find(scheduled_polygon.second); + + scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); + } + } + else + { + #ifdef DEBUG + { + printf("Polygon sequential schedule optimization FAILED.\n"); + } + #endif + return -2; + } + #ifdef PROFILE + { + finish = clock(); + } + #endif + + #ifdef PROFILE + { + printf("Intermediate CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + } + #endif + + vector next_polygons; + vector > next_unreachable_polygons; + + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + vector next_polygon_index_map; + map next_original_index_map; + + for (int index = 0; index < polygons.size(); ++index) + { + next_polygon_index_map.push_back(index); + next_original_index_map[index] = original_index_map[remaining_polygons[index]]; + } + polygon_index_map = next_polygon_index_map; + original_index_map = next_original_index_map; + + scheduled_plates.push_back(scheduled_plate); + } + while (!remaining_polygons.empty()); + + #ifdef PROFILE + { + finish = clock(); + } + #endif + + #ifdef DEBUG + { + printf("Sequential scheduling/arranging ... finished\n"); + } + #endif + + #ifdef PROFILE + { + printf("Total CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + } + #endif + + return 0; +} + +/*----------------------------------------------------------------*/ + +} // namespace Sequential diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp new file mode 100644 index 0000000000..2125e61d94 --- /dev/null +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -0,0 +1,965 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_preprocess.hpp + * + * Object preprocessing for the sequential printing SMT model. + */ +/*================================================================*/ + +#include "seq_defs.hpp" + +#include "libslic3r/Geometry.hpp" +#include "libslic3r/ClipperUtils.hpp" + +#include "seq_preprocess.hpp" +#include "seq_interface.hpp" + + +/*----------------------------------------------------------------*/ + +using namespace std; +using namespace Slic3r; +//using namespace ClipperLib; + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + + +/*----------------------------------------------------------------*/ + +// These are only approximate values for M3S, TODO: measure MK3S for true values +const std::vector SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S = +{ + { + {-500000, -500000}, + {500000, -500000}, + {500000, 500000}, + {-500000, 500000} + } +}; + + +// TODO: measure MK3S for true values +const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S = +{ + { + {-2000000, -10000000}, + {2000000, -10000000}, + {2000000, 2000000}, + {-2000000, 2000000} + } +}; + + +// TODO: measure MK3S for true values +const std::vector SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S = +{ + { + {-1000000, 500000}, + {1000000, 500000}, + {1000000, -250000000}, + {-1000000, -250000000} + } +}; + + +// TODO: measure MK3S for true values +const std::vector SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S = +{ + { + {-250000000, 2000000}, + {250000000, 2000000}, + {250000000, 2100000}, + {-250000000, 2100000} + } +}; + + +// TODO: measure MK3S for true values +const std::vector > SEQ_UNREACHABLE_POLYGON_ALL_LEVELS_MK3S = +{ + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S, + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S, + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S, + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S = +{ + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S, + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S = +{ + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S, + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S +}; + + +/*----------------------------------------------------------------*/ + +// Nozzle height range: 0.00mm-4.9mm +const std::vector SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK4 = +{ + { + /* hand tailored */ + { -5000000, -5000000}, + { 5000000, -5000000}, + { 5000000, 5000000}, + { -5000000, 5000000} + + /* original from decimator + { -3 728 158, -1 611 789}, + { -468 223, -4 034 578}, + { 2 543 938, -2 732 339}, + { 3 259 933, -2 422 789}, + { 3 728 160, 1 611 785}, + { 468 227, 4 034 579}, + { -1 666 062, 3 111 867}, + { -3 259 931, 2 422 789}, + */ + } +}; + +// Extruder height range: 4.9mm-13.0mm +const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK4 = +{ + { /* fan - hand tailored */ + { -1000000, -21000000}, + { 37000000, -21000000}, + { 37000000, 44000000}, + { -1000000, 44000000} + + /* fan - original from decimator + { 87952801, 3665480}, + { 103166346, -1375028}, + { 105384145, -1136906}, + { 107137556, 241781}, + { 107889619, 2905295}, + { 102396166, 55454515}, + { 101386126, 58737097}, + { 93053422, 62777197}, + { 87447788, 59999636}, + { 70782970, 28440457}, + + // nozzle + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, + + */ + }, + { /* body - hand tailored */ + {-40000000, -45000000}, + { 38000000, -45000000}, + { 38000000, 20000000}, + {-40000000, 20000000} + + /* body - original from decimator + { -68105202, -14269412}, + { -62019977, -20740757}, + { -37145411, -25968391}, + { -23949432, -25968391}, + { 919905, -20740757}, + { 3102334, -16781961}, + { 8275483, 3033496}, + { -130845, 26409612}, + { -20142759, 38793397}, + { -62268386, 38793397}, + { -67090122, 17070789}, + + // nozzle + { -29076068, 18872356}, + { -29001876, 18872356}, + { -29001876, 18952646}, + { -29076068, 18952646}, + */ + } +}; + + +// Gantry height range: 13.0mm-15.0mm +const std::vector SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK4 = +{ + { + /* hand tailored */ + { -350000000, -4000000}, + { 350000000, -4000000}, + { 350000000, -14000000}, + { -350000000, -14000000} + + /* original from decimator + { -206972968, -12664471}, + { -206470468, -13167301} + { 164374531, -13167301}, + { 164877031, -12664471}, + { 164877031, -5630724}, + { 164374531, -5128674}, + { -206470468, -5128674}, + { -206972968, -5630724}, + + nozzle + { -29111351, 18877954}, + { -29022835, 18841825}, + { -28966594, 18940523}, + { -29040014, 18983178}, + */ + } +}; + + +// Hose height range: 15.0mm-infinity (the hose is the last) +const std::vector SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK4 = +{ + { + /* rigid hose - hand tailored */ + { -12000000, -350000000}, + { 9000000, -350000000}, + { 9000000, -39000000}, + { -12000000, -39000000} + + /* original from decimator + { -40942228, -22802359}, + { -38008017, -64681679}, + { -23603700, -65215173}, + { -20135995, -20401563}, + { -28933517, 21680323}, + + // nozzle + { -29111351, 18877954}, + { -29022835, 18841825}, + { -28966594, 18940523}, + { -29040014, 18983178}, + */ + }, + { + /* flexible hose - hand tailored */ + { -12000000, -350000000}, + { 250000000, -350000000}, + { 250000000, -82000000}, + { -12000000, -82000000} + } +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_ALL_LEVELS_MK4 = +{ + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK4, + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK4, + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK4, + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK4 +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK4 = +{ + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK4, + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK4 +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4 = +{ + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK4, + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK4 +}; + + +/*----------------------------------------------------------------*/ + +// TODO: Measure XL for true values +const std::vector SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_XL = +{ + { + {-500000, -500000}, + {500000, -500000}, + {500000, 500000}, + {-500000, 500000} + } +}; + + +// TODO: Measure XL for true values +const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_XL = +{ + { + {-2000000, -10000000}, + {2000000, -10000000}, + {2000000, 2000000}, + {-2000000, 2000000} + } +}; + + +// TODO: Measure XL for true values +const std::vector SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_XL = +{ + { + {-1000000, 500000}, + {1000000, 500000}, + {1000000, -250000000}, + {-1000000, -250000000} + } +}; + + +// TODO: Measure XL for true values +const std::vector SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_XL = +{ + { + {-250000000, 2000000}, + {250000000, 2000000}, + {250000000, 2100000}, + {-250000000, 2100000} + } +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_ALL_LEVELS_XL = +{ + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_XL, + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_XL, + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_XL, + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_XL +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_XL = +{ + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_XL, + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_XL +}; + + +const std::vector > SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_XL = +{ + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_XL, + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_XL +}; + + +/*----------------------------------------------------------------*/ + +Rational scaleDown_CoordinateForSequentialSolver(coord_t x) +{ + Rational scale_down_x(x, SEQ_SLICER_SCALE_FACTOR); + scale_down_x.normalize(); + + return scale_down_x; +} + + +void scaleDown_PolygonForSequentialSolver(const Slic3r::Polygon &polygon, + Slic3r::Polygon &scale_down_polygon) +{ + scaleDown_PolygonForSequentialSolver(SEQ_SLICER_SCALE_FACTOR, polygon, scale_down_polygon); +} + + +void scaleDown_PolygonForSequentialSolver(coord_t scale_factor, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &scale_down_polygon) +{ + for (int i = 0; i < polygon.points.size(); ++i) + { + scale_down_polygon.points.insert(scale_down_polygon.points.begin() + i, Point(polygon.points[i].x() / scale_factor, polygon.points[i].y() / scale_factor)); + } + scale_down_polygon.make_counter_clockwise(); +} + + +Slic3r::Polygon scaleDown_PolygonForSequentialSolver(coord_t scale_factor, const Slic3r::Polygon &polygon) +{ + Slic3r::Polygon scale_down_polygon; + + for (int i = 0; i < polygon.points.size(); ++i) + { + scale_down_polygon.points.insert(scale_down_polygon.points.begin() + i, Point(polygon.points[i].x() / scale_factor, polygon.points[i].y() / scale_factor)); + } + scale_down_polygon.make_counter_clockwise(); + + return scale_down_polygon; +} + + +void scaleUp_PositionForSlicer(const Rational &position_X, + const Rational &position_Y, + coord_t &scaled_position_X, + coord_t &scaled_position_Y) +{ + scaleUp_PositionForSlicer(SEQ_SLICER_SCALE_FACTOR, position_X, position_Y, scaled_position_X, scaled_position_Y); +} + + +void scaleUp_PositionForSlicer(coord_t scale_factor, + const Rational &position_X, + const Rational &position_Y, + coord_t &scaled_position_X, + coord_t &scaled_position_Y) +{ + scaled_position_X = (position_X.normalize() * scale_factor).as_int64(); + scaled_position_Y = (position_Y.normalize() * scale_factor).as_int64(); +} + + + +void scaleUp_PositionForSlicer(double position_X, double position_Y, coord_t &scaled_position_X, coord_t &scaled_position_Y) +{ + scaleUp_PositionForSlicer(SEQ_SLICER_SCALE_FACTOR, position_X, position_Y, scaled_position_X, scaled_position_Y); +} + + +void scaleUp_PositionForSlicer(coord_t scale_factor, + double position_X, + double position_Y, + coord_t &scaled_position_X, + coord_t &scaled_position_Y) +{ + scaled_position_X = scale_factor * position_X; + scaled_position_Y = scale_factor * position_Y; +} + + +Slic3r::Polygon scaleUp_PolygonForSlicer(const Slic3r::Polygon &polygon) +{ + return scaleUp_PolygonForSlicer(SEQ_SLICER_SCALE_FACTOR, polygon); +} + + +Slic3r::Polygon scaleUp_PolygonForSlicer(coord_t scale_factor, const Slic3r::Polygon &polygon) +{ + Slic3r::Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Slic3r::Point(poly.points[i].x() * scale_factor, poly.points[i].y() * scale_factor); + } + + return poly; +} + + +Slic3r::Polygon scaleUp_PolygonForSlicer(const Polygon &polygon, double x_pos, double y_pos) +{ + return scaleUp_PolygonForSlicer(SEQ_SLICER_SCALE_FACTOR, polygon, x_pos, y_pos); +} + + +Slic3r::Polygon scaleUp_PolygonForSlicer(coord_t scale_factor, const Polygon &polygon, double x_pos, double y_pos) +{ + Slic3r::Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x() * scale_factor + x_pos * scale_factor, + poly.points[i].y() * scale_factor + y_pos * scale_factor); + } + + return poly; +} + + +void ground_PolygonByBoundingBox(Slic3r::Polygon &polygon) +{ + BoundingBox polygon_box = get_extents(polygon); + + for (int i = 0; i < polygon.points.size(); ++i) + { + polygon.points[i] -= polygon_box.min; + } +} + + +void ground_PolygonByFirstPoint(Slic3r::Polygon &polygon) +{ + Point first = polygon.points[0]; + for (int i = 0; i < polygon.points.size(); ++i) + { + polygon.points[i] -= first; + } +} + + +void shift_Polygon(Slic3r::Polygon &polygon, coord_t x_offset, coord_t y_offset) +{ + Point offset(x_offset, y_offset); + + shift_Polygon(polygon, offset); +} + + +void shift_Polygon(Slic3r::Polygon &polygon, const Slic3r::Point &offset) +{ + for (int i = 0; i < polygon.points.size(); ++i) + { + polygon.points[i] += offset; + } +} + + +/*----------------------------------------------------------------*/ + +Polygon transform_UpsideDown(const SolverConfiguration &solver_configuration, const Polygon &polygon) +{ + return transform_UpsideDown(solver_configuration, SEQ_SLICER_SCALE_FACTOR, polygon); +} + + +Polygon transform_UpsideDown(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Polygon &polygon) +{ + Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x(), + (coord_t)(solver_configuration.maximum_Y_bounding_box_size * scale_factor - poly.points[i].y())); + } + + return poly; +} + + +void transform_UpsideDown(const SolverConfiguration &solver_configuration, const coord_t &scaled_x_pos, const coord_t &scaled_y_pos, coord_t &transformed_x_pos, coord_t &transformed_y_pos) +{ + transform_UpsideDown(solver_configuration, SEQ_SLICER_SCALE_FACTOR, scaled_x_pos, scaled_y_pos, transformed_x_pos, transformed_y_pos); +} + + +void transform_UpsideDown(const SolverConfiguration &solver_configuration, coord_t scale_factor, const coord_t &scaled_x_pos, const coord_t &scaled_y_pos, coord_t &transformed_x_pos, coord_t &transformed_y_pos) +{ + transformed_x_pos = scaled_x_pos; + transformed_y_pos = solver_configuration.maximum_Y_bounding_box_size * scale_factor - scaled_y_pos; +} + + +/*----------------------------------------------------------------*/ + +void decimate_PolygonForSequentialSolver(const SolverConfiguration &solver_configuration, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &decimated_polygon) +{ + double DP_tolerance = SolverConfiguration::convert_DecimationPrecision2Tolerance(solver_configuration.decimation_precision); + + decimate_PolygonForSequentialSolver(DP_tolerance, polygon, decimated_polygon); +} + + +void decimate_PolygonForSequentialSolver(double DP_tolerance, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &decimated_polygon) +{ + decimated_polygon = polygon; + decimated_polygon.make_counter_clockwise(); + + decimated_polygon.douglas_peucker(DP_tolerance); + + if (decimated_polygon.points.size() >= 4) + { + while (true) + { + for (int i = 0; i < decimated_polygon.points.size(); ++i) + { + decimated_polygon.points[i] *= SEQ_POLYGON_DECIMATION_GROW_FACTOR; + } + + BoundingBox polygon_box = get_extents(polygon); + BoundingBox decimated_polygon_box = get_extents(decimated_polygon); + + coord_t shift_x = ((decimated_polygon_box.min.x() + decimated_polygon_box.max.x()) / 2) - ((polygon_box.min.x() + polygon_box.max.x()) / 2); + coord_t shift_y = ((decimated_polygon_box.min.y() + decimated_polygon_box.max.y()) / 2) - ((polygon_box.min.y() + polygon_box.max.y()) / 2); + + for (int i = 0; i < decimated_polygon.points.size(); ++i) + { + decimated_polygon.points[i] -= Point(shift_x, shift_y); + } + + bool contains = true; + for (int i = 0; i < polygon.points.size(); ++i) + { + if (!decimated_polygon.contains(polygon.points[i])) + { + contains = false; + break; + } + } + + if (contains) + { + break; + } + } + } + else + { + BoundingBox polygon_box = get_extents(polygon); + + decimated_polygon = { { polygon_box.min.x(), polygon_box.min.y() }, + { polygon_box.max.x(), polygon_box.min.y() }, + { polygon_box.max.x(), polygon_box.max.y() }, + { polygon_box.min.x(), polygon_box.max.y() } }; + } + + #ifdef DEBUG + { + printf("Comparison: %ld, %ld\n", polygon.points.size(), decimated_polygon.points.size()); + } + #endif +} + + +void extend_PolygonConvexUnreachableZone(const SolverConfiguration &SEQ_UNUSED(solver_configuration), + const Slic3r::Polygon &polygon, + const std::vector &extruder_polygons, + std::vector &unreachable_polygons) +{ + if (!polygon.points.empty()) + { + Slic3r::ClipperLib::Paths paths; + + for (int i = 0; i < extruder_polygons.size(); ++i) + { + ClipperLib::MinkowskiSum(extruder_polygons[i].points, polygon.points, paths, true); + + for (int j = 0; j < paths.size(); ++j) + { + unreachable_polygons.push_back(Polygon(paths[j])); + } + } + } +} + + +void extend_PolygonBoxUnreachableZone(const SolverConfiguration &SEQ_UNUSED(solver_configuration), + const Slic3r::Polygon &polygon, + const std::vector &extruder_polygons, + std::vector &unreachable_polygons) +{ + if (!polygon.points.empty()) + { + BoundingBox polygon_box = get_extents(polygon); + + for (int i = 0; i < extruder_polygons.size(); ++i) + { + BoundingBox extruder_box = get_extents(extruder_polygons[i]); + + /* + coord_t extruder_box_size_x = extruder_box.max.x() - extruder_box.min.x(); + coord_t extruder_box_size_y = extruder_box.max.y() - extruder_box.min.y(); + */ + + coord_t min_x = polygon_box.min.x() + extruder_box.min.x(); + coord_t min_y = polygon_box.min.y() + extruder_box.min.y(); + + coord_t max_x = polygon_box.max.x() + extruder_box.max.x(); + coord_t max_y = polygon_box.max.y() + extruder_box.max.y(); + + unreachable_polygons.push_back(Polygon({ { min_x, min_y }, + { max_x, min_y }, + { max_x, max_y }, + { min_x, max_y } })); + } + } +} + + +void prepare_ExtruderPolygons(const SolverConfiguration &solver_configuration, + const PrinterGeometry &printer_geometry, + const ObjectToPrint &object_to_print, + std::vector &convex_level_polygons, + std::vector &box_level_polygons, + std::vector > &extruder_convex_level_polygons, + std::vector > &extruder_box_level_polygons) +{ + for (int j = 0; j < object_to_print.pgns_at_height.size(); ++j) + { + coord_t height = object_to_print.pgns_at_height[j].first; + + if (!object_to_print.pgns_at_height[j].second.points.empty()) + { + Polygon decimated_polygon; + + if (solver_configuration.decimation_precision != SEQ_DECIMATION_PRECISION_UNDEFINED) + { + decimate_PolygonForSequentialSolver(solver_configuration, + object_to_print.pgns_at_height[j].second, + decimated_polygon); + } + else + { + decimated_polygon = object_to_print.pgns_at_height[j].second; + decimated_polygon.make_counter_clockwise(); + } + + if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + { + printf("Object too large to fit onto plate.\n"); + throw std::runtime_error("OBJECT TOO LARGE"); + } + + if (printer_geometry.convex_heights.find(height) != printer_geometry.convex_heights.end()) + { + std::map >::const_iterator extruder_slice = printer_geometry.extruder_slices.find(height); + assert(extruder_slice != printer_geometry.extruder_slices.end()); + + convex_level_polygons.push_back(decimated_polygon); + extruder_convex_level_polygons.push_back(extruder_slice->second); + } + else if (printer_geometry.box_heights.find(height) != printer_geometry.box_heights.end()) + { + std::map >::const_iterator extruder_slice = printer_geometry.extruder_slices.find(height); + assert(extruder_slice != printer_geometry.extruder_slices.end()); + + box_level_polygons.push_back(decimated_polygon); + extruder_box_level_polygons.push_back(extruder_slice->second); + } + else + { + throw std::runtime_error("MISMATCH BETWEEN OBJECT AND PRINTER SLICE HEIGHTS."); + } + } + } +} + + +void prepare_ObjectPolygons(const SolverConfiguration &solver_configuration, + const std::vector &convex_level_polygons, + const std::vector &box_level_polygons, + const std::vector > &extruder_convex_level_polygons, + const std::vector > &extruder_box_level_polygons, + Slic3r::Polygon &object_polygon, + std::vector &unreachable_polygons) +{ + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + extruder_convex_level_polygons, + extruder_box_level_polygons, + unreachable_polygons); + + assert(convex_level_polygons.size() >= 1); + Polygon raw_polygon = convex_level_polygons[0]; + + scaleDown_PolygonForSequentialSolver(raw_polygon, + object_polygon); + object_polygon.make_counter_clockwise(); +} + + +void prepare_UnreachableZonePolygons(const SolverConfiguration &solver_configuration, + const Slic3r::Polygon &polygon, + const std::vector > &extruder_convex_level_polygons, + const std::vector > &extruder_box_level_polygons, + std::vector &unreachable_polygons) +{ + std::vector scaled_unreachable_polygons; + + for (int i = 0; i < extruder_convex_level_polygons.size(); ++i) + { + extend_PolygonConvexUnreachableZone(solver_configuration, + polygon, + extruder_convex_level_polygons[i], + scaled_unreachable_polygons); + } + + for (int i = 0; i < extruder_box_level_polygons.size(); ++i) + { + extend_PolygonBoxUnreachableZone(solver_configuration, + polygon, + extruder_box_level_polygons[i], + scaled_unreachable_polygons); + } + + for (int i = 0; i < scaled_unreachable_polygons.size(); ++i) + { + Polygon scale_down_polygon; + + scaleDown_PolygonForSequentialSolver(scaled_unreachable_polygons[i], + scale_down_polygon); + scale_down_polygon.make_counter_clockwise(); + unreachable_polygons.push_back(scale_down_polygon); + } +} + + +void prepare_UnreachableZonePolygons(const SolverConfiguration &solver_configuration, + const std::vector &convex_level_polygons, + const std::vector &box_level_polygons, + const std::vector > &extruder_convex_level_polygons, + const std::vector > &extruder_box_level_polygons, + std::vector &unreachable_polygons) +{ + std::vector scaled_unreachable_polygons; + assert(extruder_convex_level_polygons.size() == convex_level_polygons.size()); + + for (int i = 0; i < extruder_convex_level_polygons.size(); ++i) + { + extend_PolygonConvexUnreachableZone(solver_configuration, + convex_level_polygons[i], + extruder_convex_level_polygons[i], + scaled_unreachable_polygons); + } + + assert(extruder_box_level_polygons.size() == box_level_polygons.size()); + + for (int i = 0; i < extruder_box_level_polygons.size(); ++i) + { + extend_PolygonBoxUnreachableZone(solver_configuration, + box_level_polygons[i], + extruder_box_level_polygons[i], + scaled_unreachable_polygons); + } + + for (int i = 0; i < scaled_unreachable_polygons.size(); ++i) + { + Polygon scale_down_polygon; + + scaleDown_PolygonForSequentialSolver(scaled_unreachable_polygons[i], + scale_down_polygon); + scale_down_polygon.make_counter_clockwise(); + unreachable_polygons.push_back(scale_down_polygon); + } +} + + +bool check_PolygonSize(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon) +{ + BoundingBox polygon_box = get_extents(polygon); + + coord_t x_size = polygon_box.max.x() - polygon_box.min.x(); + if (x_size > solver_configuration.maximum_X_bounding_box_size) + { + return false; + } + + coord_t y_size = polygon_box.max.y() - polygon_box.min.y(); + if (y_size > solver_configuration.maximum_Y_bounding_box_size) + { + return false; + } + + return true; +} + + +bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon) +{ + BoundingBox polygon_box = get_extents(polygon); + + coord_t x_size = polygon_box.max.x() - polygon_box.min.x(); + if (x_size > solver_configuration.maximum_X_bounding_box_size * scale_factor) + { + return false; + } + + coord_t y_size = polygon_box.max.y() - polygon_box.min.y(); + if (y_size > solver_configuration.maximum_Y_bounding_box_size * scale_factor) + { + return false; + } + + return true; +} + + +/*----------------------------------------------------------------*/ + +double calc_PolygonArea(const Slic3r::Polygon &polygon) +{ + Polygons overlapping_polygons; + + overlapping_polygons.push_back(polygon); + ExPolygons union_polygons = union_ex(overlapping_polygons); + + double area = 0; + for (const auto& union_polygon: union_polygons) + { + area += union_polygon.area(); + } + + return area; +} + + +double calc_PolygonUnreachableZoneArea(const Slic3r::Polygon &polygon, + const std::vector &unreachable_polygons) +{ + Polygons overlapping_polygons; + + overlapping_polygons.push_back(polygon); + for (const auto& unreachable_polygon: unreachable_polygons) + { + overlapping_polygons.push_back(unreachable_polygon); + } + ExPolygons union_polygons = union_ex(overlapping_polygons); + + double area = 0; + for (const auto& union_polygon: union_polygons) + { + area += union_polygon.area(); + } + + return area; +} + + +double calc_PolygonArea(const std::vector &polygons) +{ + double area = 0; + + for (const auto &polygon: polygons) + { + area += calc_PolygonArea(polygon); + } + return area; +} + + +double calc_PolygonArea(const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons) +{ + double area = 0; + + for (int i = 0; i < fixed.size(); ++i) + { + area += calc_PolygonArea(polygons[i]); + } + for (int i = 0; i < undecided.size(); ++i) + { + area += calc_PolygonArea(polygons[i]); + } + + return area; +} + + +double calc_PolygonUnreachableZoneArea(const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + assert(polygons.size() == unreachable_polygons.size()); + double area = 0; + + for (int i = 0; i < polygons.size(); ++i) + { + area += calc_PolygonUnreachableZoneArea(polygons[i], unreachable_polygons[i]); + } + + return area; +} + + +/*----------------------------------------------------------------*/ + +} // namespace Sequential + diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp new file mode 100644 index 0000000000..72670d4f64 --- /dev/null +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -0,0 +1,10158 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_sequential.cpp + * + * SMT models for sequential printing. + */ +/*================================================================*/ + +#include "seq_defs.hpp" + +#include "seq_sequential.hpp" +#include "seq_preprocess.hpp" + + +/*----------------------------------------------------------------*/ + +using namespace std; +using namespace Slic3r; + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + +/*----------------------------------------------------------------*/ + +int hidden_var_cnt = 0; + + +/*----------------------------------------------------------------*/ + +void introduce_DecisionBox(z3::solver &Solver, + const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + int box_size_x, + int box_size_y) +{ + Solver.add(dec_var_X >= 0); + Solver.add(dec_var_X <= box_size_x); + Solver.add(dec_var_Y >= 0); + Solver.add(dec_var_Y <= box_size_y); +} + + +void assume_DecisionBox(const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + int box_size_x, + int box_size_y, + z3::expr_vector &box_constraints) +{ + box_constraints.push_back(dec_var_X >= 0); + box_constraints.push_back(dec_var_X <= box_size_x); + box_constraints.push_back(dec_var_Y >= 0); + box_constraints.push_back(dec_var_Y <= box_size_y); +} + + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_size_x, + int box_size_y) +{ + BoundingBox box = get_extents(polygon); + + Solver.add(dec_var_X + box.min.x() >= 0); + Solver.add(dec_var_X + box.max.x() <= box_size_x); + + Solver.add(dec_var_Y + box.min.y() >= 0); + Solver.add(dec_var_Y + box.max.y() <= box_size_y); +} + + +void assume_BedBoundingBox(const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_size_x, + int box_size_y, + z3::expr_vector &bounding_constraints) +{ + BoundingBox box = get_extents(polygon); + + bounding_constraints.push_back(dec_var_X + box.min.x() >= 0); + bounding_constraints.push_back(dec_var_X + box.max.x() <= box_size_x); + + bounding_constraints.push_back(dec_var_Y + box.min.y() >= 0); + bounding_constraints.push_back(dec_var_Y + box.max.y() <= box_size_y); +} + + + + + + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y) +{ + BoundingBox box = get_extents(polygon); + + Solver.add(dec_var_X + box.min.x() >= box_min_x); + Solver.add(dec_var_X + box.max.x() <= box_max_x); + + Solver.add(dec_var_Y + box.min.y() >= box_min_y); + Solver.add(dec_var_Y + box.max.y() <= box_max_y); +} + + +void assume_BedBoundingBox(const z3::expr &dec_var_X, + const z3::expr &dec_var_Y, + const Slic3r::Polygon &polygon, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y, + z3::expr_vector &bounding_constraints) +{ + BoundingBox box = get_extents(polygon); + + bounding_constraints.push_back(dec_var_X + box.min.x() >= box_min_x); + bounding_constraints.push_back(dec_var_X + box.max.x() <= box_max_x); + + bounding_constraints.push_back(dec_var_Y + box.min.y() >= box_min_y); + bounding_constraints.push_back(dec_var_Y + box.max.y() <= box_max_y); +} + + + + + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_size_x, + int box_size_y) +{ + for (int i = 0; i < polygons.size(); ++i) + { + BoundingBox box = get_extents(polygons[i]); + + Solver.add(dec_vars_X[i] + box.min.x() >= 0); + Solver.add(dec_vars_X[i] + box.max.x() <= box_size_x); + + Solver.add(dec_vars_Y[i] + box.min.y() >= 0); + Solver.add(dec_vars_Y[i] + box.max.y() <= box_size_y); + } +} + + +void assume_BedBoundingBox(const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_size_x, + int box_size_y, + z3::expr_vector &bounding_constraints) +{ + for (int i = 0; i < polygons.size(); ++i) + { + BoundingBox box = get_extents(polygons[i]); + + bounding_constraints.push_back(dec_vars_X[i] + box.min.x() >= 0); + bounding_constraints.push_back(dec_vars_X[i] + box.max.x() <= box_size_x); + + bounding_constraints.push_back(dec_vars_Y[i] + box.min.y() >= 0); + bounding_constraints.push_back(dec_vars_Y[i] + box.max.y() <= box_size_y); + } +} + + +void introduce_BedBoundingBox(z3::solver &Solver, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y) +{ + for (int i = 0; i < polygons.size(); ++i) + { + BoundingBox box = get_extents(polygons[i]); + + Solver.add(dec_vars_X[i] + box.min.x() >= box_min_x); + Solver.add(dec_vars_X[i] + box.max.x() <= box_max_x); + + Solver.add(dec_vars_Y[i] + box.min.y() >= box_min_y); + Solver.add(dec_vars_Y[i] + box.max.y() <= box_max_y); + } +} + + +void assume_BedBoundingBox_(const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons, + int box_min_x, + int box_min_y, + int box_max_x, + int box_max_y, + z3::expr_vector &bounding_constraints) +{ + for (int i = 0; i < polygons.size(); ++i) + { + BoundingBox box = get_extents(polygons[i]); + + bounding_constraints.push_back(dec_vars_X[i] + box.min.x() >= box_min_x); + bounding_constraints.push_back(dec_vars_X[i] + box.max.x() <= box_max_x); + + bounding_constraints.push_back(dec_vars_Y[i] + box.min.y() >= box_min_y); + bounding_constraints.push_back(dec_vars_Y[i] + box.max.y() <= box_max_y); + } +} + + +void assume_ConsequentialObjectPresence(z3::context &Context, + const z3::expr_vector &dec_vars_T, + const std::vector &present, + const std::vector &missing, + z3::expr_vector &presence_constraints) +{ + for (int i = 0; i < present.size(); ++i) + { + presence_constraints.push_back(dec_vars_T[present[i]] > Context.real_val(SEQ_TEMPORAL_PRESENCE_THRESHOLD)); + } + + for (int i = 0; i < missing.size(); ++i) + { + presence_constraints.push_back(dec_vars_T[missing[i]] < Context.real_val(SEQ_TEMPORAL_ABSENCE_THRESHOLD)); + } +} + + +void introduce_TemporalOrdering(z3::solver &Solver, + z3::context &SEQ_UNUSED(Context), + const z3::expr_vector &dec_vars_T, + int temporal_spread, + const std::vector &polygons) +{ + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + Solver.add(dec_vars_T[i] > dec_vars_T[j] + temporal_spread || dec_vars_T[i] + temporal_spread < dec_vars_T[j]); + } + } +} + + +void introduce_SequentialTemporalOrderingAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + int temporal_spread, + const std::vector &SEQ_UNUSED(polygons)) +{ + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + Solver.add( dec_vars_T[undecided[i]] > Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator) + temporal_spread + || dec_vars_T[undecided[i]] + temporal_spread < Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator)); + } + } + + #ifdef DEBUG + { + printf("Origo\n"); + for (int i = 0; i < fixed.size(); ++i) + { + printf("%.3f\n", dec_values_T[fixed[i]].as_double()); + } + } + #endif +} + + +void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + int temporal_spread, + const std::vector &SEQ_UNUSED(polygons)) +{ + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + Solver.add( dec_vars_T[undecided[i]] > Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator) + temporal_spread + || dec_vars_T[undecided[i]] + temporal_spread < Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator)); + } + } + + #ifdef DEBUG + { + printf("Origo\n"); + for (int i = 0; i < fixed.size(); ++i) + { + printf("%.3f\n", dec_values_T[fixed[i]].as_double()); + } + } + #endif +} + + +/*----------------------------------------------------------------*/ + +void introduce_LineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2) +{ + introduce_LineNonIntersection_implicit(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + line1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + line2); +} + + +void introduce_SequentialLineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + introduce_SequentialLineNonIntersection_implicit(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + dec_var_t1, + line1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + dec_var_t2, + line2); +} + + +void introduce_ConsequentialLineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + introduce_ConsequentialLineNonIntersection_implicit(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + dec_var_t1, + line1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + dec_var_t2, + line2); +} + + +void introduce_LineNonIntersection_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2) +{ + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint iota: [%d, %d, %d, %d] [%d, %d, %d, %d]\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y()); + } + #endif + + Solver.add((dec_var_X1 + line1.a.x() + v1x * dec_var_T1) == (dec_var_X2 + line2.a.x() + v2x * dec_var_T2)); + Solver.add((dec_var_Y1 + line1.a.y() + v1y * dec_var_T1) == (dec_var_Y2 + line2.a.y() + v2y * dec_var_T2)); + + Solver.add( dec_var_T1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_T2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } +} + + +void introduce_SequentialLineNonIntersection_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint seq: [%d, %d, %d, %d] [%d, %d, %d, %d]\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y()); + } + #endif + + Solver.add((dec_var_X1 + line1.a.x() + v1x * dec_var_t1) == (dec_var_X2 + line2.a.x() + v2x * dec_var_t2)); + Solver.add((dec_var_Y1 + line1.a.y() + v1y * dec_var_t1) == (dec_var_Y2 + line2.a.y() + v2y * dec_var_t2)); + +// Solver.add(dec_var_T1 < dec_var_T2 || dec_var_t1 < 0 || dec_var_t1 > 1 || dec_var_t2 < 0 || dec_var_t2 > 1); + Solver.add( dec_var_T1 < dec_var_T2 + || dec_var_t1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_t2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } +} + + +void introduce_ConsequentialLineNonIntersection_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint seq: [%d, %d, %d, %d] [%d, %d, %d, %d]\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y()); + } + #endif + + Solver.add((dec_var_X1 + line1.a.x() + v1x * dec_var_t1) == (dec_var_X2 + line2.a.x() + v2x * dec_var_t2)); + Solver.add((dec_var_Y1 + line1.a.y() + v1y * dec_var_t1) == (dec_var_Y2 + line2.a.y() + v2y * dec_var_t2)); + +// Solver.add(dec_var_T1 < dec_var_T2 || dec_var_t1 < 0 || dec_var_t1 > 1 || dec_var_t2 < 0 || dec_var_t2 > 1); + Solver.add( dec_var_T1 < 0 + || dec_var_T2 < 0 + || dec_var_T1 < dec_var_T2 + || dec_var_t1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_t2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } +} + + +void introduce_LineNonIntersection_explicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2) +{ + Point point; + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + if (abs(v2x) > 0) + { + int coef_T1 = v1y * v2x - v1x * v2y; + int d1 = v2x * line1.a.y() - v2x * line2.a.y() - v2y * line1.a.x() + v2y * line2.a.x(); + + int coef_X1 = -v2y; + int coef_Y1 = v2x; + + int coef_X2 = v2y; + int coef_Y2 = -v2x; + + Solver.add( ((coef_X1 * dec_var_X1) + + (coef_Y1 * dec_var_Y1) + + (coef_X2 * dec_var_X2) + + (coef_Y2 * dec_var_Y2) + + (coef_T1 * dec_var_T1) + + d1) == 0); + + int d2 = line1.a.x() - line2.a.x(); + + Solver.add( (dec_var_X1 + - dec_var_X2 + + v1x * dec_var_T1 + - v2x * dec_var_T2 + + d2) == 0); + + Solver.add( dec_var_T1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_T2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } + else + { + if (abs(v2y) > 0) + { + int coef_T2 = v1y * v2x - v1x * v2y; + int d1 = v2y * line1.a.x() - v2y * line2.a.x() - v2x * line1.a.y() + v2x * line2.a.y(); + + int coef_X1 = v2y; + int coef_Y1 = -v2x; + + int coef_X2 = -v2y; + int coef_Y2 = v2x; + + Solver.add( ((coef_X1 * dec_var_X1) + + (coef_Y1 * dec_var_Y1) + + (coef_X2 * dec_var_X2) + + (coef_Y2 * dec_var_Y2) + + (coef_T2 * dec_var_T2) + + d1) == 0); + + int d2 = line1.a.y() - line2.a.y(); + + Solver.add( (dec_var_Y1 + - dec_var_Y2 + + v1y * dec_var_T1 + - v2y* dec_var_T2 + + d2) == 0); + + Solver.add( dec_var_T1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_T2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } + else + { + /* intersection not possible, the second line is empty */ + assert(false); + } + } + } +} + + + +void introduce_LineNonIntersectionAgainstFixedLine(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2) +{ + introduce_LineNonIntersectionAgainstFixedLine_implicit(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + line1, + dec_value_X2, + dec_value_Y2, + dec_var_T2, + line2); +} + + +void introduce_SequentialLineNonIntersectionAgainstFixedLine(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + introduce_SequentialLineNonIntersectionAgainstFixedLine_implicit(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + dec_var_t1, + line1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + dec_var_t2, + line2); +} + + +void introduce_SequentialFixedLineNonIntersectionAgainstLine(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + introduce_SequentialFixedLineNonIntersectionAgainstLine_implicit(Solver, + Context, + dec_value_X1, + dec_value_Y1, + dec_value_T1, + dec_var_t1, + line1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + dec_var_t2, + line2); +} + + +void introduce_ConsequentialLineNonIntersectionAgainstFixedLine(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + introduce_ConsequentialLineNonIntersectionAgainstFixedLine_implicit(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + dec_var_t1, + line1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + dec_var_t2, + line2); +} + + +void introduce_ConsequentialFixedLineNonIntersectionAgainstLine(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + introduce_ConsequentialFixedLineNonIntersectionAgainstLine_implicit(Solver, + Context, + dec_value_X1, + dec_value_Y1, + dec_value_T1, + dec_var_t1, + line1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + dec_var_t2, + line2); +} + + +void introduce_LineNonIntersectionAgainstFixedLine_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2) +{ + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint alpha [%d, %d, %d, %d] [%d, %d, %d, %d]\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y()); + } + #endif + + Solver.add((dec_var_X1 + line1.a.x() + v1x * dec_var_T1) == (Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator) + line2.a.x() + v2x * dec_var_T2)); + Solver.add((dec_var_Y1 + line1.a.y() + v1y * dec_var_T1) == (Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator) + line2.a.y() + v2y * dec_var_T2)); + + Solver.add( dec_var_T1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_T2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } +} + + +void introduce_LineNonIntersectionAgainstFixedLine_explicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Line &line2) +{ + Point point; + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + if (abs(v2x) > 0) + { + int coef_T1 = v1y * v2x - v1x * v2y; + int d1 = v2x * line1.a.y() - v2x * line2.a.y() - v2y * line1.a.x() + v2y * line2.a.x(); + + int coef_X1 = -v2y; + int coef_Y1 = v2x; + + int coef_X2 = v2y; + int coef_Y2 = -v2x; + + Solver.add( ((coef_X1 * dec_var_X1) + + (coef_Y1 * dec_var_Y1) + + (coef_X2 * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) + + (coef_Y2 * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) + + (coef_T1 * dec_var_T1) + + d1) == 0); + + int d2 = line1.a.x() - line2.a.x(); + + Solver.add( (dec_var_X1 + - Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator) + + v1x * dec_var_T1 + - v2x * dec_var_T2 + + d2) == 0); + + Solver.add( dec_var_T1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_T2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } + else + { + if (abs(v2y) > 0) + { + int coef_T2 = v1y * v2x - v1x * v2y; + int d1 = v2y * line1.a.x() - v2y * line2.a.x() - v2x * line1.a.y() + v2x * line2.a.y(); + + int coef_X1 = v2y; + int coef_Y1 = -v2x; + + int coef_X2 = -v2y; + int coef_Y2 = v2x; + + Solver.add( ( (coef_X1 * dec_var_X1) + + (coef_Y1 * dec_var_Y1) + + (coef_X2 * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) + + (coef_Y2 * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) + + (coef_T2 * dec_var_T2) + + d1) == 0); + + int d2 = line1.a.y() - line2.a.y(); + + Solver.add( ( dec_var_Y1 + - Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator) + + v1y * dec_var_T1 + - v2y* dec_var_T2 + + d2) == 0); + + Solver.add( dec_var_T1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_T2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_T2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } + else + { + /* intersection not possible, the second line is empty */ + assert(false); + } + } + } +} + + +void introduce_SequentialLineNonIntersectionAgainstFixedLine_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint beta: [%d, %d, %d, %d] [%d, %d, %d, %d] (%.3f,%.3f,%.3f)\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y(), dec_value_X2.as_double(), dec_value_Y2.as_double(), dec_value_T2.as_double()); + printf("v1: %d,%d v2:%d,%d\n", v1x, v1y, v2x, v2y); + } + #endif + + Solver.add((dec_var_X1 + line1.a.x() + v1x * dec_var_t1) == (Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator) + line2.a.x() + v2x * dec_var_t2)); + Solver.add((dec_var_Y1 + line1.a.y() + v1y * dec_var_t1) == (Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator) + line2.a.y() + v2y * dec_var_t2)); + + Solver.add( (dec_var_T1 < Context.real_val(dec_value_T2.numerator, dec_value_T2.denominator)) + || (dec_var_t1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN)) + || (dec_var_t1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)) + || (dec_var_t2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN)) + || (dec_var_t2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX))); + } +} + + +void introduce_SequentialFixedLineNonIntersectionAgainstLine_implicit(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint gamma: [%d, %d, %d, %d] [%d, %d, %d, %d]\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y()); + } + #endif + + Solver.add((Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator) + line1.a.x() + v1x * dec_var_t1) == (dec_var_X2 + line2.a.x() + v2x * dec_var_t2)); + Solver.add((Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator) + line1.a.y() + v1y * dec_var_t1) == (dec_var_Y2 + line2.a.y() + v2y * dec_var_t2)); + + Solver.add( Context.real_val(dec_value_T1.numerator, dec_value_T1.denominator) < dec_var_T2 + || dec_var_t1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_t2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } +} + + +void introduce_ConsequentialLineNonIntersectionAgainstFixedLine_implicit(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + + if (dec_value_T2.is_Positive()) + { + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint beta: [%d, %d, %d, %d] [%d, %d, %d, %d] (%.3f,%.3f,%.3f)\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y(), dec_value_X2.as_double(), dec_value_Y2.as_double(), dec_value_T2.as_double()); + printf("v1: %d,%d v2:%d,%d\n", v1x, v1y, v2x, v2y); + } + #endif + + Solver.add((dec_var_X1 + line1.a.x() + v1x * dec_var_t1) == (Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator) + line2.a.x() + v2x * dec_var_t2)); + Solver.add((dec_var_Y1 + line1.a.y() + v1y * dec_var_t1) == (Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator) + line2.a.y() + v2y * dec_var_t2)); + + Solver.add( dec_var_T1 < 0 + || (dec_var_T1 < Context.real_val(dec_value_T2.numerator, dec_value_T2.denominator)) + || (dec_var_t1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN)) + || (dec_var_t1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)) + || (dec_var_t2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN)) + || (dec_var_t2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX))); + } + } +} + + +void introduce_ConsequentialFixedLineNonIntersectionAgainstLine_implicit(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_t1, + const Slic3r::Line &line1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const z3::expr &dec_var_t2, + const Slic3r::Line &line2) +{ + if (dec_value_T1.is_Positive()) + { + Point point; + + if (line1.intersection_infinite(line2, &point)) + { + int v1x = line1.b.x() - line1.a.x(); + int v1y = line1.b.y() - line1.a.y(); + + int v2x = line2.b.x() - line2.a.x(); + int v2y = line2.b.y() - line2.a.y(); + + #ifdef DEBUG + { + printf("adding constraint gamma: [%d, %d, %d, %d] [%d, %d, %d, %d]\n", line1.a.x(), line1.a.y(), line1.b.x(), line1.b.y(), + line2.a.x(), line2.a.y(), line2.b.x(), line2.b.y()); + } + #endif + + Solver.add((Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator) + line1.a.x() + v1x * dec_var_t1) == (dec_var_X2 + line2.a.x() + v2x * dec_var_t2)); + Solver.add((Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator) + line1.a.y() + v1y * dec_var_t1) == (dec_var_Y2 + line2.a.y() + v2y * dec_var_t2)); + + Solver.add( dec_var_T2 < 0 + || Context.real_val(dec_value_T1.numerator, dec_value_T1.denominator) < dec_var_T2 + || dec_var_t1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) + || dec_var_t2 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) + || dec_var_t2 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX)); + } + } +} + + +/*----------------------------------------------------------------*/ + +void introduce_PointInsideHalfPlane(z3::solver &Solver, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Line &halving_line) +{ + Vector normal = halving_line.normal(); + + Solver.add( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * dec_var_X2 + normal.x() * halving_line.a.x()) + - (normal.y() * dec_var_Y2 + normal.y() * halving_line.a.y()) < 0); +} + + +void introduce_PointOutsideHalfPlane(z3::solver &Solver, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Line &halving_line) +{ + Vector normal = halving_line.normal(); + + Solver.add( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * dec_var_X2 + normal.x() * halving_line.a.x()) + - (normal.y() * dec_var_Y2 + normal.y() * halving_line.a.y()) > 0); +} + + +void introduce_PointInsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr in_conjunction(Context); + + for (Points::const_iterator point = polygon.points.begin(); point != polygon.points.end(); ++point) + { + Points::const_iterator next_point = point + 1; + if (next_point == polygon.points.end()) + { + next_point = polygon.points.begin(); + } + + Line line(*point, *next_point); + Vector normal = line.normal(); + + z3::expr inside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) < 0); + + if (point == polygon.points.begin()) + { + in_conjunction = inside_half_plane; + } + else + { + in_conjunction = in_conjunction && inside_half_plane; + } + } + + Solver.add(in_conjunction); + } +} + + +/*----------------------------------------------------------------*/ + +void introduce_PointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_SequentialPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2) +{ + if (polygon2.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon2.points.size(); ++p) + { + int np = (p + 1) % polygon2.points.size(); + + Line line(polygon2.points[p], polygon2.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_ConsequentialPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2) +{ + if (polygon2.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon2.points.size(); ++p) + { + int np = (p + 1) % polygon2.points.size(); + + Line line(polygon2.points[p], polygon2.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < 0) || (dec_var_T2 < 0) || (dec_var_T1 < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_ShiftSequentialPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + int x, + int y, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2) +{ + if (polygon2.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon2.points.size(); ++p) + { + int np = (p + 1) % polygon2.points.size(); + + Line line(polygon2.points[p], polygon2.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + (normal.x() * x) + + (normal.y() * dec_var_Y1) + (normal.y() * y) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_ShiftConsequentialPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + int x, + int y, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2) +{ + if (polygon2.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon2.points.size(); ++p) + { + int np = (p + 1) % polygon2.points.size(); + + Line line(polygon2.points[p], polygon2.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + (normal.x() * x) + + (normal.y() * dec_var_Y1) + (normal.y() * y) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < 0) || (dec_var_T2 < 0) || (dec_var_T1 < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_FixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator)) + + (normal.y() * Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator)) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0); + + if (p == 0) + { + out_disjunction = outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator)) + + (normal.y() * Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator)) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (Context.real_val(dec_value_T1.numerator, dec_value_T1.denominator) < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator)) + + (normal.y() * Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator)) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < Context.real_val(dec_value_T2.numerator, dec_value_T2.denominator)) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const Rational &dec_value_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon) +{ + if (dec_value_T1.is_Positive()) + { + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator)) + + (normal.y() * Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator)) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T2 < 0) || (Context.real_val(dec_value_T1.numerator, dec_value_T1.denominator) < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } + } +} + + +void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const Rational &dec_value_X1, + const Rational &dec_value_Y1, + const z3::expr &dec_var_T1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon) +{ + if (dec_value_T2.is_Positive()) + { + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator)) + + (normal.y() * Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator)) + - (normal.x() * dec_var_X2) + - (normal.x() * line.a.x()) + - (normal.y() * dec_var_Y2) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < 0) || (dec_var_T1 < Context.real_val(dec_value_T2.numerator, dec_value_T2.denominator)) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } + } +} + + +void introduce_PointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) + - (normal.x() * line.a.x()) + - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) + - (normal.x() * line.a.x()) + - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < Context.real_val(dec_value_T2.numerator, dec_value_T2.denominator)) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Rational &dec_value_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon) +{ + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) + - (normal.x() * line.a.x()) + - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (Context.real_val(dec_value_T1.numerator, dec_value_T1.denominator) < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } +} + + +void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon) +{ + if (dec_value_T2.is_Positive()) + { + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) + - (normal.x() * line.a.x()) + - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T1 < 0) || (dec_var_T1 < Context.real_val(dec_value_T2.numerator, dec_value_T2.denominator)) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } + } +} + + +void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Rational &dec_value_T1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon) +{ + if (dec_value_T1.is_Positive()) + { + if (polygon.points.size() >= 3) + { + z3::expr out_disjunction(Context); + + for (int p = 0; p < polygon.points.size(); ++p) + { + int np = (p + 1) % polygon.points.size(); + + Line line(polygon.points[p], polygon.points[np]); + Vector normal = line.normal(); + + z3::expr outside_half_plane( (normal.x() * dec_var_X1) + + (normal.y() * dec_var_Y1) + - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) + - (normal.x() * line.a.x()) + - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) + - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + + if (p == 0) + { + out_disjunction = (dec_var_T2 < 0) || (Context.real_val(dec_value_T1.numerator, dec_value_T1.denominator) < dec_var_T2) || outside_half_plane; + } + else + { + out_disjunction = out_disjunction || outside_half_plane; + } + } + + Solver.add(out_disjunction); + } + } +} + +void introduce_PolygonLineNonIntersection(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Slic3r::Polygon &polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon2) +{ + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + const Point &next_point1 = polygon1.points[(p1 + 1) % polygon1.points.size()]; + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + const Point &next_point2 = polygon2.points[(p2 + 1) % polygon2.points.size()]; + + introduce_LineNonIntersection(Solver, + Context, + dec_var_X1, + dec_var_Y1, + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_var_X2, + dec_var_Y2, + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + } + } +} + + +void introduce_PolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Slic3r::Polygon &polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const Slic3r::Polygon &polygon2) +{ + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + introduce_PointOutsidePolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_X2, + dec_var_Y2, + polygon2); + } + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + introduce_PointOutsidePolygon(Solver, + Context, + dec_var_X2 + point2.x(), + dec_var_Y2 + point2.y(), + dec_var_X1, + dec_var_Y1, + polygon1); + } +} + + +void introduce_PolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const Slic3r::Polygon &polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Slic3r::Polygon &polygon2) +{ + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + introduce_PointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_value_X2, + dec_value_Y2, + polygon2); + } + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + introduce_FixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + point2.x(), + dec_value_Y2 + point2.y(), + dec_var_X1, + dec_var_Y1, + polygon1); + } +} + + +void introduce_SequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2) +{ + std::vector _unreachable_polygons1; + _unreachable_polygons1.push_back(unreachable_polygon1); + + std::vector _unreachable_polygons2; + _unreachable_polygons2.push_back(unreachable_polygon2); + + introduce_SequentialPolygonOutsidePolygon(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + polygon1, + _unreachable_polygons1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + polygon2, + _unreachable_polygons2); +} + + +void introduce_SequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2) +{ +// Solver.add(dec_var_T1 < dec_var_T2); + + #ifdef DEBUG + { + printf("polygon1:\n"); + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + printf("[%d,%d] ", polygon1.points[p1].x(), polygon1.points[p1].y()); + } + printf("\n"); + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + printf("pro_polygon1 %d:\n", poly1); + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + printf("[%d,%d] ", unreachable_polygons1[poly1].points[p1].x(), unreachable_polygons1[poly1].points[p1].y()); + } + printf("\n"); + } + printf("\n"); + + printf("polygon2:\n"); + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + printf("[%d,%d] ", polygon2.points[p2].x(), polygon2.points[p2].y()); + } + printf("\n"); + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + printf("pro_polygon2 %d:\n", poly2); + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + printf("[%d,%d] ", unreachable_polygons2[poly2].points[p2].x(), unreachable_polygons2[poly2].points[p2].y()); + } + printf("\n"); + } + printf("\n"); + } + #endif + + + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + introduce_SequentialPointOutsidePolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_T1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + unreachable_polygons2[poly2]); + } + } + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; + + introduce_SequentialPointOutsidePolygon(Solver, + Context, + dec_var_X2 + pro_point2.x(), + dec_var_Y2 + pro_point2.y(), + dec_var_T1, + dec_var_X1, + dec_var_Y1, + dec_var_T2, + polygon1); + } + } + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + /* + introduce_ShiftSequentialPointOutsidePolygon(Solver, + Context, + point2.x(), + point2.y(), + dec_var_X2, + dec_var_Y2, + dec_var_T2, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + polygon1); + unreachable_polygons1[poly1]); + */ + introduce_SequentialPointOutsidePolygon(Solver, + Context, + dec_var_X2 + point2.x(), + dec_var_Y2 + point2.y(), + dec_var_T2, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + unreachable_polygons1[poly1]); + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; + + introduce_SequentialPointOutsidePolygon(Solver, + Context, + dec_var_X1 + pro_point1.x(), + dec_var_Y1 + pro_point1.y(), + dec_var_T2, + dec_var_X2, + dec_var_Y2, + dec_var_T1, + polygon2); + } + } +/* + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + introduce_PointOutsidePolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_X2, + dec_var_Y2, + polygon2); + } +*/ +/* + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + introduce_PointOutsidePolygon(Solver, + Context, + dec_var_X2 + point2.x(), + dec_var_Y2 + point2.y(), + dec_var_X1, + dec_var_Y1, + polygon1); + } +*/ +} + + + +void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2) +{ + std::vector _unreachable_polygons1; + _unreachable_polygons1.push_back(unreachable_polygon1); + + std::vector _unreachable_polygons2; + _unreachable_polygons2.push_back(unreachable_polygon2); + + introduce_SequentialPolygonOutsideFixedPolygon(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + polygon1, + _unreachable_polygons1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + polygon2, + _unreachable_polygons2); +} + + +void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2) +{ + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + introduce_SequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_T1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + unreachable_polygons2[poly2]); + } + } + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; + + introduce_SequentialFixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + pro_point2.x(), + dec_value_Y2 + pro_point2.y(), + dec_var_T1, + dec_var_X1, + dec_var_Y1, + dec_value_T2, + polygon1); + } + } + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + introduce_SequentialFixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + point2.x(), + dec_value_Y2 + point2.y(), + dec_value_T2, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + unreachable_polygons1[poly1]); + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; + + introduce_SequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + pro_point1.x(), + dec_var_Y1 + pro_point1.y(), + dec_value_T2, + dec_value_X2, + dec_value_Y2, + dec_var_T1, + polygon2); + } + } + +/* + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + introduce_PointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_value_X2, + dec_value_Y2, + polygon2); + } + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + printf("c: %.3f, %.3f\n", dec_value_X2.as_double(), dec_value_Y2.as_double()); + printf(" %.3f, %.3f\n", (dec_value_X2 + point2.x()).as_double(), (dec_value_Y2 + point2.y()).as_double()); + + introduce_FixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + point2.x(), + dec_value_Y2 + point2.y(), + dec_var_X1, + dec_var_Y1, + polygon1); + } +*/ +} + + +void introduce_ConsequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2) +{ + std::vector _unreachable_polygons1; + _unreachable_polygons1.push_back(unreachable_polygon1); + + std::vector _unreachable_polygons2; + _unreachable_polygons2.push_back(unreachable_polygon2); + + introduce_ConsequentialPolygonOutsidePolygon(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + polygon1, + _unreachable_polygons1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + polygon2, + _unreachable_polygons2); +} + + +void introduce_ConsequentialPolygonOutsidePolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2) +{ + #ifdef DEBUG + { + printf("polygon1:\n"); + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + printf("[%d,%d] ", polygon1.points[p1].x(), polygon1.points[p1].y()); + } + printf("\n"); + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + printf("pro_polygon1 %d:\n", poly1); + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + printf("[%d,%d] ", unreachable_polygons1[poly1].points[p1].x(), unreachable_polygons1[poly1].points[p1].y()); + } + printf("\n"); + } + printf("\n"); + + printf("polygon2:\n"); + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + printf("[%d,%d] ", polygon2.points[p2].x(), polygon2.points[p2].y()); + } + printf("\n"); + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + printf("pro_polygon2 %d:\n", poly2); + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + printf("[%d,%d] ", unreachable_polygons2[poly2].points[p2].x(), unreachable_polygons2[poly2].points[p2].y()); + } + printf("\n"); + } + printf("\n"); + } + #endif + + + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_T1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + unreachable_polygons2[poly2]); + } + } + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; + + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X2 + pro_point2.x(), + dec_var_Y2 + pro_point2.y(), + dec_var_T1, + dec_var_X1, + dec_var_Y1, + dec_var_T2, + polygon1); + } + } + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X2 + point2.x(), + dec_var_Y2 + point2.y(), + dec_var_T2, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + unreachable_polygons1[poly1]); + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; + + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X1 + pro_point1.x(), + dec_var_Y1 + pro_point1.y(), + dec_var_T2, + dec_var_X2, + dec_var_Y2, + dec_var_T1, + polygon2); + } + } +} + + +void introduce_ConsequentialPolygonExternalPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2) +{ + std::vector _unreachable_polygons1; + _unreachable_polygons1.push_back(unreachable_polygon1); + + std::vector _unreachable_polygons2; + _unreachable_polygons2.push_back(unreachable_polygon2); + + introduce_ConsequentialPolygonExternalPolygon(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + polygon1, + _unreachable_polygons1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + polygon2, + _unreachable_polygons2); +} + + +void introduce_ConsequentialPolygonExternalPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const z3::expr &dec_var_X2, + const z3::expr &dec_var_Y2, + const z3::expr &dec_var_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2) +{ + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + if (unreachable_polygons2[poly2].area() > polygon1.area()) + { + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_T1, + dec_var_X2, + dec_var_Y2, + dec_var_T2, + unreachable_polygons2[poly2]); + } + } + } + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + if (unreachable_polygons2[poly2].area() < polygon1.area()) + { + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; + + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X2 + pro_point2.x(), + dec_var_Y2 + pro_point2.y(), + dec_var_T1, + dec_var_X1, + dec_var_Y1, + dec_var_T2, + polygon1); + } + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + if (unreachable_polygons1[poly1].area() > polygon2.area()) + { + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X2 + point2.x(), + dec_var_Y2 + point2.y(), + dec_var_T2, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + unreachable_polygons1[poly1]); + } + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + if (unreachable_polygons1[poly1].area() < polygon2.area()) + { + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; + + introduce_ConsequentialPointOutsidePolygon(Solver, + Context, + dec_var_X1 + pro_point1.x(), + dec_var_Y1 + pro_point1.y(), + dec_var_T2, + dec_var_X2, + dec_var_Y2, + dec_var_T1, + polygon2); + } + } + } +} + + +void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2) +{ + std::vector _unreachable_polygons1; + _unreachable_polygons1.push_back(unreachable_polygon1); + + std::vector _unreachable_polygons2; + _unreachable_polygons2.push_back(unreachable_polygon2); + + introduce_ConsequentialPolygonOutsideFixedPolygon(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + polygon1, + _unreachable_polygons1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + polygon2, + _unreachable_polygons2); +} + + +void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2) +{ + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + introduce_ConsequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_T1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + unreachable_polygons2[poly2]); + } + } + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; + + introduce_ConsequentialFixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + pro_point2.x(), + dec_value_Y2 + pro_point2.y(), + dec_var_T1, + dec_var_X1, + dec_var_Y1, + dec_value_T2, + polygon1); + } + } + + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + introduce_ConsequentialFixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + point2.x(), + dec_value_Y2 + point2.y(), + dec_value_T2, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + unreachable_polygons1[poly1]); + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; + + introduce_ConsequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + pro_point1.x(), + dec_var_Y1 + pro_point1.y(), + dec_value_T2, + dec_value_X2, + dec_value_Y2, + dec_var_T1, + polygon2); + } + } +} + + + +void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const Slic3r::Polygon &unreachable_polygon1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const Slic3r::Polygon &unreachable_polygon2) +{ + std::vector _unreachable_polygons1; + _unreachable_polygons1.push_back(unreachable_polygon1); + + std::vector _unreachable_polygons2; + _unreachable_polygons2.push_back(unreachable_polygon2); + + introduce_ConsequentialPolygonExternalFixedPolygon(Solver, + Context, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + polygon1, + _unreachable_polygons1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + polygon2, + _unreachable_polygons2); +} + + +void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon1, + const std::vector &unreachable_polygons1, + const Rational &dec_value_X2, + const Rational &dec_value_Y2, + const Rational &dec_value_T2, + const Slic3r::Polygon &polygon2, + const std::vector &unreachable_polygons2) +{ + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + if (unreachable_polygons2[poly2].area() > polygon1.area()) + { + for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + { + const Point &point1 = polygon1.points[p1]; + + introduce_ConsequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_T1, + dec_value_X2, + dec_value_Y2, + dec_value_T2, + unreachable_polygons2[poly2]); + } + } + } + + for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + { + if (unreachable_polygons2[poly2].area() < polygon1.area()) + { + for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + { + const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; + + introduce_ConsequentialFixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + pro_point2.x(), + dec_value_Y2 + pro_point2.y(), + dec_var_T1, + dec_var_X1, + dec_var_Y1, + dec_value_T2, + polygon1); + } + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + if (unreachable_polygons1[poly1].area() > polygon2.area()) + { + for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + { + const Point &point2 = polygon2.points[p2]; + + introduce_ConsequentialFixedPointOutsidePolygon(Solver, + Context, + dec_value_X2 + point2.x(), + dec_value_Y2 + point2.y(), + dec_value_T2, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + unreachable_polygons1[poly1]); + } + } + } + + for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + { + if (unreachable_polygons1[poly1].area() < polygon2.area()) + { + for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + { + const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; + + introduce_ConsequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + pro_point1.x(), + dec_var_Y1 + pro_point1.y(), + dec_value_T2, + dec_value_X2, + dec_value_Y2, + dec_var_T1, + polygon2); + } + } + } +} + + +/*----------------------------------------------------------------*/ + +void introduce_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons) +{ + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + introduce_PolygonOutsidePolygon(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + polygons[i], + dec_vars_X[j], + dec_vars_Y[j], + polygons[j]); + } + } +} + + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + introduce_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + polygons, + _unreachable_polygons); +} + + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + introduce_SequentialPolygonOutsidePolygon(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + polygons[i], + unreachable_polygons[i], + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + polygons[j], + unreachable_polygons[j]); + } + } +} + + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + introduce_ConsequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + polygons, + _unreachable_polygons); +} + + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + introduce_ConsequentialPolygonOutsidePolygon(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + polygons[i], + unreachable_polygons[i], + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + polygons[j], + unreachable_polygons[j]); + } + } +} + + +void introduce_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons) +{ + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + introduce_PolygonOutsidePolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + polygons[undecided[j]]); + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + introduce_PolygonOutsideFixedPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + polygons[fixed[j]]); + } + } +} + + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + introduce_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + polygons, + _unreachable_polygons); +} + + +void introduce_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + #ifdef DEBUG + { + printf("PoP: %d,%d\n", undecided[i], undecided[j]); + } + #endif + introduce_SequentialPolygonOutsidePolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + polygons[undecided[j]], + unreachable_polygons[undecided[j]]); + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + #ifdef DEBUG + { + printf("PoFP: %d,%d\n", undecided[i], fixed[j]); + } + #endif + introduce_SequentialPolygonOutsideFixedPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + polygons[fixed[j]], + unreachable_polygons[fixed[j]]); + } + } +} + + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + introduce_ConsequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + polygons, + _unreachable_polygons); +} + + +void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + #ifdef DEBUG + { + printf("PoP: %d,%d\n", undecided[i], undecided[j]); + } + #endif + introduce_ConsequentialPolygonExternalPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + polygons[undecided[j]], + unreachable_polygons[undecided[j]]); + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + #ifdef DEBUG + { + printf("PoFP: %d,%d\n", undecided[i], fixed[j]); + } + #endif + introduce_ConsequentialPolygonExternalFixedPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + polygons[fixed[j]], + unreachable_polygons[fixed[j]]); + } + } +} + + +void introduce_PolygonStrongNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &polygons) +{ + introduce_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + polygons); + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + } + } + } + } +} + + +bool lines_intersect_(coord_t ax, coord_t ay, coord_t ux, coord_t uy, coord_t bx, coord_t by, coord_t vx, coord_t vy) +{ + coord_t den = ux * vy - uy * vx; + coord_t num = vx * ay - vx * by - vy * ax + vy * bx; + + if (fabs(den) < EPSILON) + { + return false; + } + else + { + double t = (double)num / den; + + if (t < 0.0 || t > 1.0) + { + return false; + } + else + { + if (abs(vx) > 0) + { + double tt = (ax - bx + t * ux) / vx; + + if (tt < 0.0 || tt > 1.0) + { + return false; + } + else + { + #ifdef DEBUG + { + printf("t:%.6f\n", t); + printf("tt:%.6f\n", tt); + } + #endif + return true; + } + } + else + { + if (abs(vy) > 0) + { + double tt = (ay - by + t * uy) / vy; + + if (tt < 0.0 || tt > 1.0) + { + return false; + } + else + { + #ifdef DEBUG + { + printf("t:%.6f\n", t); + printf("tt2:%.6f\n", tt); + } + #endif + return true; + } + } + else + { + return false; + } + } + } + } + + return false; +} + + +bool lines_intersect(double ax, double ay, double ux, double uy, double bx, double by, double vx, double vy) +{ + double den = ux * vy - uy * vx; + double num = vx * ay - vx * by - vy * ax + vy * bx; + + if (fabs(den) < EPSILON) + { + return false; + } + else + { + double t = num / den; + + if (t < 0.0 || t > 1.0) + { + return false; + } + else + { + if (fabs(vx) > EPSILON) + { + double tt = (ax - bx + t * ux) / vx; + + if (tt < 0.0 || tt > 1.0) + { + return false; + } + else + { +// #ifdef DEBUG + { + printf("t:%.6f\n", t); + printf("tt:%.6f\n", tt); + } +// #endif + return true; + } + } + else + { + if (fabs(vy) > EPSILON) + { + double tt = (ay - by + t * uy) / vy; + + if (tt < 0.0 || tt > 1.0) + { + return false; + } + else + { +// #ifdef DEBUG + { + printf("t:%.6f\n", t); + printf("tt2:%.6f\n", tt); + } +// #endif + return true; + } + } + else + { + return false; + } + } + } + } + + return false; +} + + +bool lines_intersect_closed(double ax, double ay, double ux, double uy, double bx, double by, double vx, double vy) +{ + return lines_intersect(ax, ay, ux, uy, bx, by, vx, vy); +} + + +bool lines_intersect_open(double ax, double ay, double ux, double uy, double bx, double by, double vx, double vy) +{ + double den = ux * vy - uy * vx; + double num = vx * ay - vx * by - vy * ax + vy * bx; + + if (fabs(den) < EPSILON) + { + return false; + } + else + { + double t = num / den; + + if (t < EPSILON || t > 1.0 - EPSILON) + { + return false; + } + else + { + if (fabs(vx) > EPSILON) + { + double tt = (ax - bx + t * ux) / vx; + + if (tt < EPSILON || tt > 1.0 - EPSILON) + { + return false; + } + else + { +// #ifdef DEBUG + { + printf("t:%.6f\n", t); + printf("tt:%.6f\n", tt); + } +// #endif + return true; + } + } + else + { + if (fabs(vy) > EPSILON) + { + double tt = (ay - by + t * uy) / vy; + + if (tt < EPSILON || tt > 1.0 - EPSILON) + { + return false; + } + else + { +// #ifdef DEBUG + { + printf("t:%.6f\n", t); + printf("tt2:%.6f\n", tt); + } +// #endif + return true; + } + } + else + { + return false; + } + } + } + } + + return false; +} + + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &polygons) +{ + bool refined = false; + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + Vec2d intersection(0,0); + #ifdef DEBUG + { + /* + printf("testing: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + */ + } + #endif + + /* Seems not working, report an intersection even if there is none, using out own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + /* + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + */ + } + #endif + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + return refined; +} + + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_values_X, + const z3::expr_vector &dec_values_Y, + const std::vector &polygons) +{ + bool refined = false; + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + printf("testing: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using out own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + return refined; +} + + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &polygons) +{ + bool refined = false; + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + printf("testing mi: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using out own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + return refined; +} + + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + bool refined = false; + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + if (dec_values_T[i] > dec_values_T[j]) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int p2 = 0; p2 < unreachable_polygons[j].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[j].points[p2]; + const Point &next_point2 = unreachable_polygons[j].points[(p2 + 1) % unreachable_polygons[j].points.size()]; + + #ifdef DEBUG + { + printf("testing ni %d %d (%d,%d): [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", i, j, p1, p2, + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + } + #endif + + if (lines_intersect(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + /* + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + */ + } + #endif + + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + else + { + if (dec_values_T[i] < dec_values_T[j]) + { + for (int p1 = 0; p1 < unreachable_polygons[i].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[i].points[p1]; + const Point &next_point1 = unreachable_polygons[i].points[(p1 + 1) % unreachable_polygons[i].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + #ifdef DEBUG + { + /* + printf("testing: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + */ + } + #endif + + if (lines_intersect(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + /* + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + */ + } + #endif + + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + refined = true; + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i], dec_values_T[j]); + } + #endif + assert(false); + } + } + } + } + return refined; +} + + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return refine_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + _unreachable_polygons); +} + + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + bool refined = false; + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + if (dec_values_T[i] > dec_values_T[j]) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + { + #ifdef DEBUG + { + printf("temporal: %.3f %.3f [ij: %d,%d]\n", dec_values_T[i].as_double(), dec_values_T[j].as_double(), i, j); + printf("proto X1: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[j].size(), unreachable_polygons[j][poly2].points.size()); + } + #endif + + for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[j][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; + + #ifdef DEBUG + { + printf("testing alpha %d %d (%d,%d): [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", i, j, p1, p2, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + if (lines_intersect(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, + dec_values_T[i].as_double(), + dec_values_T[j].as_double()); + + printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double(), + dec_values_Y[i].as_double(), + dec_values_X[j].as_double(), + dec_values_Y[j].as_double()); + + printf("intersect 1: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + hidden_var_cnt, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + else + { + if (dec_values_T[i] < dec_values_T[j]) + { + for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + { + #ifdef DEBUG + { + printf("proto2: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[i].size(), unreachable_polygons[i][poly1].points.size()); + //getchar(); + } + #endif + + const Point &point1 = unreachable_polygons[i][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + #ifdef DEBUG + { + printf("testing beta: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + if (lines_intersect(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, + dec_values_T[i].as_double(), + dec_values_T[j].as_double()); + + printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double(), + dec_values_Y[i].as_double(), + dec_values_X[j].as_double(), + dec_values_Y[j].as_double()); + + printf("intersect 2: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + hidden_var_cnt, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + /* + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + + */ + refined = true; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + } + #endif + assert(false); + } + } + } + } + return refined; +} + + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + bool refined = false; + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + if (dec_values_T[i] > dec_values_T[j]) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int p2 = 0; p2 < unreachable_polygons[j].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[j].points[p2]; + const Point &next_point2 = unreachable_polygons[j].points[(p2 + 1) % unreachable_polygons[j].points.size()]; + + #ifdef DEBUG + { + printf("testing ni %d %d (%d,%d): [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", i, j, p1, p2, + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + } + #endif + + if (lines_intersect(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + /* + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + */ + } + #endif + + introduce_ConsequentialLineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + else + { + if (dec_values_T[i] < dec_values_T[j]) + { + for (int p1 = 0; p1 < unreachable_polygons[i].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[i].points[p1]; + const Point &next_point1 = unreachable_polygons[i].points[(p1 + 1) % unreachable_polygons[i].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + #ifdef DEBUG + { + printf("testing: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + } + #endif + + if (lines_intersect(dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + /* + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + dec_values_X[i] + point1.x(), dec_values_Y[i] + point1.y(), + dec_values_X[i] + next_point1.x(), dec_values_Y[i] + next_point1.y(), + dec_values_X[j] + point2.x(), dec_values_Y[j] + point2.y(), + dec_values_X[j] + next_point2.x(), dec_values_Y[j] + next_point2.y()); + */ + } + #endif + + introduce_ConsequentialLineNonIntersection(Solver, + Context, + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + refined = true; + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i], dec_values_T[j]); + } + #endif + assert(false); + } + } + } + } + return refined; +} + + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return refine_ConsequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + _unreachable_polygons); +} + + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + bool refined = false; + + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + if (dec_values_T[i] > dec_values_T[j]) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + { + #ifdef DEBUG + { + printf("temporal: %.3f %.3f [ij: %d,%d]\n", dec_values_T[i].as_double(), dec_values_T[j].as_double(), i, j); + printf("proto X1: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[j].size(), unreachable_polygons[j][poly2].points.size()); + //getchar(); + } + #endif + + for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[j][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; + + #ifdef DEBUG + { + printf("testing alpha %d %d (%d,%d): [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", i, j, p1, p2, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + if (lines_intersect(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, + dec_values_T[i].as_double(), + dec_values_T[j].as_double()); + + printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double(), + dec_values_Y[i].as_double(), + dec_values_X[j].as_double(), + dec_values_Y[j].as_double()); + + printf("intersect 1: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + hidden_var_cnt, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + introduce_ConsequentialLineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + else + { + if (dec_values_T[i] < dec_values_T[j]) + { + for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + { + #ifdef DEBUG + { + printf("proto2: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[i].size(), unreachable_polygons[i][poly1].points.size()); + //getchar(); + } + #endif + + const Point &point1 = unreachable_polygons[i][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + #ifdef DEBUG + { + printf("testing beta: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + if (lines_intersect(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, + dec_values_T[i].as_double(), + dec_values_T[j].as_double()); + + printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double(), + dec_values_Y[i].as_double(), + dec_values_X[j].as_double(), + dec_values_Y[j].as_double()); + + printf("intersect 2: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + hidden_var_cnt, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + introduce_ConsequentialLineNonIntersection(Solver, + Context, + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + /* + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + + */ + refined = true; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + } + #endif + assert(false); + } + } + } + } + return refined; +} + + +/*----------------------------------------------------------------*/ + +void introduce_PolygonWeakNonoverlappingAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_values_X, + const z3::expr_vector &dec_values_Y, + const std::vector &decided, + const std::vector &undecided, + const std::vector &polygons) +{ + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + introduce_PolygonOutsidePolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + polygons[undecided[j]]); + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < decided.size(); ++j) + { + introduce_PolygonOutsidePolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + dec_values_X[decided[j]], + dec_values_Y[decided[j]], + polygons[decided[j]]); + } + } +} + + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_values_X, + const z3::expr_vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons) +{ + bool refined = false; + + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + { + const Point &point2 = polygons[undecided[j]].points[p2]; + const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; + + Vec2d intersection (0, 0); + #ifdef DEBUG + { + /* + printf("testing: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[undecided[i]].as_double() + point1.x(), dec_values_Y[undecided[i]].as_double() + point1.y(), + dec_values_X[undecided[i]].as_double() + next_point1.x(), dec_values_Y[undecided[i]].as_double() + next_point1.y(), + dec_values_X[undecided[j]].as_double() + point2.x(), dec_values_Y[undecided[j]].as_double() + point2.y(), + dec_values_X[undecided[j]].as_double() + next_point2.x(), dec_values_Y[undecided[j]].as_double() + next_point2.y()); + */ + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[undecided[j]] + point2.x(), dec_values_Y[undecided[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect(dec_values_X[undecided[i]].as_double() + point1.x(), dec_values_Y[undecided[i]].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[undecided[j]].as_double() + point2.x(), dec_values_Y[undecided[j]].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + /* + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + dec_values_X[undecided[i]].as_double() + point1.x(), dec_values_Y[undecided[i]].as_double() + point1.y(), + dec_values_X[undecided[i]].as_double() + next_point1.x(), dec_values_Y[undecided[i]].as_double() + next_point1.y(), + dec_values_X[undecided[j]].as_double() + point2.x(), dec_values_Y[undecided[j]].as_double() + point2.y(), + dec_values_X[undecided[j]].as_double() + next_point2.x(), dec_values_Y[undecided[j]].as_double() + next_point2.y()); + */ + } + #endif + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + { + const Point &point2 = polygons[fixed[j]].points[p2]; + const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + /* + printf("testing: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[undecided[i]].as_double() + point1.x(), dec_values_Y[undecided[i]].as_double() + point1.y(), + dec_values_X[undecided[i]].as_double() + next_point1.x(), dec_values_Y[undecided[i]].as_double() + next_point1.y(), + dec_values_X[fixed[j]].as_double() + point2.x(), dec_values_Y[fixed[j]].as_double() + point2.y(), + dec_values_X[fixed[j]].as_double() + next_point2.x(), dec_values_Y[fixed[j]].as_double() + next_point2.y()); + */ + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[fixed[j]] + point2.x(), dec_values_Y[fixed[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + + if (lines_intersect(dec_values_X[undecided[i]].as_double() + point1.x(), dec_values_Y[undecided[i]].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[fixed[j]].as_double() + point2.x(), dec_values_Y[fixed[j]].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + /* + printf("intersect: %d (%.3f,%.3f) - [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, intersection.x(), intersection.y(), + dec_values_X[undecided[i]].as_double() + point1.x(), dec_values_Y[undecided[i]].as_double() + point1.y(), + dec_values_X[undecided[i]].as_double() + next_point1.x(), dec_values_Y[undecided[i]].as_double() + next_point1.y(), + dec_values_X[fixed[j]].as_double() + point2.x(), dec_values_Y[fixed[j]].as_double() + point2.y(), + dec_values_X[fixed[j]].as_double() + next_point2.x(), dec_values_Y[fixed[j]].as_double() + next_point2.y()); + */ + } + #endif + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[fixed[j]], + dec_vars_Y[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + + return refined; +} + + +bool refine_PolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons) +{ + bool refined = false; + + #ifdef DEBUG + { + printf("Refining ***************************\n"); + } + #endif + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + #ifdef DEBUG + { + printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); + } + #endif + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + { + const Point &point2 = polygons[undecided[j]].points[p2]; + const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; + + Vec2d intersection (0, 0); + #ifdef DEBUG + { + printf("%d,%d - %ld,%ld,%ld,%ld %ld,%ld,%ld,%ld\n", undecided[i], undecided[j], + dec_values_X[undecided[i]].numerator, + dec_values_X[undecided[i]].denominator, + dec_values_Y[undecided[i]].numerator, + dec_values_Y[undecided[i]].denominator, + dec_values_X[undecided[j]].numerator, + dec_values_X[undecided[j]].denominator, + dec_values_Y[undecided[j]].numerator, + dec_values_Y[undecided[j]].denominator); + + printf("point1: %d,%d,%d,%d\n", point1.x(), point1.y(), next_point1.x(), next_point1.y()); + printf("point2: %d,%d,%d,%d\n", point2.x(), point2.y(), next_point2.x(), next_point2.y()); + + printf("%ld,%ld\n", (dec_values_X[undecided[i]] + point1.x()).numerator, (dec_values_X[undecided[i]] + point1.x()).denominator); + printf("%ld,%ld\n", (dec_values_X[undecided[j]] + point1.x()).numerator, (dec_values_X[undecided[j]] + point1.x()).denominator); + + printf("testing gamma: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[undecided[j]] + point2.x(), dec_values_Y[undecided[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + #ifdef DEBUG + { + printf("Fixo ------------------------> Polygons: %d,%d\n", undecided[i], fixed[j]); + } + #endif + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + { + const Point &point2 = polygons[fixed[j]].points[p2]; + const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + printf("testing delta: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[fixed[j]] + point2.x(), dec_values_Y[fixed[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[fixed[j]], + dec_vars_Y[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + introduce_LineNonIntersectionAgainstFixedLine(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + + return refined; +} + + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return refine_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + polygons, + _unreachable_polygons); +} + + +bool refine_SequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + bool refined = false; + + #ifdef DEBUG + { + printf("Refining *************************** alpha\n"); + + for (int i = 0; i < undecided.size(); ++i) + { + printf("%d: %.3f,%.3f [%.3f]\n", + undecided[i], + dec_values_X[undecided[i]].as_double(), + dec_values_Y[undecided[i]].as_double(), + dec_values_T[undecided[i]].as_double()); + } + } + #endif + + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + if (dec_values_T[undecided[i]] > dec_values_T[undecided[j]]) + { + #ifdef DEBUG + { + printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); + } + #endif + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int poly2 = 0; poly2 < unreachable_polygons[undecided[j]].size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons[undecided[j]][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[undecided[j]][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[undecided[j]][poly2].points[(p2 + 1) % unreachable_polygons[undecided[j]][poly2].points.size()]; + + Vec2d intersection (0, 0); + #ifdef DEBUG + { + printf("%d,%d - %ld,%ld,%ld,%ld %ld,%ld,%ld,%ld\n", undecided[i], undecided[j], + dec_values_X[undecided[i]].numerator, + dec_values_X[undecided[i]].denominator, + dec_values_Y[undecided[i]].numerator, + dec_values_Y[undecided[i]].denominator, + dec_values_X[undecided[j]].numerator, + dec_values_X[undecided[j]].denominator, + dec_values_Y[undecided[j]].numerator, + dec_values_Y[undecided[j]].denominator); + + printf("point1: %d,%d,%d,%d\n", point1.x(), point1.y(), next_point1.x(), next_point1.y()); + printf("point2: %d,%d,%d,%d\n", point2.x(), point2.y(), next_point2.x(), next_point2.y()); + + printf("%ld,%ld\n", (dec_values_X[undecided[i]] + point1.x()).numerator, (dec_values_X[undecided[i]] + point1.x()).denominator); + printf("%ld,%ld\n", (dec_values_X[undecided[j]] + point2.x()).numerator, (dec_values_X[undecided[j]] + point2.x()).denominator); + + printf("testing epsilon: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[undecided[j]] + point2.x(), dec_values_Y[undecided[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + else + { + if (dec_values_T[undecided[i]] < dec_values_T[undecided[j]]) + { + #ifdef DEBUG + { + printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); + } + #endif + for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; + + for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + { + const Point &point2 = polygons[undecided[j]].points[p2]; + const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; + + Vec2d intersection (0, 0); + #ifdef DEBUG + { + printf("%d,%d - %ld,%ld,%ld,%ld %ld,%ld,%ld,%ld\n", undecided[i], undecided[j], + dec_values_X[undecided[i]].numerator, + dec_values_X[undecided[i]].denominator, + dec_values_Y[undecided[i]].numerator, + dec_values_Y[undecided[i]].denominator, + dec_values_X[undecided[j]].numerator, + dec_values_X[undecided[j]].denominator, + dec_values_Y[undecided[j]].numerator, + dec_values_Y[undecided[j]].denominator); + + printf("point1: %d,%d,%d,%d\n", point1.x(), point1.y(), next_point1.x(), next_point1.y()); + printf("point2: %d,%d,%d,%d\n", point2.x(), point2.y(), next_point2.x(), next_point2.y()); + + printf("%ld,%ld\n", (dec_values_X[undecided[i]] + point1.x()).numerator, (dec_values_X[undecided[i]] + point1.x()).denominator); + printf("%ld,%ld\n", (dec_values_X[undecided[j]] + point2.x()).numerator, (dec_values_X[undecided[j]] + point2.x()).denominator); + + printf("testing iota: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[undecided[j]] + point2.x(), dec_values_Y[undecided[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + + #ifdef DEBUG + { + printf("Hidden var: %d\n", hidden_var_cnt); + } + #endif + introduce_SequentialLineNonIntersection(Solver, + Context, + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + refined = true; + } + } + } + } + } + else + { + assert(false); + } + } + } + } + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + if (dec_values_T[undecided[i]] > dec_values_T[fixed[j]]) + { + #ifdef DEBUG + { + printf("Fixo iota ------------------------> Polygons: %d,%d\n", undecided[i], fixed[j]); + printf("Times iota: %.3f, %.3f\n", dec_values_T[undecided[i]].as_double(), dec_values_T[fixed[j]].as_double()); + } + #endif + + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int poly2 = 0; poly2 < unreachable_polygons[fixed[j]].size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons[fixed[j]][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[fixed[j]][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[fixed[j]][poly2].points[(p2 + 1) % unreachable_polygons[fixed[j]][poly2].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + /* + printf("testing kappa: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + */ + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[fixed[j]] + point2.x(), dec_values_Y[fixed[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + + printf("testing iota decs: [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[undecided[i]].as_double(), + dec_values_Y[undecided[i]].as_double(), + dec_values_X[fixed[j]].as_double(), + dec_values_Y[fixed[j]].as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[fixed[j]], + dec_vars_Y[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + #ifdef DEBUG + { + printf("Hidden var iota: %d\n", hidden_var_cnt); + } + #endif + /* + int hidden_var1 = hidden_var_cnt++; + int hidden_var2 = hidden_var_cnt++; + */ + introduce_SequentialLineNonIntersectionAgainstFixedLine(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 0)).c_str())), + Line(point1, next_point1), + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; + } + } + } + } + } + else + { + if (dec_values_T[undecided[i]] < dec_values_T[fixed[j]]) + { + #ifdef DEBUG + { + printf("Times: %.3f, %.3f\n", dec_values_T[undecided[i]].as_double(), dec_values_T[fixed[j]].as_double()); + printf("Fixo kappa ------------------------> Polygons: %d,%d\n", undecided[i], fixed[j]); + } + #endif + + for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; + + for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + { + const Point &point2 = polygons[fixed[j]].points[p2]; + const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + printf("testing lambda: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + + printf("testing kappa decs: [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[undecided[i]].as_double(), + dec_values_Y[undecided[i]].as_double(), + dec_values_X[fixed[j]].as_double(), + dec_values_Y[fixed[j]].as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[fixed[j]] + point2.x(), dec_values_Y[fixed[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[fixed[j]], + dec_vars_Y[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + #ifdef DEBUG + { + printf("Hidden var kappa: %d\n", hidden_var_cnt); + } + #endif + introduce_SequentialFixedLineNonIntersectionAgainstLine(Solver, + Context, + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + refined = true; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Times: %.3f, %.3f (%d,%d)\n", dec_values_T[undecided[i]].as_double(), dec_values_T[fixed[j]].as_double(), undecided[i], fixed[j]); + cout.flush(); + } + #endif + assert(false); + } + } + } + } + + return refined; +} + + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return refine_ConsequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + polygons, + _unreachable_polygons); +} + + +bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + bool refined = false; + + #ifdef DEBUG + { + printf("Refining *************************** alpha\n"); + + for (int i = 0; i < undecided.size(); ++i) + { + printf("%d: %.3f,%.3f [%.3f]\n", + undecided[i], + dec_values_X[undecided[i]].as_double(), + dec_values_Y[undecided[i]].as_double(), + dec_values_T[undecided[i]].as_double()); + } + } + #endif + + for (int i = 0; i < undecided.size() - 1; ++i) + { + for (int j = i + 1; j < undecided.size(); ++j) + { + if (dec_values_T[undecided[i]].is_Positive() && dec_values_T[undecided[j]].is_Positive() && dec_values_T[undecided[i]] > dec_values_T[undecided[j]]) + { + #ifdef DEBUG + { + printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); + } + #endif + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int poly2 = 0; poly2 < unreachable_polygons[undecided[j]].size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons[undecided[j]][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[undecided[j]][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[undecided[j]][poly2].points[(p2 + 1) % unreachable_polygons[undecided[j]][poly2].points.size()]; + + Vec2d intersection (0, 0); + #ifdef DEBUG + { + printf("%d,%d - %ld,%ld,%ld,%ld %ld,%ld,%ld,%ld\n", undecided[i], undecided[j], + dec_values_X[undecided[i]].numerator, + dec_values_X[undecided[i]].denominator, + dec_values_Y[undecided[i]].numerator, + dec_values_Y[undecided[i]].denominator, + dec_values_X[undecided[j]].numerator, + dec_values_X[undecided[j]].denominator, + dec_values_Y[undecided[j]].numerator, + dec_values_Y[undecided[j]].denominator); + + printf("point1: %d,%d,%d,%d\n", point1.x(), point1.y(), next_point1.x(), next_point1.y()); + printf("point2: %d,%d,%d,%d\n", point2.x(), point2.y(), next_point2.x(), next_point2.y()); + + printf("%ld,%ld\n", (dec_values_X[undecided[i]] + point1.x()).numerator, (dec_values_X[undecided[i]] + point1.x()).denominator); + printf("%ld,%ld\n", (dec_values_X[undecided[j]] + point2.x()).numerator, (dec_values_X[undecided[j]] + point2.x()).denominator); + + printf("testing epsilon: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[undecided[j]] + point2.x(), dec_values_Y[undecided[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + + introduce_ConsequentialLineNonIntersection(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + refined = true; + } + } + } + } + } + else + { + if (dec_values_T[undecided[i]].is_Positive() && dec_values_T[undecided[j]].is_Positive() && dec_values_T[undecided[i]] < dec_values_T[undecided[j]]) + { + #ifdef DEBUG + { + printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); + } + #endif + for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; + + for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + { + const Point &point2 = polygons[undecided[j]].points[p2]; + const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; + + Vec2d intersection (0, 0); + #ifdef DEBUG + { + printf("%d,%d - %ld,%ld,%ld,%ld %ld,%ld,%ld,%ld\n", undecided[i], undecided[j], + dec_values_X[undecided[i]].numerator, + dec_values_X[undecided[i]].denominator, + dec_values_Y[undecided[i]].numerator, + dec_values_Y[undecided[i]].denominator, + dec_values_X[undecided[j]].numerator, + dec_values_X[undecided[j]].denominator, + dec_values_Y[undecided[j]].numerator, + dec_values_Y[undecided[j]].denominator); + + printf("point1: %d,%d,%d,%d\n", point1.x(), point1.y(), next_point1.x(), next_point1.y()); + printf("point2: %d,%d,%d,%d\n", point2.x(), point2.y(), next_point2.x(), next_point2.y()); + + printf("%ld,%ld\n", (dec_values_X[undecided[i]] + point1.x()).numerator, (dec_values_X[undecided[i]] + point1.x()).denominator); + printf("%ld,%ld\n", (dec_values_X[undecided[j]] + point2.x()).numerator, (dec_values_X[undecided[j]] + point2.x()).denominator); + + printf("testing iota: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[undecided[j]] + point2.x(), dec_values_Y[undecided[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[undecided[j]] + point2.x()).as_double(), (dec_values_Y[undecided[j]] + point2.y()).as_double(), + (dec_values_X[undecided[j]] + next_point2.x()).as_double(), (dec_values_Y[undecided[j]] + next_point2.y()).as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + + #ifdef DEBUG + { + printf("Hidden var: %d\n", hidden_var_cnt); + } + #endif + introduce_ConsequentialLineNonIntersection(Solver, + Context, + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + refined = true; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("The pair is not effective: %d,%d\n", undecided[i], undecided[j]); + } + #endif + } + } + } + } + + + for (int i = 0; i < undecided.size(); ++i) + { + for (int j = 0; j < fixed.size(); ++j) + { + if (dec_values_T[undecided[i]].is_Positive() && dec_values_T[fixed[j]].is_Positive() && dec_values_T[undecided[i]] > dec_values_T[fixed[j]]) + { + #ifdef DEBUG + { + printf("Fixo iota ------------------------> Polygons: %d,%d\n", undecided[i], fixed[j]); + printf("Times iota: %.3f, %.3f\n", dec_values_T[undecided[i]].as_double(), dec_values_T[fixed[j]].as_double()); + } + #endif + for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + { + const Point &point1 = polygons[undecided[i]].points[p1]; + const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; + + for (int poly2 = 0; poly2 < unreachable_polygons[fixed[j]].size(); ++poly2) + { + for (int p2 = 0; p2 < unreachable_polygons[fixed[j]][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[fixed[j]][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[fixed[j]][poly2].points[(p2 + 1) % unreachable_polygons[fixed[j]][poly2].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + /* + printf("testing kappa: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + */ + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[fixed[j]] + point2.x(), dec_values_Y[fixed[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + + printf("testing iota decs: [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[undecided[i]].as_double(), + dec_values_Y[undecided[i]].as_double(), + dec_values_X[fixed[j]].as_double(), + dec_values_Y[fixed[j]].as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[fixed[j]], + dec_vars_Y[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + #ifdef DEBUG + { + printf("Hidden var iota: %d\n", hidden_var_cnt); + } + #endif + /* + int hidden_var1 = hidden_var_cnt++; + int hidden_var2 = hidden_var_cnt++; + */ + introduce_ConsequentialLineNonIntersectionAgainstFixedLine(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 0)).c_str())), + Line(point1, next_point1), + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; + } + } + } + } + } + else + { + if (dec_values_T[undecided[i]].is_Positive() && dec_values_T[fixed[j]].is_Positive() && dec_values_T[undecided[i]] < dec_values_T[fixed[j]]) + { + #ifdef DEBUG + { + printf("Times: %.3f, %.3f\n", dec_values_T[undecided[i]].as_double(), dec_values_T[fixed[j]].as_double()); + printf("Fixo kappa ------------------------> Polygons: %d,%d\n", undecided[i], fixed[j]); + } + #endif + + for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; + + for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + { + const Point &point2 = polygons[fixed[j]].points[p2]; + const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; + + Vec2d intersection(0, 0); + #ifdef DEBUG + { + printf("testing lambda: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + + printf("testing kappa decs: [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[undecided[i]].as_double(), + dec_values_Y[undecided[i]].as_double(), + dec_values_X[fixed[j]].as_double(), + dec_values_Y[fixed[j]].as_double()); + } + #endif + + /* Seems not working, report an intersection even if there is none, using our own lines_intersect() instead + if (Slic3r::Geometry::segment_segment_intersection(Vec2d(dec_values_X[undecided[i]] + point1.x(), dec_values_Y[undecided[i]] + point1.y()), + Vec2d(next_point1.x() - point1.x(), next_point1.y() - point1.y()), + Vec2d(dec_values_X[fixed[j]] + point2.x(), dec_values_Y[fixed[j]] + point2.y()), + Vec2d(next_point2.x() - point2.x(), next_point2.y() - point2.y()), + intersection)) + */ + + if (lines_intersect((dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("Intersecting: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + (dec_values_X[undecided[i]] + point1.x()).as_double(), (dec_values_Y[undecided[i]] + point1.y()).as_double(), + (dec_values_X[undecided[i]] + next_point1.x()).as_double(), (dec_values_Y[undecided[i]] + next_point1.y()).as_double(), + (dec_values_X[fixed[j]] + point2.x()).as_double(), (dec_values_Y[fixed[j]] + point2.y()).as_double(), + (dec_values_X[fixed[j]] + next_point2.x()).as_double(), (dec_values_Y[fixed[j]] + next_point2.y()).as_double()); + } + #endif + + /* + introduce_LineNonIntersection(Solver, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1), + dec_vars_X[fixed[j]], + dec_vars_Y[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2)); + */ + #ifdef DEBUG + { + printf("Hidden var kappa: %d\n", hidden_var_cnt); + } + #endif + introduce_ConsequentialFixedLineNonIntersectionAgainstLine(Solver, + Context, + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point2, next_point2), + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + Line(point1, next_point1)); + refined = true; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Times: %.3f, %.3f (%d,%d)\n", dec_values_T[undecided[i]].as_double(), dec_values_T[fixed[j]].as_double(), undecided[i], fixed[j]); + cout.flush(); + } + #endif + + #ifdef DEBUG + { + printf("The pair is not effective: %d,%d\n", undecided[i], fixed[j]); + } + #endif + } + } + } + } + + return refined; +} + + +/*----------------------------------------------------------------*/ + +bool check_PointsOutsidePolygons(const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + if (dec_values_T[i] > dec_values_T[j]) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + + #ifdef DEBUG + { + printf(">----------------\n"); + } + #endif + + for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + { + if (unreachable_polygons[j][poly2].points.size() >= 3) + { + bool always_inside_halfplane = true; + + for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[j][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; + + Line line(point2, next_point2); + Vector normal = line.normal(); + + double outside = (normal.x() * (dec_values_X[i].as_double() + point1.x())) + + (normal.y() * (dec_values_Y[i].as_double() + point1.y())) + - (normal.x() * dec_values_X[j].as_double()) + - (normal.x() * line.a.x()) + - (normal.y() * dec_values_Y[j].as_double()) + - (normal.y() * line.a.y()); + + #ifdef DEBUG + { + printf("Tested point: %d, %d\n", point1.x(), point1.y()); + printf("Point: %d, %d\n", point2.x(), point2.y()); + printf("Next point: %d, %d\n", next_point2.x(), next_point2.y()); + printf("X[i]: %.3f, Y[i]: %.3f, X[j]: %.3f, Y[j]: %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); + printf("Outside 1: %.3f\n", outside); + } + #endif + + if (outside > -EPSILON) + { + always_inside_halfplane = false; + break; + } + } + if (always_inside_halfplane) + { + return false; + } + } + } + } + } + else if (dec_values_T[i] < dec_values_T[j]) + { + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + + #ifdef DEBUG + { + printf("<----------------\n"); + } + #endif + + for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + { + if (unreachable_polygons[i][poly1].points.size() >= 3) + { + bool always_inside_halfplane = true; + + for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[i][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; + + Line line(point1, next_point1); + Vector normal = line.normal(); + + double outside = (normal.x() * (dec_values_X[j].as_double() + point2.x())) + + (normal.y() * (dec_values_Y[j].as_double() + point2.y())) + - (normal.x() * dec_values_X[i].as_double()) + - (normal.x() * line.a.x()) + - (normal.y() * dec_values_Y[i].as_double()) + - (normal.y() * line.a.y()); + + #ifdef DEBUG + { + printf("Tested point: %.3f, %.3f\n", dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y()); + printf("Point: %.3f, %.3f\n", point1.x() + dec_values_X[i].as_double(), point1.y() + dec_values_Y[i].as_double()); + printf("Next point: %.3f, %.3f\n", next_point1.x() + dec_values_X[i].as_double(), next_point1.y() + dec_values_Y[i].as_double()); + printf("X[i]: %.3f, Y[i]: %.3f, X[j]: %.3f, Y[j]: %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); + printf("Outside 2: %.3f\n", outside); + } + #endif + + if (outside > -EPSILON) + { + always_inside_halfplane = false; + break; + } + } + if (always_inside_halfplane) + { + return false; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + } + #endif + assert(false); + } + } + } + #ifdef DEBUG + { + printf("Points DONE !!!\n"); + } + #endif + + return true; +} + + +bool check_PolygonLineIntersections(const std::vector &dec_values_X, + const std::vector &dec_values_Y, + const std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + for (int i = 0; i < polygons.size() - 1; ++i) + { + for (int j = i + 1; j < polygons.size(); ++j) + { + if (dec_values_T[i] > dec_values_T[j]) + { + for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + { + #ifdef DEBUG + { + printf("temporal: %.3f %.3f [ij: %d,%d]\n", dec_values_T[i].as_double(), dec_values_T[j].as_double(), i, j); + printf("proto X1: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[j].size(), unreachable_polygons[j][poly2].points.size()); + } + #endif + + for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[j][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; + + #ifdef DEBUG + { + printf("testing alpha %d %d (%d,%d): [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", i, j, p1, p2, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + if (lines_intersect_open(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, + dec_values_T[i].as_double(), + dec_values_T[j].as_double()); + + printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double(), + dec_values_Y[i].as_double(), + dec_values_X[j].as_double(), + dec_values_Y[j].as_double()); + + printf("intersect 1: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + hidden_var_cnt, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + return false; + } + } + } + } + } + else + { + if (dec_values_T[i] < dec_values_T[j]) + { + for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + { + for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + { + #ifdef DEBUG + { + printf("proto2: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[i].size(), unreachable_polygons[i][poly1].points.size()); + } + #endif + + const Point &point1 = unreachable_polygons[i][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; + + for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + #ifdef DEBUG + { + printf("testing beta: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + if (lines_intersect_open(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + + { + #ifdef DEBUG + { + printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, + dec_values_T[i].as_double(), + dec_values_T[j].as_double()); + + printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double(), + dec_values_Y[i].as_double(), + dec_values_X[j].as_double(), + dec_values_Y[j].as_double()); + + printf("intersect 2: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + hidden_var_cnt, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + return false; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + } + #endif + assert(false); + } + } + } + } + + #ifdef DEBUG + { + printf("Lines DONE !!!\n"); + } + #endif + + return true; +} + + +/*----------------------------------------------------------------*/ + +void extract_DecisionValuesFromModel(const z3::model &Model, + const string_map &dec_var_names_map, + std::vector &dec_values_X, + std::vector &dec_values_Y) +{ + for (int i = 0; i < Model.size(); ++i) + { + double value = Model.get_const_interp(Model[i]).as_double(); + + switch (Model[i].name().str()[0]) + { + case 'X': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + dec_values_X[var_item->second] = value; + } + break; + } + case 'Y': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + dec_values_Y[var_item->second] = value; + } + break; + } + default: + { + break; + } + } + } +} + + +void extract_DecisionValuesFromModel(const z3::model &Model, + z3::context &Context, + const string_map &dec_var_names_map, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y) +{ + std::map values_X; + std::map values_Y; + + for (int i = 0; i < Model.size(); ++i) + { + z3::expr value = Model.get_const_interp(Model[i]); + + #ifdef DEBUG + { + printf("extracted: %.3f (%s)\n", value.as_double(), Model[i].name().str().c_str()); + } + #endif + + switch (Model[i].name().str()[0]) + { + case 'X': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + //printf("saving: %d <-- %.3f, %d, %d\n", var_item->second, value.as_double(), value.numerator().as_int64(), value.denominator().as_int64()); + values_X[var_item->second] = new z3::expr(Context.real_val(value.numerator().as_int64(), value.denominator().as_int64())); + //dec_values_X[var_item->second] = value; + #ifdef DEBUG + { + printf("saved: %.3f\n", values_X[var_item->second]->as_double()); + } + #endif + } + break; + } + case 'Y': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + //printf("saving: %d <-- %.3f\n", var_item->second, value.as_double()); + + values_Y[var_item->second] = new z3::expr(Context.real_val(value.numerator().as_int64(), value.denominator().as_int64())); + //dec_values_Y[var_item->second] = value; + //printf("saved: %.3f, %.3f\n", values_X[var_item->second]->as_dou + + #ifdef DEBUG + { + printf("saved: %.3f\n", values_Y[var_item->second]->as_double()); + } + #endif + } + break; + } + default: + { + break; + } + } + } + + dec_values_X.resize(0); + dec_values_Y.resize(0); + + for (std::map::const_iterator value = values_X.begin(); value != values_X.end(); ++value) + { + dec_values_X.push_back(*value->second); + delete value->second; + } + for (std::map::const_iterator value = values_Y.begin(); value != values_Y.end(); ++value) + { + dec_values_Y.push_back(*value->second); + delete value->second; + } +} + + +void extract_DecisionValuesFromModel(const z3::model &Model, + const string_map &dec_var_names_map, + std::vector &dec_values_X, + std::vector &dec_values_Y) +{ + for (int i = 0; i < Model.size(); ++i) + { + z3::expr value = Model.get_const_interp(Model[i]); + + #ifdef DEBUG + { + printf("extracted: %.3f (%s)\n", value.as_double(), Model[i].name().str().c_str()); + } + #endif + + switch (Model[i].name().str()[0]) + { + case 'X': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + #ifdef DEBUG + { + printf("saving X: %d <-- %.3f, %ld, %ld\n", var_item->second, value.as_double(), value.numerator().as_int64(), value.denominator().as_int64()); + } + #endif + //dec_values_X[var_item->second] = Rational(value.numerator().as_int64(), value.denominator().as_int64()); + dec_values_X[var_item->second] = Rational(value); + //dec_values_X[var_item->second] = value; + } + break; + } + case 'Y': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + #ifdef DEBUG + { + printf("saving Y: %d <-- %.3f, %ld, %ld\n", var_item->second, value.as_double(), value.numerator().as_int64(), value.denominator().as_int64()); + } + #endif + //printf("saving: %d <-- %.3f\n", var_item->second, value.as_double()); + //dec_values_Y[var_item->second] = Rational(value.numerator().as_int64(), value.denominator().as_int64()); + dec_values_Y[var_item->second] = Rational(value); + } + break; + } + default: + { + break; + } + } + } +} + + +void extract_DecisionValuesFromModel(const z3::model &Model, + const string_map &dec_var_names_map, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T) +{ + for (int i = 0; i < Model.size(); ++i) + { + z3::expr value = Model.get_const_interp(Model[i]); + #ifdef DEBUG + { + printf("extracted: %.3f (%s)\n", value.as_double(), Model[i].name().str().c_str()); + } + #endif + + switch (Model[i].name().str()[0]) + { + case 'X': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + #ifdef DEBUG + { + printf("saving X: %d <-- %.3f, %ld, %ld\n", var_item->second, value.as_double(), value.numerator().as_int64(), value.denominator().as_int64()); + } + #endif + //dec_values_X[var_item->second] = Rational(value.numerator().as_int64(), value.denominator().as_int64()); + dec_values_X[var_item->second] = Rational(value); + //dec_values_X[var_item->second] = value; + } + break; + } + case 'Y': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + #ifdef DEBUG + { + printf("saving Y: %d <-- %.3f, %ld, %ld\n", var_item->second, value.as_double(), value.numerator().as_int64(), value.denominator().as_int64()); + } + #endif + //printf("saving: %d <-- %.3f\n", var_item->second, value.as_double()); + //dec_values_Y[var_item->second] = Rational(value.numerator().as_int64(), value.denominator().as_int64()); + dec_values_Y[var_item->second] = Rational(value); + } + break; + } + case 'T': + { + string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); + if (var_item != dec_var_names_map.end()) + { + #ifdef DEBUG + { + printf("saving T: %d <-- %.3f, %ld, %ld\n", var_item->second, value.as_double(), value.numerator().as_int64(), value.denominator().as_int64()); + } + #endif + //printf("saving: %d <-- %.3f\n", var_item->second, value.as_double()); + //dec_values_T[var_item->second] = Rational(value.numerator().as_int64(), value.denominator().as_int64()); + dec_values_T[var_item->second] = Rational(value); + } + break; + } + default: + { + break; + } + } + } +} + + +void build_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + string_map &dec_var_names_map) +{ + for (int i = 0; i < polygons.size(); ++i) + { + string name = "X_pos-" + to_string(i); + + dec_vars_X.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + for (int i = 0; i < polygons.size(); ++i) + { + string name = "Y_pos-" + to_string(i); + + dec_vars_Y.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + dec_values_X.resize(polygons.size(), 0.0); + dec_values_Y.resize(polygons.size(), 0.0); + + introduce_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + polygons); +} + + +void build_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y, + string_map &dec_var_names_map) +{ + for (int i = 0; i < polygons.size(); ++i) + { + string name = "X_pos-" + to_string(i); + + dec_vars_X.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + for (int i = 0; i < polygons.size(); ++i) + { + string name = "Y_pos-" + to_string(i); + + dec_vars_Y.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + dec_values_X.resize(polygons.size()); + dec_values_Y.resize(polygons.size()); + + introduce_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + polygons); +} + + +void build_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map) +{ + for (int i = 0; i < polygons.size(); ++i) + { + string name = "X_pos-" + to_string(i); + + dec_vars_X.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + for (int i = 0; i < polygons.size(); ++i) + { + string name = "Y_pos-" + to_string(i); + + dec_vars_Y.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + introduce_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_values_X, + dec_values_Y, + fixed, + undecided, + polygons); +} + + +void build_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + build_SequentialWeakPolygonNonoverlapping(Solver, + Context, + polygons, + _unreachable_polygons, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + dec_var_names_map); +} + +void build_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map) +{ + for (int i = 0; i < polygons.size(); ++i) + { + string name = "X_pos-" + to_string(i); + + dec_vars_X.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + for (int i = 0; i < polygons.size(); ++i) + { + string name = "Y_pos-" + to_string(i); + + dec_vars_Y.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + for (int i = 0; i < polygons.size(); ++i) + { + string name = "T_time-" + to_string(i); + + dec_vars_T.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + introduce_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + polygons, + unreachable_polygons); +} + + +void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + build_ConsequentialWeakPolygonNonoverlapping(Solver, + Context, + polygons, + _unreachable_polygons, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + dec_var_names_map); +} + + +void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + z3::expr_vector &dec_vars_X, + z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + string_map &dec_var_names_map) +{ + for (int i = 0; i < polygons.size(); ++i) + { + string name = "X_pos-" + to_string(i); + + dec_vars_X.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + for (int i = 0; i < polygons.size(); ++i) + { + string name = "Y_pos-" + to_string(i); + + dec_vars_Y.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + for (int i = 0; i < polygons.size(); ++i) + { + string name = "T_time-" + to_string(i); + + dec_vars_T.push_back(z3::expr(Context.real_const(name.c_str()))); + dec_var_names_map[name] = i; + } + + introduce_ConsequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + polygons, + unreachable_polygons); +} + + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const string_map &dec_var_names_map, + const std::vector &polygons) +{ + + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + + int last_solvable_bounding_box_size = -1; + + for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; + bounding_box_size > solver_configuration.minimum_bounding_box_size; + bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) + { + #ifdef DEBUG + { + printf("BB: %d\n", bounding_box_size); + } + #endif + z3::expr_vector bounding_box_assumptions(Context); + + for (int i = 0; i < polygons.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[i], dec_vars_Y[i], polygons[i], bounding_box_size, bounding_box_size, bounding_box_assumptions); + } + + bool sat = false; + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + while (true) + { + bool refined = refine_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_values_X, + dec_values_Y, + polygons); + + bool refined_sat = false; + + if (refined) + { + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + + if (refined_sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < polygons.size(); ++i) + { + printf(" %.3f, %.3f\n", dec_values_X[i], dec_values_Y[i]); + } + } + #endif + } + else + { + break; + } + } + else + { + last_solvable_bounding_box_size = bounding_box_size; + break; + } + } + } + else + { + break; + } + } + if (last_solvable_bounding_box_size > 0) + { + return true; + } + + return false; +} + + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y, + const string_map &dec_var_names_map, + const std::vector &polygons) +{ + Z3_global_param_set("timeout", solver_configuration.optimization_timeout.c_str()); + int last_solvable_bounding_box_size = -1; + + for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; + bounding_box_size > solver_configuration.minimum_bounding_box_size; + bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) + { + #ifdef DEBUG + { + printf("BB: %d\n", bounding_box_size); + } + #endif + z3::expr_vector bounding_box_assumptions(Context); + + for (int i = 0; i < polygons.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[i], dec_vars_Y[i], polygons[i], bounding_box_size, bounding_box_size, bounding_box_assumptions); + } + + bool sat = false; + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + Context, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + while (true) + { + bool refined = refine_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_values_X, + dec_values_Y, + polygons); + + bool refined_sat = false; + + if (refined) + { + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + + if (refined_sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + Context, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < polygons.size(); ++i) + { + printf(" %.3f, %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double()); + } + } + #endif + } + else + { + break; + } + } + else + { + last_solvable_bounding_box_size = bounding_box_size; + break; + } + } + } + else + { + break; + } + } + if (last_solvable_bounding_box_size > 0) + { + return true; + } + + return false; +} + + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const string_map &dec_var_names_map, + const std::vector &polygons) +{ + + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + int last_solvable_bounding_box_size = -1; + + for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; + bounding_box_size > solver_configuration.minimum_bounding_box_size; + bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) + { + #ifdef DEBUG + { + printf("BB: %d\n", bounding_box_size); + } + #endif + z3::expr_vector bounding_box_assumptions(Context); + + for (int i = 0; i < polygons.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[i], dec_vars_Y[i], polygons[i], bounding_box_size, bounding_box_size, bounding_box_assumptions); + } + + bool sat = false; + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + while (true) + { + bool refined = refine_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_values_X, + dec_values_Y, + polygons); + + bool refined_sat = false; + + if (refined) + { + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + + if (refined_sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < polygons.size(); ++i) + { + printf(" %ld/%ld, %ld/%ld\n", dec_values_X[i].numerator, dec_values_X[i].denominator, dec_values_Y[i].numerator, dec_values_Y[i].denominator); + } + } + #endif + } + else + { + break; + } + } + else + { + last_solvable_bounding_box_size = bounding_box_size; + break; + } + } + } + else + { + break; + } + } + if (last_solvable_bounding_box_size > 0) + { + return true; + } + + return false; +} + + +/*----------------------------------------------------------------*/ + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + z3::expr_vector &dec_values_X, + z3::expr_vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons) +{ + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + int last_solvable_bounding_box_size = -1; + + for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; + bounding_box_size > solver_configuration.minimum_bounding_box_size; + bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) + { + #ifdef DEBUG + { + printf("BB: %d\n", bounding_box_size); + } + #endif + + z3::expr_vector bounding_box_assumptions(Context); + + for (int i = 0; i < undecided.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], polygons[undecided[i]], bounding_box_size, bounding_box_size, bounding_box_assumptions); + } + + bool sat = false; + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + Context, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + while (true) + { + bool refined = refine_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_values_X, + dec_values_Y, + fixed, + undecided, + polygons); + + bool refined_sat = false; + + if (refined) + { + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + + if (refined_sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + Context, + dec_var_names_map, + dec_values_X, + dec_values_Y); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < undecided.size(); ++i) + { + printf(" %.3f, %.3f\n", dec_values_X[undecided[i]].as_double(), dec_values_Y[undecided[i]].as_double()); + } + } + #endif + } + else + { + break; + } + } + else + { + last_solvable_bounding_box_size = bounding_box_size; + break; + } + } + } + else + { + break; + } + } + if (last_solvable_bounding_box_size > 0) + { + return true; + } + + return false; +} + + +bool optimize_WeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons) +{ + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + int last_solvable_bounding_box_size = -1; + + std::vector local_dec_values_X = dec_values_X; + std::vector local_dec_values_Y = dec_values_Y; + + for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; + bounding_box_size > solver_configuration.minimum_bounding_box_size; + bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) + { + #ifdef DEBUG + { + printf("BBX: %d\n", bounding_box_size); + } + #endif + + z3::expr_vector bounding_box_assumptions(Context); + + for (int i = 0; i < undecided.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], polygons[undecided[i]], bounding_box_size, bounding_box_size, bounding_box_assumptions); + } + + bool sat = false; + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y); + + while (true) + { + bool refined = refine_PolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + local_dec_values_X, + local_dec_values_Y, + fixed, + undecided, + polygons); + + + if (refined) + { + bool refined_sat = false; + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + + if (refined_sat) + { + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < undecided.size(); ++i) + { + printf(" %ld/%ld, %ld/%ld\n", + local_dec_values_X[undecided[i]].numerator, + local_dec_values_X[undecided[i]].denominator, + local_dec_values_Y[undecided[i]].numerator, + local_dec_values_Y[undecided[i]].denominator); + } + } + #endif + } + else + { + break; + } + } + else + { + last_solvable_bounding_box_size = bounding_box_size; + + dec_values_X = local_dec_values_X; + dec_values_Y = local_dec_values_Y; + break; + } + } + } + else + { + break; + } + } + if (last_solvable_bounding_box_size > 0) + { + return true; + } + + return false; +} + + + +bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector &unreachable_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return optimize_SequentialWeakPolygonNonoverlapping(Solver, + Context, + solver_configuration, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + dec_values_X, + dec_values_Y, + dec_values_T, + fixed, + undecided, + dec_var_names_map, + polygons, + _unreachable_polygons); +} + + +bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + + int last_solvable_bounding_box_size = -1; + + std::vector local_dec_values_X = dec_values_X; + std::vector local_dec_values_Y = dec_values_Y; + std::vector local_dec_values_T = dec_values_T; + + for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; + bounding_box_size > solver_configuration.minimum_bounding_box_size; + bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) + { + #ifdef DEBUG + { + printf("BBX: %d\n", bounding_box_size); + } + #endif + + //Solver.reset(); + + z3::expr_vector bounding_box_assumptions(Context); + + for (int i = 0; i < undecided.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], polygons[undecided[i]], bounding_box_size, bounding_box_size, bounding_box_assumptions); + } + + bool sat = false; + +// Solver.add(bounding_box_assumptions); + + #ifdef DEBUG + { + printf("Solving 11 ...\n"); + } + #endif + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + #ifdef DEBUG + { + printf("Solving 11 ... finished\n"); + } + #endif + + if (sat) + { + #ifdef DEBUG + { + printf("First SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + while (true) + { + bool refined = refine_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T, + fixed, + undecided, + polygons, + unreachable_polygons); + + + if (refined) + { + bool refined_sat = false; + + #ifdef DEBUG + { + printf("Solving 12 ...\n"); + } + #endif + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + #ifdef DEBUG + { + printf("Solving 12 ... finished: %d\n", refined_sat); + } + #endif + + /* + printf("Printing solver status:\n"); + cout << Solver << "\n"; + */ + + if (refined_sat) + { + #ifdef DEBUG + { + printf("Refined SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + /* + printf("Printing smt status:\n"); + cout << Solver.to_smt2() << "\n"; + */ + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < undecided.size(); ++i) + { + printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", + i, undecided[i], + local_dec_values_X[undecided[i]].numerator, + local_dec_values_X[undecided[i]].denominator, + local_dec_values_X[undecided[i]].as_double(), + local_dec_values_Y[undecided[i]].numerator, + local_dec_values_Y[undecided[i]].denominator, + local_dec_values_Y[undecided[i]].as_double(), + local_dec_values_T[undecided[i]].numerator, + local_dec_values_T[undecided[i]].denominator, + local_dec_values_T[undecided[i]].as_double()); + } + } + #endif + } + else + { + #ifdef DEBUG + { + printf("Refined UNSAT\n"); + } + #endif + if (last_solvable_bounding_box_size > 0) + { + return true; + } + else + { + return false; + } + } + } + else + { + last_solvable_bounding_box_size = bounding_box_size; + + dec_values_X = local_dec_values_X; + dec_values_Y = local_dec_values_Y; + dec_values_T = local_dec_values_T; + break; + } + } + } + else + { + #ifdef DEBUG + { + printf("First UNSAT\n"); + } + #endif + if (last_solvable_bounding_box_size > 0) + { + return true; + } + else + { + return false; + } + } + } + return false; +} + + +bool optimize_SequentialWeakPolygonNonoverlappingCentered(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + + int last_solvable_bounding_box_size = -1; + + std::vector local_dec_values_X = dec_values_X; + std::vector local_dec_values_Y = dec_values_Y; + std::vector local_dec_values_T = dec_values_T; + + int box_min_x = 0; + int box_max_x = solver_configuration.maximum_X_bounding_box_size; + int box_min_y = 0; + int box_max_y = solver_configuration.maximum_Y_bounding_box_size; + + while (box_min_x < box_max_x && box_min_y < box_max_y) + { + #ifdef DEBUG + { + printf("BBX: %d, %d, %d, %d\n", box_min_x, box_max_x, box_min_y, box_max_y); + } + #endif + + z3::expr_vector bounding_box_assumptions(Context); + + for (int i = 0; i < undecided.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + box_min_x, + box_min_y, + box_max_x, + box_max_y, + bounding_box_assumptions); + } + + bool sat = false; + + #ifdef DEBUG + { + printf("Solving 11 ...\n"); + } + #endif +// Solver.add(bounding_box_assumptions); + + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + + if (sat) + { + #ifdef DEBUG + { + printf("First SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + while (true) + { + bool refined = refine_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T, + fixed, + undecided, + polygons, + unreachable_polygons); + + + if (refined) + { + bool refined_sat = false; + + #ifdef DEBUG + { + printf("Solving 12 ...\n"); + } + #endif + + /* + z3::check_result result = Solver.check(bounding_box_assumptions); + printf("check_result: %d\n", result); + */ + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + + #ifdef DEBUG + { + printf("Solving 12 ... finished: %d\n", refined_sat); + } + #endif + + /* + printf("Printing solver status:\n"); + cout << Solver << "\n"; + */ + + if (refined_sat) + { + #ifdef DEBUG + { + printf("Refined SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + /* + printf("Printing smt status:\n"); + cout << Solver.to_smt2() << "\n"; + */ + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < undecided.size(); ++i) + { + printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", + i, undecided[i], + local_dec_values_X[undecided[i]].numerator, + local_dec_values_X[undecided[i]].denominator, + local_dec_values_X[undecided[i]].as_double(), + local_dec_values_Y[undecided[i]].numerator, + local_dec_values_Y[undecided[i]].denominator, + local_dec_values_Y[undecided[i]].as_double(), + local_dec_values_T[undecided[i]].numerator, + local_dec_values_T[undecided[i]].denominator, + local_dec_values_T[undecided[i]].as_double()); + } + } + #endif + } + else + { + #ifdef DEBUG + { + printf("Refined UNSAT\n"); + } + #endif + if (last_solvable_bounding_box_size > 0) + { + return true; + } + else + { + return false; + } + } + } + else + { + last_solvable_bounding_box_size = box_max_x; + + dec_values_X = local_dec_values_X; + dec_values_Y = local_dec_values_Y; + dec_values_T = local_dec_values_T; + break; + } + } + } + else + { + #ifdef DEBUG + { + printf("First UNSAT\n"); + } + #endif + if (last_solvable_bounding_box_size > 0) + { + return true; + } + else + { + return false; + } + } + + + box_min_x += solver_configuration.bounding_box_size_optimization_step; + box_max_x -= solver_configuration.bounding_box_size_optimization_step; + + box_min_y += solver_configuration.bounding_box_size_optimization_step; + box_max_y -= solver_configuration.bounding_box_size_optimization_step; + + if (box_min_x >= box_max_x || box_min_y >= box_max_y) + { + break; + } + } + return false; +} + + +bool checkArea_SequentialWeakPolygonNonoverlapping(coord_t box_min_x, + coord_t box_min_y, + coord_t box_max_x, + coord_t box_max_y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &SEQ_UNUSED(unreachable_polygons)) +{ + + double check_area = (box_max_x - box_min_x) * (box_max_y - box_min_y); + double polygon_area = calc_PolygonArea(fixed, undecided, polygons); + + #ifdef DEBUG + { + printf("Fast checkging for box: %d, %d, %d, %d\n", box_min_x, box_min_y, box_max_x, box_max_y); + printf("Check area: %.3f\n", check_area); + printf("Polygon area: %.3f\n", polygon_area); + } + #endif + + if (check_area < polygon_area) + { + return false; + } + + return true; +} + + +bool checkExtens_SequentialWeakPolygonNonoverlapping(coord_t box_min_x, + coord_t box_min_y, + coord_t box_max_x, + coord_t box_max_y, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &fixed, + const std::vector &undecided, + const std::vector &polygons, + const std::vector > &SEQ_UNUSED(unreachable_polygons)) +{ + double min_X, max_X, min_Y, max_Y; + + if (!fixed.empty()) + { + BoundingBox polygon_box = get_extents(polygons[fixed[0]]); + + min_X = dec_values_X[fixed[0]].as_double() + polygon_box.min.x(); + min_Y = dec_values_Y[fixed[0]].as_double() + polygon_box.min.y(); + + max_X = dec_values_X[fixed[0]].as_double() + polygon_box.max.x(); + max_Y = dec_values_Y[fixed[0]].as_double() + polygon_box.max.y(); + + for (int i = 1; i < fixed.size(); ++i) + { + BoundingBox polygon_box = get_extents(polygons[fixed[i]]); + + double next_min_X = dec_values_X[fixed[i]].as_double() + polygon_box.min.x(); + + if (next_min_X < min_X) + { + min_X = next_min_X; + } + double next_min_Y = dec_values_Y[fixed[i]].as_double() + polygon_box.min.y(); + + if (next_min_Y < min_Y) + { + min_Y = next_min_Y; + } + + double next_max_X = dec_values_X[fixed[i]].as_double() + polygon_box.max.x(); + + if (next_max_X > max_X) + { + max_X = next_max_X; + } + double next_max_Y = dec_values_Y[fixed[i]].as_double() + polygon_box.max.y(); + + if (next_max_Y > max_Y) + { + max_Y = next_max_Y; + } + } + + #ifdef DEBUG + { + printf("Box:%d,%d,%d,%d\n", box_min_x, box_max_x, box_min_y, box_max_y); + printf("Fix:%.3f,%.3f,%.3f,%.3f\n", min_X, max_X, min_Y, max_Y); + } + #endif + + if (min_X < box_min_x || max_X > box_max_x || min_Y < box_min_y || max_Y > box_max_y) + { + return false; + } + } + return true; +} + + +bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + coord_t &box_half_x_max, + coord_t &box_half_y_max, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons) +{ + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + + coord_t last_solvable_bounding_box_size = -1; + + std::vector local_dec_values_X = dec_values_X; + std::vector local_dec_values_Y = dec_values_Y; + std::vector local_dec_values_T = dec_values_T; + + coord_t half_x_min = 0; + coord_t half_x_max = box_half_x_max; //solver_configuration.maximum_X_bounding_box_size / 2; + + coord_t half_y_min = 0; + coord_t half_y_max = box_half_y_max; //solver_configuration.maximum_Y_bounding_box_size / 2; + + while ((half_x_max - half_x_min) > 1 && (half_y_max - half_y_min) > 1) + { + #ifdef DEBUG + { + printf("Halves: %d, %d, %d, %d\n", half_x_min, half_x_max, half_y_min, half_y_max); + } + #endif + + bool size_solvable = false; + + z3::expr_vector bounding_box_assumptions(Context); + + coord_t box_min_x = (half_x_max + half_x_min) / 2; + coord_t box_max_x = solver_configuration.maximum_X_bounding_box_size - box_min_x; + coord_t box_min_y = (half_y_max + half_y_min) / 2; + coord_t box_max_y = solver_configuration.maximum_Y_bounding_box_size - box_min_y; + + #ifdef DEBUG + { + printf("BBX: %d, %d, %d, %d\n", box_min_x, box_max_x, box_min_y, box_max_y); + } + #endif + + for (int i = 0; i < undecided.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + box_min_x, + box_min_y, + box_max_x, + box_max_y, + bounding_box_assumptions); + } + + bool sat = false; + + #ifdef DEBUG + { + printf("Solving 11 ...\n"); + } + #endif +// Solver.add(bounding_box_assumptions); + + if (checkArea_SequentialWeakPolygonNonoverlapping(box_min_x, + box_min_y, + box_max_x, + box_max_y, + fixed, + undecided, + polygons, + unreachable_polygons)) + { + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + } + else + { + sat = false; + } + + if (sat) + { + #ifdef DEBUG + { + printf("First SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + while (true) + { + bool refined = refine_SequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T, + fixed, + undecided, + polygons, + unreachable_polygons); + + if (refined) + { + bool refined_sat = false; + + #ifdef DEBUG + { + printf("Solving 12 ...\n"); + } + #endif + + if (checkArea_SequentialWeakPolygonNonoverlapping(box_min_x, + box_min_y, + box_max_x, + box_max_y, + fixed, + undecided, + polygons, + unreachable_polygons)) + { + switch (Solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + refined_sat = true; + break; + } + case z3::unsat: + { + refined_sat = false; + break; + } + case z3::unknown: + { + refined_sat = false; + break; + } + default: + { + break; + } + } + } + else + { + refined_sat = false; + } + + #ifdef DEBUG + { + printf("Solving 12 ... finished: %d\n", refined_sat); + } + #endif + + /* + printf("Printing solver status:\n"); + cout << Solver << "\n"; + */ + + if (refined_sat) + { + #ifdef DEBUG + { + printf("Refined SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + /* + printf("Printing smt status:\n"); + cout << Solver.to_smt2() << "\n"; + */ + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < undecided.size(); ++i) + { + printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", + i, undecided[i], + local_dec_values_X[undecided[i]].numerator, + local_dec_values_X[undecided[i]].denominator, + local_dec_values_X[undecided[i]].as_double(), + local_dec_values_Y[undecided[i]].numerator, + local_dec_values_Y[undecided[i]].denominator, + local_dec_values_Y[undecided[i]].as_double(), + local_dec_values_T[undecided[i]].numerator, + local_dec_values_T[undecided[i]].denominator, + local_dec_values_T[undecided[i]].as_double()); + } + } + #endif + } + else + { + #ifdef DEBUG + { + printf("Refined UNSAT\n"); + } + #endif + size_solvable = false; + break; + } + } + else + { + last_solvable_bounding_box_size = box_max_x; + + dec_values_X = local_dec_values_X; + dec_values_Y = local_dec_values_Y; + dec_values_T = local_dec_values_T; + + size_solvable = true; + break; + } + } + } + else + { + #ifdef DEBUG + { + printf("First UNSAT\n"); + } + #endif + + if (last_solvable_bounding_box_size > 0) + { + size_solvable = false; + } + else + { + size_solvable = false; + } + } + + coord_t half_x_med = (half_x_max + half_x_min) / 2; + coord_t half_y_med = (half_y_max + half_y_min) / 2; + + if (size_solvable) + { + #ifdef DEBUG + { + printf("Solvable\n"); + } + #endif + half_x_min = half_x_med; + half_y_min = half_y_med; + } + else + { + #ifdef DEBUG + { + printf("Unsolvable\n"); + } + #endif + half_x_max = half_x_med; + half_y_max = half_y_med; + } + #ifdef DEBUG + { + printf("Halves augmented: X:[%d,%d] Y:[%d,%d]\n", half_x_min, half_x_max, half_y_min, half_y_max); + } + #endif + } + + if (last_solvable_bounding_box_size > 0) + { + box_half_x_max = half_x_max; + box_half_y_max = half_y_max; + + return true; + } + return false; +} + + +#ifdef PROFILE +double init_cumul = 0.0; +clock_t init_start, init_finish; + +double refine_cumul = 0.0; +clock_t refine_start, refine_finish; + +double recheck_SAT_cumul = 0.0; +double recheck_UNSAT_cumul = 0.0; +double recheck_INDET_cumul = 0.0; +clock_t recheck_start, recheck_finish; +#endif + +bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver &Solver, + z3::context &Context, + const SolverConfiguration &solver_configuration, + coord_t &box_half_x_max, + coord_t &box_half_y_max, + const z3::expr_vector &dec_vars_X, + const z3::expr_vector &dec_vars_Y, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + const string_map &dec_var_names_map, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const z3::expr_vector &presence_constraints) +{ + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + + coord_t last_solvable_bounding_box_size = -1; + + std::vector local_dec_values_X = dec_values_X; + std::vector local_dec_values_Y = dec_values_Y; + std::vector local_dec_values_T = dec_values_T; + + coord_t half_x_min = 0; + coord_t half_x_max = box_half_x_max; //solver_configuration.maximum_X_bounding_box_size / 2; + + coord_t half_y_min = 0; + coord_t half_y_max = box_half_y_max; //solver_configuration.maximum_Y_bounding_box_size / 2; + + while ((half_x_max - half_x_min) > 1 && (half_y_max - half_y_min) > 1) + { + #ifdef DEBUG + { + printf("Halves: %d, %d, %d, %d\n", half_x_min, half_x_max, half_y_min, half_y_max); + } + #endif + + bool size_solvable = false; + + z3::expr_vector bounding_box_assumptions(Context); + + coord_t box_min_x = (half_x_max + half_x_min) / 2; + coord_t box_max_x = solver_configuration.maximum_X_bounding_box_size - box_min_x; + coord_t box_min_y = (half_y_max + half_y_min) / 2; + coord_t box_max_y = solver_configuration.maximum_Y_bounding_box_size - box_min_y; + + #ifdef DEBUG + { + printf("BBX: %d, %d, %d, %d\n", box_min_x, box_max_x, box_min_y, box_max_y); + } + #endif + + z3::expr_vector complete_assumptions(Context); + + for (int i = 0; i < presence_constraints.size(); ++i) + { + complete_assumptions.push_back(presence_constraints[i]); + } + + for (int i = 0; i < undecided.size(); ++i) + { + assume_BedBoundingBox(dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + box_min_x, + box_min_y, + box_max_x, + box_max_y, + complete_assumptions); + } + + bool sat = false; + + #ifdef DEBUG + { + printf("Solving 11 ...\n"); + } + #endif + + if (checkArea_SequentialWeakPolygonNonoverlapping(box_min_x, + box_min_y, + box_max_x, + box_max_y, + fixed, + undecided, + polygons, + unreachable_polygons)) + { + #ifdef PROFILE + { + init_start = clock(); + } + #endif + + switch (Solver.check(complete_assumptions)) + { + case z3::sat: + { + sat = true; + break; + } + case z3::unsat: + { + sat = false; + break; + } + case z3::unknown: + { + sat = false; + break; + } + default: + { + break; + } + } + + #ifdef PROFILE + { + init_finish = clock(); + init_cumul += (init_finish - init_start) / (double)CLOCKS_PER_SEC; + } + #endif + } + else + { + sat = false; + } + + if (sat) + { + #ifdef DEBUG + { + printf("First SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + while (true) + { + #ifdef PROFILE + { + refine_start = clock(); + } + #endif + bool refined = refine_ConsequentialPolygonWeakNonoverlapping(Solver, + Context, + dec_vars_X, + dec_vars_Y, + dec_vars_T, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T, + fixed, + undecided, + polygons, + unreachable_polygons); + #ifdef PROFILE + { + refine_finish = clock(); + refine_cumul += (refine_finish - refine_start) / (double)CLOCKS_PER_SEC; + } + #endif + + if (refined) + { + bool refined_sat = false; + + #ifdef DEBUG + { + printf("Solving 12 ...\n"); + } + #endif + + if (checkArea_SequentialWeakPolygonNonoverlapping(box_min_x, + box_min_y, + box_max_x, + box_max_y, + fixed, + undecided, + polygons, + unreachable_polygons)) + { + #ifdef PROFILE + { + recheck_start = clock(); + } + #endif + + switch (Solver.check(complete_assumptions)) + { + case z3::sat: + { + #ifdef PROFILE + { + recheck_finish = clock(); + recheck_SAT_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + } + #endif + + refined_sat = true; + break; + } + case z3::unsat: + { + #ifdef PROFILE + { + recheck_finish = clock(); + recheck_UNSAT_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + } + #endif + refined_sat = false; + break; + } + case z3::unknown: + { + #ifdef PROFILE + { + recheck_finish = clock(); + recheck_INDET_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + } + #endif + refined_sat = false; + break; + } + default: + { + break; + } + } + } + else + { + refined_sat = false; + } + + #ifdef DEBUG + { + printf("Solving 12 ... finished: %d\n", refined_sat); + } + #endif + + /* + printf("Printing solver status:\n"); + cout << Solver << "\n"; + */ + + if (refined_sat) + { + #ifdef DEBUG + { + printf("Refined SAT\n"); + } + #endif + z3::model Model(Solver.get_model()); + + /* + printf("Printing smt status:\n"); + cout << Solver.to_smt2() << "\n"; + */ + + extract_DecisionValuesFromModel(Model, + dec_var_names_map, + local_dec_values_X, + local_dec_values_Y, + local_dec_values_T); + + #ifdef DEBUG + { + printf("Refined positions:\n"); + for (int i = 0; i < undecided.size(); ++i) + { + printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", + i, undecided[i], + local_dec_values_X[undecided[i]].numerator, + local_dec_values_X[undecided[i]].denominator, + local_dec_values_X[undecided[i]].as_double(), + local_dec_values_Y[undecided[i]].numerator, + local_dec_values_Y[undecided[i]].denominator, + local_dec_values_Y[undecided[i]].as_double(), + local_dec_values_T[undecided[i]].numerator, + local_dec_values_T[undecided[i]].denominator, + local_dec_values_T[undecided[i]].as_double()); + } + } + #endif + } + else + { + #ifdef DEBUG + { + printf("Refined UNSAT\n"); + } + #endif + size_solvable = false; + break; + } + } + else + { + last_solvable_bounding_box_size = box_max_x; + + dec_values_X = local_dec_values_X; + dec_values_Y = local_dec_values_Y; + dec_values_T = local_dec_values_T; + + size_solvable = true; + break; + } + } + } + else + { + #ifdef DEBUG + { + printf("First UNSAT\n"); + } + #endif + + if (last_solvable_bounding_box_size > 0) + { + size_solvable = false; + } + else + { + size_solvable = false; + } + } + + coord_t half_x_med = (half_x_max + half_x_min) / 2; + coord_t half_y_med = (half_y_max + half_y_min) / 2; + + if (size_solvable) + { + #ifdef DEBUG + { + printf("Solvable\n"); + } + #endif + half_x_min = half_x_med; + half_y_min = half_y_med; + } + else + { + #ifdef DEBUG + { + printf("Unsolvable\n"); + } + #endif + half_x_max = half_x_med; + half_y_max = half_y_med; + } + #ifdef DEBUG + { + printf("Halves augmented: X:[%d,%d] Y:[%d,%d]\n", half_x_min, half_x_max, half_y_min, half_y_max); + } + #endif + } + + if (last_solvable_bounding_box_size > 0) + { + box_half_x_max = half_x_max; + box_half_y_max = half_y_max; + + #ifdef PROFILE + { + printf("Init : %.3f\n", init_cumul); + printf("Refine: %.3f\n", refine_cumul); + + printf("Recheck SAT : %.3f\n", recheck_SAT_cumul); + printf("Recheck UNSAT: %.3f\n", recheck_UNSAT_cumul); + printf("Recheck INDET: %.3f\n", recheck_INDET_cumul); + } + #endif + + return true; + } + return false; +} + + +/*----------------------------------------------------------------*/ + +void augment_TemporalSpread(const SolverConfiguration &solver_configuration, + std::vector &dec_values_T, + const std::vector &decided_polygons) +{ + std::map> sorted_polygons; + + #ifdef DEBUG + { + printf("Origo\n"); + for (int i = 0; i < dec_values_T.size(); ++i) + { + printf("%.3f\n", dec_values_T[i].as_double()); + } + } + #endif + + for (int i = 0; i < decided_polygons.size(); ++i) + { + sorted_polygons[dec_values_T[decided_polygons[i]].as_double()] = decided_polygons[i]; + } + + int time = SEQ_GROUND_PRESENCE_TIME; + + for (const auto& sorted_polygon: sorted_polygons) + { + dec_values_T[sorted_polygon.second] = Rational(time); + time += 2 * solver_configuration.temporal_spread * solver_configuration.object_group_size; + } + + #ifdef DEBUG + { + printf("Augment\n"); + for (int i = 0; i < dec_values_T.size(); ++i) + { + printf("%.3f\n", dec_values_T[i].as_double()); + } + } + #endif +} + + +bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + const std::vector &polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + vector undecided; + + decided_polygons.clear(); + remaining_polygons.clear(); + + dec_values_X.resize(polygons.size()); + dec_values_Y.resize(polygons.size()); + + for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + { + bool optimized = false; + + int remaining_polygon = 0; + for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + { + z3::context z_context; + z3::solver z_solver(z_context); + + z3::expr_vector local_dec_vars_X(z_context); + z3::expr_vector local_dec_vars_Y(z_context); + + vector local_values_X; + vector local_values_Y; + + local_values_X.resize(polygons.size()); + local_values_Y.resize(polygons.size()); + + for (int i = 0; i < decided_polygons.size(); ++i) + { + #ifdef DEBUG + { + printf("Decided: %d %.3f, %.3f\n", decided_polygons[i], dec_values_X[decided_polygons[i]].as_double(), dec_values_Y[decided_polygons[i]].as_double()); + } + #endif + local_values_X[decided_polygons[i]] = dec_values_X[decided_polygons[i]]; + local_values_Y[decided_polygons[i]] = dec_values_Y[decided_polygons[i]]; + } + + string_map dec_var_names_map; + + undecided.clear(); + + /* + for (int i = 0; i < object_group_size; ++i) + { + undecided.push_back(curr_polygon + i); + } + */ + + for (int i = object_group_size - 1; i >= 0; --i) + { + undecided.push_back(curr_polygon + i + remaining_polygon); + } + + #ifdef DEBUG + { + printf("Undecided\n"); + for (int j = 0; j < undecided.size(); ++j) + { + printf(" %d\n", undecided[j]); + } + printf("Decided\n"); + for (int j = 0; j < decided_polygons.size(); ++j) + { + printf(" %d\n", decided_polygons[j]); + } + printf("Locals\n"); + for (int j = 0; j < polygons.size(); ++j) + { + printf("X: %ld,%ld Y: %ld,%ld \n", + local_values_X[j].numerator, + local_values_X[j].denominator, + local_values_Y[j].numerator, + local_values_Y[j].denominator); + } + } + #endif + + build_WeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + local_dec_vars_X, + local_dec_vars_Y, + local_values_X, + local_values_Y, + decided_polygons, + undecided, + dec_var_names_map); + + #ifdef DEBUG + { + printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); + + for (int i = 0; i < polygons.size(); ++i) + { + printf("poly: %ld\n", polygons[i].points.size()); + for (int j = 0; j < polygons[i].points.size(); ++j) + { + printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); + } + } + } + #endif + + optimized = optimize_WeakPolygonNonoverlapping(z_solver, + z_context, + solver_configuration, + local_dec_vars_X, + local_dec_vars_Y, + local_values_X, + local_values_Y, + decided_polygons, + undecided, + dec_var_names_map, + polygons); + + if (optimized) + { + for (int i = 0; i < undecided.size(); ++i) + { + dec_values_X[undecided[i]] = local_values_X[undecided[i]]; + dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; + decided_polygons.push_back(undecided[i]); + } + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + break; + } + else + { + #ifdef DEBUG + { + printf("Remaining polygon: %d\n", curr_polygon + remaining_polygon); + } + #endif + remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); + } + } + if (!optimized) + { + if (curr_polygon <= 0) + { + return false; + } + else + { + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + } + } + } + return true; +} + + +bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return optimize_SubglobalSequentialPolygonNonoverlapping(solver_configuration, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + _unreachable_polygons, + undecided_polygons, + decided_polygons, + remaining_polygons); +} + + +bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + vector undecided; + + decided_polygons.clear(); + remaining_polygons.clear(); + + dec_values_X.resize(polygons.size()); + dec_values_Y.resize(polygons.size()); + dec_values_T.resize(polygons.size()); + + for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + { + bool optimized = false; + + int remaining_polygon = 0; + for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + { + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + //z3::set_param("smt.threads", "8"); + //z3::set_param("parallel.threads.max", "16"); + + z3::context z_context; + z3::solver z_solver(z_context); + + z3::expr_vector local_dec_vars_X(z_context); + z3::expr_vector local_dec_vars_Y(z_context); + z3::expr_vector local_dec_vars_T(z_context); + + vector local_values_X; + vector local_values_Y; + vector local_values_T; + + local_values_X.resize(polygons.size()); + local_values_Y.resize(polygons.size()); + local_values_T.resize(polygons.size()); + + for (int i = 0; i < decided_polygons.size(); ++i) + { + #ifdef DEBUG + { + printf("Decided: %d %.3f, %.3f, %.3f\n", + decided_polygons[i], + dec_values_X[decided_polygons[i]].as_double(), + dec_values_Y[decided_polygons[i]].as_double(), + dec_values_T[decided_polygons[i]].as_double()); + } + #endif + + local_values_X[decided_polygons[i]] = dec_values_X[decided_polygons[i]]; + local_values_Y[decided_polygons[i]] = dec_values_Y[decided_polygons[i]]; + local_values_T[decided_polygons[i]] = dec_values_T[decided_polygons[i]]; + } + + string_map dec_var_names_map; + + undecided.clear(); + + /* + for (int i = 0; i < object_group_size; ++i) + { + undecided.push_back(curr_polygon + i); + } + */ + + for (int i = object_group_size - 1; i >= 0; --i) + { + undecided.push_back(curr_polygon + i + remaining_polygon); + } + + #ifdef DEBUG + { + printf("Undecided\n"); + for (int j = 0; j < undecided.size(); ++j) + { + printf(" %d\n", undecided[j]); + } + printf("Decided\n"); + for (int j = 0; j < decided_polygons.size(); ++j) + { + printf(" %d\n", decided_polygons[j]); + } + printf("Locals\n"); + for (int j = 0; j < polygons.size(); ++j) + { + printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", + local_values_X[j].numerator, + local_values_X[j].denominator, + local_values_Y[j].numerator, + local_values_Y[j].denominator, + local_values_T[j].numerator, + local_values_T[j].denominator); + + } + } + #endif + + build_SequentialWeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + unreachable_polygons, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map); + + + introduce_SequentialTemporalOrderingAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons); + + #ifdef DEBUG + { + printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); + + for (int i = 0; i < polygons.size(); ++i) + { + printf("poly: %ld\n", polygons[i].points.size()); + for (int j = 0; j < polygons[i].points.size(); ++j) + { + printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); + } + } + } + #endif + + optimized = optimize_SequentialWeakPolygonNonoverlapping(z_solver, + z_context, + solver_configuration, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map, + polygons, + unreachable_polygons); + + + if (optimized) + { + /* + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + */ + + for (int i = 0; i < undecided.size(); ++i) + { + dec_values_X[undecided[i]] = local_values_X[undecided[i]]; + dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; + dec_values_T[undecided[i]] = local_values_T[undecided[i]]; + decided_polygons.push_back(undecided[i]); + } + augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); + + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + break; + } + else + { + #ifdef DEBUG + { + printf("Remaining polygon: %d\n", curr_polygon + remaining_polygon); + } + #endif + remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); + } + } + if (!optimized) + { + if (curr_polygon <= 0) + { + return false; + } + else + { + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + } + } + } + return true; +} + + +bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return optimize_SubglobalSequentialPolygonNonoverlappingCentered(solver_configuration, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + _unreachable_polygons, + undecided_polygons, + decided_polygons, + remaining_polygons); +} + + +bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + vector undecided; + + decided_polygons.clear(); + remaining_polygons.clear(); + + dec_values_X.resize(polygons.size()); + dec_values_Y.resize(polygons.size()); + dec_values_T.resize(polygons.size()); + + for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + { + bool optimized = false; + + int remaining_polygon = 0; + for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + { + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + //z3::set_param("smt.threads", "8"); + //z3::set_param("parallel.threads.max", "16"); + + z3::context z_context; + z3::solver z_solver(z_context); + + z3::expr_vector local_dec_vars_X(z_context); + z3::expr_vector local_dec_vars_Y(z_context); + z3::expr_vector local_dec_vars_T(z_context); + + vector local_values_X; + vector local_values_Y; + vector local_values_T; + + local_values_X.resize(polygons.size()); + local_values_Y.resize(polygons.size()); + local_values_T.resize(polygons.size()); + + for (int i = 0; i < decided_polygons.size(); ++i) + { + #ifdef DEBUG + { + printf("Decided: %d %.3f, %.3f, %.3f\n", + decided_polygons[i], + dec_values_X[decided_polygons[i]].as_double(), + dec_values_Y[decided_polygons[i]].as_double(), + dec_values_T[decided_polygons[i]].as_double()); + } + #endif + + local_values_X[decided_polygons[i]] = dec_values_X[decided_polygons[i]]; + local_values_Y[decided_polygons[i]] = dec_values_Y[decided_polygons[i]]; + local_values_T[decided_polygons[i]] = dec_values_T[decided_polygons[i]]; + } + + string_map dec_var_names_map; + + undecided.clear(); + + /* + for (int i = 0; i < object_group_size; ++i) + { + undecided.push_back(curr_polygon + i); + } + */ + + for (int i = object_group_size - 1; i >= 0; --i) + { + undecided.push_back(curr_polygon + i + remaining_polygon); + } + + #ifdef DEBUG + { + printf("Undecided\n"); + for (int j = 0; j < undecided.size(); ++j) + { + printf(" %d\n", undecided[j]); + } + printf("Decided\n"); + for (int j = 0; j < decided_polygons.size(); ++j) + { + printf(" %d\n", decided_polygons[j]); + } + printf("Locals\n"); + for (int j = 0; j < polygons.size(); ++j) + { + printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", + local_values_X[j].numerator, + local_values_X[j].denominator, + local_values_Y[j].numerator, + local_values_Y[j].denominator, + local_values_T[j].numerator, + local_values_T[j].denominator); + + } + } + #endif + + build_SequentialWeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + unreachable_polygons, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map); + + + introduce_SequentialTemporalOrderingAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons); + + #ifdef DEBUG + { + printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); + + for (int i = 0; i < polygons.size(); ++i) + { + printf("poly: %ld\n", polygons[i].points.size()); + for (int j = 0; j < polygons[i].points.size(); ++j) + { + printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); + } + } + } + #endif + + optimized = optimize_SequentialWeakPolygonNonoverlappingCentered(z_solver, + z_context, + solver_configuration, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map, + polygons, + unreachable_polygons); + + + if (optimized) + { + /* + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + */ + + for (int i = 0; i < undecided.size(); ++i) + { + dec_values_X[undecided[i]] = local_values_X[undecided[i]]; + dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; + dec_values_T[undecided[i]] = local_values_T[undecided[i]]; + decided_polygons.push_back(undecided[i]); + } + augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); + + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + break; + } + else + { + #ifdef DEBUG + { + printf("Remaining polygon: %d\n", curr_polygon + remaining_polygon); + } + #endif + remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); + } + } + if (!optimized) + { + if (curr_polygon <= 0) + { + return false; + } + else + { + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + } + } + } + return true; +} + + +bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + _unreachable_polygons, + undecided_polygons, + decided_polygons, + remaining_polygons); +} + + +bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + vector undecided; + + decided_polygons.clear(); + remaining_polygons.clear(); + + dec_values_X.resize(polygons.size()); + dec_values_Y.resize(polygons.size()); + dec_values_T.resize(polygons.size()); + + coord_t box_half_x_max = solver_configuration.maximum_X_bounding_box_size / 2; + coord_t box_half_y_max = solver_configuration.maximum_Y_bounding_box_size / 2; + + for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + { + bool optimized = false; + + int remaining_polygon = 0; + for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + { + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + //z3::set_param("smt.threads", "8"); + //z3::set_param("parallel.threads.max", "16"); + + z3::context z_context; + z3::solver z_solver(z_context); + + z3::expr_vector local_dec_vars_X(z_context); + z3::expr_vector local_dec_vars_Y(z_context); + z3::expr_vector local_dec_vars_T(z_context); + + vector local_values_X; + vector local_values_Y; + vector local_values_T; + + local_values_X.resize(polygons.size()); + local_values_Y.resize(polygons.size()); + local_values_T.resize(polygons.size()); + + for (int i = 0; i < decided_polygons.size(); ++i) + { + #ifdef DEBUG + { + printf("Decided: %d %.3f, %.3f, %.3f\n", + decided_polygons[i], + dec_values_X[decided_polygons[i]].as_double(), + dec_values_Y[decided_polygons[i]].as_double(), + dec_values_T[decided_polygons[i]].as_double()); + } + #endif + + local_values_X[decided_polygons[i]] = dec_values_X[decided_polygons[i]]; + local_values_Y[decided_polygons[i]] = dec_values_Y[decided_polygons[i]]; + local_values_T[decided_polygons[i]] = dec_values_T[decided_polygons[i]]; + } + + string_map dec_var_names_map; + + undecided.clear(); + + /* + for (int i = 0; i < object_group_size; ++i) + { + undecided.push_back(curr_polygon + i); + } + */ + + for (int i = object_group_size - 1; i >= 0; --i) + { + undecided.push_back(curr_polygon + i + remaining_polygon); + } + + #ifdef DEBUG + { + printf("Undecided\n"); + for (int j = 0; j < undecided.size(); ++j) + { + printf(" %d\n", undecided[j]); + } + printf("Decided\n"); + for (int j = 0; j < decided_polygons.size(); ++j) + { + printf(" %d\n", decided_polygons[j]); + } + printf("Locals\n"); + for (int j = 0; j < polygons.size(); ++j) + { + printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", + local_values_X[j].numerator, + local_values_X[j].denominator, + local_values_Y[j].numerator, + local_values_Y[j].denominator, + local_values_T[j].numerator, + local_values_T[j].denominator); + + } + } + #endif + + build_SequentialWeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + unreachable_polygons, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map); + + introduce_SequentialTemporalOrderingAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons); + + #ifdef DEBUG + { + printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); + + for (int i = 0; i < polygons.size(); ++i) + { + printf("poly: %ld\n", polygons[i].points.size()); + for (int j = 0; j < polygons[i].points.size(); ++j) + { + printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); + } + } + } + #endif + + optimized = optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, + z_context, + solver_configuration, + box_half_x_max, + box_half_y_max, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map, + polygons, + unreachable_polygons); + + + if (optimized) + { + /* + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + */ + + for (int i = 0; i < undecided.size(); ++i) + { + dec_values_X[undecided[i]] = local_values_X[undecided[i]]; + dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; + dec_values_T[undecided[i]] = local_values_T[undecided[i]]; + decided_polygons.push_back(undecided[i]); + } + augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); + + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + break; + } + else + { + #ifdef DEBUG + { + printf("Remaining polygon: %d\n", curr_polygon + remaining_polygon); + } + #endif + remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); + } + } + if (!optimized) + { + if (curr_polygon <= 0) + { + return false; + } + else + { + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + + for (; curr_polygon < polygons.size(); ++curr_polygon) + { + remaining_polygons.push_back(undecided_polygons[curr_polygon]); + } + return true; + } + else + { + return true; + } + } + } + } + return true; +} + + +bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + std::vector > _unreachable_polygons; + _unreachable_polygons.resize(unreachable_polygons.size()); + + for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + { + _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); + } + + return optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + _unreachable_polygons, + undecided_polygons, + decided_polygons, + remaining_polygons); +} + + +#ifdef PROFILE +double build_cumul = 0.0; +clock_t build_start, build_finish; +#endif + +bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &polygons, + const std::vector > &unreachable_polygons, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons) +{ + vector undecided; + + decided_polygons.clear(); + remaining_polygons.clear(); + + dec_values_X.resize(polygons.size()); + dec_values_Y.resize(polygons.size()); + dec_values_T.resize(polygons.size()); + + int box_half_x_max = solver_configuration.maximum_X_bounding_box_size / 2; + int box_half_y_max = solver_configuration.maximum_Y_bounding_box_size / 2; + + for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + { + bool optimized = false; + + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + //z3::set_param("parallel.enable", "true"); + //z3::set_param("smt.threads", "8"); + //z3::set_param("parallel.threads.max", "16"); + + z3::context z_context; + z3::solver z_solver(z_context); + + z3::expr_vector local_dec_vars_X(z_context); + z3::expr_vector local_dec_vars_Y(z_context); + z3::expr_vector local_dec_vars_T(z_context); + + vector local_values_X; + vector local_values_Y; + vector local_values_T; + + local_values_X.resize(polygons.size()); + local_values_Y.resize(polygons.size()); + local_values_T.resize(polygons.size()); + + for (int i = 0; i < decided_polygons.size(); ++i) + { + #ifdef DEBUG + { + printf("Decided: %d %.3f, %.3f, %.3f\n", + decided_polygons[i], + dec_values_X[decided_polygons[i]].as_double(), + dec_values_Y[decided_polygons[i]].as_double(), + dec_values_T[decided_polygons[i]].as_double()); + } + #endif + + local_values_X[decided_polygons[i]] = dec_values_X[decided_polygons[i]]; + local_values_Y[decided_polygons[i]] = dec_values_Y[decided_polygons[i]]; + local_values_T[decided_polygons[i]] = dec_values_T[decided_polygons[i]]; + } + + string_map dec_var_names_map; + + int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); + + undecided.clear(); + + int remaining_polygon = 0; + + for (int i = object_group_size - 1; i >= 0; --i) + { + undecided.push_back(curr_polygon + i + remaining_polygon); + } + + #ifdef PROFILE + { + build_start = clock(); + } + #endif + build_ConsequentialWeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + unreachable_polygons, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map); + #ifdef PROFILE + { + build_finish = clock(); + build_cumul += (build_finish - build_start) / (double)CLOCKS_PER_SEC; + } + #endif + + vector missing; + + while(object_group_size > 0) + { + z3::expr_vector presence_assumptions(z_context); + assume_ConsequentialObjectPresence(z_context, local_dec_vars_T, undecided, missing, presence_assumptions); + + #ifdef DEBUG + { + printf("Undecided\n"); + for (int j = 0; j < undecided.size(); ++j) + { + printf(" %d\n", undecided[j]); + } + printf("Decided\n"); + for (int j = 0; j < decided_polygons.size(); ++j) + { + printf(" %d\n", decided_polygons[j]); + } + printf("Locals\n"); + for (int j = 0; j < polygons.size(); ++j) + { + printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", + local_values_X[j].numerator, + local_values_X[j].denominator, + local_values_Y[j].numerator, + local_values_Y[j].denominator, + local_values_T[j].numerator, + local_values_T[j].denominator); + + } + } + #endif + + introduce_ConsequentialTemporalOrderingAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons); + + #ifdef DEBUG + { + printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); + + for (int i = 0; i < polygons.size(); ++i) + { + printf("poly: %ld\n", polygons[i].points.size()); + for (int j = 0; j < polygons[i].points.size(); ++j) + { + printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); + } + } + } + #endif + + optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, + z_context, + solver_configuration, + box_half_x_max, + box_half_y_max, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map, + polygons, + unreachable_polygons, + presence_assumptions); + + if (optimized) + { + /* + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + */ + + for (int i = 0; i < undecided.size(); ++i) + { + dec_values_X[undecided[i]] = local_values_X[undecided[i]]; + dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; + dec_values_T[undecided[i]] = local_values_T[undecided[i]]; + decided_polygons.push_back(undecided[i]); + } + augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); + + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + } + else + { + return true; + } + break; + } + else + { + #ifdef DEBUG + { + printf("Remaining polygon: %d\n", curr_polygon + remaining_polygon); + } + #endif + remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); + } + missing.push_back(undecided.back()); + undecided.pop_back(); + + --object_group_size; + } + + #ifdef PROFILE + { + printf("Build: %.3f\n", build_cumul); + } + #endif + + if (!optimized) + { + if (curr_polygon <= 0) + { + return false; + } + else + { + if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + + for (; curr_polygon < polygons.size(); ++curr_polygon) + { + remaining_polygons.push_back(undecided_polygons[curr_polygon]); + } + return true; + } + else + { + return true; + } + } + } + } + return true; +} + + +/*----------------------------------------------------------------*/ + +} // namespace Sequential diff --git a/src/libseqarrange/src/seq_utilities.cpp b/src/libseqarrange/src/seq_utilities.cpp new file mode 100644 index 0000000000..08b696edce --- /dev/null +++ b/src/libseqarrange/src/seq_utilities.cpp @@ -0,0 +1,201 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_utilities.cpp + * + * Various utilities for sequential print. + */ +/*================================================================*/ + +#include +#include +#include + +#include "seq_defs.hpp" + +#include "libslic3r/Geometry.hpp" +#include "libslic3r/ClipperUtils.hpp" + +#include "seq_utilities.hpp" + + +/*----------------------------------------------------------------*/ + +using namespace std; +using namespace Slic3r; + + +/*----------------------------------------------------------------*/ + +namespace Sequential +{ + + +/*----------------------------------------------------------------*/ + + +bool find_and_remove(std::string& src, const std::string& key) +{ + size_t pos = src.find(key); + if (pos != std::string::npos) { + src.erase(pos, key.length()); + return true; + } + return false; +} + + +std::vector load_exported_data(const std::string& filename) +{ + std::vector objects_to_print; + + std::ifstream in(filename); + if (!in) + throw std::runtime_error("NO EXPORTED FILE WAS FOUND"); + std::string line; + + while (in) { + std::getline(in, line); + if (find_and_remove(line, "OBJECT_ID")) { + objects_to_print.push_back(ObjectToPrint()); + objects_to_print.back().id = std::stoi(line); + } + if (find_and_remove(line, "TOTAL_HEIGHT")) + { + objects_to_print.back().total_height = std::stoi(line); + } + if (find_and_remove(line, "POLYGON_AT_HEIGHT")) + { + objects_to_print.back().pgns_at_height.emplace_back(std::make_pair(std::stoi(line), Polygon())); + } + if (find_and_remove(line, "POINT")) + { + std::stringstream ss(line); + std::string val; + ss >> val; + Point pt(std::stoi(val), 0); + ss >> val; + pt.y() = std::stoi(val); + objects_to_print.back().pgns_at_height.back().second.append(pt); + } + } + return objects_to_print; +} + + +int load_printer_geometry(const std::string& filename, PrinterGeometry &printer_geometry) +{ + std::ifstream in(filename); + if (!in) + throw std::runtime_error("NO PRINTER GEOMETRY FILE WAS FOUND"); + std::string line; + + Polygon *current_polygon = NULL; + + while (in) { + std::getline(in, line); + + if (find_and_remove(line, "POLYGON_AT_HEIGHT")) + { + coord_t height = std::stoi(line); + + std::map >::iterator extruder_slice = printer_geometry.extruder_slices.find(height); + + if (extruder_slice != printer_geometry.extruder_slices.end()) + { + extruder_slice->second.push_back(Polygon()); + current_polygon = &extruder_slice->second.back(); + } + else + { + vector polygons; + polygons.push_back(Polygon()); + + current_polygon = &printer_geometry.extruder_slices.insert(std::pair(height, polygons)).first->second.back(); + } + } + else if (find_and_remove(line, "POINT")) + { + std::stringstream ss(line); + std::string val; + ss >> val; + Point pt(std::stoi(val), 0); + ss >> val; + pt.y() = std::stoi(val); + + assert(current_polygon != NULL); + current_polygon->append(pt); + } + else if (find_and_remove(line, "CONVEX_HEIGHT")) + { + std::stringstream ss(line); + std::string val; + ss >> val; + coord_t height = std::stoi(val); + + printer_geometry.convex_heights.insert(height); + } + else if (find_and_remove(line, "BOX_HEIGHT")) + { + std::stringstream ss(line); + std::string val; + ss >> val; + coord_t height = std::stoi(val); + + printer_geometry.box_heights.insert(height); + } + + else if (find_and_remove(line, "X_SIZE")) + { + std::stringstream ss(line); + std::string val; + ss >> val; + coord_t x_size = std::stoi(val); + + printer_geometry.x_size = x_size; + } + else if (find_and_remove(line, "Y_SIZE")) + { + std::stringstream ss(line); + std::string val; + ss >> val; + coord_t y_size = std::stoi(val); + + printer_geometry.y_size = y_size; + } + } + return 0; +} + + +void save_import_data(const std::string &filename, + const std::map &scheduled_polygons, + const map &original_index_map, + const vector &poly_positions_X, + const vector &poly_positions_Y) +{ + std::ofstream out(filename); + if (!out) + throw std::runtime_error("CANNOT CREATE IMPORT FILE"); + + for (const auto& scheduled_polygon: scheduled_polygons) + { + coord_t X, Y; + + scaleUp_PositionForSlicer(poly_positions_X[scheduled_polygon.second], + poly_positions_Y[scheduled_polygon.second], + X, + Y); + const auto& original_index = original_index_map.find(scheduled_polygon.second); + +// out << original_index_map[scheduled_polygon.second] << " " << X << " " << Y << endl; + out << original_index->second << " " << X << " " << Y << endl; + } +} + + +/*----------------------------------------------------------------*/ + +} // namespace Sequential diff --git a/src/libseqarrange/src/sequential_decimator.cpp b/src/libseqarrange/src/sequential_decimator.cpp new file mode 100644 index 0000000000..c184323187 --- /dev/null +++ b/src/libseqarrange/src/sequential_decimator.cpp @@ -0,0 +1,411 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: sequential_decimator.cpp + * + * Polygon decimator utility (especially for extruder models). + */ +/*================================================================*/ + + +#include +#include +#include + +#include "libslic3r/Polygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/SVG.hpp" + +#include "seq_version.hpp" +#include "seq_utilities.hpp" + +#include "sequential_decimator.hpp" + +/*----------------------------------------------------------------*/ + +using namespace Slic3r; +using namespace Sequential; + + +/*----------------------------------------------------------------*/ + +#define SCALE_FACTOR 50000.0 + + +/*----------------------------------------------------------------*/ + +//const Point polygon_offset_0(28000000, -16000000); // body +//const Point polygon_offset_1(-3000000, -60000000); // hose +//const Point polygon_offset_2(28000000, -16000000); // fan +//const Point polygon_offset_3(0,-24000000); // gantry +//const Point polygon_offset_4(0,0); // nozzle + + +/*----------------------------------------------------------------*/ + + +void print_IntroductoryMessage(void) +{ + printf("----------------------------------------------------------------\n"); + printf("Polygon decimation utility - build %s\n", SEQ_SEQUENTIAL_BUILD); + printf("(C) 2024 Prusa Research \n"); + printf("================================================================\n"); +} + + +void print_ConcludingMessage(void) +{ + printf("----------------------------------------------------------------\n"); +} + + +void print_Help(void) +{ + printf("Usage:\n"); + printf("sequential_prusa [--input-file=]\n"); + printf(" [--output-file=]\n"); + printf(" [--tolerance=]\n"); + printf(" [--x-pos= (in mm)]\n"); + printf(" [--y-pos= (in mm)]\n"); + printf(" [--x-nozzle= (in coord_t)]\n"); + printf(" [--y-nozzle= (in coord_t)]\n"); + printf(" [--help]\n"); + printf("\n"); + printf("\n"); + printf("Defaults: --input-file=arrange_data_export.txt\n"); + printf(" --output-file=arrange_data_import.txt\n"); + printf(" --x-pos='random'\n"); + printf(" --y-pos='random'\n"); + printf(" --x-nozzle=0\n"); + printf(" --y-nozzle=0\n"); + printf(" --tolerance=400000 \n"); + printf("\n"); +} + + +int parse_CommandLineParameter(const string ¶meter, CommandParameters &command_parameters) +{ + if (parameter.find("--input-file=") == 0) + { + command_parameters.input_filename = parameter.substr(13, parameter.size()); + } + else if (parameter.find("--output-file=") == 0) + { + command_parameters.output_filename = parameter.substr(14, parameter.size()); + } + else if (parameter.find("--tolerance=") == 0) + { + command_parameters.tolerance = std::atof(parameter.substr(12, parameter.size()).c_str()); + } + else if (parameter.find("--x-pos=") == 0) + { + command_parameters.x_position = std::atof(parameter.substr(8, parameter.size()).c_str()); + command_parameters.random_position = false; + + } + else if (parameter.find("--y-pos=") == 0) + { + command_parameters.y_position = std::atof(parameter.substr(8, parameter.size()).c_str()); + command_parameters.random_position = false; + } + else if (parameter.find("--x-nozzle=") == 0) + { + command_parameters.x_nozzle = std::atoi(parameter.substr(11, parameter.size()).c_str()); + + } + else if (parameter.find("--y-nozzle=") == 0) + { + command_parameters.y_nozzle = std::atoi(parameter.substr(11, parameter.size()).c_str()); + } + else if (parameter.find("--help") == 0) + { + command_parameters.help = true; + } + else + { + return -1; + } + return 0; +} + + +void save_DecimatedPolygons(const CommandParameters &command_parameters, + const std::vector &decimated_polygons) +{ + std::ofstream out(command_parameters.output_filename); + if (!out) + throw std::runtime_error("CANNOT CREATE OUTPUT FILE"); + + Point nozzle_offset(-command_parameters.x_nozzle, -command_parameters.y_nozzle); + + for (int i = 0; i < decimated_polygons.size(); ++i) + { + out << "[" << i << "]" << endl; + out << "{" << endl; + + Slic3r::Polygon shift_polygon = scaleUp_PolygonForSlicer(1, + decimated_polygons[i], + (command_parameters.x_position * SEQ_SLICER_SCALE_FACTOR) * 10, + (command_parameters.y_position * SEQ_SLICER_SCALE_FACTOR) * 10); + shift_Polygon(shift_polygon, nozzle_offset); + + for (const auto& point: shift_polygon.points) + { + out << " { " << point.x() << ", " << point.y() << "}," << endl; + } + out << "}" << endl; + } +} + + +int decimate_Polygons(const CommandParameters &command_parameters) +{ + clock_t start, finish; + + printf("Decimation ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + std::vector objects_to_print = load_exported_data(command_parameters.input_filename); + + std::vector decimated_polygons; + std::vector > unreachable_polygons; + + printf(" Decimating objects (polygons) ...\n"); + + for (int i = 0; i < objects_to_print.size(); ++i) + { + for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + { + coord_t height = objects_to_print[i].pgns_at_height[j].first; + + if (!objects_to_print[i].pgns_at_height[j].second.points.empty()) + { + Polygon decimated_polygon; + //ground_PolygonByFirstPoint(objects_to_print[i].pgns_at_height[j].second); + + decimate_PolygonForSequentialSolver(command_parameters.tolerance, + objects_to_print[i].pgns_at_height[j].second, + decimated_polygon); + + decimated_polygons.push_back(decimated_polygon); + } + } + } + printf(" Decimating objects (polygons) ... finished\n"); + + Point nozzle_offset(-command_parameters.x_nozzle, -command_parameters.y_nozzle); + + for (int i = 0; i < decimated_polygons.size(); ++i) + { + printf(" [%d]\n", i); + Slic3r::Polygon shift_polygon = decimated_polygons[i]; + shift_Polygon(shift_polygon, nozzle_offset); + + shift_polygon = scaleUp_PolygonForSlicer(1, + shift_polygon, + (command_parameters.x_position * SEQ_SLICER_SCALE_FACTOR) * 10, + (command_parameters.y_position * SEQ_SLICER_SCALE_FACTOR) * 10); + + for (const auto &point: shift_polygon.points) + { + cout << " " << point.x() << " " << point.y() << endl; + } + } + + if (command_parameters.output_filename != "") + { + save_DecimatedPolygons(command_parameters, decimated_polygons); + } + + string svg_filename = "sequential_decimator.svg"; + SVG preview_svg(svg_filename); + + for (int i = 0; i < decimated_polygons.size(); ++i) + { + Polygon transformed_polygon; + Polygon shift_polygon = decimated_polygons[i]; + + shift_Polygon(shift_polygon, nozzle_offset); + + if (command_parameters.random_position) + { + transformed_polygon = transform_UpsideDown(solver_configuration, + scaleUp_PolygonForSlicer(1, + shift_polygon, + rand() % (solver_configuration.maximum_X_bounding_box_size * SEQ_SLICER_SCALE_FACTOR), + rand() % (solver_configuration.maximum_Y_bounding_box_size * SEQ_SLICER_SCALE_FACTOR))); + } + else + { + transformed_polygon = transform_UpsideDown(solver_configuration, + scaleUp_PolygonForSlicer(1, + shift_polygon, + (command_parameters.x_position * SEQ_SLICER_SCALE_FACTOR) * 10, + (command_parameters.y_position * SEQ_SLICER_SCALE_FACTOR) * 10)); + } + Polygon display_polygon = scaleDown_PolygonForSequentialSolver(2, transformed_polygon); + + string color; + + switch(i % 16) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "firebrick"; + break; + } + case 11: + { + color = "violet"; + break; + } + case 12: + { + color = "midnightblue"; + break; + } + case 13: + { + color = "khaki"; + break; + } + case 14: + { + color = "darkslategrey"; + break; + } + case 15: + { + color = "hotpink"; + break; + } + + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + Polygon bed_polygon({ { 0, 0}, + { solver_configuration.maximum_X_bounding_box_size, 0 }, + { solver_configuration.maximum_X_bounding_box_size, solver_configuration.maximum_Y_bounding_box_size}, + { 0, solver_configuration.maximum_Y_bounding_box_size} }); + Polygon display_bed_polygon = scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, + bed_polygon, + 0, + 0); + preview_svg.draw_outline(display_bed_polygon, "black"); + + preview_svg.Close(); + printf(" Displaying ... finised\n"); + + finish = clock(); + + printf("Decimation ... finished\n"); + printf("Total CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + + return 0; +} + + +/*----------------------------------------------------------------------------*/ +// main program + +int main(int argc, char **argv) +{ + int result; + CommandParameters command_parameters; + + print_IntroductoryMessage(); + + if (argc >= 1 && argc <= 10) + { + for (int i = 1; i < argc; ++i) + { + result = parse_CommandLineParameter(argv[i], command_parameters); + if (result < 0) + { + printf("Error: Cannot parse command line parameters (code = %d).\n", result); + print_Help(); + + return result; + } + } + if (command_parameters.help) + { + print_Help(); + } + else + { + result = decimate_Polygons(command_parameters); + if (result < 0) + { + return result; + } + } + } + else + { + print_Help(); + } + print_ConcludingMessage(); + + return 0; +} diff --git a/src/libseqarrange/src/sequential_decimator.hpp b/src/libseqarrange/src/sequential_decimator.hpp new file mode 100644 index 0000000000..21d2949bf5 --- /dev/null +++ b/src/libseqarrange/src/sequential_decimator.hpp @@ -0,0 +1,73 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: sequential_decimator.hpp + * + * Polygon decimator utility (especially for extruder models). + */ +/*================================================================*/ + +#ifndef __SEQUENTIAL_DECIMATOR_HPP__ +#define __SEQUENTIAL_DECIMATOR_HPP__ + +/*----------------------------------------------------------------*/ + +#include "seq_sequential.hpp" +#include "seq_preprocess.hpp" +#include "seq_interface.hpp" + + +/*----------------------------------------------------------------*/ + +const double SEQ_DECIMATION_TOLERANCE = 400000.0; + + +/*----------------------------------------------------------------*/ + +struct CommandParameters +{ + CommandParameters() + : tolerance(SEQ_DECIMATION_TOLERANCE) + , input_filename("arrange_data_export.txt") + , output_filename("arrange_data_import.txt") + , x_position(0) + , y_position(0) + , random_position(true) + , help(false) + , x_nozzle(0) + , y_nozzle(0) + { + /* nothing */ + } + + double tolerance; + + string input_filename; + string output_filename; + + double x_position; + double y_position; + bool random_position; + + coord_t x_nozzle; + coord_t y_nozzle; + + bool help; +}; + + +/*----------------------------------------------------------------------------*/ + +void print_IntroductoryMessage(void); +void print_ConcludingMessage(void); +void print_Help(void); + +int parse_CommandLineParameter(const string ¶meter, CommandParameters ¶meters); +int decimate_Polygons(const CommandParameters &command_parameters); + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQUENTIAL_DECIMATOR_HPP__ */ diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp new file mode 100644 index 0000000000..f00bb66b62 --- /dev/null +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -0,0 +1,811 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: sequential_prusa.cpp + * + * SEQUENTIAL 3D Print Scheduler|Arranger. + */ +/*================================================================*/ + + +#include "libslic3r/Polygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/SVG.hpp" + +#include "seq_version.hpp" +#include "seq_preprocess.hpp" +#include "seq_utilities.hpp" + +#include "sequential_prusa.hpp" + +/*----------------------------------------------------------------*/ + +using namespace Slic3r; +using namespace Sequential; + + +/*----------------------------------------------------------------*/ + + +void print_IntroductoryMessage(void) +{ + printf("----------------------------------------------------------------\n"); + printf("SEQUENTIAL 3D Print Scheduler|Arranger - build %s\n", SEQ_SEQUENTIAL_BUILD); + printf("(C) 2024 Prusa Research \n"); + printf("================================================================\n"); +} + + +void print_ConcludingMessage(void) +{ + printf("----------------------------------------------------------------\n"); +} + + +void print_Help(void) +{ + printf("Usage:\n"); + printf("sequential_prusa [--input-file=]\n"); + printf(" [--output-file=]\n"); + printf(" [--printer-file=]\n"); + printf(" [--decimation={yes|no}]\n"); + printf(" [--precision={low|high}]\n"); + printf(" [--assumptions={yes|no}]\n"); + printf(" [--interactive={yes|no}]\n"); + printf(" [--object-group-size=]\n"); + printf(" [--help]\n"); + printf("\n"); + printf("\n"); + printf("Defaults: --input-file=arrange_data_export.txt\n"); + printf(" --output-file=arrange_data_import.txt\n"); + printf(" --printer-file=../printers/printer_geometry.mk4.compatibility.txt\n"); + printf(" --object-group-size=4 \n"); + printf(" --decimation=yes\n"); + printf(" --precision=high\n"); + printf(" --assumptions=yes\n"); + printf(" --interactive=no\n"); + printf("\n"); +} + + +int parse_CommandLineParameter(const string ¶meter, CommandParameters &command_parameters) +{ + if (parameter.find("--input-file=") == 0) + { + command_parameters.input_filename = parameter.substr(13, parameter.size()); + } + else if (parameter.find("--output-file=") == 0) + { + command_parameters.output_filename = parameter.substr(14, parameter.size()); + } + else if (parameter.find("--printer-file=") == 0) + { + command_parameters.printer_filename = parameter.substr(15, parameter.size()); + } + else if (parameter.find("--object-group-size=") == 0) + { + command_parameters.object_group_size = std::atoi(parameter.substr(20, parameter.size()).c_str()); + } + else if (parameter.find("--decimation=") == 0) + { + string decimation_str = parameter.substr(13, parameter.size()); + + if (decimation_str == "yes") + { + command_parameters.decimation = true; + } + else if (decimation_str == "no") + { + command_parameters.decimation = false; + } + else + { + return -2; + } + } + else if (parameter.find("--precision=") == 0) + { + string decimation_str = parameter.substr(12, parameter.size()); + + if (decimation_str == "high") + { + command_parameters.precision = true; + } + else if (decimation_str == "low") + { + command_parameters.precision = false; + } + else + { + return -2; + } + } + else if (parameter.find("--assumptions=") == 0) + { + string assumptions_str = parameter.substr(14, parameter.size()); + + if (assumptions_str == "yes") + { + command_parameters.assumptions = true; + } + else if (assumptions_str == "no") + { + command_parameters.assumptions = false; + } + else + { + return -2; + } + } + else if (parameter.find("--interactive=") == 0) + { + string interactive_str = parameter.substr(14, parameter.size()); + + if (interactive_str == "yes") + { + command_parameters.interactive = true; + } + else if (interactive_str == "no") + { + command_parameters.interactive = false; + } + else + { + return -2; + } + } + else if (parameter.find("--help") == 0) + { + command_parameters.help = true; + } + else + { + return -1; + } + return 0; +} + + +string convert_Index2Suffix(int index) +{ + string buffer = "000"; + + string index_str = std::to_string(index); + buffer.replace(buffer.length() - index_str.length(), index_str.length(), index_str); + + return buffer; +} + + +int solve_SequentialPrint(const CommandParameters &command_parameters) +{ + clock_t start, finish; + + printf("Sequential scheduling/arranging ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + solver_configuration.object_group_size = command_parameters.object_group_size; + + PrinterGeometry printer_geometry; + + if (!command_parameters.printer_filename.empty()) + { + printf(" Loading printer geometry ...\n"); + int result = load_printer_geometry(command_parameters.printer_filename, printer_geometry); + + if (result != 0) + { + printf("Cannot load printer geometry (code: %d).\n", result); + return result; + } + solver_configuration.setup(printer_geometry); + printf(" Loading printer geometry ... finished\n"); + } + + std::vector objects_to_print = load_exported_data(command_parameters.input_filename); + + std::vector polygons; + std::vector > unreachable_polygons; + + printf(" Preparing objects ...\n"); + + map original_index_map; + + for (int i = 0; i < objects_to_print.size(); ++i) + { + Polygon nozzle_polygon; + Polygon extruder_polygon; + Polygon hose_polygon; + Polygon gantry_polygon; + + std::vector convex_level_polygons; + std::vector box_level_polygons; + + std::vector > extruder_convex_level_polygons; + std::vector > extruder_box_level_polygons; + + std::vector scale_down_unreachable_polygons; + + original_index_map[i] = objects_to_print[i].id; + + if (command_parameters.printer_filename.empty()) + { + for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + { + coord_t height = objects_to_print[i].pgns_at_height[j].first; + + if (!objects_to_print[i].pgns_at_height[j].second.points.empty()) + { + Polygon decimated_polygon; + //ground_PolygonByFirstPoint(objects_to_print[i].pgns_at_height[j].second); + + if (command_parameters.decimation) + { + if (command_parameters.precision) + { + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; + } + else + { + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_LOW; + } + decimate_PolygonForSequentialSolver(solver_configuration, + objects_to_print[i].pgns_at_height[j].second, + decimated_polygon); + } + else + { + decimated_polygon = objects_to_print[i].pgns_at_height[j].second; + decimated_polygon.make_counter_clockwise(); + } + if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + { + printf("Object too large to fit onto plate [ID:%d RID:%d].\n", original_index_map[i], i); + return -1; + } + + switch (height) + { + case 0: // nozzle + { + nozzle_polygon = decimated_polygon; + break; + } + case 2000000: // extruder + { + extruder_polygon = decimated_polygon; + break; + } + case 18000000: // hose + { + hose_polygon = decimated_polygon; + break; + } + case 26000000: // gantry + { + gantry_polygon = decimated_polygon; + break; + } + default: + { + throw std::runtime_error("UNSUPPORTED POLYGON HEIGHT"); + break; + } + } + } + } + + Polygon scale_down_polygon; + scaleDown_PolygonForSequentialSolver(nozzle_polygon, scale_down_polygon); + polygons.push_back(scale_down_polygon); + + convex_level_polygons.push_back(nozzle_polygon); + convex_level_polygons.push_back(extruder_polygon); + box_level_polygons.push_back(hose_polygon); + box_level_polygons.push_back(gantry_polygon); + + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK4, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4, + scale_down_unreachable_polygons); + + unreachable_polygons.push_back(scale_down_unreachable_polygons); + } + else + { + Polygon scale_down_object_polygon; + + prepare_ExtruderPolygons(solver_configuration, + printer_geometry, + objects_to_print[i], + convex_level_polygons, + box_level_polygons, + extruder_convex_level_polygons, + extruder_box_level_polygons); + + prepare_ObjectPolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + extruder_convex_level_polygons, + extruder_box_level_polygons, + scale_down_object_polygon, + scale_down_unreachable_polygons); + + unreachable_polygons.push_back(scale_down_unreachable_polygons); + polygons.push_back(scale_down_object_polygon); + } + + SVG preview_svg("sequential_prusa.svg"); + for (int k = 0; k < unreachable_polygons.back().size(); ++k) + { + Polygon display_unreachable_polygon = transform_UpsideDown(solver_configuration, SEQ_SVG_SCALE_FACTOR, scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, unreachable_polygons.back()[k], 0, 0)); + preview_svg.draw(display_unreachable_polygon, "lightgrey"); + } + /* + Polygon display_unreachable_polygon = scale_UP(polygons.back(), 0, 0); + preview_svg.draw(display_unreachable_polygon, "blue"); + */ + preview_svg.Close(); + } + + vector remaining_polygons; + vector polygon_index_map; + //vector original_index_map; + vector decided_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + printf(" Preparing objects ... finished\n"); + + int plate_index = 0; + + do + { + decided_polygons.clear(); + remaining_polygons.clear(); + + printf(" Object scheduling/arranging ...\n"); + bool optimized; + + if (command_parameters.assumptions) + { + optimized = optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + } + else + { + optimized = optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + } + + printf(" Object scheduling/arranging ... finished\n"); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", + original_index_map[decided_polygons[i]], + decided_polygons[i], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double(), + times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); + } + + std::map scheduled_polygons; + for (int i = 0; i < decided_polygons.size(); ++i) + { + scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); + } + + string output_filename; + + if (command_parameters.interactive) + { + output_filename = command_parameters.output_filename; + } + else + { + int suffix_position = command_parameters.output_filename.find("."); + + output_filename = command_parameters.output_filename.substr(0, suffix_position) + "_" + + convert_Index2Suffix(plate_index) + + command_parameters.output_filename.substr(suffix_position, command_parameters.output_filename.length()); + } + + save_import_data(output_filename, + scheduled_polygons, + original_index_map, + poly_positions_X, + poly_positions_Y); + + string svg_filename; + + if (command_parameters.interactive) + { + svg_filename = "sequential_prusa.svg"; + } + else + { + svg_filename = "sequential_prusa_" + convert_Index2Suffix(plate_index) + ".svg"; + } + + SVG preview_svg(svg_filename); + + if (!unreachable_polygons.empty()) + { + for (int i = 0; i < decided_polygons.size(); ++i) + { + for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + { + Polygon display_unreachable_polygon = transform_UpsideDown(solver_configuration, SEQ_SVG_SCALE_FACTOR, scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, + unreachable_polygons[decided_polygons[i]][j], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double())); + + string unreachable_color; + + switch(j % 8) + { + case 0: + { + unreachable_color = "lightgray"; + break; + } + case 1: + { + unreachable_color = "darkgray"; + break; + } + case 2: + { + unreachable_color = "dimgrey"; + break; + } + case 3: + { + unreachable_color = "silver"; + break; + } + case 4: + { + unreachable_color = "gainsboro"; + break; + } + case 5: + { + unreachable_color = "lavender"; + break; + } + case 6: + { + unreachable_color = "lavenderblush"; + break; + } + case 7: + { + unreachable_color = "beige"; + break; + } + default: + { + break; + } + } + preview_svg.draw(display_unreachable_polygon, unreachable_color); + } + } + } + + for (int i = 0; i < decided_polygons.size(); ++i) + { + Polygon display_polygon = transform_UpsideDown(solver_configuration, SEQ_SVG_SCALE_FACTOR, scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, + polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double())); + + string color; + + switch(i % 12) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + + case 7: + { + color = "rosybrown"; + break; + } + + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "firebrick"; + break; + } + case 11: + { + color = "violet"; + break; + } + case 12: + { + color = "midnightblue"; + break; + } + case 13: + { + color = "khaki"; + break; + } + case 14: + { + color = "darkslategrey"; + break; + } + case 15: + { + color = "hotpink"; + break; + } + + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + std::map::const_iterator scheduled_polygon = scheduled_polygons.begin(); + for (int i = 0; i < decided_polygons.size(); ++i, ++scheduled_polygon) + { + coord_t sx, sy, x, y; + + scaleUp_PositionForSlicer(SEQ_SVG_SCALE_FACTOR, + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double(), + sx, sy); + transform_UpsideDown(solver_configuration, SEQ_SVG_SCALE_FACTOR, sx, sy, x, y); + + string text_color; + + switch(i % 12) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + { + text_color = "black"; + break; + } + case 7: + { + text_color = "grey"; + break; + } + case 8: + case 9: + case 10: + case 11: + { + text_color = "black"; + break; + } + default: + { + break; + } + } + + preview_svg.draw_text(Point(x, y), ("ID:" + std::to_string(original_index_map[decided_polygons[i]]) + " T:" + std::to_string(times_T[decided_polygons[i]].as_int64())).c_str(), text_color.c_str()); + } + Polygon plate_polygon({ { 0, 0}, + { solver_configuration.maximum_X_bounding_box_size, 0 }, + { solver_configuration.maximum_X_bounding_box_size, solver_configuration.maximum_Y_bounding_box_size}, + { 0, solver_configuration.maximum_Y_bounding_box_size} }); + Polygon display_plate_polygon = scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, + plate_polygon, + 0, + 0); + preview_svg.draw_outline(display_plate_polygon, "black"); + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + finish = clock(); + printf("Intermediate CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + + if (!remaining_polygons.empty()) + { + printf("Some object did not fit into plate.\n"); + + if (command_parameters.interactive) + { + printf("Press ENTER to continue to the next plate ...\n"); + getchar(); + } + else + { + ++plate_index; + printf("Continuing to the next plate number %d ...\n", plate_index); + } + } + else + { + printf("All objects fit onto plate.\n"); + } + + vector next_polygons; + vector > next_unreachable_polygons; + + #ifdef DEBUG + { + for (int i = 0; i < polygon_index_map.size(); ++i) + { + printf(" %d\n", polygon_index_map[i]); + } + } + #endif + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + vector next_polygon_index_map; + //vector next_original_index_map; + map next_original_index_map; + + for (int index = 0; index < polygons.size(); ++index) + { + next_polygon_index_map.push_back(index); + next_original_index_map[index] = original_index_map[remaining_polygons[index]]; + } + polygon_index_map = next_polygon_index_map; + original_index_map = next_original_index_map; + } + while (!remaining_polygons.empty()); + + finish = clock(); + + printf("Sequential scheduling/arranging ... finished\n"); + printf("Total CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + + return 0; +} + + +/*----------------------------------------------------------------------------*/ +// main program + +int main(int argc, char **argv) +{ + int result; + CommandParameters command_parameters; + + print_IntroductoryMessage(); + + if (argc >= 1 && argc <= 10) + { + for (int i = 1; i < argc; ++i) + { + result = parse_CommandLineParameter(argv[i], command_parameters); + if (result < 0) + { + printf("Error: Cannot parse command line parameters (code = %d).\n", result); + print_Help(); + + return result; + } + } + if (command_parameters.help) + { + print_Help(); + } + else + { + result = solve_SequentialPrint(command_parameters); + if (result < 0) + { + return result; + } + } + } + else + { + print_Help(); + } + print_ConcludingMessage(); + + return 0; +} diff --git a/src/libseqarrange/src/sequential_prusa.hpp b/src/libseqarrange/src/sequential_prusa.hpp new file mode 100644 index 0000000000..0543a98c7d --- /dev/null +++ b/src/libseqarrange/src/sequential_prusa.hpp @@ -0,0 +1,65 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: sequential_prusa.hpp + * + * SEQUENTIAL 3D Print Scheduler|Arranger. + */ +/*================================================================*/ + +#ifndef __SEQUENTIAL_PRUSA_HPP__ +#define __SEQUENTIAL_PRUSA_HPP__ + +/*----------------------------------------------------------------*/ + +#include "seq_sequential.hpp" +#include "seq_preprocess.hpp" +#include "seq_interface.hpp" + + +/*----------------------------------------------------------------*/ + +struct CommandParameters +{ + CommandParameters() + : decimation(true) + , precision(true) + , assumptions(true) + , interactive(false) + , object_group_size(4) + , input_filename("arrange_data_export.txt") + , output_filename("arrange_data_import.txt") + , printer_filename("../printers/printer_geometry.mk4.compatibility.txt") + , help(false) + { + /* nothing */ + } + + bool decimation; + bool precision; + bool assumptions; + bool interactive; + int object_group_size; + + string input_filename; + string output_filename; + string printer_filename; + + bool help; +}; + + +/*----------------------------------------------------------------------------*/ + + void print_IntroductoryMessage(void); + void print_ConcludingMessage(void); + void print_Help(void); + + int parse_CommandLineParameter(const string ¶meter, CommandParameters ¶meters); + int solve_SequentialPrint(const CommandParameters &command_parameters); + +/*----------------------------------------------------------------*/ + +#endif /* __SEQUENTIAL_PRUSA_HPP__ */ diff --git a/src/libseqarrange/test/CMakeLists.txt b/src/libseqarrange/test/CMakeLists.txt new file mode 100644 index 0000000000..32c0d6964b --- /dev/null +++ b/src/libseqarrange/test/CMakeLists.txt @@ -0,0 +1,22 @@ +# Minimum required version of CMake +cmake_minimum_required(VERSION 3.10) + +# Set C++ standard and flags +set(CMAKE_CXX_STANDARD 17) + + +# add_executable(seq_test_arrangement seq_test_arrangement.cpp) +# target_link_libraries(seq_test_arrangement libseqarrange) + +add_executable(seq_test_polygon seq_test_polygon.cpp prusaparts.cpp) +target_link_libraries(seq_test_polygon libseqarrange) + +add_executable(seq_test_sequential seq_test_sequential.cpp) +target_link_libraries(seq_test_sequential libseqarrange) + +add_executable(seq_test_preprocess seq_test_preprocess.cpp prusaparts.cpp) +target_link_libraries(seq_test_preprocess libseqarrange) + +add_executable(seq_test_interface seq_test_interface.cpp) +target_link_libraries(seq_test_interface libseqarrange) + diff --git a/src/libseqarrange/test/prusaparts.cpp b/src/libseqarrange/test/prusaparts.cpp new file mode 100644 index 0000000000..72d5c7d9bc --- /dev/null +++ b/src/libseqarrange/test/prusaparts.cpp @@ -0,0 +1,5981 @@ +#include "prusaparts.hpp" + +const TestData PRUSA_PART_POLYGONS = +{ + { + {-5000000, 8954050}, + {5000000, 8954050}, + {5000000, -45949}, + {4972609, -568550}, + {3500000, -8954050}, + {-3500000, -8954050}, + {-4972609, -568550}, + {-5000000, -45949}, + {-5000000, 8954050}, + }, + { + {-63750000, -8000000}, + {-54750000, 46000000}, + {50750000, 46000000}, + {63750000, 33000000}, + {63750000, -46000000}, + {-54750000, -46000000}, + {-63750000, -28000000}, + {-63750000, -8000000}, + }, + { + {-52750000, 41512348}, + {-31250000, 45987651}, + {52750000, 45987651}, + {52750000, -45987651}, + {-52750000, -45987651}, + {-52750000, 41512348}, + }, + { + {-3900000, 14000000}, + {-2167950, 14000000}, + {1721454, 7263400}, + {3828529, 3613790}, + {3838809, 3582149}, + {3871560, 3270569}, + {3900000, 3000000}, + {3500000, -3000000}, + {3471560, -3270565}, + {3447549, -3498986}, + {3292510, -3976167}, + {3099999, -4512949}, + {2530129, -5500000}, + {807565, -8483570}, + {-2377349, -14000000}, + {-3900000, -14000000}, + {-3900000, 14000000}, + }, + { + {-31750000, -1000000}, + {-25250000, 40500000}, + {-18250000, 47500000}, + {10750000, 47500000}, + {16750000, 41500000}, + {31750000, -37000000}, + {31750000, -43857898}, + {28107900, -47500000}, + {18392099, -47500000}, + {-20750000, -46500000}, + {-31750000, -4000000}, + {-31750000, -1000000}, + }, + { + {-34625000, -14265399}, + {-10924999, 24875000}, + {33325000, 24875000}, + {37575000, 20625000}, + {37575000, 17625000}, + {26575000, -24875000}, + {-8924999, -24875000}, + {-34625000, -24484600}, + {-37575000, -19375000}, + {-34625000, -14265399}, + }, + { + {-14000000, 9000000}, + {-11000000, 17000000}, + {14000000, 17000000}, + {14000000, -17000000}, + {-11000000, -17000000}, + {-14000000, -8000000}, + {-14000000, 9000000}, + }, + { + {-5300000, 2227401}, + {-237800, 5150001}, + {5299999, 5150001}, + {5299999, 650001}, + {4699999, -5149997}, + {-5300000, -5149997}, + {-5300000, 2227401}, + }, + { + {-12000000, 18000000}, + {12000000, 18000000}, + {12000000, -18000000}, + {-12000000, -18000000}, + {-12000000, 18000000}, + }, + { + {-18000000, -1000000}, + {-15000000, 22000000}, + {-11000000, 26000000}, + {11000000, 26000000}, + {15000000, 22000000}, + {18000000, -1000000}, + {18000000, -26000000}, + {-18000000, -26000000}, + {-18000000, -1000000}, + }, + { + {-77500000, 30000000}, + {-72500000, 35000000}, + {72500000, 35000000}, + {77500000, 30000000}, + {77500000, -32928901}, + {75428901, -35000000}, + {-75428901, -35000000}, + {-77500000, -32928901}, + {-77500000, 30000000}, + }, + { + {-9945219, -3065619}, + {-9781479, -2031780}, + {-9510560, -1020730}, + {-9135450, -43529}, + {-2099999, 14110899}, + {2099999, 14110899}, + {9135450, -43529}, + {9510560, -1020730}, + {9781479, -2031780}, + {9945219, -3065619}, + {10000000, -4110899}, + {9945219, -5156179}, + {9781479, -6190019}, + {9510560, -7201069}, + {9135450, -8178270}, + {8660249, -9110899}, + {8090169, -9988750}, + {7431449, -10802209}, + {6691309, -11542349}, + {5877850, -12201069}, + {5000000, -12771149}, + {4067369, -13246350}, + {3090169, -13621459}, + {2079119, -13892379}, + {1045279, -14056119}, + {0, -14110899}, + {-1045279, -14056119}, + {-2079119, -13892379}, + {-3090169, -13621459}, + {-4067369, -13246350}, + {-5000000, -12771149}, + {-5877850, -12201069}, + {-6691309, -11542349}, + {-7431449, -10802209}, + {-8090169, -9988750}, + {-8660249, -9110899}, + {-9135450, -8178270}, + {-9510560, -7201069}, + {-9781479, -6190019}, + {-9945219, -5156179}, + {-10000000, -4110899}, + {-9945219, -3065619}, + }, + { + {-34192394, -5192389}, + {-31499996, 39000000}, + {-8183795, 47668998}, + {-6769596, 47668998}, + {-4648197, 45547698}, + {34192394, 6707109}, + {34192394, 5192389}, + {31500003, -39000000}, + {8183803, -47668998}, + {6769603, -47668998}, + {4648202, -45547698}, + {-32474895, -8424619}, + {-34192394, -6707109}, + {-34192394, -5192389}, + }, + { + {-23475500, -11910099}, + {-18000000, 8217699}, + {-11139699, 20100000}, + {-10271400, 20899999}, + {9532010, 20899999}, + {11199999, 20100000}, + {18500000, 8600000}, + {23475500, -11910099}, + {23799999, -14899999}, + {23706600, -15788900}, + {23668899, -16147499}, + {23281299, -17340400}, + {22654100, -18426700}, + {21814800, -19358900}, + {20799999, -20096199}, + {19654100, -20606300}, + {18427200, -20867099}, + {17799999, -20899999}, + {-17799999, -20899999}, + {-18427200, -20867099}, + {-19654100, -20606300}, + {-20799999, -20096199}, + {-21814800, -19358900}, + {-22654100, -18426700}, + {-23281299, -17340400}, + {-23668899, -16147499}, + {-23799999, -14899999}, + {-23475500, -11910099}, + }, + { + {-32000000, 10000000}, + {-31934440, 10623733}, + {-31740640, 11220210}, + {-31427049, 11763360}, + {-31007389, 12229430}, + {-30500000, 12598079}, + {-29927051, 12853170}, + {-29313585, 12983570}, + {16000000, 16000000}, + {26000000, 16000000}, + {31007400, 12229430}, + {31427101, 11763360}, + {31740600, 11220210}, + {31934398, 10623733}, + {32000000, 10000000}, + {32000000, -13000000}, + {31934398, -13623699}, + {31740600, -14220199}, + {31427101, -14763399}, + {31007400, -15229400}, + {30500000, -15598100}, + {29927101, -15853200}, + {29313598, -15983600}, + {29000000, -16000000}, + {-28000000, -16000000}, + {-29313585, -15983600}, + {-29927051, -15853200}, + {-30500000, -15598100}, + {-31007389, -15229400}, + {-31427049, -14763399}, + {-31740640, -14220199}, + {-31934440, -13623699}, + {-32000000, -13000000}, + {-32000000, 10000000}, + }, + { + {-36133789, -46431022}, + {-36040100, -46171817}, + {-35852722, -45653411}, + {2200073, 59616485}, + {12112792, 87039184}, + {14274505, 93019332}, + {14382049, 93291641}, + {14508483, 93563430}, + {14573425, 93688369}, + {14654052, 93832443}, + {14818634, 94096328}, + {14982757, 94327621}, + {15001708, 94352630}, + {15202392, 94598999}, + {15419342, 94833160}, + {15497497, 94910552}, + {15650848, 95053039}, + {15894866, 95256866}, + {16104309, 95412185}, + {16149047, 95443206}, + {16410888, 95611038}, + {16677795, 95759750}, + {16782348, 95812332}, + {16947143, 95889144}, + {17216400, 95999465}, + {17483123, 96091293}, + {17505554, 96098251}, + {17745178, 96165542}, + {18000671, 96223373}, + {18245880, 96265884}, + {18484039, 96295257}, + {18976715, 96319580}, + {31135131, 96319580}, + {31697082, 96287902}, + {31746368, 96282104}, + {32263000, 96190719}, + {32338623, 96172576}, + {32821411, 96026641}, + {32906188, 95995391}, + {33360565, 95797012}, + {33443420, 95754882}, + {33869171, 95505874}, + {33900756, 95485122}, + {34136413, 95318618}, + {34337127, 95159790}, + {34377288, 95125930}, + {34619628, 94905410}, + {34756286, 94767364}, + {34859008, 94656143}, + {35090606, 94378067}, + {35120849, 94338546}, + {35309295, 94072113}, + {35434875, 93871475}, + {35510070, 93740310}, + {35688232, 93385772}, + {35699096, 93361679}, + {35839782, 93012557}, + {35905487, 92817459}, + {35961578, 92625488}, + {36048004, 92249023}, + {36051574, 92229934}, + {36108856, 91831405}, + {36122985, 91667816}, + {36133789, 91435317}, + {36129669, 91085830}, + {36127685, 91046661}, + {36092742, 90669830}, + {36069946, 90514739}, + {36031829, 90308425}, + {35948211, 89965225}, + {34482635, 84756820}, + {27911407, 61403976}, + {-5872558, -58657440}, + {-14243621, -88406509}, + {-14576812, -89590599}, + {-15421997, -92594200}, + {-15657684, -93431732}, + {-16038940, -93720520}, + {-16420196, -94009307}, + {-17182708, -94586875}, + {-18834838, -95838272}, + {-19470275, -96319580}, + {-21368133, -96319580}, + {-22763854, -96319534}, + {-29742462, -96319274}, + {-32533935, -96319168}, + {-36133789, -54619018}, + {-36133789, -46431022}, + }, + { + {-26000000, 25500000}, + {-6500000, 45000000}, + {17499998, 45000000}, + {23966310, 38533699}, + {26000000, 36500000}, + {26000000, -19000000}, + {25950000, -24500000}, + {17000000, -42214698}, + {14300000, -45000000}, + {-14299999, -45000000}, + {-17500000, -41714698}, + {-23400001, -24500000}, + {-26000000, -10464000}, + {-26000000, 25500000}, + }, + { + {-26000000, 16636100}, + {-25072200, 18777799}, + {-16500000, 35299999}, + {-15050000, 36750000}, + {13550000, 36750000}, + {15000000, 35299999}, + {26000000, 16045200}, + {26000000, -2750000}, + {16500000, -34507900}, + {14840600, -36167301}, + {14257900, -36750000}, + {-14257900, -36750000}, + {-16500000, -34507900}, + {-26000000, -2750000}, + {-26000000, 16636100}, + }, + { + {-18062349, 18950099}, + {4644938, 20049900}, + {6230361, 20049900}, + {7803279, 19851200}, + {9338899, 19456899}, + {10812990, 18873300}, + {12202310, 18109500}, + {13484951, 17177600}, + {14640670, 16092300}, + {15651250, 14870700}, + {16500749, 13532100}, + {17175849, 12097599}, + {17665750, 10589700}, + {17962850, 9032400}, + {18062349, 7450099}, + {17962850, 5867799}, + {15810750, -11007740}, + {15683750, -11727769}, + {15506849, -12437200}, + {15280929, -13132559}, + {15007040, -13810470}, + {14686531, -14467609}, + {14320949, -15100799}, + {13912099, -15706950}, + {13461959, -16283100}, + {12972730, -16826450}, + {12446790, -17334339}, + {11886699, -17804309}, + {11295190, -18234069}, + {10675149, -18621520}, + {10029590, -18964771}, + {9361650, -19262149}, + {8674600, -19512220}, + {7971780, -19713699}, + {7256609, -19865798}, + {6532589, -19967498}, + {5803222, -20018501}, + {5437650, -20024900}, + {-1062349, -20049900}, + {-16562349, -20049900}, + {-18062349, -18549900}, + {-18062349, 18950099}, + }, + { + {-18062349, 41299900}, + {-1062349, 41299900}, + {15280929, -8117440}, + {15506849, -8812799}, + {15683750, -9522230}, + {15810750, -10242259}, + {17962850, -27117799}, + {18062349, -28700099}, + {17962850, -30282400}, + {17665750, -31839700}, + {17175849, -33347599}, + {16500749, -34782100}, + {15651250, -36120700}, + {14640670, -37342300}, + {13484951, -38427600}, + {12202310, -39359500}, + {10812990, -40123298}, + {9338899, -40706901}, + {7803279, -41101200}, + {6230361, -41299900}, + {4644938, -41299900}, + {-18062349, -40200099}, + {-18062349, 41299900}, + }, + { + {-11750000, 13057900}, + {-9807860, 15000000}, + {4392139, 24000000}, + {11750000, 24000000}, + {11750000, -24000000}, + {4392139, -24000000}, + {-9807860, -15000000}, + {-11750000, -13057900}, + {-11750000, 13057900}, + }, + { + {-12500000, 17500000}, + {12500000, 17500000}, + {12500000, -17500000}, + {-12500000, -17500000}, + {-12500000, 17500000}, + }, + { + {-23500000, 11500000}, + {-13857859, 21000000}, + {-11000000, 21000000}, + {18500000, 500000}, + {23500000, -4500000}, + {23500000, -19500000}, + {22000000, -21000000}, + {-23500000, -21000000}, + {-23500000, 11500000}, + }, + { + {-13000000, 5250000}, + {-4000000, 6750000}, + {4000000, 6750000}, + {13000000, 5250000}, + {13000000, 838459}, + {11376299, -1973939}, + {10350899, -3750000}, + {8618800, -6750000}, + {-8498290, -6750000}, + {-13000000, 1047180}, + {-13000000, 5250000}, + }, + { + {-25000000, 50500000}, + {-21500000, 54000000}, + {18286800, 54000000}, + {25000000, 47286800}, + {25000000, -47286800}, + {18286800, -54000000}, + {-21500000, -54000000}, + {-25000000, -50500000}, + {-25000000, 50500000}, + }, + { + {-19000000, 46000000}, + {-16799999, 46000000}, + {14000000, 34000000}, + {19000000, 29000000}, + {19000000, -29000000}, + {14000000, -34000000}, + {-16799999, -46000000}, + {-19000000, -46000000}, + {-19000000, 46000000}, + }, + { + {-7956170, 836226}, + {-7825180, 1663290}, + {-7767529, 1914530}, + {-7608449, 2472140}, + {-7308360, 3253890}, + {-7083650, 3717780}, + {-6928199, 4000000}, + {-6472139, 4702280}, + {-5988090, 5304979}, + {-5945159, 5353040}, + {-5353040, 5945159}, + {-4702280, 6472139}, + {-4544519, 6583869}, + {-4000000, 6928199}, + {-3253890, 7308360}, + {-2836839, 7480130}, + {-2472140, 7608449}, + {-1663290, 7825180}, + {-964293, 7941669}, + {-836226, 7956170}, + {0, 8000000}, + {836226, 7956170}, + {964293, 7941669}, + {1663290, 7825180}, + {2472140, 7608449}, + {2836839, 7480130}, + {3253890, 7308360}, + {4000000, 6928199}, + {4544519, 6583869}, + {4702280, 6472139}, + {5353040, 5945159}, + {5945159, 5353040}, + {5988090, 5304979}, + {6472139, 4702280}, + {6928199, 4000000}, + {7083650, 3717780}, + {7308360, 3253890}, + {7608449, 2472140}, + {7767529, 1914530}, + {7825180, 1663290}, + {7956170, 836226}, + {8000000, 0}, + {7956170, -836226}, + {7825180, -1663290}, + {7767529, -1914530}, + {7608449, -2472140}, + {7308360, -3253890}, + {7083650, -3717780}, + {6928199, -4000000}, + {6472139, -4702280}, + {5988090, -5304979}, + {5945159, -5353040}, + {5353040, -5945159}, + {4702280, -6472139}, + {4544519, -6583869}, + {4000000, -6928199}, + {3253890, -7308360}, + {2836839, -7480130}, + {2472140, -7608449}, + {1663290, -7825180}, + {964293, -7941669}, + {836226, -7956170}, + {0, -8000000}, + {-836226, -7956170}, + {-964293, -7941669}, + {-1663290, -7825180}, + {-2472140, -7608449}, + {-2836839, -7480130}, + {-3253890, -7308360}, + {-4000000, -6928199}, + {-4544519, -6583869}, + {-4702280, -6472139}, + {-5353040, -5945159}, + {-5945159, -5353040}, + {-5988090, -5304979}, + {-6472139, -4702280}, + {-6928199, -4000000}, + {-7083650, -3717780}, + {-7308360, -3253890}, + {-7608449, -2472140}, + {-7767529, -1914530}, + {-7825180, -1663290}, + {-7956170, -836226}, + {-8000000, 0}, + {-7956170, 836226}, + }, +}; + +const TestData PRUSA_STEGOSAUR_POLYGONS = +{ + { + {113210205, 107034095}, + {113561798, 109153793}, + {113750099, 109914001}, + {114396499, 111040199}, + {114599197, 111321998}, + {115570404, 112657096}, + {116920097, 114166595}, + {117630599, 114609390}, + {119703704, 115583900}, + {120559494, 115811996}, + {121045410, 115754493}, + {122698097, 115526496}, + {123373001, 115370193}, + {123482406, 115315689}, + {125664199, 114129798}, + {125920303, 113968193}, + {128551208, 111866195}, + {129075592, 111443199}, + {135044692, 106572608}, + {135254898, 106347694}, + {135415100, 106102897}, + {136121704, 103779891}, + {136325103, 103086303}, + {136690093, 101284896}, + {136798309, 97568496}, + {136798309, 97470397}, + {136787399, 97375297}, + {136753295, 97272102}, + {136687988, 97158699}, + {136539794, 96946899}, + {135526702, 95550994}, + {135388488, 95382293}, + {135272491, 95279098}, + {135214904, 95250595}, + {135122894, 95218002}, + {134966705, 95165191}, + {131753997, 94380798}, + {131226806, 94331001}, + {129603393, 94193893}, + {129224197, 94188003}, + {127874107, 94215103}, + {126812797, 94690200}, + {126558197, 94813896}, + {118361801, 99824195}, + {116550796, 101078796}, + {116189704, 101380493}, + {114634002, 103027999}, + {114118103, 103820297}, + {113399200, 105568000}, + {113201705, 106093597}, + {113210205, 107034095}, + }, + { + {77917999, 130563003}, + {77926300, 131300903}, + {77990196, 132392700}, + {78144195, 133328002}, + {78170593, 133427093}, + {78235900, 133657592}, + {78799598, 135466705}, + {78933296, 135832397}, + {79112899, 136247604}, + {79336303, 136670898}, + {79585197, 137080596}, + {79726303, 137309005}, + {79820297, 137431900}, + {79942199, 137549407}, + {90329193, 145990203}, + {90460197, 146094390}, + {90606399, 146184509}, + {90715194, 146230010}, + {90919601, 146267211}, + {142335296, 153077697}, + {143460296, 153153594}, + {143976593, 153182189}, + {145403991, 153148605}, + {145562301, 153131195}, + {145705993, 153102905}, + {145938796, 153053192}, + {146134094, 153010101}, + {146483184, 152920196}, + {146904693, 152806396}, + {147180099, 152670196}, + {147357788, 152581695}, + {147615295, 152423095}, + {147782287, 152294708}, + {149281799, 150908386}, + {149405303, 150784912}, + {166569305, 126952499}, + {166784301, 126638099}, + {166938491, 126393699}, + {167030899, 126245101}, + {167173004, 126015899}, + {167415298, 125607200}, + {167468292, 125504699}, + {167553100, 125320899}, + {167584594, 125250694}, + {167684997, 125004394}, + {167807098, 124672401}, + {167938995, 124255203}, + {168052307, 123694000}, + {170094100, 112846900}, + {170118408, 112684204}, + {172079101, 88437797}, + {172082000, 88294403}, + {171916290, 82827606}, + {171911590, 82705703}, + {171874893, 82641906}, + {169867004, 79529907}, + {155996795, 58147998}, + {155904998, 58066299}, + {155864791, 58054199}, + {134315704, 56830902}, + {134086486, 56817901}, + {98200096, 56817798}, + {97838195, 56818599}, + {79401695, 56865097}, + {79291297, 56865501}, + {79180694, 56869499}, + {79058799, 56885097}, + {78937301, 56965301}, + {78324691, 57374599}, + {77932998, 57638401}, + {77917999, 57764297}, + {77917999, 130563003}, + }, + { + {75566848, 109289947}, + {75592651, 109421951}, + {75644248, 109534446}, + {95210548, 141223846}, + {95262649, 141307449}, + {95487854, 141401443}, + {95910850, 141511642}, + {96105651, 141550338}, + {106015045, 142803451}, + {106142852, 142815155}, + {166897460, 139500244}, + {167019348, 139484741}, + {168008239, 138823043}, + {168137542, 138735153}, + {168156250, 138616851}, + {173160751, 98882049}, + {174381546, 87916046}, + {174412246, 87579048}, + {174429443, 86988746}, + {174436141, 86297348}, + {174438949, 84912048}, + {174262939, 80999145}, + {174172546, 80477546}, + {173847549, 79140846}, + {173623840, 78294349}, + {173120239, 76485046}, + {173067138, 76300544}, + {173017852, 76137542}, + {172941543, 75903045}, + {172892547, 75753143}, + {172813537, 75533348}, + {172758453, 75387046}, + {172307556, 74196746}, + {171926544, 73192848}, + {171891448, 73100448}, + {171672546, 72524147}, + {171502441, 72085144}, + {171414459, 71859146}, + {171294250, 71552352}, + {171080139, 71019744}, + {171039245, 70928146}, + {170970550, 70813346}, + {170904235, 70704040}, + {170786254, 70524353}, + {168063247, 67259048}, + {167989547, 67184844}, + {83427947, 67184844}, + {78360847, 67201248}, + {78238845, 67220550}, + {78151550, 67350547}, + {77574554, 68220550}, + {77494949, 68342651}, + {77479949, 68464546}, + {75648345, 106513351}, + {75561050, 109165740}, + {75566848, 109289947}, + }, + { + {75619415, 108041595}, + {83609863, 134885772}, + {83806945, 135450820}, + {83943908, 135727371}, + {84799934, 137289794}, + {86547897, 140033782}, + {86674118, 140192962}, + {86810661, 140364715}, + {87045211, 140619918}, + {88187042, 141853240}, + {93924575, 147393783}, + {94058013, 147454803}, + {111640083, 153754562}, + {111762550, 153787933}, + {111975250, 153835311}, + {112127426, 153842803}, + {116797996, 154005157}, + {116969688, 154010681}, + {117141731, 154005935}, + {117333145, 153988037}, + {118007507, 153919952}, + {118159675, 153902130}, + {118931480, 153771942}, + {120878150, 153379089}, + {121172164, 153319259}, + {122074508, 153034362}, + {122260681, 152970367}, + {122313438, 152949584}, + {130755096, 149423736}, + {130996063, 149316818}, + {138893524, 144469665}, + {138896423, 144466918}, + {169883666, 97686134}, + {170115036, 96518981}, + {170144317, 96365257}, + {174395645, 67672065}, + {174396560, 67664222}, + {174288452, 66839241}, + {174170364, 66096923}, + {174112731, 65952033}, + {174021377, 65823486}, + {173948608, 65743225}, + {173863830, 65654769}, + {170408340, 63627494}, + {170004867, 63394714}, + {169585632, 63194389}, + {169441162, 63137046}, + {168944274, 62952133}, + {160605072, 60214218}, + {160331573, 60126396}, + {159674743, 59916877}, + {150337249, 56943778}, + {150267730, 56922073}, + {150080139, 56864868}, + {149435333, 56676422}, + {149310241, 56640579}, + {148055419, 56285041}, + {147828796, 56230949}, + {147598205, 56181800}, + {147149963, 56093917}, + {146834457, 56044700}, + {146727966, 56028717}, + {146519729, 56004882}, + {146328521, 55989326}, + {146170684, 55990036}, + {146151321, 55990745}, + {145800170, 56003616}, + {145639526, 56017753}, + {145599426, 56022491}, + {145481338, 56039184}, + {145389556, 56052757}, + {145325134, 56062591}, + {145176574, 56086135}, + {145017272, 56113922}, + {107163085, 63504539}, + {101013870, 65454101}, + {100921798, 65535285}, + {95362182, 74174079}, + {75652366, 107803443}, + {75635391, 107834983}, + {75628814, 107853294}, + {75603431, 107933692}, + {75619415, 108041595}, + }, + { + {83617141, 120264900}, + {84617370, 126416427}, + {84648635, 126601341}, + {84693695, 126816085}, + {84762496, 127082641}, + {84772140, 127117034}, + {84860748, 127391693}, + {84927398, 127550239}, + {85072967, 127789642}, + {85155151, 127908851}, + {86745422, 130042907}, + {86982666, 130317489}, + {89975143, 133230743}, + {90091384, 133338500}, + {96260833, 138719818}, + {96713928, 139103668}, + {98139297, 140307388}, + {102104766, 143511505}, + {102142089, 143536468}, + {102457626, 143735107}, + {103386764, 144312988}, + {103845001, 144579177}, + {104139175, 144737136}, + {104551254, 144932250}, + {104690155, 144985778}, + {104844238, 145010009}, + {105020034, 145010375}, + {128999633, 144082305}, + {129096542, 144076141}, + {133932327, 143370178}, + {134130615, 143326751}, + {134281250, 143289520}, + {135247116, 142993438}, + {150774948, 137828704}, + {150893478, 137786178}, + {151350921, 137608901}, + {159797760, 134318115}, + {159979827, 134244384}, + {159988128, 134240997}, + {160035186, 134221633}, + {160054962, 134211486}, + {160168762, 134132736}, + {160181228, 134121047}, + {160336425, 133961502}, + {160689147, 133564331}, + {161446258, 132710739}, + {163306427, 130611648}, + {164845474, 128873855}, + {165270233, 128393600}, + {165281478, 128380706}, + {165300598, 128358673}, + {165303497, 128355194}, + {166411590, 122772674}, + {166423767, 122708648}, + {164745605, 66237312}, + {164740341, 66193061}, + {164721755, 66082092}, + {164721160, 66078750}, + {164688476, 65914146}, + {164668426, 65859436}, + {164563110, 65765937}, + {164431152, 65715034}, + {163997619, 65550788}, + {163946426, 65531440}, + {162998107, 65173629}, + {162664978, 65049140}, + {162482696, 64991668}, + {162464660, 64989639}, + {148029083, 66896141}, + {147862396, 66932853}, + {130087829, 73341102}, + {129791564, 73469726}, + {100590927, 90307685}, + {100483535, 90373847}, + {100364990, 90458930}, + {96447448, 93276664}, + {95179656, 94189010}, + {93692718, 95260208}, + {87904327, 99430885}, + {87663711, 99606147}, + {87576202, 99683990}, + {87498199, 99801719}, + {85740264, 104173728}, + {85538925, 104710494}, + {84786132, 107265830}, + {84635955, 107801383}, + {84619506, 107868064}, + {84518463, 108287200}, + {84456848, 108613471}, + {84419158, 108826194}, + {84375244, 109093818}, + {84329818, 109435180}, + {84249862, 110179664}, + {84218429, 110572166}, + {83630020, 117995208}, + {83595535, 118787673}, + {83576217, 119290679}, + {83617141, 120264900}, + }, + { + {91735549, 117640846}, + {91748252, 117958145}, + {91823547, 118515449}, + {92088752, 119477249}, + {97995346, 140538452}, + {98031051, 140660446}, + {98154449, 141060241}, + {98179855, 141133758}, + {98217056, 141232849}, + {98217147, 141233047}, + {98269256, 141337051}, + {98298950, 141387954}, + {98337753, 141445755}, + {99455047, 142984451}, + {99656250, 143247344}, + {102567855, 146783752}, + {102685150, 146906845}, + {102828948, 147031250}, + {102972457, 147120452}, + {103676147, 147539642}, + {103758956, 147586151}, + {103956756, 147682144}, + {104479949, 147931457}, + {104744453, 148044143}, + {104994750, 148123443}, + {105375648, 148158645}, + {109266250, 148178253}, + {109447753, 148169052}, + {109693649, 148129150}, + {113729949, 147337448}, + {113884552, 147303054}, + {115155349, 146956146}, + {117637145, 146174346}, + {154694046, 134048049}, + {156979949, 133128555}, + {157076843, 133059356}, + {157125045, 133001449}, + {157561340, 132300750}, + {157865753, 131795959}, + {157923156, 131667358}, + {158007049, 131297653}, + {158112747, 130777053}, + {158116653, 130640853}, + {158268951, 119981643}, + {158260040, 119824752}, + {158229949, 119563751}, + {149914047, 73458648}, + {149877548, 73331748}, + {144460754, 66413558}, + {144230545, 66153152}, + {144128051, 66075057}, + {143974853, 65973152}, + {142812744, 65353149}, + {141810943, 64837249}, + {141683349, 64805152}, + {141505157, 64784652}, + {108214355, 61896251}, + {107826354, 61866352}, + {107072151, 61821750}, + {106938850, 61873550}, + {106584251, 62055152}, + {106419952, 62147548}, + {100459152, 65546951}, + {100343849, 65615150}, + {100198852, 65716949}, + {99825149, 65979751}, + {94619247, 70330352}, + {94492355, 70480850}, + {94445846, 70547355}, + {94425354, 70588752}, + {94379753, 70687652}, + {94110252, 71443450}, + {94095252, 71569053}, + {91737251, 117308746}, + {91731048, 117430946}, + {91735549, 117640846}, + }, + { + {108231399, 111763748}, + {108335403, 111927955}, + {108865203, 112754745}, + {109206703, 113283851}, + {127117500, 125545951}, + {127212097, 125560951}, + {127358497, 125563652}, + {131348007, 125551147}, + {131412002, 125550849}, + {131509506, 125535446}, + {131579391, 125431343}, + {132041000, 124735656}, + {132104690, 124637847}, + {144108505, 100950546}, + {144120605, 100853042}, + {144123291, 100764648}, + {144122695, 100475143}, + {144086898, 85637748}, + {144083602, 85549346}, + {144071105, 85451843}, + {144007003, 85354545}, + {143679595, 84864547}, + {143468597, 84551048}, + {143367889, 84539146}, + {109847702, 84436347}, + {109684700, 84458953}, + {105946502, 89406143}, + {105915901, 91160446}, + {105880905, 93187744}, + {105876701, 93441345}, + {108231399, 111763748}, + }, + { + {102614700, 117684249}, + {102675102, 118074157}, + {102888999, 118743148}, + {103199707, 119517555}, + {103446800, 120099655}, + {103488204, 120193450}, + {104063903, 121373947}, + {104535499, 122192245}, + {104595802, 122295249}, + {104663002, 122402854}, + {104945701, 122854858}, + {105740501, 124038848}, + {106809700, 125479354}, + {107564399, 126380050}, + {108116203, 126975646}, + {123724700, 142516540}, + {124938400, 143705444}, + {127919601, 146599243}, + {128150894, 146821456}, + {128251602, 146917251}, + {128383605, 147041839}, + {128527709, 147176147}, + {128685699, 147321456}, + {128861007, 147481246}, + {132825103, 151046661}, + {133005493, 151205657}, + {133389007, 151488143}, + {133896499, 151858062}, + {134172302, 151991546}, + {134375000, 152063140}, + {135316101, 152300949}, + {136056304, 152220947}, + {136242706, 152186843}, + {136622207, 152016448}, + {136805404, 151908355}, + {147099594, 145766845}, + {147246704, 144900756}, + {147387603, 144048461}, + {144353698, 99345855}, + {144333801, 99232254}, + {144244598, 98812850}, + {144228698, 98757858}, + {144174606, 98616455}, + {133010101, 72396743}, + {132018905, 70280853}, + {130667404, 67536949}, + {129167297, 64854446}, + {128569198, 64098350}, + {124458503, 59135948}, + {124260597, 58946949}, + {123908706, 58658851}, + {123460098, 58327850}, + {122674499, 57840648}, + {122041801, 57712150}, + {121613403, 57699047}, + {121359901, 57749351}, + {121123199, 57826450}, + {120953498, 57882247}, + {120431701, 58198547}, + {120099205, 58599349}, + {119892303, 58903049}, + {102835296, 115179351}, + {102686599, 115817245}, + {102612396, 116540557}, + {102614700, 117684249}, + }, + { + {98163757, 71203430}, + {98212463, 73314544}, + {98326538, 74432693}, + {98402908, 75169799}, + {98524154, 76328353}, + {99088806, 79911361}, + {99304885, 80947769}, + {100106689, 84244186}, + {100358123, 85080337}, + {101715545, 89252807}, + {101969528, 89987213}, + {107989440, 106391418}, + {126299575, 140277343}, + {127061813, 141486663}, + {127405746, 141872253}, + {127846908, 142318450}, + {130818496, 145301574}, + {134366424, 148100921}, + {135308380, 148798828}, + {135745666, 149117523}, + {136033020, 149251800}, + {136500579, 149387725}, + {136662719, 149418395}, + {136973922, 149474822}, + {137184890, 149484375}, + {137623748, 149434356}, + {137830810, 149355072}, + {138681732, 148971343}, + {139374465, 148463409}, + {139589187, 148264312}, + {139809707, 148010711}, + {139985610, 147685028}, + {140196029, 147284973}, + {140355834, 146978668}, + {142079666, 142575622}, + {146702194, 129469726}, + {151285888, 113275238}, + {151543731, 112046264}, + {151701629, 110884704}, + {151837020, 108986206}, + {151837097, 107724029}, + {151760101, 106529205}, + {151581970, 105441925}, + {151577301, 105413757}, + {151495269, 105014709}, + {151393142, 104551513}, + {151058502, 103296112}, + {150705520, 102477264}, + {150137725, 101686370}, + {149427032, 100938537}, + {102979965, 60772064}, + {101930953, 60515609}, + {101276748, 60634414}, + {100717803, 60918136}, + {100125732, 61584625}, + {99618148, 62413436}, + {99457214, 62709442}, + {99368347, 62914794}, + {99166992, 63728332}, + {98313827, 69634780}, + {98176910, 70615707}, + {98162902, 70798233}, + {98163757, 71203430}, + }, + { + {79090698, 116426399}, + {80959800, 137087692}, + {81030303, 137762298}, + {81190704, 138903503}, + {81253700, 139084197}, + {81479301, 139544998}, + {81952003, 140118896}, + {82319900, 140523895}, + {82967803, 140993896}, + {83022903, 141032104}, + {83777900, 141493606}, + {84722099, 141849899}, + {84944396, 141887207}, + {86144699, 141915893}, + {87643997, 141938095}, + {88277503, 141887695}, + {88582099, 141840606}, + {89395401, 141712203}, + {90531204, 141528396}, + {91014801, 141438400}, + {92097595, 141190093}, + {123348297, 132876998}, + {123399505, 132860000}, + {123452804, 132841506}, + {123515502, 132818908}, + {123543800, 132806198}, + {124299598, 132437393}, + {124975502, 132042098}, + {125047500, 131992202}, + {125119506, 131930603}, + {166848800, 86317703}, + {168976409, 83524902}, + {169359603, 82932701}, + {169852600, 81917800}, + {170686904, 79771202}, + {170829406, 79245597}, + {170885498, 78796295}, + {170909301, 78531898}, + {170899703, 78238700}, + {170842803, 77553199}, + {170701293, 76723495}, + {170302307, 75753898}, + {169924301, 75067398}, + {169359802, 74578796}, + {168148605, 73757499}, + {163261596, 71124702}, + {162986007, 70977798}, + {162248703, 70599098}, + {158193405, 68923995}, + {157514297, 68667495}, + {156892700, 68495201}, + {156607299, 68432998}, + {154301895, 68061904}, + {93440299, 68061904}, + {88732002, 68255996}, + {88627304, 68298500}, + {88111396, 68541900}, + {86393898, 69555404}, + {86138298, 69706695}, + {85871704, 69913200}, + {85387199, 70393402}, + {79854499, 76783203}, + {79209701, 77649398}, + {79108505, 78072502}, + {79090698, 78472198}, + {79090698, 116426399}, + }, + { + {90956314, 84639938}, + {91073814, 85141891}, + {91185752, 85505371}, + {109815368, 137196487}, + {110342590, 138349899}, + {110388549, 138447540}, + {110652862, 138971343}, + {110918045, 139341140}, + {114380859, 143159042}, + {114446723, 143220352}, + {114652198, 143392166}, + {114712196, 143437301}, + {114782165, 143476028}, + {114873054, 143514923}, + {115217086, 143660934}, + {115306060, 143695526}, + {115344009, 143707580}, + {115444541, 143737747}, + {115589378, 143779937}, + {115751358, 143823989}, + {115802780, 143825820}, + {116872810, 143753616}, + {116927055, 143744644}, + {154690734, 133504180}, + {155009704, 133371856}, + {155029907, 133360061}, + {155089141, 133323181}, + {155342315, 133163360}, + {155602294, 132941406}, + {155669158, 132880294}, + {155821624, 132737884}, + {155898986, 132656890}, + {155934936, 132608932}, + {155968627, 132562713}, + {156062896, 132431808}, + {156111694, 132363174}, + {156148147, 132297180}, + {158738342, 127281066}, + {159026672, 126378631}, + {159073699, 125806335}, + {159048522, 125299743}, + {159040313, 125192901}, + {158898300, 123934677}, + {149829376, 70241508}, + {149763031, 69910629}, + {149684692, 69628723}, + {149557800, 69206214}, + {149366485, 68864326}, + {149137390, 68578514}, + {148637466, 68048767}, + {147027725, 66632934}, + {146228607, 66257507}, + {146061309, 66184646}, + {146017929, 66174186}, + {145236465, 66269500}, + {144802490, 66345039}, + {144673995, 66376220}, + {93732284, 79649864}, + {93345336, 79785865}, + {93208084, 79840286}, + {92814521, 79997779}, + {92591087, 80098968}, + {92567016, 80110511}, + {92032684, 80860725}, + {91988853, 80930152}, + {91471725, 82210029}, + {91142349, 83076683}, + {90969284, 83653182}, + {90929664, 84043212}, + {90926315, 84325256}, + {90956314, 84639938}, + }, + { + {114758499, 88719909}, + {114771591, 88860549}, + {115515533, 94195907}, + {115559539, 94383651}, + {119882980, 109502059}, + {120660522, 111909683}, + {126147735, 124949630}, + {127127212, 127107215}, + {129976379, 132117279}, + {130754470, 133257080}, + {130820968, 133340835}, + {130889312, 133423858}, + {131094787, 133652832}, + {131257629, 133828247}, + {131678619, 134164276}, + {131791107, 134248901}, + {131969482, 134335189}, + {132054107, 134373718}, + {132927368, 134701141}, + {133077072, 134749313}, + {133196075, 134785705}, + {133345230, 134804351}, + {133498809, 134809051}, + {133611541, 134797607}, + {134621170, 134565322}, + {134741165, 134527511}, + {134892089, 134465240}, + {135071212, 134353820}, + {135252029, 134185821}, + {135384979, 134003631}, + {135615585, 133576675}, + {135793029, 132859008}, + {135890228, 131382904}, + {135880828, 131261657}, + {135837570, 130787963}, + {135380661, 127428909}, + {132830596, 109495368}, + {132815826, 109411666}, + {132765869, 109199302}, + {132724380, 109068161}, + {127490066, 93353515}, + {125330810, 87852828}, + {125248336, 87647026}, + {125002182, 87088424}, + {124894592, 86872482}, + {121007278, 80019584}, + {120962829, 79941261}, + {120886489, 79833923}, + {120154983, 78949615}, + {119366561, 78111709}, + {119014755, 77776794}, + {116728790, 75636238}, + {116660522, 75593933}, + {116428192, 75458541}, + {116355255, 75416870}, + {116264663, 75372528}, + {115952728, 75233367}, + {115865554, 75205482}, + {115756835, 75190956}, + {115564163, 75197830}, + {115481170, 75202087}, + {115417144, 75230400}, + {115226959, 75337806}, + {115203842, 75351448}, + {114722015, 75746932}, + {114672103, 75795661}, + {114594619, 75891891}, + {114565811, 75973831}, + {114478256, 76240814}, + {114178039, 77252197}, + {114137664, 77769668}, + {114109771, 78154464}, + {114758499, 88719909}, + }, + { + {108135070, 109828002}, + {108200347, 110091529}, + {108319419, 110298500}, + {108439025, 110488388}, + {108663574, 110766731}, + {108812957, 110935768}, + {109321914, 111398925}, + {109368087, 111430320}, + {109421295, 111466331}, + {110058998, 111849746}, + {127160308, 120588981}, + {127350692, 120683456}, + {128052749, 120997207}, + {128326919, 121113449}, + {131669586, 122213058}, + {131754745, 122240592}, + {131854583, 122264770}, + {132662048, 122449813}, + {132782669, 122449897}, + {132909118, 122443687}, + {133013442, 122436058}, + {140561035, 121609939}, + {140786346, 121583320}, + {140876144, 121570228}, + {140962356, 121547996}, + {141052612, 121517837}, + {141231292, 121442184}, + {141309371, 121390007}, + {141370132, 121327003}, + {141456008, 121219932}, + {141591598, 121045005}, + {141905761, 120634796}, + {141894607, 120305725}, + {141881881, 120110855}, + {141840881, 119885009}, + {141685043, 119238922}, + {141617416, 118962882}, + {141570434, 118858856}, + {131617462, 100598548}, + {131542846, 100487213}, + {131229385, 100089019}, + {131091476, 99928108}, + {119824127, 90297180}, + {119636337, 90142387}, + {119507492, 90037765}, + {119436744, 89983657}, + {119423942, 89974159}, + {119207366, 89822471}, + {119117149, 89767097}, + {119039489, 89726867}, + {116322929, 88522857}, + {114817031, 87882110}, + {114683975, 87826751}, + {114306411, 87728507}, + {113876434, 87646003}, + {113792106, 87629974}, + {113658988, 87615974}, + {113574333, 87609275}, + {112813575, 87550102}, + {112578567, 87560157}, + {112439880, 87571647}, + {112306922, 87599395}, + {112225082, 87622535}, + {112132568, 87667175}, + {112103477, 87682830}, + {110795242, 88511634}, + {110373565, 88847793}, + {110286537, 88934989}, + {109730873, 89531501}, + {109648735, 89628883}, + {109552581, 89768859}, + {109514228, 89838470}, + {109501640, 89877586}, + {109480964, 89941864}, + {109461761, 90032417}, + {109457778, 90055458}, + {108105194, 109452575}, + {108094238, 109620979}, + {108135070, 109828002}, + }, + { + {108764694, 108910400}, + {108965499, 112306495}, + {109598602, 120388298}, + {110573898, 128289596}, + {110597801, 128427795}, + {113786201, 137983795}, + {113840301, 138134704}, + {113937202, 138326904}, + {114046005, 138520401}, + {114150802, 138696792}, + {114164703, 138717895}, + {114381896, 139021194}, + {114701004, 139425292}, + {114997398, 139747497}, + {115065597, 139805191}, + {115134498, 139850891}, + {115167098, 139871704}, + {115473396, 139992797}, + {115537498, 139995101}, + {116762596, 139832000}, + {116897499, 139808593}, + {118401802, 139225585}, + {118437500, 139209594}, + {118488204, 139182189}, + {118740097, 139033996}, + {118815795, 138967285}, + {134401000, 116395492}, + {134451507, 116309997}, + {135488098, 113593597}, + {137738006, 106775695}, + {140936492, 97033889}, + {140960006, 96948997}, + {141026504, 96660995}, + {141067291, 96467094}, + {141124893, 95771896}, + {141511795, 90171600}, + {141499801, 90026000}, + {141479598, 89907798}, + {141276794, 88844596}, + {141243804, 88707397}, + {140778305, 87031593}, + {140733306, 86871696}, + {140697204, 86789993}, + {140619796, 86708190}, + {140398391, 86487396}, + {125798797, 72806198}, + {125415802, 72454498}, + {123150398, 70566093}, + {123038803, 70503997}, + {122681198, 70305397}, + {121919204, 70104797}, + {121533699, 70008094}, + {121273696, 70004898}, + {121130599, 70020797}, + {121045097, 70033294}, + {120847099, 70082298}, + {120481895, 70278999}, + {120367004, 70379692}, + {120272796, 70475097}, + {119862098, 71004791}, + {119745101, 71167297}, + {119447799, 71726997}, + {119396499, 71825798}, + {119348701, 71944496}, + {109508796, 98298797}, + {109368598, 98700897}, + {109298400, 98926391}, + {108506301, 102750991}, + {108488197, 102879898}, + {108764694, 108910400}, + }, + { + {106666252, 87231246}, + {106673248, 87358055}, + {107734146, 101975646}, + {107762649, 102357955}, + {108702445, 111208351}, + {108749450, 111345153}, + {108848350, 111542648}, + {110270645, 114264358}, + {110389648, 114445144}, + {138794845, 143461151}, + {139048355, 143648956}, + {139376144, 143885345}, + {139594451, 144022644}, + {139754043, 144110046}, + {139923950, 144185852}, + {140058242, 144234451}, + {140185653, 144259552}, + {140427551, 144292648}, + {141130950, 144281448}, + {141157653, 144278152}, + {141214355, 144266555}, + {141347457, 144223449}, + {141625350, 144098953}, + {141755142, 144040145}, + {141878143, 143971557}, + {142011444, 143858154}, + {142076843, 143796356}, + {142160644, 143691055}, + {142224456, 143560852}, + {142925842, 142090850}, + {142935653, 142065353}, + {142995956, 141899154}, + {143042556, 141719757}, + {143102951, 141436157}, + {143129257, 141230453}, + {143316055, 139447250}, + {143342544, 133704650}, + {143307556, 130890960}, + {142461257, 124025558}, + {141916046, 120671051}, + {141890457, 120526153}, + {140002349, 113455749}, + {139909149, 113144149}, + {139853454, 112974456}, + {137303756, 105228057}, + {134700546, 98161254}, + {134617950, 97961547}, + {133823547, 96118057}, + {133688751, 95837356}, + {133481353, 95448059}, + {133205444, 94948150}, + {131178955, 91529853}, + {131144744, 91482055}, + {113942047, 67481246}, + {113837051, 67360549}, + {113048950, 66601745}, + {112305549, 66002746}, + {112030853, 65790351}, + {111970649, 65767547}, + {111912445, 65755249}, + {111854248, 65743453}, + {111657447, 65716354}, + {111576950, 65707351}, + {111509750, 65708549}, + {111443550, 65718551}, + {111397247, 65737449}, + {111338546, 65764648}, + {111129547, 65863349}, + {111112449, 65871551}, + {110995254, 65927856}, + {110968849, 65946151}, + {110941444, 65966751}, + {110836448, 66057853}, + {110490447, 66445449}, + {110404144, 66576751}, + {106802055, 73202148}, + {106741950, 73384948}, + {106715454, 73469650}, + {106678054, 73627151}, + {106657455, 75433448}, + {106666252, 87231246}, + }, + { + {101852752, 106261352}, + {101868949, 106406051}, + {102347549, 108974250}, + {112286750, 152027954}, + {112305648, 152106536}, + {112325752, 152175857}, + {112391448, 152290863}, + {113558250, 154187454}, + {113592048, 154226745}, + {113694351, 154313156}, + {113736549, 154335647}, + {113818145, 154367462}, + {114284454, 154490951}, + {114415847, 154504547}, + {114520751, 154489151}, + {114571350, 154478057}, + {114594551, 154472854}, + {114630546, 154463958}, + {114715148, 154429443}, + {146873657, 136143051}, + {146941741, 136074249}, + {147190155, 135763549}, + {147262649, 135654937}, + {147309951, 135557159}, + {147702255, 133903945}, + {147934143, 131616348}, + {147967041, 131273864}, + {148185852, 127892250}, + {148195648, 127669754}, + {148179656, 126409851}, + {148119552, 126182151}, + {147874053, 125334152}, + {147818954, 125150352}, + {146958557, 122656646}, + {139070251, 101025955}, + {139002655, 100879051}, + {119028450, 63067649}, + {118846649, 62740753}, + {115676048, 57814651}, + {115550453, 57629852}, + {115330352, 57319751}, + {115094749, 56998352}, + {114978347, 56847454}, + {114853050, 56740550}, + {114695053, 56609550}, + {114582252, 56528148}, + {114210449, 56375953}, + {113636245, 56214950}, + {113470352, 56171649}, + {109580749, 55503551}, + {109491645, 55495452}, + {109238754, 55511550}, + {109080352, 55534049}, + {108027748, 55687351}, + {107839950, 55732349}, + {107614456, 55834953}, + {107488143, 55925952}, + {107302551, 56062553}, + {107218353, 56145751}, + {107199447, 56167251}, + {107052749, 56354850}, + {106978652, 56476348}, + {106869644, 56710754}, + {104541351, 62448753}, + {104454551, 62672554}, + {104441253, 62707351}, + {104231750, 63366348}, + {104222648, 63419952}, + {104155746, 63922649}, + {104127349, 64147552}, + {104110847, 64299957}, + {102235450, 92366752}, + {101804351, 102877655}, + {101852752, 106261352}, + }, + { + {106808700, 120885696}, + {106818695, 120923103}, + {106873901, 121057098}, + {115123603, 133614700}, + {115128799, 133619598}, + {115182197, 133661804}, + {115330101, 133740707}, + {115455398, 133799407}, + {115595001, 133836807}, + {115651000, 133851806}, + {116413604, 134055206}, + {116654495, 134097900}, + {116887603, 134075210}, + {117071098, 134040405}, + {117458801, 133904891}, + {118057998, 133572601}, + {118546997, 133261001}, + {118578498, 133239395}, + {118818603, 133011596}, + {121109695, 130501495}, + {122661598, 128760101}, + {142458190, 102765197}, + {142789001, 102099601}, + {143105010, 101386505}, + {143154800, 101239700}, + {143193908, 100825500}, + {143160507, 100282501}, + {143133499, 100083602}, + {143092697, 99880500}, + {143050689, 99766700}, + {142657501, 98974502}, + {142580307, 98855201}, + {122267196, 76269897}, + {122036399, 76105003}, + {121832000, 76028305}, + {121688796, 75983108}, + {121591598, 75955001}, + {121119697, 75902099}, + {120789596, 75953498}, + {120487495, 76041900}, + {120042701, 76365798}, + {119886695, 76507301}, + {119774200, 76635299}, + {119739097, 76686904}, + {119685195, 76798202}, + {119456199, 77320098}, + {106877601, 119561401}, + {106854797, 119645103}, + {106849098, 119668807}, + {106847099, 119699005}, + {106840400, 119801406}, + {106807800, 120719299}, + {106806098, 120862808}, + {106808700, 120885696}, + }, + { + {99663352, 105328948}, + {99690048, 105797050}, + {99714050, 105921447}, + {99867248, 106439949}, + {100111557, 107256546}, + {104924850, 120873649}, + {105106155, 121284049}, + {105519149, 122184753}, + {105586051, 122292655}, + {105665054, 122400154}, + {106064147, 122838455}, + {106755355, 123453453}, + {106929054, 123577651}, + {107230346, 123771949}, + {107760650, 123930648}, + {108875854, 124205154}, + {108978752, 124228050}, + {131962051, 123738754}, + {135636047, 123513954}, + {135837249, 123500747}, + {136357345, 123442749}, + {136577346, 123394454}, + {136686645, 123367752}, + {137399353, 123185050}, + {137733947, 123063156}, + {137895355, 122997154}, + {138275650, 122829154}, + {138394256, 122767753}, + {138516845, 122670150}, + {139987045, 121111251}, + {149171646, 108517349}, + {149274353, 108372848}, + {149314758, 108314247}, + {149428848, 108140846}, + {149648651, 107650550}, + {149779541, 107290252}, + {149833343, 107115249}, + {149891357, 106920051}, + {150246353, 105630249}, + {150285842, 105423454}, + {150320953, 105233749}, + {150336639, 104981552}, + {150298049, 104374053}, + {150287948, 104271850}, + {150026153, 103481147}, + {149945449, 103301651}, + {149888946, 103213455}, + {149800949, 103103851}, + {149781143, 103079650}, + {149714141, 103005447}, + {149589950, 102914146}, + {149206054, 102698951}, + {128843856, 91378150}, + {128641754, 91283050}, + {119699851, 87248046}, + {117503555, 86311950}, + {117145851, 86178054}, + {116323654, 85925048}, + {115982551, 85834045}, + {115853050, 85819252}, + {115222549, 85771949}, + {107169357, 85771949}, + {107122650, 85776451}, + {106637145, 85831550}, + {105095046, 86423950}, + {104507850, 86703750}, + {104384155, 86763153}, + {104332351, 86790145}, + {104198257, 86882644}, + {103913757, 87109451}, + {103592346, 87388450}, + {103272651, 87666748}, + {103198051, 87779052}, + {101698654, 90600952}, + {101523551, 90958450}, + {101360054, 91347450}, + {101295349, 91542144}, + {99774551, 98278152}, + {99746749, 98417755}, + {99704055, 98675453}, + {99663352, 99022949}, + {99663352, 105328948}, + }, + { + {95036499, 101778106}, + {95479103, 102521301}, + {95587295, 102700103}, + {98306503, 106984901}, + {98573303, 107377700}, + {100622406, 110221702}, + {101252304, 111089599}, + {104669502, 115750198}, + {121838500, 131804107}, + {122000503, 131943695}, + {122176803, 132023406}, + {122474105, 132025390}, + {122703804, 132023101}, + {123278808, 131878112}, + {124072998, 131509109}, + {124466506, 131102508}, + {152779296, 101350906}, + {153016510, 101090606}, + {153269699, 100809097}, + {153731994, 100214096}, + {153927902, 99939796}, + {154641098, 98858100}, + {154864303, 98517601}, + {155056594, 97816604}, + {155083511, 97645599}, + {155084899, 97462097}, + {154682601, 94386100}, + {154376007, 92992599}, + {154198593, 92432403}, + {153830505, 91861701}, + {153686904, 91678695}, + {151907104, 90314605}, + {151368896, 89957603}, + {146983306, 87632202}, + {139082397, 84273605}, + {128947692, 80411399}, + {121179000, 78631301}, + {120264701, 78458198}, + {119279510, 78304603}, + {116913101, 77994102}, + {116151504, 77974601}, + {115435104, 78171401}, + {113544105, 78709106}, + {113231002, 78879898}, + {112726303, 79163604}, + {112310501, 79411102}, + {96169998, 97040802}, + {95196304, 98364402}, + {95167800, 98409599}, + {95083503, 98570701}, + {94986999, 99022201}, + {94915100, 100413299}, + {95036499, 101778106}, + }, + { + {82601348, 96004745}, + {83443847, 128861953}, + {84173248, 136147354}, + {104268249, 141388839}, + {104373649, 141395355}, + {105686950, 141389541}, + {149002243, 140435653}, + {159095748, 133388244}, + {159488143, 133112655}, + {159661849, 132894653}, + {163034149, 128290847}, + {164801849, 124684249}, + {167405746, 72553245}, + {167330444, 71960746}, + {167255050, 71791847}, + {167147155, 71572044}, + {166999557, 71341545}, + {166723937, 70961448}, + {166238250, 70611541}, + {165782348, 70359649}, + {165649444, 70286849}, + {165332946, 70122344}, + {165164154, 70062248}, + {164879150, 69967544}, + {164744949, 69928947}, + {164691452, 69915245}, + {164669448, 69910247}, + {159249938, 68738952}, + {158528259, 68704742}, + {147564254, 68604644}, + {116196655, 68982742}, + {115364944, 69005050}, + {115193145, 69013549}, + {101701248, 70984146}, + {93918449, 72233047}, + {93789749, 72285247}, + {93777046, 72292648}, + {93586044, 72444046}, + {93366348, 72662345}, + {93301147, 72745452}, + {93260345, 72816345}, + {83523948, 92593849}, + {83430145, 92810241}, + {82815048, 94665542}, + {82755554, 94858551}, + {82722953, 95014350}, + {82594253, 95682350}, + {82601348, 96004745}, + }, + { + {110371345, 125796493}, + {110411544, 126159599}, + {110445251, 126362899}, + {111201950, 127863800}, + {112030052, 129270492}, + {112367050, 129799301}, + {113088348, 130525604}, + {113418144, 130853698}, + {117363449, 134705505}, + {118131149, 135444793}, + {118307449, 135607299}, + {119102546, 136297195}, + {119385047, 136531906}, + {120080848, 137094390}, + {120794845, 137645401}, + {121150344, 137896392}, + {121528945, 138162506}, + {121644546, 138242095}, + {122142349, 138506408}, + {127540847, 141363006}, + {127933448, 141516204}, + {128728256, 141766799}, + {129877151, 141989898}, + {130626052, 142113891}, + {130912246, 142135192}, + {131246841, 142109100}, + {131496047, 142027404}, + {131596252, 141957794}, + {131696350, 141873504}, + {131741043, 141803405}, + {138788452, 128037704}, + {139628646, 125946197}, + {138319351, 112395401}, + {130035354, 78066703}, + {124174049, 69908798}, + {123970649, 69676895}, + {123874252, 69571899}, + {123246643, 68961303}, + {123193954, 68924400}, + {121952049, 68110000}, + {121787345, 68021896}, + {121661544, 67970306}, + {121313446, 67877502}, + {121010650, 67864799}, + {120995346, 67869705}, + {120583747, 68122207}, + {120509750, 68170600}, + {120485847, 68189102}, + {112160148, 77252403}, + {111128646, 78690704}, + {110969650, 78939407}, + {110512550, 79663406}, + {110397247, 79958206}, + {110371345, 80038299}, + {110371345, 125796493}, + }, + { + {112163948, 137752700}, + {112171150, 137837997}, + {112203048, 137955993}, + {112240150, 138008209}, + {112343246, 138111099}, + {112556243, 138223205}, + {112937149, 138307998}, + {113318748, 138331909}, + {126076446, 138428298}, + {126165245, 138428695}, + {126312446, 138417907}, + {134075546, 136054504}, + {134322753, 135949401}, + {134649948, 135791198}, + {135234954, 135493408}, + {135290145, 135464691}, + {135326248, 135443695}, + {135920043, 135032592}, + {135993850, 134975799}, + {136244247, 134761199}, + {136649444, 134378692}, + {137067153, 133964294}, + {137188156, 133839096}, + {137298049, 133704498}, + {137318954, 133677795}, + {137413543, 133522201}, + {137687347, 133043792}, + {137816055, 132660705}, + {137836044, 131747695}, + {137807144, 131318603}, + {136279342, 119078704}, + {136249053, 118945800}, + {127306152, 81348602}, + {127114852, 81065505}, + {127034248, 80951400}, + {126971649, 80893707}, + {125093551, 79178001}, + {124935745, 79036003}, + {115573745, 71767601}, + {115411148, 71701805}, + {115191947, 71621002}, + {115017051, 71571304}, + {114870147, 71572898}, + {113869552, 71653900}, + {112863349, 72976104}, + {112756347, 73223899}, + {112498947, 73832206}, + {112429351, 73998504}, + {112366050, 74168098}, + {112273246, 74487098}, + {112239250, 74605400}, + {112195549, 74899902}, + {112163948, 75280700}, + {112163948, 137752700}, + }, + { + {78562347, 141451843}, + {79335624, 142828186}, + {79610343, 143188140}, + {79845077, 143445724}, + {81379173, 145126678}, + {81826751, 145577178}, + {82519126, 146209472}, + {83964973, 147280502}, + {85471343, 148377868}, + {86115539, 148760803}, + {88839988, 150281188}, + {89021247, 150382217}, + {90775917, 151320526}, + {91711380, 151767288}, + {92757591, 152134277}, + {93241058, 152201766}, + {113402145, 153091995}, + {122065994, 146802825}, + {164111053, 91685104}, + {164812759, 90470565}, + {165640182, 89037384}, + {171027435, 66211853}, + {171450805, 64406951}, + {171463150, 64349624}, + {171469787, 64317184}, + {171475585, 64282028}, + {171479812, 64253036}, + {171483596, 64210433}, + {171484405, 64153488}, + {171483001, 64140785}, + {171481719, 64132751}, + {171478668, 64115478}, + {171472702, 64092437}, + {171462768, 64075408}, + {171448089, 64061347}, + {171060333, 63854789}, + {169640502, 63197738}, + {169342147, 63086711}, + {166413101, 62215766}, + {151881774, 58826736}, + {146010574, 57613151}, + {141776962, 56908004}, + {140982940, 57030628}, + {139246154, 57540817}, + {139209609, 57566974}, + {127545310, 66015594}, + {127476654, 66104812}, + {105799087, 98784980}, + {85531921, 129338897}, + {79319717, 138704513}, + {78548156, 140188079}, + {78530448, 140530456}, + {78515594, 141299987}, + {78562347, 141451843}, + }, + { + {77755004, 128712387}, + {78073547, 130552612}, + {78433593, 132017822}, + {79752693, 136839645}, + {80479461, 138929260}, + {80903221, 140119674}, + {81789848, 141978454}, + {82447387, 143105575}, + {83288436, 144264328}, + {84593582, 145846542}, + {84971939, 146242813}, + {86905578, 147321304}, + {87874191, 147594131}, + {89249092, 147245132}, + {89541542, 147169052}, + {98759140, 144071609}, + {98894233, 144024261}, + {113607818, 137992843}, + {128324356, 131649307}, + {139610076, 126210189}, + {146999572, 122112884}, + {147119415, 122036041}, + {148717330, 120934616}, + {149114776, 120652725}, + {171640289, 92086624}, + {171677917, 92036224}, + {171721191, 91973869}, + {171851608, 91721557}, + {171927795, 91507644}, + {172398696, 89846351}, + {172436752, 89559959}, + {169361663, 64753852}, + {169349029, 64687164}, + {169115127, 63616458}, + {168965728, 63218254}, + {168911788, 63121219}, + {168901611, 63106807}, + {168896896, 63100486}, + {168890686, 63092460}, + {168876586, 63081058}, + {168855529, 63067909}, + {168808746, 63046024}, + {167251068, 62405864}, + {164291717, 63716899}, + {152661651, 69910156}, + {142312393, 75421356}, + {78778053, 111143295}, + {77887222, 113905914}, + {77591979, 124378433}, + {77563247, 126586669}, + {77755004, 128712387}, + }, + { + {105954101, 131182754}, + {105959197, 131275848}, + {105972801, 131473556}, + {105981498, 131571044}, + {106077903, 132298553}, + {106134094, 132715255}, + {106155700, 132832351}, + {106180099, 132942657}, + {106326797, 133590347}, + {106375099, 133719345}, + {106417602, 133829345}, + {106471000, 133930343}, + {106707901, 134308654}, + {106728401, 134340545}, + {106778198, 134417556}, + {106832397, 134491851}, + {106891296, 134562957}, + {106981300, 134667358}, + {107044204, 134736557}, + {107111000, 134802658}, + {107180999, 134865661}, + {107291099, 134961349}, + {107362998, 135020355}, + {107485397, 135112854}, + {107558998, 135166946}, + {107690399, 135256256}, + {107765098, 135305252}, + {107903594, 135390548}, + {108183898, 135561843}, + {108459503, 135727951}, + {108532501, 135771850}, + {108796096, 135920059}, + {108944099, 135972549}, + {109102401, 136010757}, + {109660598, 136071044}, + {109971595, 136100250}, + {110209594, 136116851}, + {110752799, 136122344}, + {111059906, 136105758}, + {111152900, 136100357}, + {111237197, 136091354}, + {111316101, 136075057}, + {111402000, 136050949}, + {111475296, 136026657}, + {143546600, 123535949}, + {143899002, 122454353}, + {143917404, 122394348}, + {143929199, 122354652}, + {143944793, 122295753}, + {143956207, 122250953}, + {143969497, 122192253}, + {143980102, 122143249}, + {143991302, 122083053}, + {144000396, 122031753}, + {144009796, 121970954}, + {144017303, 121917655}, + {144025405, 121850250}, + {144030609, 121801452}, + {144036804, 121727455}, + {144040008, 121683456}, + {144043502, 121600952}, + {144044708, 121565048}, + {144045700, 121470352}, + {144045898, 121446952}, + {144041503, 121108657}, + {144037506, 121023452}, + {143733795, 118731750}, + {140461395, 95238647}, + {140461105, 95236755}, + {140433807, 95115249}, + {140392608, 95011650}, + {134840805, 84668952}, + {134824996, 84642456}, + {134781494, 84572952}, + {134716796, 84480850}, + {127473899, 74425453}, + {127467002, 74417152}, + {127431701, 74381652}, + {127402603, 74357147}, + {127375503, 74334457}, + {127294906, 74276649}, + {127181900, 74207649}, + {127177597, 74205451}, + {127123901, 74178451}, + {127078903, 74155853}, + {127028999, 74133148}, + {126870803, 74070953}, + {126442901, 73917648}, + {126432403, 73914955}, + {126326004, 73889846}, + {126262405, 73880645}, + {126128097, 73878456}, + {125998199, 73877655}, + {108701095, 74516647}, + {108644599, 74519348}, + {108495201, 74528953}, + {108311302, 74556457}, + {108252799, 74569458}, + {108079002, 74612152}, + {107981399, 74638954}, + {107921295, 74657951}, + {107862197, 74685951}, + {107601303, 74828948}, + {107546997, 74863449}, + {107192794, 75098846}, + {107131202, 75151153}, + {106260002, 76066146}, + {106195098, 76221145}, + {106168502, 76328453}, + {106144699, 76437454}, + {106124496, 76538452}, + {106103698, 76649650}, + {106084197, 76761650}, + {106066299, 76874450}, + {106049903, 76987457}, + {106034797, 77101150}, + {106020904, 77214950}, + {106008201, 77328948}, + {105996902, 77443145}, + {105986099, 77565849}, + {105977005, 77679649}, + {105969299, 77793151}, + {105963096, 77906349}, + {105958297, 78019149}, + {105955299, 78131454}, + {105954101, 78242950}, + {105954101, 131182754}, + }, + { + {91355499, 77889205}, + {114834197, 120804504}, + {114840301, 120815200}, + {124701507, 132324798}, + {124798805, 132436706}, + {124901504, 132548309}, + {125126602, 132788909}, + {125235000, 132901901}, + {125337707, 133005401}, + {125546302, 133184707}, + {125751602, 133358703}, + {126133300, 133673004}, + {126263900, 133775604}, + {126367401, 133855499}, + {126471908, 133935104}, + {126596008, 134027496}, + {127119308, 134397094}, + {127135101, 134408203}, + {127433609, 134614303}, + {127554107, 134695709}, + {128155395, 135070907}, + {128274505, 135141799}, + {129132003, 135573211}, + {129438003, 135713195}, + {129556106, 135767196}, + {131512695, 136648498}, + {132294509, 136966598}, + {132798400, 137158798}, + {133203796, 137294494}, + {133377410, 137350799}, + {133522399, 137396606}, + {133804397, 137480697}, + {134017807, 137542205}, + {134288696, 137618408}, + {134564208, 137680099}, + {134844696, 137740097}, + {135202606, 137807098}, + {135489105, 137849807}, + {135626800, 137864898}, + {135766906, 137878692}, + {135972808, 137895797}, + {136110107, 137905502}, + {136235000, 137913101}, + {136485809, 137907196}, + {139194305, 136979202}, + {140318298, 136536209}, + {140380004, 136505004}, + {140668197, 136340499}, + {140724304, 136298904}, + {140808197, 136228210}, + {140861801, 136180603}, + {140917404, 136129104}, + {140979202, 136045104}, + {141022903, 135984207}, + {147591094, 126486999}, + {147661315, 126356101}, + {147706100, 126261901}, + {147749099, 126166000}, + {147817108, 126007507}, + {147859100, 125908599}, + {153693206, 111901100}, + {153731109, 111807800}, + {153760894, 111698806}, + {158641998, 92419303}, + {158644500, 92263702}, + {158539703, 92013504}, + {158499603, 91918899}, + {158335510, 91626800}, + {158264007, 91516304}, + {158216308, 91449203}, + {158178314, 91397506}, + {158094299, 91283203}, + {157396408, 90368202}, + {157285491, 90224700}, + {157169906, 90079200}, + {157050003, 89931304}, + {156290603, 89006805}, + {156221099, 88922897}, + {156087707, 88771003}, + {155947906, 88620498}, + {155348602, 88004203}, + {155113204, 87772796}, + {154947296, 87609703}, + {154776306, 87448204}, + {154588806, 87284301}, + {153886306, 86716400}, + {153682403, 86560501}, + {152966705, 86032402}, + {152687805, 85828704}, + {152484313, 85683204}, + {152278808, 85539001}, + {150878204, 84561401}, + {150683013, 84426498}, + {150599395, 84372703}, + {150395599, 84243202}, + {149988906, 83989395}, + {149782897, 83864501}, + {149568908, 83739799}, + {148872100, 83365303}, + {148625396, 83242202}, + {128079010, 73079605}, + {127980506, 73031005}, + {126701103, 72407104}, + {126501701, 72312202}, + {126431503, 72280601}, + {126311706, 72230606}, + {126260101, 72210899}, + {126191902, 72187599}, + {126140106, 72170303}, + {126088203, 72155303}, + {126036102, 72142700}, + {125965904, 72126899}, + {125913009, 72116600}, + {125859603, 72108505}, + {125788101, 72100296}, + {125733505, 72094398}, + {125678100, 72090400}, + {125621398, 72088302}, + {125548805, 72087303}, + {125490707, 72086898}, + {125430908, 72088203}, + {125369804, 72091094}, + {125306900, 72095306}, + {125233505, 72100997}, + {125168609, 72106506}, + {125102203, 72113601}, + {125034103, 72122207}, + {124964309, 72132095}, + {124890701, 72143707}, + {124819305, 72155105}, + {91355499, 77889099}, + {91355499, 77889205}, + }, + { + {84531845, 127391708}, + {84916946, 130417510}, + {86133247, 131166900}, + {86338447, 131292892}, + {86748847, 131544799}, + {102193946, 136599502}, + {103090942, 136796798}, + {103247146, 136822509}, + {104083549, 136911499}, + {106119346, 137109802}, + {106265853, 137122207}, + {106480247, 137139205}, + {110257850, 137133605}, + {116917747, 136131408}, + {117054946, 136106704}, + {119043945, 135244293}, + {119249046, 135154708}, + {136220947, 126833007}, + {165896347, 91517105}, + {166032546, 91314697}, + {166055435, 91204902}, + {166056152, 91176803}, + {166047256, 91100006}, + {166039733, 91063705}, + {165814849, 90080802}, + {165736450, 89837707}, + {165677246, 89732101}, + {165676956, 89731803}, + {165560241, 89629302}, + {154419952, 82608505}, + {153822143, 82239700}, + {137942749, 74046104}, + {137095245, 73845504}, + {135751342, 73537704}, + {134225952, 73208602}, + {132484344, 72860801}, + {124730346, 73902000}, + {120736549, 74464401}, + {100401245, 78685401}, + {90574645, 90625701}, + {90475944, 90748809}, + {90430747, 90808700}, + {90321548, 90958305}, + {90254852, 91077903}, + {90165641, 91244003}, + {90134941, 91302398}, + {84474647, 103745697}, + {84328048, 104137901}, + {84288543, 104327606}, + {84038047, 106164604}, + {84013351, 106368698}, + {83943847, 110643203}, + {84531845, 127391708}, + }, +}; + +using Slic3r::ExPolygon; +using Slic3r::Polygon; +using Slic3r::Polygons; +using Slic3r::ExPolygons; + +struct MyPoly { + ExPolygon poly; + MyPoly(Polygon contour, Polygons holes) + : poly(std::move(contour)) + { + poly.holes = std::move(holes); + } + + operator ExPolygon () { return poly; } +}; + +const TestDataEx PRUSA_PART_POLYGONS_EX = { + ExPolygons{ + // "x-carriage.stl": + MyPoly{{ + {-22097700, -14878600}, {-21981300, -14566100}, + {-21807600, -14303900}, {-21354100, -13619200}, + {-20514800, -12806600}, {-19500000, -12163900}, + {-18553700, -11796600}, {-18354100, -11719200}, + {-18146200, -11680600}, {-17127200, -11491800}, + {-15872800, -11491800}, {-14853800, -11680600}, + {-14645900, -11719200}, {-14446300, -11796600}, + {-13500000, -12163900}, {-12485200, -12806600}, + {-11645900, -13619200}, {-11192400, -14303900}, + {-11018700, -14566100}, {-10902300, -14878600}, + {-10857000, -15000000}, {-2200000, -15000000}, + {-2242640, -14957400}, {500000, -12214700}, + {500000, 5500000}, {9450000, 5500000}, + {9450000, 7500000}, {273885, 7500000}, + {273885, 11050000}, {2706110, 11050000}, + {2706110, 11000000}, {9500000, 11000000}, + {9500000, 66500000}, {7466310, 68533696}, + {999999, 75000000}, {-8500000, 75000000}, + {-8500000, 74250000}, {-7500000, 74250000}, + {-7500000, 71750000}, {-8500000, 71750000}, + {-8500000, 68250000}, {-7500000, 68250000}, + {-7500000, 65750000}, {-8500000, 65750000}, + {-8500000, 64000000}, {-12500000, 64000000}, + {-12500000, 67000000}, {-14500000, 67000000}, + {-14500000, 73000000}, {-12500000, 73000000}, + {-12500000, 75000000}, {-23000000, 75000000}, + {-23000000, 59500000}, {-38500000, 59500000}, + {-42500000, 55500000}, {-42500000, 19536000}, + {-36767700, 18000000}, {-34000000, 18000000}, + {-34000000, 13000000}, {-39900000, 13000000}, + {-39900000, 11000000}, {-34000000, 11000000}, + {-34000000, 7500000}, {-39900000, 7500000}, + {-39900000, 5500000}, {-34000000, 5500000}, + {-34000000, -11714700}, {-30757400, -14957400}, + {-30800000, -15000000}, {-22143000, -15000000}, + }, + { + { + {2311850, 65709900}, {2076590, 65759904}, + {1943770, 65788100}, {1600000, 65941200}, + {1362567, 66113636}, {1329590, 66137604}, + {1295560, 66162300}, {1043769, 66442000}, + {855618, 66767900}, {739334, 67125800}, + {714193, 67365000}, {700000, 67500000}, + {714193, 67635000}, {739334, 67874200}, + {855618, 68232104}, {1043769, 68558000}, + {1295560, 68837696}, {1329590, 68862400}, + {1352596, 68879119}, {1600000, 69058800}, + {1943770, 69211896}, {2076590, 69240096}, + {2311850, 69290104}, {2688150, 69290104}, + {3056230, 69211896}, {3400000, 69058800}, + {3541910, 68955704}, {3704430, 68837696}, + {3762210, 68773496}, {3865370, 68658896}, + {3956230, 68558000}, {4024119, 68440400}, + {4065821, 68368176}, {4144380, 68232104}, + {4260660, 67874200}, {4300000, 67500000}, + {4260660, 67125800}, {4144380, 66767900}, + {4024119, 66559600}, {3956230, 66442000}, + {3865370, 66341104}, {3762210, 66226500}, + {3704430, 66162300}, {3541910, 66044296}, + {3400000, 65941200}, {3056230, 65788100}, + {2688150, 65709900}, + }, + { + {-27606700, 54303400}, {-27818500, 54330100}, + {-27896000, 54350000}, {-28025300, 54383200}, + {-28223800, 54461800}, {-28410900, 54564600}, + {-28583600, 54690100}, {-28739200, 54836300}, + {-28875300, 55000800}, {-28989700, 55181000}, + {-29080600, 55374200}, {-29146600, 55577200}, + {-29150000, 55595100}, {-29186600, 55786900}, + {-29200000, 56000000}, {-29186600, 56213100}, + {-29150000, 56404900}, {-29146600, 56422800}, + {-29080600, 56625800}, {-28989700, 56819000}, + {-28875300, 56999200}, {-28739200, 57163700}, + {-28583600, 57309900}, {-28410900, 57435400}, + {-28223800, 57538200}, {-28025300, 57616800}, + {-27896000, 57650000}, {-27818500, 57669900}, + {-27606700, 57696600}, {-27393300, 57696600}, + {-27181400, 57669900}, {-27104000, 57650000}, + {-26974700, 57616800}, {-26776200, 57538200}, + {-26589100, 57435400}, {-26416400, 57309900}, + {-26260800, 57163700}, {-26124700, 56999200}, + {-26010300, 56819000}, {-25919400, 56625800}, + {-25853400, 56422800}, {-25850000, 56404900}, + {-25813400, 56213100}, {-25800000, 56000000}, + {-25813400, 55786900}, {-25850000, 55595100}, + {-25853400, 55577200}, {-25919400, 55374200}, + {-26010300, 55181000}, {-26124700, 55000800}, + {-26260800, 54836300}, {-26416400, 54690100}, + {-26589100, 54564600}, {-26776200, 54461800}, + {-26974700, 54383200}, {-27104000, 54350000}, + {-27181400, 54330100}, {-27393300, 54303400}, + }, + { + {-4106740, 54303400}, {-4318550, 54330100}, + {-4396010, 54350000}, {-4525330, 54383200}, + {-4723820, 54461800}, {-4910900, 54564600}, + {-5083620, 54690100}, {-5239250, 54836300}, + {-5375330, 55000800}, {-5489720, 55181000}, + {-5580620, 55374200}, {-5646590, 55577200}, + {-5650000, 55595100}, {-5686590, 55786900}, + {-5700000, 56000000}, {-5686590, 56213100}, + {-5650000, 56404900}, {-5646590, 56422800}, + {-5580620, 56625800}, {-5489720, 56819000}, + {-5375330, 56999200}, {-5239250, 57163700}, + {-5083620, 57309900}, {-4910900, 57435400}, + {-4723820, 57538200}, {-4525330, 57616800}, + {-4396010, 57650000}, {-4318550, 57669900}, + {-4106740, 57696600}, {-3893260, 57696600}, + {-3681450, 57669900}, {-3603990, 57650000}, + {-3474670, 57616800}, {-3276170, 57538200}, + {-3089090, 57435400}, {-2916380, 57309900}, + {-2760750, 57163700}, {-2624670, 56999200}, + {-2510280, 56819000}, {-2419380, 56625800}, + {-2353410, 56422800}, {-2350000, 56404900}, + {-2313400, 56213100}, {-2300000, 56000000}, + {-2313400, 55786900}, {-2350000, 55595100}, + {-2353410, 55577200}, {-2419380, 55374200}, + {-2510280, 55181000}, {-2624670, 55000800}, + {-2760750, 54836300}, {-2916380, 54690100}, + {-3089090, 54564600}, {-3276170, 54461800}, + {-3474670, 54383200}, {-3603990, 54350000}, + {-3681450, 54330100}, {-3893260, 54303400}, + }, + { + {-16103600, 27353300}, {-16309200, 27379200}, + {-16509899, 27430800}, {-16702499, 27507000}, + {-16884100, 27606900}, {-17051800, 27728700}, + {-17202800, 27870500}, {-17334900, 28030200}, + {-17445900, 28205100}, {-17534100, 28392600}, + {-17598200, 28589700}, {-17637000, 28793200}, + {-17650000, 29000000}, {-17637000, 29206800}, + {-17598200, 29410300}, {-17534100, 29607400}, + {-17445900, 29794900}, {-17334900, 29969800}, + {-17202800, 30129500}, {-17051800, 30271300}, + {-16884100, 30393100}, {-16702499, 30493000}, + {-16509899, 30569200}, {-16309200, 30620800}, + {-16103600, 30646700}, {-15896400, 30646700}, + {-15690800, 30620800}, {-15490100, 30569200}, + {-15297500, 30493000}, {-15115900, 30393100}, + {-14948200, 30271300}, {-14797200, 30129500}, + {-14665100, 29969800}, {-14554100, 29794900}, + {-14465900, 29607400}, {-14401800, 29410300}, + {-14363000, 29206800}, {-14350000, 29000000}, + {-14363000, 28793200}, {-14401800, 28589700}, + {-14465900, 28392600}, {-14554100, 28205100}, + {-14665100, 28030200}, {-14797200, 27870500}, + {-14948200, 27728700}, {-15115900, 27606900}, + {-15297500, 27507000}, {-15490100, 27430800}, + {-15690800, 27379200}, {-15896400, 27353300}, + }, + { + {-5809180, 22879200}, {-6202540, 23007000}, + {-6551750, 23228700}, {-6834880, 23530200}, + {-7034130, 23892600}, {-7136990, 24293200}, + {-7136990, 24706800}, {-7034130, 25107400}, + {-6834880, 25469800}, {-6551750, 25771300}, + {-6202540, 25993000}, {-5809180, 26120800}, + {-5396390, 26146700}, {-4990120, 26069200}, + {-4615890, 25893100}, {-4297200, 25629500}, + {-4054090, 25294900}, {-3901840, 24910300}, + {-3850000, 24500000}, {-3901840, 24089700}, + {-4054090, 23705100}, {-4297200, 23370500}, + {-4615890, 23106900}, {-4990120, 22930800}, + {-5396390, 22853300}, + }, + { + {-28809200, 22879200}, {-29202500, 23007000}, + {-29551800, 23228700}, {-29834900, 23530200}, + {-30034100, 23892600}, {-30137000, 24293200}, + {-30137000, 24706800}, {-30034100, 25107400}, + {-29834900, 25469800}, {-29551800, 25771300}, + {-29202500, 25993000}, {-28809200, 26120800}, + {-28396400, 26146700}, {-27990100, 26069200}, + {-27615900, 25893100}, {-27297200, 25629500}, + {-27054100, 25294900}, {-26901800, 24910300}, + {-26850000, 24500000}, {-26901800, 24089700}, + {-27054100, 23705100}, {-27297200, 23370500}, + {-27615900, 23106900}, {-27990100, 22930800}, + {-28396400, 22853300}, + }, + { + {-15718329, 8800000}, + {-15729700, 8808230}, + {-15736300, 8814060}, + {-15742800, 8833890}, + {-15876410, 9243607}, + {-15729700, 9696850}, + {-14969700, 10251100}, + {-14030300, 10251100}, + {-13270300, 9696850}, + {-13123590, 9243607}, + {-13257200, 8833890}, + {-13263700, 8814060}, + {-13270300, 8808230}, + {-13281671, 8800000}, + }, + }}, + }, + ExPolygons{ + // "Spool-holder.stl": + MyPoly{{ + {338485792, -31307222}, {338867040, -31018436}, + {339248320, -30729652}, {339769915, -30334566}, + {340010848, -30152082}, {340392096, -29863298}, + {340773344, -29574512}, {341244704, -27899436}, + {341480384, -27061900}, {342060734, -24999444}, + {342187424, -24549286}, {343068058, -21419626}, + {343130112, -21199134}, {343521972, -19806477}, + {344953440, -14719350}, {345583712, -12479458}, + {345898880, -11359512}, {346213984, -10239566}, + {346529152, -9119620}, {346684120, -8568830}, + {347258496, -6527694}, {348879776, -765989}, + {351121248, 7199785}, {351160318, 7338666}, + {351581888, 8836852}, {358349952, 32889144}, + {361733984, 44915292}, {362502080, 47644968}, + {365226370, 57326618}, {367181933, 64276284}, + {369782208, 73517048}, {372004549, 81414857}, + {375270080, 93019880}, {377062304, 99389120}, + {380702368, 112325160}, {387982496, 138197232}, + {390913664, 148614048}, {392379232, 153822448}, + {392462848, 154165648}, {392500992, 154371968}, + {392523776, 154527056}, {392558720, 154903888}, + {392560704, 154943056}, {392564832, 155292544}, + {392554016, 155525040}, {392539872, 155688624}, + {392482592, 156087152}, {392479040, 156106240}, + {392392608, 156482704}, {392336512, 156674688}, + {392270816, 156869776}, {392130112, 157218896}, + {392119264, 157242992}, {391941088, 157597536}, + {391865920, 157728704}, {391740320, 157929344}, + {391551872, 158195776}, {391521632, 158235296}, + {391290048, 158513360}, {391187328, 158624592}, + {391050656, 158762640}, {390808320, 158983152}, + {390768160, 159017008}, {390567456, 159175840}, + {390331776, 159342352}, {390300192, 159363104}, + {389874464, 159612112}, {389791584, 159654240}, + {389337216, 159852608}, {389252448, 159883872}, + {388769664, 160029808}, {388694016, 160047936}, + {388177408, 160139328}, {388128128, 160145120}, + {387566176, 160176800}, {375407744, 160176800}, + {374915072, 160152480}, {374676896, 160123104}, + {374431712, 160080592}, {374176224, 160022768}, + {373936576, 159955472}, {373914144, 159948512}, + {373647424, 159856688}, {373378176, 159746368}, + {373213376, 159669552}, {373108832, 159616976}, + {372841920, 159468256}, {372580064, 159300432}, + {372535328, 159269408}, {372325888, 159114096}, + {372081888, 158910256}, {371928512, 158767776}, + {371850368, 158690384}, {371633408, 158456224}, + {371432736, 158209856}, {371413792, 158184848}, + {371249664, 157953552}, {371085088, 157689664}, + {371004448, 157545600}, {370939520, 157420656}, + {370813088, 157148864}, {370705536, 156876560}, + {368543808, 150896416}, {363439712, 136776352}, + {358631104, 123473712}, {358408023, 122856568}, + {356409504, 117327816}, {355922364, 115980139}, + {355915437, 115960977}, {352669088, 106980280}, + {351986938, 105093166}, {351083520, 102593952}, + {349781616, 98992320}, {348098080, 94334952}, + {340262048, 72657256}, {338954668, 69040480}, + {336962208, 63528480}, {332255104, 50506656}, + {327202016, 36527760}, {322789144, 24319856}, + {322760544, 24240790}, {322533686, 23613197}, + {322519552, 23574124}, {320672032, 18463012}, + {320578304, 18203810}, {320531456, 18074210}, + {320484608, 17944606}, {320437760, 17815006}, + {320297248, 17426202}, {320297248, 9238203}, + {321164066, 9238176}, {321689312, 9238155}, + {323777376, 9238073}, {324473408, 9238046}, + {325169440, 9238018}, {325496384, 10782991}, + {325496360, 12868520}, {327892320, 12868504}, + {329090336, 12868496}, {330288320, 12868487}, + {331486336, 12868480}, {332684279, 12868472}, + {332096736, 10092249}, {332096736, -26761938}, + {325697024, -26761692}, {325697024, -26311692}, + {324897056, -26311692}, {323897056, -27061692}, + {323897056, -29536704}, {323897088, -30511784}, + {323897088, -32461944}, {323897091, -32461944}, + {328084288, -32462100}, {329480000, -32462150}, + {332271456, -32462258}, {335062912, -32462360}, + {336960768, -32462360}, + }, + { + { + {376588032, 136952960}, {375810912, 137178704}, + {375411104, 137361136}, {375032960, 137582800}, + {374679360, 137841776}, {374353152, 138136224}, + {374058688, 138462448}, {373799680, 138816048}, + {373578048, 139194192}, {373395584, 139594016}, + {373169856, 140371136}, {373093728, 141176800}, + {373169856, 141982464}, {373395584, 142759600}, + {373578048, 143159392}, {373799680, 143537536}, + {374058688, 143891136}, {374353152, 144217360}, + {374679360, 144511824}, {375032960, 144770816}, + {375411104, 144992464}, {375810912, 145174896}, + {376588032, 145400656}, {377393696, 145476800}, + {378199360, 145400656}, {378976512, 145174896}, + {379376320, 144992480}, {379754464, 144770816}, + {380108064, 144511808}, {380434272, 144217360}, + {380728736, 143891136}, {380987744, 143537536}, + {381209376, 143159392}, {381391776, 142759600}, + {381617568, 141982464}, {381693696, 141176800}, + {381617568, 140371136}, {381391776, 139594000}, + {381209376, 139194192}, {380987744, 138816064}, + {380728736, 138462464}, {380434272, 138136240}, + {380108064, 137841792}, {379754464, 137582800}, + {379376320, 137361136}, {378976512, 137178704}, + {378199360, 136952960}, {377393696, 136876800}, + }, + { + {354604704, 97626944}, {355293600, 99532704}, + {355982496, 101438472}, {356671392, 103344232}, + {357360288, 105250000}, {358424054, 108192839}, + {358738080, 109061520}, {359426976, 110967296}, + {360115840, 112873056}, {362111392, 113825960}, + {368097952, 116684672}, {370093472, 117637584}, + {372089024, 118590488}, {374084544, 119543392}, + {378075584, 121449192}, {377003072, 117637704}, + {375930560, 113826200}, {375394304, 111920456}, + {374321792, 108108952}, {373249280, 104297464}, + {368952928, 102391616}, {362508448, 99532856}, + {360360288, 98579944}, {358212128, 97627024}, + {356063968, 96674096}, {353915808, 95721176}, + }, + { + {342204640, 63323192}, {342893536, 65228960}, + {344271328, 69040480}, {344960192, 70946248}, + {345649120, 72852016}, {346338016, 74757776}, + {347026880, 76663536}, {347715776, 78569304}, + {354618176, 81428112}, {356918976, 82381040}, + {359219776, 83333976}, {361520576, 84286920}, + {363821376, 85239856}, {366122176, 86192784}, + {368422976, 87145720}, {367886720, 85239976}, + {366814208, 81428472}, {366277952, 79522728}, + {365741664, 77616984}, {365205408, 75711224}, + {364132896, 71899736}, {363596640, 69993984}, + {361143232, 69041032}, {356236352, 67135128}, + {353782944, 66182184}, {351329504, 65229232}, + {348876064, 64276284}, {346422592, 63323328}, + {343969184, 62370380}, {341515744, 61417428}, + }, + { + {329804576, 29019442}, {330493472, 30925208}, + {331182368, 32830970}, {331871232, 34736732}, + {332560160, 36642500}, {333249056, 38548264}, + {333937920, 40454024}, {334626816, 42359792}, + {335315744, 44265552}, {337921792, 45218520}, + {340527872, 46171484}, {343133952, 47124452}, + {345740000, 48077416}, {348346080, 49030384}, + {350952160, 49983348}, {353558208, 50936312}, + {356164288, 51889284}, {358770368, 52842248}, + {358234112, 50936496}, {357697856, 49030752}, + {357161568, 47125000}, {356089056, 43313504}, + {355552800, 41407752}, {355016544, 39502008}, + {354480288, 37596256}, {353944032, 35690508}, + {351185344, 34737524}, {348426624, 33784544}, + {345667904, 32831566}, {342909216, 31878584}, + {340150528, 30925604}, {334633088, 29019640}, + {331874400, 28066660}, {329115680, 27113678}, + }, + }}, + }, + ExPolygons{ + // "x-end-idler.stl": + MyPoly{{ + {-6500000, -10475000}, {0, -10475000}, + {0, -10468600}, {365572, -10468600}, + {1094940, -10417600}, {1818960, -10315900}, + {2534130, -10163800}, {3236950, -9962320}, + {3924000, -9712250}, {4591940, -9414870}, + {5237500, -9071620}, {5857540, -8684170}, + {6449050, -8254410}, {7009140, -7784440}, + {7535080, -7276550}, {8024310, -6733200}, + {8474450, -6157050}, {8883300, -5550900}, + {9248880, -4917710}, {9569390, -4260570}, + {9843280, -3582660}, {10069200, -2887300}, + {10246100, -2177870}, {10373100, -1457840}, + {10449500, -730699}, {10475000, 0}, + {10449500, 730699}, {10373100, 1457840}, + {10246100, 2177870}, {10069200, 2887300}, + {9843280, 3582660}, {9569390, 4260570}, + {9248880, 4917710}, {8883300, 5550900}, + {8474450, 6157050}, {8024310, 6733200}, + {7739860, 7049120}, {8047300, 7272490}, + {9203020, 8357790}, {10213600, 9579380}, + {11063100, 10918000}, {11738200, 12352500}, + {12228100, 13860400}, {12525200, 15417700}, + {12624700, 17000000}, {12525200, 18582300}, + {12228100, 20139600}, {11738200, 21647500}, + {11063100, 23082000}, {10213600, 24420600}, + {9203020, 25642200}, {8047300, 26727500}, + {6764660, 27659400}, {5375340, 28423200}, + {3901250, 29006800}, {2365630, 29401100}, + {792712, 29599800}, {-792712, 29599800}, + {-2365630, 29401100}, {-3901250, 29006800}, + {-5181320, 28500000}, {-23500000, 28500000}, + {-23500000, -9000000}, {-22000000, -10500000}, + {-6500000, -10500000}, + }, + { + { + {6562230, 22074800}, {6357580, 22107300}, + {6158600, 22165100}, {5968430, 22247400}, + {5790080, 22352800}, {5626350, 22479800}, + {5479830, 22626400}, {5352830, 22790100}, + {5247350, 22968400}, {5165060, 23158600}, + {5107250, 23357600}, {5074840, 23562200}, + {5068330, 23769300}, {5087830, 23975600}, + {5133030, 24177800}, {5203220, 24372800}, + {5297290, 24557400}, {5413760, 24728800}, + {5550790, 24884200}, {5706220, 25021300}, + {5877600, 25137700}, {6062220, 25231800}, + {6257180, 25302000}, {6459400, 25347200}, + {6665690, 25366700}, {6872790, 25360200}, + {7077450, 25327800}, {7276430, 25270000}, + {7466600, 25187700}, {7644950, 25082200}, + {7808680, 24955200}, {7955200, 24808700}, + {8082200, 24645000}, {8187670, 24466600}, + {8269970, 24276400}, {8327780, 24077400}, + {8360190, 23872800}, {8366700, 23665700}, + {8347200, 23459400}, {8302000, 23257200}, + {8231809, 23062200}, {8137740, 22877600}, + {8021270, 22706200}, {7884240, 22550800}, + {7728810, 22413800}, {7557430, 22297300}, + {7372810, 22203200}, {7177850, 22133000}, + {6975630, 22087800}, {6769340, 22068300}, + }, + { + {1094940, 10417600}, {365572, 10468600}, + {0, 10468600}, {0, 10475000}, + {-1431080, 10475000}, {-6000000, 15108169}, + {-6000000, 19962102}, {-5802370, 20350000}, + {-5420410, 20938200}, {-4979070, 21483200}, + {-4483170, 21979100}, {-3938160, 22420400}, + {-3350000, 22802400}, {-2725130, 23120800}, + {-2070410, 23372100}, {-1393010, 23553600}, + {-700340, 23663300}, {0, 23700000}, + {700340, 23663300}, {1393010, 23553600}, + {2070410, 23372100}, {2725130, 23120800}, + {3350000, 22802400}, {3938160, 22420400}, + {4483170, 21979100}, {4979070, 21483200}, + {5420410, 20938200}, {5802370, 20350000}, + {6120750, 19725100}, {6372080, 19070400}, + {6553590, 18393000}, {6663300, 17700300}, + {6700000, 17000000}, {6663300, 16299700}, + {6553590, 15607000}, {6372080, 14929600}, + {6120750, 14274900}, {5802370, 13650000}, + {5420410, 13061800}, {4979070, 12516800}, + {4483170, 12020900}, {3938160, 11579600}, + {3350000, 11197600}, {2725130, 10879200}, + {2070410, 10627900}, {1393010, 10446400}, + {1156540, 10409000}, + }, + { + {-1455380, -6847030}, {-2847160, -6394820}, + {-4114500, -5663120}, {-5202010, -4683910}, + {-6062180, -3500000}, {-6657400, -2163120}, + {-6961650, -731699}, {-6961650, 731699}, + {-6657400, 2163120}, {-6062180, 3500000}, + {-5202010, 4683910}, {-4114500, 5663120}, + {-2847160, 6394820}, {-1455380, 6847030}, + {0, 7000000}, {1455380, 6847030}, + {2847160, 6394820}, {4114500, 5663120}, + {5018810, 4848870}, {5421400, 5186681}, + {5472037, 5130444}, {6083180, 4451690}, + {6090937, 4443078}, {6007070, 4372710}, + {5647390, 4070900}, {6062180, 3500000}, + {6657400, 2163120}, {6961650, 731699}, + {6961650, -731699}, {6657400, -2163120}, + {6062180, -3500000}, {5202010, -4683910}, + {4114500, -5663120}, {2847160, -6394820}, + {1455380, -6847030}, {0, -7000000}, + }, + }}, + }, + ExPolygons{ + // "Einsy-hinges.stl": + MyPoly{ + { + {865247, 3337040}, {1400000, 3575130}, {1873570, 3919190}, + {2265250, 4354200}, {2557930, 4861140}, {2738810, 5417850}, + {2762880, 5646830}, {2785290, 5860020}, {2786450, 5871067}, + {2796080, 5962680}, {2800000, 6000000}, {2738810, 6582150}, + {2728530, 6613790}, {2344020, 7279790}, {2195738, 7536616}, + {1639530, 8500000}, {1552105, 8651421}, {935040, 9720210}, + {621454, 10263400}, {-3267950, 17000000}, {-5000000, 17000000}, + {-5000000, 6000000}, {-2800000, 6000000}, {-2738810, 5417850}, + {-2557930, 4861140}, {-2265250, 4354200}, {-1873570, 3919190}, + {-1400000, 3575130}, {-865247, 3337040}, {-292679, 3215340}, + {292679, 3215340}, + }, + {}}, + MyPoly{{ + {412054, -4263360}, {725639, -3720210}, + {1315606, -2698356}, {1430130, -2500000}, + {2000000, -1512950}, {2000000, -1309600}, + {2192510, -976168}, {2347550, -498987}, + {2400000, 0}, {2382076, 170521}, + {2362880, 353169}, {2349180, 483565}, + {2347550, 498987}, {2192510, 976168}, + {1941640, 1410680}, {1605910, 1783550}, + {1200000, 2078460}, {741640, 2282540}, + {250868, 2386850}, {-250868, 2386850}, + {-741640, 2282540}, {-1200000, 2078460}, + {-1605910, 1783550}, {-1941640, 1410680}, + {-2192510, 976168}, {-2347550, 498987}, + {-2400000, 0}, {-5000000, 0}, + {-5000000, -11000000}, {-3477350, -11000000}, + }, + {}}, + }, + ExPolygons{ + // "LCD-cover-ORIGINAL-MK3.stl": + MyPoly{{ + {78000000, -11928900}, + {78000000, 51000000}, + {73000000, 56000000}, + {-72000000, 56000000}, + {-77000000, 51000000}, + {-77000000, -11928900}, + {-74928904, -14000000}, + {75928904, -14000000}, + }, + { + { + {44000000, 26000000}, {44000000, 31980000}, + {43992900, 31987100}, {44000000, 31994200}, + {44000000, 32000000}, {44005800, 32000000}, + {56000000, 43994200}, {56000000, 44000000}, + {56005800, 44000000}, {56013700, 44007900}, + {56021600, 44000000}, {69500000, 44000000}, + {69500000, 36020800}, {69510400, 36010400}, + {63500000, 30000000}, {50900000, 30000000}, + {49000000, 28100000}, {49000000, 26000000}, + {48000000, 26000000}, {48000000, 28500000}, + {47992900, 28507100}, {50503100, 31017300}, + {50520500, 31000000}, {63085800, 31000000}, + {68500000, 36414200}, {68500000, 43000000}, + {56420000, 43000000}, {45000000, 31580000}, + {45000000, 26000000}, + }, + { + {-54500000, 8000000}, + {-54500000, 38500000}, + {30500000, 38500000}, + {30500000, 8000000}, + }, + { + {61872800, 15032900}, {60645900, 15293700}, + {59500000, 15803800}, {58485200, 16541100}, + {57645900, 17473300}, {57018700, 18559600}, + {56631100, 19752500}, {56500000, 21000000}, + {56631100, 22247500}, {57018700, 23440400}, + {57645900, 24526700}, {58485200, 25458900}, + {59500000, 26196200}, {60645900, 26706300}, + {61872800, 26967100}, {63127200, 26967100}, + {64354104, 26706300}, {65500000, 26196200}, + {66514800, 25458900}, {67354104, 24526700}, + {67981304, 23440400}, {68368896, 22247500}, + {68500000, 21000000}, {68368896, 19752500}, + {67981304, 18559600}, {67354104, 17473300}, + {66514800, 16541100}, {65500000, 15803800}, + {64354104, 15293700}, {63127200, 15032900}, + }, + { + {57000000, 1500000}, + {57000000, 5500000}, + {58300000, 5500000}, + {58300000, 1500000}, + }, + { + {55000000, 1500000}, + {55000000, 5500000}, + {56300000, 5500000}, + {56300000, 1500000}, + }, + { + {59000000, 1500000}, + {59000000, 5500000}, + {60300000, 5500000}, + {60300000, 1500000}, + }, + { + {61000000, 1500000}, + {61000000, 5500000}, + {62300000, 5500000}, + {62300000, 1500000}, + }, + { + {63000000, 1500000}, + {63000000, 5500000}, + {64300004, 5500000}, + {64300004, 1500000}, + }, + { + {65000000, 1500000}, + {65000000, 5500000}, + {66300004, 5500000}, + {66300004, 1500000}, + }, + { + {67000000, 1500000}, + {67000000, 5500000}, + {68300000, 5500000}, + {68300000, 1500000}, + }, + }}, + }, + ExPolygons{ + // "x-end-motor.stl": + MyPoly{{ + {2365630, -29401100}, {3901250, -29006800}, + {5375340, -28423200}, {6764660, -27659400}, + {8047300, -26727500}, {9203020, -25642200}, + {10213600, -24420600}, {11063100, -23082000}, + {11738200, -21647500}, {12228100, -20139600}, + {12525200, -18582300}, {12624700, -17000000}, + {12525200, -15417700}, {12228100, -13860400}, + {11738200, -12352500}, {11063100, -10918000}, + {10213600, -9579380}, {9203020, -8357790}, + {8047300, -7272490}, {7739860, -7049120}, + {8024310, -6733200}, {8474450, -6157050}, + {8883300, -5550900}, {9248880, -4917710}, + {9569390, -4260570}, {9843280, -3582660}, + {10069200, -2887300}, {10246100, -2177870}, + {10373100, -1457840}, {10449500, -730699}, + {10475000, 0}, {10449500, 730699}, + {10373100, 1457840}, {10246100, 2177870}, + {10069200, 2887300}, {9843280, 3582660}, + {9569390, 4260570}, {9248880, 4917710}, + {8883300, 5550900}, {8474450, 6157050}, + {8024310, 6733200}, {7535080, 7276550}, + {7009140, 7784440}, {6449050, 8254410}, + {5857540, 8684170}, {5237500, 9071620}, + {4591940, 9414870}, {3924000, 9712250}, + {3236950, 9962320}, {2534130, 10163800}, + {1818960, 10315900}, {1094940, 10417600}, + {365572, 10468600}, {0, 10468600}, + {0, 10475000}, {-6500000, 10475000}, + {-6500000, 53000000}, {-23500000, 53000000}, + {-23500000, -28500000}, {-5181320, -28500000}, + {-3901250, -29006800}, {-2365630, -29401100}, + {-792712, -29599800}, {792712, -29599800}, + }, + { + { + {-1455380, -6847030}, {-2847160, -6394820}, + {-4114500, -5663120}, {-5202010, -4683910}, + {-6062180, -3500000}, {-6657400, -2163120}, + {-6961650, -731699}, {-6961650, 731699}, + {-6657400, 2163120}, {-6062180, 3500000}, + {-5202010, 4683910}, {-4114500, 5663120}, + {-2847160, 6394820}, {-1455380, 6847030}, + {0, 7000000}, {1455380, 6847030}, + {2847160, 6394820}, {4114500, 5663120}, + {5202010, 4683910}, {6062180, 3500000}, + {6657400, 2163120}, {6961650, 731699}, + {6961650, -731699}, {6657400, -2163120}, + {6062180, -3500000}, {5641320, -4079259}, + {6084032, -4450744}, {6083180, -4451690}, + {5472037, -5130444}, {5414502, -5194343}, + {5328022, -5121778}, {5011080, -4855830}, + {4114500, -5663120}, {2847160, -6394820}, + {1455380, -6847030}, {0, -7000000}, + }, + { + {-700340, -23663300}, {-1393010, -23553600}, + {-2070410, -23372100}, {-2725130, -23120800}, + {-3350000, -22802400}, {-3938160, -22420400}, + {-4483170, -21979100}, {-4979070, -21483200}, + {-5420410, -20938200}, {-5802370, -20350000}, + {-6120750, -19725100}, {-6372080, -19070400}, + {-6500000, -18593000}, {-6500000, -15515603}, + {-1406282, -10475000}, {0, -10475000}, + {0, -10468600}, {365572, -10468600}, + {1094940, -10417600}, {1156540, -10409000}, + {1393010, -10446400}, {2070410, -10627900}, + {2725130, -10879200}, {3350000, -11197600}, + {3938160, -11579600}, {4483170, -12020900}, + {4979070, -12516800}, {5420410, -13061800}, + {5802370, -13650000}, {6120750, -14274900}, + {6372080, -14929600}, {6553590, -15607000}, + {6663300, -16299700}, {6700000, -17000000}, + {6663300, -17700300}, {6553590, -18393000}, + {6372080, -19070400}, {6120750, -19725100}, + {5802370, -20350000}, {5420410, -20938200}, + {4979070, -21483200}, {4483170, -21979100}, + {3938160, -22420400}, {3350000, -22802400}, + {2725130, -23120800}, {2070410, -23372100}, + {1393010, -23553600}, {700340, -23663300}, + {0, -23700000}, + }, + { + {6459400, -25347200}, {6257180, -25302000}, + {6062220, -25231800}, {5877600, -25137700}, + {5706220, -25021300}, {5550790, -24884200}, + {5413760, -24728800}, {5297290, -24557400}, + {5203220, -24372800}, {5133030, -24177800}, + {5087830, -23975600}, {5068330, -23769300}, + {5074840, -23562200}, {5107250, -23357600}, + {5165060, -23158600}, {5247350, -22968400}, + {5352830, -22790100}, {5479830, -22626400}, + {5626350, -22479800}, {5790080, -22352800}, + {5968430, -22247400}, {6158600, -22165100}, + {6357580, -22107300}, {6562230, -22074800}, + {6769340, -22068300}, {6975630, -22087800}, + {7177850, -22133000}, {7372810, -22203200}, + {7557430, -22297300}, {7728810, -22413800}, + {7884240, -22550800}, {8021270, -22706200}, + {8137740, -22877600}, {8231809, -23062200}, + {8302000, -23257200}, {8347200, -23459400}, + {8366700, -23665700}, {8360190, -23872800}, + {8327780, -24077400}, {8269970, -24276400}, + {8187670, -24466600}, {8082200, -24645000}, + {7955200, -24808700}, {7808680, -24955200}, + {7644950, -25082200}, {7466600, -25187700}, + {7276430, -25270000}, {7077450, -25327800}, + {6872790, -25360200}, {6665690, -25366700}, + }, + }}, + }, + ExPolygons{ + // "y-belt-idler.stl": + MyPoly{{ + {12500000, 40000000}, + {-12500000, 40000000}, + {-12500000, 5000000}, + {12500000, 5000000}, + }, + { + { + {-103604, 34353300}, {-309178, 34379200}, + {-509877, 34430800}, {-702536, 34507000}, + {-884113, 34606900}, {-1051750, 34728700}, + {-1202800, 34870500}, {-1334880, 35030200}, + {-1445910, 35205100}, {-1534130, 35392600}, + {-1598160, 35589700}, {-1636990, 35793200}, + {-1650000, 36000000}, {-1636990, 36206800}, + {-1598160, 36410300}, {-1534130, 36607400}, + {-1445910, 36794900}, {-1334880, 36969800}, + {-1202800, 37129500}, {-1051750, 37271300}, + {-884113, 37393100}, {-702536, 37493000}, + {-509877, 37569200}, {-309178, 37620800}, + {-103604, 37646700}, {103604, 37646700}, + {309178, 37620800}, {509877, 37569200}, + {702536, 37493000}, {884113, 37393100}, + {1051750, 37271300}, {1202800, 37129500}, + {1334880, 36969800}, {1445910, 36794900}, + {1534130, 36607400}, {1598160, 36410300}, + {1636990, 36206800}, {1650000, 36000000}, + {1636990, 35793200}, {1598160, 35589700}, + {1534130, 35392600}, {1445910, 35205100}, + {1334880, 35030200}, {1202800, 34870500}, + {1051750, 34728700}, {884113, 34606900}, + {702536, 34507000}, {509877, 34430800}, + {309178, 34379200}, {103604, 34353300}, + }, + { + {-103604, 8353260}, {-309178, 8379229}, + {-509877, 8430760}, {-702536, 8507040}, + {-884113, 8606860}, {-1051750, 8728650}, + {-1202800, 8870500}, {-1334880, 9030150}, + {-1445910, 9205110}, {-1534130, 9392590}, + {-1598160, 9589660}, {-1636990, 9793200}, + {-1650000, 10000000}, {-1636990, 10206800}, + {-1598160, 10410300}, {-1534130, 10607400}, + {-1445910, 10794900}, {-1334880, 10969800}, + {-1202800, 11129500}, {-1051750, 11271300}, + {-884113, 11393100}, {-702536, 11493000}, + {-509877, 11569200}, {-309178, 11620800}, + {-103604, 11646700}, {103604, 11646700}, + {309178, 11620800}, {509877, 11569200}, + {702536, 11493000}, {884113, 11393100}, + {1051750, 11271300}, {1202800, 11129500}, + {1334880, 10969800}, {1445910, 10794900}, + {1534130, 10607400}, {1598160, 10410300}, + {1636990, 10206800}, {1650000, 10000000}, + {1636990, 9793200}, {1598160, 9589660}, + {1534130, 9392590}, {1445910, 9205110}, + {1334880, 9030150}, {1202800, 8870500}, + {1051750, 8728650}, {884113, 8606860}, + {702536, 8507040}, {509877, 8430760}, + {309178, 8379229}, {103604, 8353260}, + }, + }}, + }, + ExPolygons{ + // "z-screw-cover.stl": + MyPoly{{ + {836227, -7956170}, {927804, -7941670}, + {964293, -7941670}, {1029899, -7925500}, + {1663290, -7825180}, {2472140, -7608450}, + {2751896, -7501064}, {2836840, -7480130}, + {2919650, -7436670}, {3253890, -7308360}, + {4000000, -6928200}, {4470019, -6622970}, + {4544520, -6583870}, {4583731, -6549125}, + {4702280, -6472140}, {5353040, -5945160}, + {5945160, -5353040}, {5973910, -5317540}, + {5988090, -5304980}, {6011204, -5271483}, + {6472140, -4702280}, {6928200, -4000000}, + {7039150, -3782250}, {7083650, -3717780}, + {7117560, -3628360}, {7308360, -3253890}, + {7608450, -2472140}, {7734580, -2001420}, + {7767530, -1914530}, {7775550, -1848520}, + {7825180, -1663290}, {7956170, -836227}, + {8000000, 0}, {7956170, 836227}, + {7825180, 1663290}, {7775550, 1848520}, + {7767530, 1914530}, {7734580, 2001420}, + {7608450, 2472140}, {7308360, 3253890}, + {7117560, 3628360}, {7083650, 3717780}, + {7039150, 3782250}, {6928200, 4000000}, + {6472140, 4702280}, {6011204, 5271483}, + {5988090, 5304980}, {5973910, 5317540}, + {5945160, 5353040}, {5353040, 5945160}, + {4702280, 6472140}, {4583731, 6549125}, + {4544520, 6583870}, {4470019, 6622970}, + {4000000, 6928200}, {3253890, 7308360}, + {2919650, 7436670}, {2836840, 7480130}, + {2751896, 7501064}, {2472140, 7608450}, + {1663290, 7825180}, {1029899, 7925500}, + {964293, 7941670}, {927804, 7941670}, + {836227, 7956170}, {0, 8000000}, + {-836227, 7956170}, {-927804, 7941670}, + {-964293, 7941670}, {-1029899, 7925500}, + {-1663290, 7825180}, {-2472140, 7608450}, + {-2751896, 7501064}, {-2836840, 7480130}, + {-2919650, 7436670}, {-3253890, 7308360}, + {-4000000, 6928200}, {-4470019, 6622970}, + {-4544520, 6583870}, {-4583731, 6549125}, + {-4702280, 6472140}, {-5353040, 5945160}, + {-5945160, 5353040}, {-5973910, 5317540}, + {-5988090, 5304980}, {-6011204, 5271483}, + {-6472140, 4702280}, {-6928200, 4000000}, + {-7039150, 3782250}, {-7083650, 3717780}, + {-7117560, 3628360}, {-7308360, 3253890}, + {-7608450, 2472140}, {-7734580, 2001420}, + {-7767530, 1914530}, {-7775550, 1848520}, + {-7825180, 1663290}, {-7956170, 836227}, + {-8000000, 0}, {-7956170, -836227}, + {-7825180, -1663290}, {-7775550, -1848520}, + {-7767530, -1914530}, {-7734580, -2001420}, + {-7608450, -2472140}, {-7308360, -3253890}, + {-7117560, -3628360}, {-7083650, -3717780}, + {-7039150, -3782250}, {-6928200, -4000000}, + {-6472140, -4702280}, {-6011204, -5271483}, + {-5988090, -5304980}, {-5973910, -5317540}, + {-5945160, -5353040}, {-5353040, -5945160}, + {-4702280, -6472140}, {-4583731, -6549125}, + {-4544520, -6583870}, {-4470019, -6622970}, + {-4000000, -6928200}, {-3253890, -7308360}, + {-2919650, -7436670}, {-2836840, -7480130}, + {-2751896, -7501064}, {-2472140, -7608450}, + {-1663290, -7825180}, {-1029899, -7925500}, + {-964293, -7941670}, {-927804, -7941670}, + {-836227, -7956170}, {0, -8000000}, + }, + { + { + {400000, -3200000}, {-400000, -3200000}, + {-440000, -3400000}, {-799999, -3400000}, + {-875001, -3600000}, {-1300000, -3600000}, + {-1416318, -3948965}, {-1708290, -3836890}, + {-2100000, -3637310}, {-2468700, -3397870}, + {-2810350, -3121210}, {-3121210, -2810350}, + {-3397870, -2468700}, {-3637310, -2100000}, + {-3836890, -1708290}, {-3994440, -1297870}, + {-4108220, -873229}, {-4152979, -590596}, + {-3200000, -400000}, {-3200000, 400000}, + {-3400000, 440000}, {-3400000, 799999}, + {-3600000, 874998}, {-3600000, 1300000}, + {-3948965, 1416318}, {-3836890, 1708290}, + {-3637310, 2100000}, {-3397870, 2468700}, + {-3121210, 2810350}, {-2810350, 3121210}, + {-2468700, 3397870}, {-2100000, 3637310}, + {-1708290, 3836890}, {-1297870, 3994440}, + {-873229, 4108220}, {-590596, 4152979}, + {-400000, 3200000}, {400000, 3200000}, + {440000, 3400000}, {799999, 3400000}, + {874998, 3600000}, {1300000, 3600000}, + {1416318, 3948965}, {1708290, 3836890}, + {2100000, 3637310}, {2468700, 3397870}, + {2810350, 3121210}, {3121210, 2810350}, + {3397870, 2468700}, {3637310, 2100000}, + {3836890, 1708290}, {3994440, 1297870}, + {4108220, 873229}, {4152979, 590596}, + {3200000, 400000}, {3200000, -400000}, + {3400000, -440000}, {3400000, -799999}, + {3600000, -874998}, {3600000, -1300000}, + {3948965, -1416318}, {3836890, -1708290}, + {3637310, -2100000}, {3397870, -2468700}, + {3121210, -2810350}, {2810350, -3121210}, + {2468700, -3397870}, {2100000, -3637310}, + {1708290, -3836890}, {1297870, -3994440}, + {873229, -4108220}, {590596, -4152979}, + }, + }}, + }, + ExPolygons{ + // "cable-holder.stl": + MyPoly{{ + {-2043150, -34799100}, {-1990180, -34549300}, + {-1988820, -34542900}, {-1986150, -34536800}, + {-1882530, -34303500}, {-1732900, -34097100}, + {-1728930, -34091600}, {-1723900, -34087100}, + {-1534730, -33916300}, {-1308420, -33785400}, + {-1059890, -33704400}, {-806907, -33677700}, + {-799999, -33677000}, {-793091, -33677700}, + {-540110, -33704400}, {-291578, -33785400}, + {-65267, -33916300}, {123903, -34087100}, + {128930, -34091600}, {132903, -34097100}, + {282532, -34303500}, {386150, -34536800}, + {388820, -34542900}, {390183, -34549300}, + {443151, -34799100}, {443151, -34908100}, + {556848, -34908100}, {556848, -34799100}, + {609816, -34549300}, {611179, -34542900}, + {613849, -34536800}, {717467, -34303500}, + {867096, -34097100}, {871069, -34091600}, + {876096, -34087100}, {1065270, -33916300}, + {1291580, -33785400}, {1540110, -33704400}, + {1793090, -33677700}, {1800000, -33677000}, + {1806910, -33677700}, {2059890, -33704400}, + {2308420, -33785400}, {2534730, -33916300}, + {2723900, -34087100}, {2728930, -34091600}, + {2732900, -34097100}, {2882530, -34303500}, + {2986150, -34536800}, {2988820, -34542900}, + {2990180, -34549300}, {3043150, -34799100}, + {3043150, -34908100}, {4000000, -34908100}, + {4000000, -29539900}, {4215720, -29345700}, + {4830130, -28500000}, {5255280, -27545100}, + {5472610, -26522600}, {5472610, -26000000}, + {5500000, -26000000}, {5500000, -17000000}, + {4805710, -17000000}, {4215720, -17815100}, + {3438930, -18517200}, {2533680, -19041900}, + {1539560, -19366100}, {499999, -19475800}, + {-539558, -19366100}, {-1533680, -19041900}, + {-2438930, -18517200}, {-3215720, -17815100}, + {-3805710, -17000000}, {-4500000, -17000000}, + {-4500000, -26000000}, {-4472610, -26000000}, + {-4472610, -26522600}, {-4255280, -27545100}, + {-3830130, -28500000}, {-3215720, -29345700}, + {-3000000, -29539900}, {-3000000, -34908100}, + {-2043150, -34908100}, + }, + { + { + {136154, -28711800}, {-211788, -28598700}, + {-382749, -28500000}, {-528624, -28415800}, + {-800503, -28171000}, {-1015540, -27875000}, + {-1164350, -27540800}, {-1240410, -27182900}, + {-1240410, -26817100}, {-1164350, -26459200}, + {-1015540, -26125000}, {-800503, -25829000}, + {-528624, -25584200}, {-382751, -25500000}, + {-211788, -25401300}, {136154, -25288200}, + {500000, -25250000}, {863845, -25288200}, + {1211790, -25401300}, {1382750, -25500000}, + {1528620, -25584200}, {1800500, -25829000}, + {2015539, -26125000}, {2164350, -26459200}, + {2240410, -26817100}, {2240410, -27182900}, + {2164350, -27540800}, {2015539, -27875000}, + {1800500, -28171000}, {1528620, -28415800}, + {1382750, -28500000}, {1211790, -28598700}, + {863845, -28711800}, {499999, -28750000}, + }, + }}, + }, + ExPolygons{ + // "Einsy-doors.stl": + MyPoly{{ + {105500000, 91975304}, + {21500000, 91975304}, + {21500000, 87500000}, + {0, 87500000}, + {0, 0}, + {105500000, 0}, + }, + { + { + {46000000, 60500000}, + {46000000, 79500000}, + {49650000, 79500000}, + {49650000, 60500000}, + }, + { + {58000000, 60500000}, + {58000000, 79500000}, + {61650000, 79500000}, + {61650000, 60500000}, + }, + { + {70000000, 60500000}, + {70000000, 79500000}, + {73650000, 79500000}, + {73650000, 60500000}, + }, + { + {64000000, 60500000}, + {64000000, 79500000}, + {67650000, 79500000}, + {67650000, 60500000}, + }, + { + {94000000, 60500000}, + {94000000, 79500000}, + {97650000, 79500000}, + {97650000, 60500000}, + }, + { + {52000000, 60500000}, + {52000000, 79500000}, + {55650000, 79500000}, + {55650000, 60500000}, + }, + { + {88000000, 60500000}, + {88000000, 79500000}, + {91650000, 79500000}, + {91650000, 60500000}, + }, + { + {82000000, 60500000}, + {82000000, 79500000}, + {85650000, 79500000}, + {85650000, 60500000}, + }, + { + {40000000, 60500000}, + {40000000, 79500000}, + {43650000, 79500000}, + {43650000, 60500000}, + }, + { + {76000000, 60500000}, + {76000000, 79500000}, + {79650000, 79500000}, + {79650000, 60500000}, + }, + { + {52000000, 35500000}, + {52000000, 54500000}, + {55650000, 54500000}, + {55650000, 35500000}, + }, + { + {40000000, 35500000}, + {40000000, 54500000}, + {43650000, 54500000}, + {43650000, 35500000}, + }, + { + {58000000, 35500000}, + {58000000, 54500000}, + {61650000, 54500000}, + {61650000, 35500000}, + }, + { + {76000000, 35500000}, + {76000000, 54500000}, + {79650000, 54500000}, + {79650000, 35500000}, + }, + { + {94000000, 35500000}, + {94000000, 54500000}, + {97650000, 54500000}, + {97650000, 35500000}, + }, + { + {82000000, 35500000}, + {82000000, 54500000}, + {85650000, 54500000}, + {85650000, 35500000}, + }, + { + {64000000, 35500000}, + {64000000, 54500000}, + {67650000, 54500000}, + {67650000, 35500000}, + }, + { + {70000000, 35500000}, + {70000000, 54500000}, + {73650000, 54500000}, + {73650000, 35500000}, + }, + { + {46000000, 35500000}, + {46000000, 54500000}, + {49650000, 54500000}, + {49650000, 35500000}, + }, + { + {88000000, 35500000}, + {88000000, 54500000}, + {91650000, 54500000}, + {91650000, 35500000}, + }, + { + {40000000, 10500000}, + {40000000, 29500000}, + {43650000, 29500000}, + {43650000, 10500000}, + }, + { + {82000000, 10500000}, + {82000000, 29500000}, + {85650000, 29500000}, + {85650000, 10500000}, + }, + { + {94000000, 10500000}, + {94000000, 29500000}, + {97650000, 29500000}, + {97650000, 10500000}, + }, + { + {88000000, 10500000}, + {88000000, 29500000}, + {91650000, 29500000}, + {91650000, 10500000}, + }, + { + {76000000, 10500000}, + {76000000, 29500000}, + {79650000, 29500000}, + {79650000, 10500000}, + }, + { + {64000000, 10500000}, + {64000000, 29500000}, + {67650000, 29500000}, + {67650000, 10500000}, + }, + { + {52000000, 10500000}, + {52000000, 29500000}, + {55650000, 29500000}, + {55650000, 10500000}, + }, + { + {70000000, 10500000}, + {70000000, 29500000}, + {73650000, 29500000}, + {73650000, 10500000}, + }, + { + {46000000, 10500000}, + {46000000, 29500000}, + {49650000, 29500000}, + {49650000, 10500000}, + }, + { + {58000000, 10500000}, + {58000000, 29500000}, + {61650000, 29500000}, + {61650000, 10500000}, + }, + }}, + }, + ExPolygons{ + // "y-motor-holder.stl": + MyPoly{{ + {47000000, 0}, {47000000, 15000000}, + {42000000, 20000000}, {37468500, 20000000}, + {37500000, 19500000}, {37409300, 18058700}, + {37138700, 16640100}, {36692400, 15266600}, + {36077500, 13959800}, {35303700, 12740500}, + {34383100, 11627700}, {33330398, 10639100}, + {32161998, 9790230}, {30896500, 9094490}, + {29553700, 8562850}, {28154900, 8203700}, + {26722100, 8022690}, {25277900, 8022690}, + {23845100, 8203700}, {22446300, 8562850}, + {21103500, 9094490}, {19838000, 9790230}, + {18669600, 10639100}, {17616900, 11627700}, + {16696301, 12740500}, {15922500, 13959800}, + {15307600, 15266600}, {14861300, 16640100}, + {14590700, 18058700}, {14500000, 19500000}, + {14590700, 20941300}, {14861300, 22359900}, + {15000000, 22786800}, {15000000, 38000000}, + {12500000, 40500000}, {9642140, 40500000}, + {71067, 30928900}, {0, 31000000}, + {0, -1500000}, {45500000, -1500000}, + }, + { + { + {10396400, 33353298}, {10190800, 33379200}, + {9990120, 33430802}, {9797460, 33507000}, + {9615890, 33606900}, {9448250, 33728700}, + {9297200, 33870500}, {9165120, 34030200}, + {9054090, 34205100}, {8965870, 34392600}, + {8901840, 34589700}, {8863010, 34793200}, + {8850000, 35000000}, {8863010, 35206800}, + {8901840, 35410300}, {8965870, 35607400}, + {9054090, 35794900}, {9165120, 35969800}, + {9297200, 36129500}, {9448250, 36271300}, + {9615890, 36393100}, {9797460, 36493000}, + {9990120, 36569200}, {10190800, 36620800}, + {10396400, 36646700}, {10603600, 36646700}, + {10809200, 36620800}, {11009900, 36569200}, + {11202500, 36493000}, {11384100, 36393100}, + {11551700, 36271300}, {11702800, 36129500}, + {11834900, 35969800}, {11945900, 35794900}, + {12034100, 35607400}, {12098200, 35410300}, + {12137000, 35206800}, {12150000, 35000000}, + {12137000, 34793200}, {12098200, 34589700}, + {12034100, 34392600}, {11945900, 34205100}, + {11834900, 34030200}, {11702800, 33870500}, + {11551700, 33728700}, {11384100, 33606900}, + {11202500, 33507000}, {11009900, 33430802}, + {10809200, 33379200}, {10603600, 33353298}, + }, + { + {41396400, 2353260}, {41190800, 2379230}, + {40990100, 2430760}, {40797500, 2507040}, + {40615900, 2606860}, {40448200, 2728650}, + {40297200, 2870500}, {40165100, 3030150}, + {40054100, 3205110}, {39965900, 3392590}, + {39901800, 3589660}, {39863000, 3793200}, + {39850000, 4000000}, {39863000, 4206800}, + {39901800, 4410340}, {39965900, 4607400}, + {40054100, 4794890}, {40165100, 4969840}, + {40297200, 5129500}, {40448200, 5271350}, + {40615900, 5393140}, {40797500, 5492960}, + {40990100, 5569240}, {41190800, 5620770}, + {41396400, 5646740}, {41603600, 5646740}, + {41809200, 5620770}, {42009900, 5569240}, + {42202500, 5492960}, {42384100, 5393140}, + {42551800, 5271350}, {42702800, 5129500}, + {42834900, 4969840}, {42945900, 4794890}, + {43034100, 4607400}, {43098200, 4410340}, + {43137000, 4206800}, {43150000, 4000000}, + {43137000, 3793200}, {43098200, 3589660}, + {43034100, 3392590}, {42945900, 3205110}, + {42834900, 3030150}, {42702800, 2870500}, + {42551800, 2728650}, {42384100, 2606860}, + {42202500, 2507040}, {42009900, 2430760}, + {41809200, 2379230}, {41603600, 2353260}, + }, + }}, + }, + ExPolygons{ + // "heatbed-cable-cover.stl": + MyPoly{{ + {15000000, 48000000}, + {11000000, 52000000}, + {-11000000, 52000000}, + {-15000000, 48000000}, + {-15000000, 35500000}, + {15000000, 35500000}, + }, + { + { + {-10100500, 43403200}, {-10299800, 43428300}, + {-10494400, 43478300}, {-10681200, 43552300}, + {-10857300, 43649100}, {-11019900, 43767200}, + {-11166300, 43904700}, {-11294400, 44059500}, + {-11402100, 44229200}, {-11487600, 44411000}, + {-11549700, 44602100}, {-11587400, 44799500}, + {-11600000, 45000000}, {-11587400, 45200500}, + {-11549700, 45397900}, {-11487600, 45589000}, + {-11402100, 45770800}, {-11294400, 45940500}, + {-11166300, 46095300}, {-11019900, 46232800}, + {-10857300, 46350900}, {-10681200, 46447700}, + {-10494400, 46521700}, {-10299800, 46571700}, + {-10100500, 46596800}, {-9899530, 46596800}, + {-9700190, 46571700}, {-9505570, 46521700}, + {-9318750, 46447700}, {-9142680, 46350900}, + {-8980120, 46232800}, {-8833650, 46095300}, + {-8705570, 45940500}, {-8597910, 45770800}, + {-8512360, 45589000}, {-8450270, 45397900}, + {-8412620, 45200500}, {-8400000, 45000000}, + {-8412620, 44799500}, {-8450270, 44602100}, + {-8512360, 44411000}, {-8597910, 44229200}, + {-8705570, 44059500}, {-8833650, 43904700}, + {-8980120, 43767200}, {-9142680, 43649100}, + {-9318750, 43552300}, {-9505570, 43478300}, + {-9700190, 43428300}, {-9899530, 43403200}, + }, + { + {9899530, 43403200}, {9700190, 43428300}, + {9505570, 43478300}, {9318750, 43552300}, + {9142680, 43649100}, {8980120, 43767200}, + {8833650, 43904700}, {8705570, 44059500}, + {8597910, 44229200}, {8512360, 44411000}, + {8450270, 44602100}, {8412620, 44799500}, + {8400000, 45000000}, {8412620, 45200500}, + {8450270, 45397900}, {8512360, 45589000}, + {8597910, 45770800}, {8705570, 45940500}, + {8833650, 46095300}, {8980120, 46232800}, + {9142680, 46350900}, {9318750, 46447700}, + {9505570, 46521700}, {9700190, 46571700}, + {9899530, 46596800}, {10100500, 46596800}, + {10299800, 46571700}, {10494400, 46521700}, + {10681200, 46447700}, {10857300, 46350900}, + {11019900, 46232800}, {11166300, 46095300}, + {11294400, 45940500}, {11402100, 45770800}, + {11487600, 45589000}, {11549700, 45397900}, + {11587400, 45200500}, {11600000, 45000000}, + {11587400, 44799500}, {11549700, 44602100}, + {11487600, 44411000}, {11402100, 44229200}, + {11294400, 44059500}, {11166300, 43904700}, + {11019900, 43767200}, {10857300, 43649100}, + {10681200, 43552300}, {10494400, 43478300}, + {10299800, 43428300}, {10100500, 43403200}, + }, + }}, + MyPoly{{ + {18000000, 25000000}, + {16426001, 26574000}, + {11000000, 32000000}, + {-11000000, 32000000}, + {-18000000, 25000000}, + {-18000000, 0}, + {18000000, 0}, + }, + { + { + {-10100500, 23403200}, {-10299800, 23428300}, + {-10494400, 23478300}, {-10681200, 23552300}, + {-10857300, 23649100}, {-11019900, 23767200}, + {-11166300, 23904700}, {-11294400, 24059500}, + {-11402100, 24229200}, {-11487600, 24411000}, + {-11549700, 24602100}, {-11587400, 24799500}, + {-11600000, 25000000}, {-11587400, 25200500}, + {-11549700, 25397900}, {-11487600, 25589000}, + {-11402100, 25770800}, {-11294400, 25940500}, + {-11166300, 26095300}, {-11019900, 26232800}, + {-10857300, 26350900}, {-10681200, 26447700}, + {-10494400, 26521700}, {-10299800, 26571700}, + {-10100500, 26596800}, {-9899530, 26596800}, + {-9700190, 26571700}, {-9505570, 26521700}, + {-9318750, 26447700}, {-9142680, 26350900}, + {-8980120, 26232800}, {-8833650, 26095300}, + {-8705570, 25940500}, {-8597910, 25770800}, + {-8512360, 25589000}, {-8450270, 25397900}, + {-8412620, 25200500}, {-8400000, 25000000}, + {-8412620, 24799500}, {-8450270, 24602100}, + {-8512360, 24411000}, {-8597910, 24229200}, + {-8705570, 24059500}, {-8833650, 23904700}, + {-8980120, 23767200}, {-9142680, 23649100}, + {-9318750, 23552300}, {-9505570, 23478300}, + {-9700190, 23428300}, {-9899530, 23403200}, + }, + { + {9899530, 23403200}, {9700190, 23428300}, + {9505570, 23478300}, {9318750, 23552300}, + {9142680, 23649100}, {8980120, 23767200}, + {8833650, 23904700}, {8705570, 24059500}, + {8597910, 24229200}, {8512360, 24411000}, + {8450270, 24602100}, {8412620, 24799500}, + {8400000, 25000000}, {8412620, 25200500}, + {8450270, 25397900}, {8512360, 25589000}, + {8597910, 25770800}, {8705570, 25940500}, + {8833650, 26095300}, {8980120, 26232800}, + {9142680, 26350900}, {9318750, 26447700}, + {9505570, 26521700}, {9700190, 26571700}, + {9899530, 26596800}, {10100500, 26596800}, + {10299800, 26571700}, {10494400, 26521700}, + {10681200, 26447700}, {10857300, 26350900}, + {11019900, 26232800}, {11166300, 26095300}, + {11294400, 25940500}, {11402100, 25770800}, + {11487600, 25589000}, {11549700, 25397900}, + {11587400, 25200500}, {11600000, 25000000}, + {11587400, 24799500}, {11549700, 24602100}, + {11487600, 24411000}, {11402100, 24229200}, + {11294400, 24059500}, {11166300, 23904700}, + {11019900, 23767200}, {10857300, 23649100}, + {10681200, 23552300}, {10494400, 23478300}, + {10299800, 23428300}, {10100500, 23403200}, + }, + { + {-100465, 5903160}, {-299809, 5928340}, + {-494427, 5978310}, {-681247, 6052280}, + {-857323, 6149070}, {-1019880, 6267180}, + {-1166350, 6404720}, {-1294430, 6559540}, + {-1402090, 6729190}, {-1487640, 6911000}, + {-1549730, 7102100}, {-1587380, 7299470}, + {-1600000, 7500000}, {-1587380, 7700530}, + {-1549730, 7897900}, {-1487640, 8088999}, + {-1402090, 8270810}, {-1294430, 8440460}, + {-1166350, 8595270}, {-1019880, 8732820}, + {-857323, 8850920}, {-681247, 8947720}, + {-494427, 9021690}, {-299809, 9071660}, + {-100465, 9096840}, {100465, 9096840}, + {299809, 9071660}, {494427, 9021690}, + {681247, 8947720}, {857323, 8850920}, + {1019880, 8732820}, {1166350, 8595270}, + {1294430, 8440460}, {1402090, 8270810}, + {1487640, 8088999}, {1549730, 7897900}, + {1587380, 7700530}, {1600000, 7500000}, + {1587380, 7299470}, {1549730, 7102100}, + {1487640, 6911000}, {1402090, 6729190}, + {1294430, 6559540}, {1166350, 6404720}, + {1019880, 6267180}, {857323, 6149070}, + {681247, 6052280}, {494427, 5978310}, + {299809, 5928340}, {100465, 5903160}, + }, + }}, + }, + ExPolygons{ + // "y-rod-holder.stl": + MyPoly{{ + {-4130159, -11630200}, {-4125905, -11625938}, + {-4036359, -11536400}, {-3977214, -11477197}, + {-3893620, -11393600}, {-3968460, -11001300}, + {-4000000, -10500000}, {-3968460, -9998670}, + {-3874330, -9505240}, {-3719110, -9027500}, + {-3505230, -8572980}, {-3236070, -8148860}, + {-2915870, -7761810}, {-2549700, -7417950}, + {-2143310, -7122690}, {-1920140, -7000000}, + {-1703120, -6880690}, {-1236070, -6695770}, + {-749525, -6570850}, {-251162, -6507890}, + {251162, -6507890}, {749525, -6570850}, + {1236070, -6695770}, {1703120, -6880690}, + {1920140, -7000000}, {2143310, -7122690}, + {2549700, -7417950}, {2915870, -7761810}, + {3236070, -8148860}, {3505230, -8572980}, + {3719110, -9027500}, {3874330, -9505240}, + {3968460, -9998670}, {4000000, -10500000}, + {3968460, -11001300}, {3916390, -11274300}, + {4089891, -11447789}, {4113299, -11471200}, + {4642140, -12000000}, {8618800, -12000000}, + {10350900, -9000000}, {11376300, -7223940}, + {13000000, -4411540}, {13000000, 0}, + {4000000, 0}, {4000000, 1500000}, + {-4000000, 1500000}, {-4000000, 0}, + {-13000000, 0}, {-13000000, -4202820}, + {-8498290, -12000000}, {-4500000, -12000000}, + }, + {}}, + }, + ExPolygons{ + // "extruder-body.stl": + MyPoly{{ + {32000000, -41357900}, {32000000, -34500000}, + {27500000, -30000000}, {22600000, -30000000}, + {22600000, -29900000}, {22500000, -30000000}, + {17000000, -24500000}, {17000000, -12000000}, + {23000000, -12000000}, {23000000, -18000000}, + {23928900, -18000000}, {26000000, -15928900}, + {26000000, -10000000}, {23000000, -7000000}, + {17000000, -7000000}, {17000000, 44000000}, + {11000000, 50000000}, {-18000000, 50000000}, + {-25000000, 43000000}, {-25000000, 5750000}, + {-27250000, 5750000}, {-31500000, 1500000}, + {-31500000, -1500000}, {-24500000, -1500000}, + {-24500000, 2500000}, {-21309400, 2500000}, + {-20500000, 1098080}, {-20500000, -44000000}, + {-15500000, -44000000}, {-15500000, -38000000}, + {-14000000, -36500000}, {14000000, -36500000}, + {14000000, -38916000}, {14423151, -39823468}, + {14452100, -39885600}, {15259800, -41617700}, + {18642100, -45000000}, {28357900, -45000000}, + }, + { + { + {-19603600, 40853300}, {-19790500, 40876900}, + {-19809200, 40879200}, {-19991600, 40926100}, + {-20009900, 40930800}, {-20202500, 41007000}, + {-20384100, 41106900}, {-20491899, 41185194}, + {-20551700, 41228700}, {-20551800, 41228700}, + {-20702800, 41370500}, {-20834900, 41530200}, + {-20945900, 41705100}, {-21034100, 41892600}, + {-21098200, 42089700}, {-21137000, 42293200}, + {-21150000, 42500000}, {-21137000, 42706800}, + {-21098200, 42910300}, {-21034100, 43107400}, + {-20945900, 43294900}, {-20834900, 43469800}, + {-20702800, 43629500}, {-20551800, 43771300}, + {-20551700, 43771300}, {-20491899, 43814806}, + {-20384100, 43893100}, {-20202500, 43993000}, + {-20009900, 44069200}, {-19991600, 44073900}, + {-19809200, 44120800}, {-19790500, 44123100}, + {-19603600, 44146700}, {-19396400, 44146700}, + {-19209500, 44123100}, {-19190800, 44120800}, + {-19008400, 44073900}, {-18990100, 44069200}, + {-18797500, 43993000}, {-18615900, 43893100}, + {-18448200, 43771300}, {-18297200, 43629500}, + {-18165100, 43469800}, {-18054100, 43294900}, + {-17965900, 43107400}, {-17901800, 42910300}, + {-17863000, 42706800}, {-17850000, 42500000}, + {-17863000, 42293200}, {-17901800, 42089700}, + {-17965900, 41892600}, {-18054100, 41705100}, + {-18165100, 41530200}, {-18297200, 41370500}, + {-18448200, 41228700}, {-18615900, 41106900}, + {-18797500, 41007000}, {-18990100, 40930800}, + {-19008400, 40926100}, {-19190800, 40879200}, + {-19209500, 40876900}, {-19396400, 40853300}, + }, + { + {11396400, 40853300}, {11190800, 40879200}, + {10990100, 40930800}, {10797500, 41007000}, + {10615900, 41106900}, {10448200, 41228700}, + {10297200, 41370500}, {10165100, 41530200}, + {10054100, 41705100}, {9965870, 41892600}, + {9901840, 42089700}, {9863010, 42293200}, + {9850000, 42500000}, {9863010, 42706800}, + {9901840, 42910300}, {9965870, 43107400}, + {10054100, 43294900}, {10165100, 43469800}, + {10297200, 43629500}, {10448200, 43771300}, + {10615900, 43893100}, {10797500, 43993000}, + {10990100, 44069200}, {11190800, 44120800}, + {11396400, 44146700}, {11603600, 44146700}, + {11809200, 44120800}, {12009900, 44069200}, + {12202500, 43993000}, {12384100, 43893100}, + {12551700, 43771300}, {12702800, 43629500}, + {12834900, 43469800}, {12945900, 43294900}, + {13034100, 43107400}, {13098200, 42910300}, + {13137000, 42706800}, {13150000, 42500000}, + {13137000, 42293200}, {13098200, 42089700}, + {13034100, 41892600}, {12945900, 41705100}, + {12834900, 41530200}, {12702800, 41370500}, + {12551700, 41228700}, {12384100, 41106900}, + {12202500, 41007000}, {12009900, 40930800}, + {11809200, 40879200}, {11603600, 40853300}, + }, + { + {-3181780, 21500000}, {-15111782, 22578598}, + {-15737800, 24505100}, {-15797300, 25071800}, + {-15997500, 26976600}, {-16000000, 27000000}, + {-15737800, 29494900}, {-14962500, 31880800}, + {-13708200, 34053400}, {-12029600, 35917700}, + {-10000000, 37392300}, {-8500000, 38060100}, + {-7708200, 38412700}, {-5282850, 38928200}, + {-5254340, 38934300}, {-3000000, 38934300}, + {-3000000, 33500000}, {-1092350, 31592300}, + {-1091812, 31591773}, {-1065440, 31565400}, + {-1063162, 31563127}, {-963937, 31463900}, + {-889918, 31389900}, {-860013, 31360013}, + {-612800, 31112800}, {-589409, 31089400}, + {-366049, 30866044}, {-339918, 30839900}, + {-206119, 30706100}, {0, 30500000}, + {206119, 30706100}, {339918, 30839900}, + {362385, 30862377}, {889918, 31389900}, + {963937, 31463900}, {1063442, 31563406}, + {1065440, 31565400}, {1091822, 31591782}, + {1092350, 31592300}, {4000000, 34500000}, + {4000000, 35939184}, {4029570, 35917700}, + {5708200, 34053400}, {6962550, 31880800}, + {7737770, 29494900}, {8000000, 27000000}, + {7737770, 24505100}, {6962550, 22119200}, + {6605070, 21500000}, {1727920, 21500000}, + {1698940, 21529000}, {1530830, 21697100}, + {1516490, 21711437}, {1125240, 22102700}, + {894136, 22333800}, {648935, 22579000}, + {318574, 22909343}, {131860, 23096100}, + {0, 23227900}, {-131860, 23096100}, + {-318574, 22909343}, {-648935, 22579000}, + {-894136, 22333800}, {-1125240, 22102700}, + {-1516490, 21711437}, {-1530830, 21697100}, + {-1698940, 21529000}, {-1727920, 21500000}, + }, + { + {-19603600, 9853260}, {-19809200, 9879230}, + {-20009900, 9930760}, {-20202500, 10007000}, + {-20384100, 10106900}, {-20551800, 10228700}, + {-20702800, 10370500}, {-20834900, 10530200}, + {-20945900, 10705100}, {-21034100, 10892600}, + {-21098200, 11089700}, {-21137000, 11293200}, + {-21150000, 11500000}, {-21137000, 11706800}, + {-21098200, 11910300}, {-21034100, 12107400}, + {-20945900, 12294900}, {-20834900, 12469800}, + {-20702800, 12629500}, {-20551800, 12771300}, + {-20384100, 12893100}, {-20202500, 12993000}, + {-20009900, 13069200}, {-19809200, 13120800}, + {-19603600, 13146700}, {-19396400, 13146700}, + {-19190800, 13120800}, {-18990100, 13069200}, + {-18797500, 12993000}, {-18615900, 12893100}, + {-18448200, 12771300}, {-18297200, 12629500}, + {-18165100, 12469800}, {-18054100, 12294900}, + {-17965900, 12107400}, {-17901800, 11910300}, + {-17863000, 11706800}, {-17850000, 11500000}, + {-17863000, 11293200}, {-17901800, 11089700}, + {-17965900, 10892600}, {-18054100, 10705100}, + {-18165100, 10530200}, {-18297200, 10370500}, + {-18448200, 10228700}, {-18615900, 10106900}, + {-18797500, 10007000}, {-18990100, 9930760}, + {-19190800, 9879230}, {-19396400, 9853260}, + }, + { + {11396400, 9853260}, {11190800, 9879230}, + {10990100, 9930760}, {10797500, 10007000}, + {10615900, 10106900}, {10448200, 10228700}, + {10297200, 10370500}, {10165100, 10530200}, + {10054100, 10705100}, {9965870, 10892600}, + {9901840, 11089700}, {9863010, 11293200}, + {9850000, 11500000}, {9863010, 11706800}, + {9901840, 11910300}, {9965870, 12107400}, + {10054100, 12294900}, {10165100, 12469800}, + {10297200, 12629500}, {10448200, 12771300}, + {10615900, 12893100}, {10797500, 12993000}, + {10990100, 13069200}, {11190800, 13120800}, + {11396400, 13146700}, {11603600, 13146700}, + {11809200, 13120800}, {12009900, 13069200}, + {12202500, 12993000}, {12384100, 12893100}, + {12551700, 12771300}, {12702800, 12629500}, + {12834900, 12469800}, {12945900, 12294900}, + {13034100, 12107400}, {13098200, 11910300}, + {13137000, 11706800}, {13150000, 11500000}, + {13137000, 11293200}, {13098200, 11089700}, + {13034100, 10892600}, {12945900, 10705100}, + {12834900, 10530200}, {12702800, 10370500}, + {12551700, 10228700}, {12384100, 10106900}, + {12202500, 10007000}, {12009900, 9930760}, + {11809200, 9879230}, {11603600, 9853260}, + }, + { + {-17177700, 1309310}, {-17525300, 1383200}, + {-17850000, 1527760}, {-18137500, 1736650}, + {-18375300, 2000760}, {-18553000, 2308550}, + {-18662800, 2646550}, {-18700000, 3000000}, + {-18662800, 3353450}, {-18553000, 3691450}, + {-18375300, 3999230}, {-18137500, 4263350}, + {-17850000, 4472240}, {-17525300, 4616800}, + {-17177700, 4690690}, {-16822300, 4690690}, + {-16474701, 4616800}, {-16150000, 4472240}, + {-15862500, 4263350}, {-15624700, 3999230}, + {-15447000, 3691450}, {-15337100, 3353450}, + {-15300000, 3000000}, {-15337100, 2646550}, + {-15447000, 2308550}, {-15624700, 2000760}, + {-15862500, 1736650}, {-16150000, 1527760}, + {-16474701, 1383200}, {-16822300, 1309310}, + }, + { + {-11603600, -2146740}, {-11809200, -2120770}, + {-12009900, -2069240}, {-12202500, -1992960}, + {-12384100, -1893140}, {-12551700, -1771350}, + {-12702800, -1629500}, {-12834900, -1469840}, + {-12945900, -1294890}, {-13034100, -1107400}, + {-13098200, -910337}, {-13137000, -706800}, + {-13150000, -500000}, {-13137000, -293200}, + {-13098200, -89661}, {-13034100, 107405}, + {-12945900, 294893}, {-12834900, 469845}, + {-12702800, 629502}, {-12551700, 771346}, + {-12384100, 893141}, {-12202500, 992964}, + {-12009900, 1069240}, {-11809200, 1120770}, + {-11603600, 1146740}, {-11396400, 1146740}, + {-11190800, 1120770}, {-10990100, 1069240}, + {-10797500, 992964}, {-10615900, 893141}, + {-10448200, 771346}, {-10297200, 629502}, + {-10165100, 469845}, {-10054100, 294893}, + {-9965870, 107405}, {-9901840, -89661}, + {-9863010, -293200}, {-9850000, -499999}, + {-9863010, -706800}, {-9901840, -910337}, + {-9965870, -1107400}, {-10054100, -1294890}, + {-10165100, -1469840}, {-10297200, -1629500}, + {-10448200, -1771350}, {-10615900, -1893140}, + {-10797500, -1992960}, {-10990100, -2069240}, + {-11190800, -2120770}, {-11396400, -2146740}, + }, + { + {11396400, -2146740}, {11190800, -2120770}, + {10990100, -2069240}, {10797500, -1992960}, + {10615900, -1893140}, {10448200, -1771350}, + {10297200, -1629500}, {10165100, -1469840}, + {10054100, -1294890}, {9965870, -1107400}, + {9901840, -910337}, {9863010, -706800}, + {9850000, -500000}, {9863010, -293200}, + {9901840, -89661}, {9965870, 107405}, + {10054100, 294893}, {10165100, 469845}, + {10297200, 629502}, {10448200, 771346}, + {10615900, 893141}, {10797500, 992964}, + {10990100, 1069240}, {11190800, 1120770}, + {11396400, 1146740}, {11603600, 1146740}, + {11809200, 1120770}, {12009900, 1069240}, + {12202500, 992964}, {12384100, 893141}, + {12551700, 771346}, {12702800, 629502}, + {12834900, 469845}, {12945900, 294893}, + {13034100, 107405}, {13098200, -89661}, + {13137000, -293200}, {13150000, -499999}, + {13137000, -706800}, {13098200, -910337}, + {13034100, -1107400}, {12945900, -1294890}, + {12834900, -1469840}, {12702800, -1629500}, + {12551700, -1771350}, {12384100, -1893140}, + {12202500, -1992960}, {12009900, -2069240}, + {11809200, -2120770}, {11603600, -2146740}, + }, + }}, + }, + ExPolygons{ + // "z-axis-top.stl": + MyPoly{{ + {34521100, -3478930}, + {38000000, 0}, + {38000000, 23000000}, + {33000000, 28000000}, + {24000000, 28000000}, + {20000000, 21071800}, + {12000000, 21071800}, + {8000000, 28000000}, + {8000000, 34200000}, + {2200000, 40000000}, + {0, 40000000}, + {0, 1000000}, + {6000000, -5000000}, + {33000000, -5000000}, + }, + { + { + {12000000, 3071800}, + {8000000, 10000000}, + {12000000, 16928200}, + {20000000, 16928200}, + {24000000, 10000000}, + {20000000, 3071800}, + }, + }}, + MyPoly{{ + {8000000, -46200000}, + {8000000, -40000000}, + {12000000, -33071800}, + {20000000, -33071800}, + {24000000, -40000000}, + {33000000, -40000000}, + {38000000, -35000000}, + {38000000, -12000000}, + {34521100, -8521070}, + {33000000, -7000000}, + {6000000, -7000000}, + {0, -13000000}, + {0, -52000000}, + {2200000, -52000000}, + }, + { + { + {12000000, -28928200}, + {8000000, -22000000}, + {12000000, -15071800}, + {20000000, -15071800}, + {24000000, -22000000}, + {20000000, -28928200}, + }, + }}, + }, + ExPolygons{ + // "y-belt-holder.stl": + MyPoly{{ + {12500000, 24000000}, + {5142140, 24000000}, + {4500000, 23357900}, + {4500000, 15000000}, + {-9057860, 15000000}, + {-11000000, 13057900}, + {-11000000, -13057900}, + {-9057860, -15000000}, + {4500000, -15000000}, + {4500000, -23357900}, + {5142140, -24000000}, + {12500000, -24000000}, + }, + {}}, + }, + ExPolygons{ + // "LCD-knob.stl": + MyPoly{{ + {1045280, -9945220}, {2079119, -9781480}, + {3090170, -9510560}, {4067370, -9135450}, + {5000000, -8660250}, {5877850, -8090170}, + {6691310, -7431450}, {7431450, -6691310}, + {8090170, -5877850}, {8660250, -5000000}, + {9135450, -4067370}, {9510560, -3090170}, + {9781480, -2079119}, {9945220, -1045280}, + {10000000, 0}, {9945220, 1045280}, + {9781480, 2079119}, {9510560, 3090170}, + {9135450, 4067370}, {8660250, 5000000}, + {8090170, 5877850}, {7431450, 6691310}, + {6691310, 7431450}, {5877850, 8090170}, + {5000000, 8660250}, {4067370, 9135450}, + {3090170, 9510560}, {2100000, 9775880}, + {2100000, 18221800}, {-2100000, 18221800}, + {-2100000, 9775880}, {-3090170, 9510560}, + {-4067370, 9135450}, {-5000000, 8660250}, + {-5877850, 8090170}, {-6691310, 7431450}, + {-7431450, 6691310}, {-8090170, 5877850}, + {-8660250, 5000000}, {-9135450, 4067370}, + {-9510560, 3090170}, {-9781480, 2079119}, + {-9945220, 1045280}, {-10000000, 0}, + {-9945220, -1045280}, {-9781480, -2079119}, + {-9510560, -3090170}, {-9135450, -4067370}, + {-8660250, -5000000}, {-8090170, -5877850}, + {-7431450, -6691310}, {-6691310, -7431450}, + {-5877850, -8090170}, {-5000000, -8660250}, + {-4067370, -9135450}, {-3090170, -9510560}, + {-2079119, -9781480}, {-1045280, -9945220}, + {0, -10000000}, + }, + {}}, + }, + ExPolygons{ + // "rpi-zero-frame.stl": + MyPoly{{ + {58000000, -25983600}, {58313600, -25983600}, + {58927100, -25853200}, {59500000, -25598100}, + {60007400, -25229400}, {60427100, -24763400}, + {60740600, -24220200}, {60934400, -23623700}, + {61000000, -23000000}, {61000000, 0}, + {60934400, 623734}, {60740600, 1220210}, + {60427100, 1763360}, {60007400, 2229430}, + {59500000, 2598080}, {58927100, 2853170}, + {58313600, 2983570}, {58000000, 2983570}, + {58000000, 3000000}, {55000000, 3000000}, + {55000000, 6000000}, {45000000, 6000000}, + {45000000, 3000000}, {0, 3000000}, + {0, 2983570}, {-313585, 2983570}, + {-927051, 2853170}, {-1500000, 2598080}, + {-2007390, 2229430}, {-2427050, 1763360}, + {-2740640, 1220210}, {-2934440, 623734}, + {-3000000, 0}, {-3000000, -23000000}, + {-2934440, -23623700}, {-2740640, -24220200}, + {-2427050, -24763400}, {-2007390, -25229400}, + {-1500000, -25598100}, {-927051, -25853200}, + {-313585, -25983600}, {313585, -25983600}, + {927051, -25853200}, {1000000, -25820720}, + {1000000, -26000000}, {58000000, -26000000}, + }, + { + { + {44883600, -2063829}, + {44638500, -2012070}, + {44409000, -1909530}, + {44205900, -1762070}, + {44037900, -1575550}, + {43912900, -1358750}, + {43834800, -1120470}, + {43822600, -1000000}, + {46195173, -1000000}, + {46182500, -1120470}, + {46105300, -1358750}, + {45979300, -1575550}, + {45812300, -1762070}, + {45609200, -1909530}, + {45379700, -2012070}, + {45134600, -2063829}, + }, + { + {51045700, -1970080}, + {50800600, -1918320}, + {50571100, -1815780}, + {50368000, -1668320}, + {50200000, -1481800}, + {50075000, -1265000}, + {49996900, -1025740}, + {49994200, -1000000}, + {52347300, -1000000}, + {52344600, -1025740}, + {52267400, -1265000}, + {52141400, -1481800}, + {51973500, -1668320}, + {51771300, -1815780}, + {51541800, -1918320}, + {51296700, -1970080}, + }, + { + {3000000, -20000000}, + {3000000, -3000000}, + {43887500, -3000000}, + {43912900, -2922230}, + {44037900, -2705430}, + {44205900, -2518910}, + {44409000, -2371440}, + {44638500, -2268910}, + {44883600, -2217150}, + {45134600, -2217150}, + {45379700, -2268910}, + {45609200, -2371440}, + {45812300, -2518910}, + {45979300, -2705430}, + {46105300, -2922230}, + {46130400, -3000000}, + {55000000, -3000000}, + {55000000, -20000000}, + }, + { + {22525500, -22729500}, {22321000, -22686100}, + {22130000, -22601000}, {21960900, -22478100}, + {21821000, -22322800}, {21716500, -22141700}, + {21651900, -21942900}, {21630000, -21735000}, + {21651900, -21527100}, {21716500, -21328300}, + {21821000, -21147200}, {21960900, -20991900}, + {22130000, -20869000}, {22321000, -20783900}, + {22525500, -20740500}, {22734500, -20740500}, + {22939000, -20783900}, {23130000, -20869000}, + {23299100, -20991900}, {23439000, -21147200}, + {23543500, -21328300}, {23608100, -21527100}, + {23630000, -21735000}, {23608100, -21942900}, + {23543500, -22141700}, {23439000, -22322800}, + {23299100, -22478100}, {23130000, -22601000}, + {22939000, -22686100}, {22734500, -22729500}, + }, + { + {7285470, -25269500}, {7080980, -25226100}, + {6890000, -25141000}, {6720870, -25018100}, + {6580980, -24862800}, {6476450, -24681700}, + {6411850, -24482900}, {6390000, -24275000}, + {6411850, -24067100}, {6476450, -23868300}, + {6580980, -23687200}, {6720870, -23531900}, + {6890000, -23409000}, {7080980, -23323900}, + {7285470, -23280500}, {7494530, -23280500}, + {7699020, -23323900}, {7890000, -23409000}, + {8059129, -23531900}, {8199020, -23687200}, + {8303540, -23868300}, {8368150, -24067100}, + {8390000, -24275000}, {8368150, -24482900}, + {8303540, -24681700}, {8199020, -24862800}, + {8059129, -25018100}, {7890000, -25141000}, + {7699020, -25226100}, {7494530, -25269500}, + }, + { + {22525500, -25269500}, {22321000, -25226100}, + {22130000, -25141000}, {21960900, -25018100}, + {21821000, -24862800}, {21716500, -24681700}, + {21651900, -24482900}, {21630000, -24275000}, + {21651900, -24067100}, {21716500, -23868300}, + {21821000, -23687200}, {21960900, -23531900}, + {22130000, -23409000}, {22321000, -23323900}, + {22525500, -23280500}, {22734500, -23280500}, + {22939000, -23323900}, {23130000, -23409000}, + {23299100, -23531900}, {23439000, -23687200}, + {23543500, -23868300}, {23608100, -24067100}, + {23630000, -24275000}, {23608100, -24482900}, + {23543500, -24681700}, {23439000, -24862800}, + {23299100, -25018100}, {23130000, -25141000}, + {22939000, -25226100}, {22734500, -25269500}, + }, + { + {14905500, -25269500}, {14701000, -25226100}, + {14510000, -25141000}, {14340900, -25018100}, + {14201000, -24862800}, {14096500, -24681700}, + {14031900, -24482900}, {14010000, -24275000}, + {14031900, -24067100}, {14096500, -23868300}, + {14201000, -23687200}, {14340900, -23531900}, + {14510000, -23409000}, {14701000, -23323900}, + {14905500, -23280500}, {15114500, -23280500}, + {15319000, -23323900}, {15510000, -23409000}, + {15679100, -23531900}, {15819000, -23687200}, + {15923500, -23868300}, {15988100, -24067100}, + {16010000, -24275000}, {15988100, -24482900}, + {15923500, -24681700}, {15819000, -24862800}, + {15679100, -25018100}, {15510000, -25141000}, + {15319000, -25226100}, {15114500, -25269500}, + }, + { + {12365500, -25269500}, {12161000, -25226100}, + {11970000, -25141000}, {11800900, -25018100}, + {11661000, -24862800}, {11556500, -24681700}, + {11491900, -24482900}, {11470000, -24275000}, + {11491900, -24067100}, {11556500, -23868300}, + {11661000, -23687200}, {11800900, -23531900}, + {11970000, -23409000}, {12161000, -23323900}, + {12365500, -23280500}, {12574500, -23280500}, + {12779000, -23323900}, {12970000, -23409000}, + {13139100, -23531900}, {13279000, -23687200}, + {13383500, -23868300}, {13448100, -24067100}, + {13470000, -24275000}, {13448100, -24482900}, + {13383500, -24681700}, {13279000, -24862800}, + {13139100, -25018100}, {12970000, -25141000}, + {12779000, -25226100}, {12574500, -25269500}, + }, + { + {9825470, -25269500}, {9620980, -25226100}, + {9430000, -25141000}, {9260870, -25018100}, + {9120980, -24862800}, {9016450, -24681700}, + {8951850, -24482900}, {8930000, -24275000}, + {8951850, -24067100}, {9016450, -23868300}, + {9120980, -23687200}, {9260870, -23531900}, + {9430000, -23409000}, {9620980, -23323900}, + {9825470, -23280500}, {10034500, -23280500}, + {10239000, -23323900}, {10430000, -23409000}, + {10599100, -23531900}, {10739000, -23687200}, + {10843500, -23868300}, {10908100, -24067100}, + {10930000, -24275000}, {10908100, -24482900}, + {10843500, -24681700}, {10739000, -24862800}, + {10599100, -25018100}, {10430000, -25141000}, + {10239000, -25226100}, {10034500, -25269500}, + }, + }}, + }, + ExPolygons{ + // "extruder-idler.stl": + MyPoly{{ + {31500000, 47000000}, {21500000, 47000000}, + {21500000, 43000000}, {21483600, 43000000}, + {21483600, 42686400}, {21443900, 42500000}, + {21391492, 42253213}, {21356700, 42089700}, + {21353200, 42072900}, {21302200, 41958400}, + {21234000, 41805300}, {21184936, 41695077}, + {21111500, 41530200}, {21098100, 41500000}, + {21058200, 41445200}, {20966500, 41319000}, + {20900900, 41228700}, {20812400, 41106900}, + {20729400, 40992600}, {20660700, 40930800}, + {20566175, 40845649}, {20359300, 40659400}, + {20263400, 40572900}, {19720200, 40259400}, + {19123700, 40065600}, {18688436, 40019806}, + {18500000, 40000000}, {18409800, 40009500}, + {17876300, 40065600}, {17279800, 40259400}, + {16736601, 40572900}, {16640699, 40659400}, + {16435924, 40843758}, {16339300, 40930800}, + {16270599, 40992600}, {16187599, 41106900}, + {16099100, 41228700}, {15996000, 41370500}, + {16270599, 40992600}, {15901900, 41500000}, + {15888500, 41530200}, {15810600, 41705100}, + {15755314, 41829246}, {15735700, 41873300}, + {15646800, 42072900}, {15643300, 42089700}, + {15608508, 42253213}, {15556100, 42500000}, + {15516400, 42686400}, {15516400, 43000000}, + {15500000, 43000000}, {15500000, 47000000}, + {6500000, 47000000}, {6500000, 39000000}, + {3500000, 39000000}, {3500000, 22000000}, + {6500000, 22000000}, {6500000, 13000000}, + {31500000, 13000000}, + }, + { + { + {12923500, 25400000}, + {12144000, 25850000}, + {12144000, 32150002}, + {12923500, 32599998}, + {17600000, 35300000}, + {18379400, 34850000}, + {23056000, 32150002}, + {23056000, 32000000}, + {22750000, 32000000}, + {22750000, 30992100}, + {21750000, 29994100}, + {21750000, 25096023}, + {17600000, 22700000}, + }, + { + {26393300, 16803400}, {26181400, 16830100}, + {25974700, 16883200}, {25776200, 16961800}, + {25589100, 17064600}, {25416400, 17190100}, + {25260800, 17336300}, {25124700, 17500800}, + {25010300, 17681000}, {24919400, 17874200}, + {24853400, 18077200}, {24813400, 18286900}, + {24800000, 18500000}, {24813400, 18713100}, + {24853400, 18922800}, {24919400, 19125800}, + {25010300, 19319000}, {25124700, 19499200}, + {25260800, 19663700}, {25416400, 19809900}, + {25589100, 19935400}, {25776200, 20038200}, + {25974700, 20116800}, {26181400, 20169900}, + {26393300, 20196600}, {26606700, 20196600}, + {26818500, 20169900}, {27025300, 20116800}, + {27223800, 20038200}, {27410900, 19935400}, + {27583600, 19809900}, {27739200, 19663700}, + {27875300, 19499200}, {27989700, 19319000}, + {28080600, 19125800}, {28146600, 18922800}, + {28186600, 18713100}, {28200000, 18500000}, + {28186600, 18286900}, {28146600, 18077200}, + {28080600, 17874200}, {27989700, 17681000}, + {27875300, 17500800}, {27739200, 17336300}, + {27583600, 17190100}, {27410900, 17064600}, + {27223800, 16961800}, {27025300, 16883200}, + {26818500, 16830100}, {26606700, 16803400}, + }, + { + {11393300, 16803400}, {11181500, 16830100}, + {10974700, 16883200}, {10776200, 16961800}, + {10589100, 17064600}, {10416400, 17190100}, + {10260800, 17336300}, {10124700, 17500800}, + {10010300, 17681000}, {9919380, 17874200}, + {9853410, 18077200}, {9813400, 18286900}, + {9800000, 18500000}, {9813400, 18713100}, + {9853410, 18922800}, {9919380, 19125800}, + {10010300, 19319000}, {10124700, 19499200}, + {10260800, 19663700}, {10416400, 19809900}, + {10589100, 19935400}, {10776200, 20038200}, + {10974700, 20116800}, {11181500, 20169900}, + {11393300, 20196600}, {11606700, 20196600}, + {11818500, 20169900}, {12025300, 20116800}, + {12223800, 20038200}, {12410900, 19935400}, + {12583600, 19809900}, {12739200, 19663700}, + {12875300, 19499200}, {12989700, 19319000}, + {13080600, 19125800}, {13146600, 18922800}, + {13186600, 18713100}, {13200000, 18500000}, + {13186600, 18286900}, {13146600, 18077200}, + {13080600, 17874200}, {12989700, 17681000}, + {12875300, 17500800}, {12739200, 17336300}, + {12583600, 17190100}, {12410900, 17064600}, + {12223800, 16961800}, {12025300, 16883200}, + {11818500, 16830100}, {11606700, 16803400}, + }, + }}, + }, + ExPolygons{ + // "filament-sensor-cover.stl": + MyPoly{{ + {18000000, 30500000}, + {-6000000, 30500000}, + {-6000000, -5500000}, + {18000000, -5500000}, + }, + { + { + {-1167240, 22908800}, {-1494430, 22978300}, + {-1800000, 23114400}, {-2070610, 23311000}, + {-2294430, 23559500}, {-2461670, 23849200}, + {-2565040, 24167300}, {-2582520, 24333700}, + {-2600000, 24500000}, {-2582520, 24666300}, + {-2565040, 24832700}, {-2461670, 25150800}, + {-2294430, 25440500}, {-2070610, 25689000}, + {-1800000, 25885600}, {-1494430, 26021700}, + {-1167240, 26091200}, {-832754, 26091200}, + {-505572, 26021700}, {-200000, 25885600}, + {70608, 25689000}, {294427, 25440500}, + {461672, 25150800}, {565036, 24832700}, + {582518, 24666300}, {599999, 24500000}, + {582518, 24333700}, {565036, 24167300}, + {461672, 23849200}, {294427, 23559500}, + {70608, 23311000}, {-200000, 23114400}, + {-505572, 22978300}, {-832754, 22908800}, + }, + { + {-144249, 15627600}, {-426443, 15687500}, + {-689999, 15804900}, {-740738, 15841700}, + {-923400, 15974500}, {-965366, 16021099}, + {-1116440, 16188900}, {-1229330, 16384399}, + {-1260690, 16438700}, {-1280070, 16498400}, + {-1349840, 16713100}, {-1373440, 16937600}, + {-1380000, 17000000}, {-1373440, 17062400}, + {-1349840, 17286900}, {-1280070, 17501600}, + {-1260690, 17561300}, {-1229330, 17615600}, + {-1116440, 17811100}, {-965366, 17978900}, + {-923400, 18025500}, {-872661, 18062400}, + {-689999, 18195100}, {-483738, 18286900}, + {-426443, 18312500}, {-144249, 18372400}, + {144249, 18372400}, {426443, 18312500}, + {483738, 18286900}, {689999, 18195100}, + {872661, 18062400}, {923400, 18025500}, + {965366, 17978900}, {1116440, 17811100}, + {1229330, 17615600}, {1260690, 17561300}, + {1280070, 17501600}, {1349840, 17286900}, + {1373440, 17062400}, {1380000, 17000000}, + {1373440, 16937600}, {1349840, 16713100}, + {1280070, 16498400}, {1260690, 16438700}, + {1229330, 16384399}, {1116440, 16188900}, + {965366, 16021099}, {923400, 15974500}, + {872661, 15937600}, {689999, 15804900}, + {483738, 15713100}, {426443, 15687500}, + {144249, 15627600}, + }, + { + {11832800, 10408800}, {11505600, 10478300}, + {11200000, 10614400}, {10929400, 10811000}, + {10705600, 11059500}, {10538300, 11349200}, + {10435000, 11667300}, {10400000, 12000000}, + {10435000, 12332700}, {10538300, 12650800}, + {10705600, 12940500}, {10929400, 13189000}, + {11200000, 13385600}, {11505600, 13521700}, + {11832800, 13591200}, {12167200, 13591200}, + {12494400, 13521700}, {12800000, 13385600}, + {13070600, 13189000}, {13294400, 12940500}, + {13461700, 12650800}, {13565000, 12332700}, + {13585100, 12141400}, {13600000, 12000000}, + {13582500, 11833700}, {13565000, 11667300}, + {13461700, 11349200}, {13294400, 11059500}, + {13070600, 10811000}, {12800000, 10614400}, + {12494400, 10478300}, {12167200, 10408800}, + }, + }}, + }, + ExPolygons{ + // "nozzle-fan.stl": + MyPoly{{ + {-14922022, 12367866}, {-14205200, 14337200}, + {-13800000, 15450500}, {-13800000, 17000000}, + {-13789800, 17000000}, {-13704300, 17813300}, + {-13694100, 17910800}, {-12789600, 20694300}, + {-11326200, 23229000}, {-9367830, 25404000}, + {-7000000, 27124400}, {-5253290, 27902000}, + {-4326240, 28314800}, {-1463400, 28923300}, + {1463400, 28923300}, {4326240, 28314800}, + {5253290, 27902000}, {7000000, 27124400}, + {9367830, 25404000}, {11326200, 23229000}, + {12789600, 20694300}, {13694100, 17910800}, + {13704300, 17813300}, {13789800, 17000000}, + {13800000, 17000000}, {13800000, 15606900}, + {14240100, 14397700}, {15015200, 12268200}, + {15476800, 11000000}, {17800000, 11000000}, + {17800000, 11032900}, {18427200, 11032900}, + {19654100, 11293700}, {20800000, 11803800}, + {21814800, 12541100}, {22654100, 13473300}, + {23281300, 14559600}, {23668900, 15752500}, + {23706600, 16111099}, {23800000, 17000000}, + {23789800, 17000000}, {23475500, 19989900}, + {21925100, 24761700}, {19416400, 29106800}, + {18612200, 30000000}, {18000000, 30679900}, + {18000000, 35500000}, {18500000, 35500000}, + {18500000, 40500000}, {17839500, 40500000}, + {11200000, 52000000}, {9532010, 52000000}, + {9532010, 52800000}, {5416000, 52800000}, + {5416000, 52000000}, {4793090, 52000000}, + {4793090, 52800000}, {-65918, 52800000}, + {-65918, 52000000}, {-296738, 52000000}, + {-296738, 52800000}, {-4368740, 52800000}, + {-4368740, 52000000}, {-4995880, 52000000}, + {-4995880, 52800000}, {-5997880, 52800000}, + {-5997880, 52000000}, {-6891430, 52000000}, + {-6891430, 52800000}, {-10271400, 52800000}, + {-10271400, 52000000}, {-11139700, 52000000}, + {-18000000, 40117700}, {-18000000, 30679900}, + {-18612200, 30000000}, {-19416400, 29106800}, + {-21925100, 24761700}, {-23475500, 19989900}, + {-23789800, 17000000}, {-23800000, 17000000}, + {-23668900, 15752500}, {-23281300, 14559600}, + {-22654100, 13473300}, {-21814800, 12541100}, + {-20800000, 11803800}, {-19654100, 11293700}, + {-18427200, 11032900}, {-17800000, 11032900}, + {-17800000, 11000000}, {-15419900, 11000000}, + }, + {}}, + }, + ExPolygons{ + // "x-carriage-back.stl": + MyPoly{{ + {-5981270, -38729200}, {-5354100, -37638700}, + {-4514780, -36703000}, {-3500000, -35962900}, + {-2354100, -35450800}, {-1969730, -35368800}, + {-1127170, -35189000}, {127170, -35189000}, + {969727, -35368800}, {1354100, -35450800}, + {2500000, -35962900}, {3514780, -36703000}, + {4354100, -37638700}, {4981270, -38729200}, + {5068930, -39000000}, {13757900, -39000000}, + {16000000, -36757900}, {16000000, -5000000}, + {25500000, -5000000}, {25500000, 13795200}, + {25057400, 14352100}, {24542500, 15342500}, + {24400000, 15200000}, {14600000, 25000000}, + {14500000, 25000000}, {14500000, 33050000}, + {13050000, 34500000}, {-500000, 34500000}, + {-500000, 28500000}, {-8000000, 28500000}, + {-8000000, 32500000}, {-5000000, 32500000}, + {-5000000, 34500000}, {-15550000, 34500000}, + {-17000000, 33050000}, {-17000000, 25000000}, + {-17100000, 25000000}, {-25572200, 16527800}, + {-25903900, 15532800}, {-26500000, 14386100}, + {-26500000, -5000000}, {-17000000, -5000000}, + {-17000000, -36757900}, {-14757900, -39000000}, + {-6068930, -39000000}, + }, + { + { + {-13103600, 29353300}, {-13309200, 29379200}, + {-13509900, 29430800}, {-13702500, 29507000}, + {-13884100, 29606900}, {-14051700, 29728700}, + {-14202800, 29870500}, {-14334900, 30030200}, + {-14445900, 30205100}, {-14534100, 30392600}, + {-14598200, 30589700}, {-14637000, 30793200}, + {-14650000, 31000000}, {-14637000, 31206800}, + {-14598200, 31410300}, {-14534100, 31607400}, + {-14445900, 31794900}, {-14334900, 31969800}, + {-14202800, 32129502}, {-14051700, 32271302}, + {-13884100, 32393100}, {-13702500, 32493000}, + {-13509900, 32569198}, {-13309200, 32620800}, + {-13103600, 32646702}, {-12896400, 32646702}, + {-12690800, 32620800}, {-12490100, 32569198}, + {-12297500, 32493000}, {-12115900, 32393100}, + {-11948200, 32271302}, {-11797200, 32129502}, + {-11665100, 31969800}, {-11554100, 31794900}, + {-11465900, 31607400}, {-11401800, 31410300}, + {-11363000, 31206800}, {-11350000, 31000000}, + {-11363000, 30793200}, {-11401800, 30589700}, + {-11465900, 30392600}, {-11554100, 30205100}, + {-11665100, 30030200}, {-11797200, 29870500}, + {-11948200, 29728700}, {-12115900, 29606900}, + {-12297500, 29507000}, {-12490100, 29430800}, + {-12690800, 29379200}, {-12896400, 29353300}, + }, + { + {10396400, 29353300}, {10190800, 29379200}, + {9990120, 29430800}, {9797460, 29507000}, + {9615890, 29606900}, {9448250, 29728700}, + {9297200, 29870500}, {9165120, 30030200}, + {9054090, 30205100}, {8965870, 30392600}, + {8901840, 30589700}, {8863010, 30793200}, + {8850000, 31000000}, {8863010, 31206800}, + {8901840, 31410300}, {8965870, 31607400}, + {9054090, 31794900}, {9165120, 31969800}, + {9297200, 32129502}, {9448250, 32271302}, + {9615890, 32393100}, {9797460, 32493000}, + {9990120, 32569198}, {10190800, 32620800}, + {10396400, 32646702}, {10603600, 32646702}, + {10809200, 32620800}, {11009900, 32569198}, + {11202500, 32493000}, {11384100, 32393100}, + {11551700, 32271302}, {11702800, 32129502}, + {11834900, 31969800}, {11945900, 31794900}, + {12034100, 31607400}, {12098200, 31410300}, + {12137000, 31206800}, {12150000, 31000000}, + {12137000, 30793200}, {12098200, 30589700}, + {12034100, 30392600}, {11945900, 30205100}, + {11834900, 30030200}, {11702800, 29870500}, + {11551700, 29728700}, {11384100, 29606900}, + {11202500, 29507000}, {11009900, 29430800}, + {10809200, 29379200}, {10603600, 29353300}, + }, + { + {-8000000, 17500000}, + {-8000000, 22500000}, + {-4500000, 22500000}, + {-4500000, 17500000}, + }, + { + {-1103600, 2353260}, {-1309180, 2379230}, + {-1509880, 2430760}, {-1702540, 2507040}, + {-1884110, 2606860}, {-2051750, 2728650}, + {-2202800, 2870500}, {-2334880, 3030150}, + {-2445910, 3205110}, {-2534130, 3392590}, + {-2598160, 3589660}, {-2636990, 3793200}, + {-2650000, 4000000}, {-2636990, 4206800}, + {-2598160, 4410340}, {-2534130, 4607400}, + {-2445910, 4794890}, {-2334880, 4969840}, + {-2202800, 5129500}, {-2051750, 5271350}, + {-1884110, 5393140}, {-1702540, 5492960}, + {-1509880, 5569240}, {-1309180, 5620770}, + {-1103600, 5646740}, {-896395, 5646740}, + {-690821, 5620770}, {-490122, 5569240}, + {-297463, 5492960}, {-115886, 5393140}, + {51749, 5271350}, {202798, 5129500}, + {334878, 4969840}, {445906, 4794890}, + {534131, 4607400}, {598162, 4410340}, + {636989, 4206800}, {650000, 4000000}, + {636989, 3793200}, {598162, 3589660}, + {534131, 3392590}, {445906, 3205110}, + {334878, 3030150}, {202798, 2870500}, + {51749, 2728650}, {-115886, 2606860}, + {-297463, 2507040}, {-490122, 2430760}, + {-690821, 2379230}, {-896395, 2353260}, + }, + { + {10876300, -3434440}, {10279800, -3240640}, + {9736640, -2927050}, {9270570, -2507390}, + {8901920, -2000000}, {8646830, -1427050}, + {8516430, -813585}, {8516430, -186414}, + {8646830, 427051}, {8901920, 999999}, + {9270570, 1507390}, {9736640, 1927050}, + {10279800, 2240640}, {10876300, 2434440}, + {11500000, 2500000}, {12123700, 2434440}, + {12720200, 2240640}, {13263400, 1927050}, + {13729400, 1507390}, {14098100, 1000000}, + {14353200, 427051}, {14483600, -186414}, + {14483600, -813585}, {14353200, -1427050}, + {14098100, -2000000}, {13729400, -2507390}, + {13263400, -2927050}, {12720200, -3240640}, + {12123700, -3434440}, {11500000, -3500000}, + }, + { + {-12123700, -3434440}, {-12720200, -3240640}, + {-13263400, -2927050}, {-13729400, -2507390}, + {-14098100, -2000000}, {-14353200, -1427050}, + {-14483600, -813585}, {-14483600, -186414}, + {-14353200, 427051}, {-14098100, 999999}, + {-13729400, 1507390}, {-13263400, 1927050}, + {-12720200, 2240640}, {-12123700, 2434440}, + {-11500000, 2500000}, {-10876300, 2434440}, + {-10279800, 2240640}, {-9736640, 1927050}, + {-9270570, 1507390}, {-8901920, 1000000}, + {-8646830, 427051}, {-8516430, -186414}, + {-8516430, -813585}, {-8646830, -1427050}, + {-8901920, -2000000}, {-9270570, -2507390}, + {-9736640, -2927050}, {-10279800, -3240640}, + {-10876300, -3434440}, {-11500000, -3500000}, + }, + { + {-1539560, -22890700}, {-2533680, -22567700}, + {-3438930, -22045100}, {-3590280, -21908800}, + {-4215720, -21345700}, {-4806270, -20532800}, + {-4830130, -20500000}, {-5012570, -20090200}, + {-5255280, -19545100}, {-5472610, -18522600}, + {-5472610, -18000000}, {-5500000, -18000000}, + {-5500000, -14000000}, {-5472610, -14000000}, + {-5472610, -13477400}, {-5255280, -12454900}, + {-5052740, -12000000}, {-4830130, -11500000}, + {-4215720, -10654300}, {-3438930, -9954910}, + {-3189080, -9810670}, {-2533680, -9432270}, + {-1539560, -9109260}, {-500000, -9000000}, + {539558, -9109260}, {1309400, -9359400}, + {1533680, -9432270}, {2438930, -9954910}, + {3215720, -10654300}, {3830130, -11500000}, + {4052740, -12000000}, {4255280, -12454900}, + {4472610, -13477400}, {4472610, -14000000}, + {4500000, -14000000}, {4500000, -18000000}, + {4472610, -18000000}, {4472610, -18522600}, + {4255280, -19545100}, {4012570, -20090200}, + {3830130, -20500000}, {3806270, -20532800}, + {3215720, -21345700}, {2590280, -21908800}, + {2438930, -22045100}, {1533680, -22567700}, + {539558, -22890700}, {-499999, -23000000}, + }, + { + {-832658, -28565000}, {-1150780, -28461700}, + {-1440460, -28294400}, {-1689030, -28070600}, + {-1885640, -27800000}, {-2021689, -27494400}, + {-2091229, -27167200}, {-2091229, -26832800}, + {-2021689, -26505600}, {-1885640, -26200000}, + {-1689030, -25929400}, {-1440460, -25705600}, + {-1150780, -25538300}, {-832658, -25435000}, + {-500000, -25400000}, {-167341, -25435000}, + {150778, -25538300}, {440456, -25705600}, + {689032, -25929400}, {885640, -26200000}, + {1021690, -26505600}, {1091230, -26832800}, + {1091230, -27167200}, {1021690, -27494400}, + {885640, -27800000}, {689032, -28070600}, + {440456, -28294400}, {150778, -28461700}, + {-167341, -28565000}, {-499999, -28600000}, + }, + { + {9396390, -37646700}, {9190820, -37620800}, + {8990120, -37569200}, {8797460, -37493000}, + {8615890, -37393100}, {8448250, -37271300}, + {8297200, -37129500}, {8165120, -36969800}, + {8054089, -36794900}, {7965870, -36607400}, + {7901840, -36410300}, {7863010, -36206800}, + {7850000, -36000000}, {7863010, -35793200}, + {7901840, -35589700}, {7965870, -35392600}, + {8054089, -35205100}, {8165120, -35030200}, + {8297200, -34870500}, {8448250, -34728700}, + {8615890, -34606900}, {8797460, -34507000}, + {8990120, -34430800}, {9190820, -34379200}, + {9396390, -34353300}, {9603600, -34353300}, + {9809180, -34379200}, {10009900, -34430800}, + {10202500, -34507000}, {10384100, -34606900}, + {10551700, -34728700}, {10702800, -34870500}, + {10834900, -35030200}, {10945900, -35205100}, + {11034100, -35392600}, {11098200, -35589700}, + {11137000, -35793200}, {11150000, -36000000}, + {11137000, -36206800}, {11098200, -36410300}, + {11034100, -36607400}, {10945900, -36794900}, + {10834900, -36969800}, {10702800, -37129500}, + {10551700, -37271300}, {10384100, -37393100}, + {10202500, -37493000}, {10009900, -37569200}, + {9809180, -37620800}, {9603600, -37646700}, + }, + { + {-10603600, -37646700}, {-10809200, -37620800}, + {-11009900, -37569200}, {-11202500, -37493000}, + {-11384100, -37393100}, {-11551700, -37271300}, + {-11702800, -37129500}, {-11834900, -36969800}, + {-11945900, -36794900}, {-12034100, -36607400}, + {-12098200, -36410300}, {-12137000, -36206800}, + {-12150000, -36000000}, {-12137000, -35793200}, + {-12098200, -35589700}, {-12034100, -35392600}, + {-11945900, -35205100}, {-11834900, -35030200}, + {-11702800, -34870500}, {-11551700, -34728700}, + {-11384100, -34606900}, {-11202500, -34507000}, + {-11009900, -34430800}, {-10809200, -34379200}, + {-10603600, -34353300}, {-10396400, -34353300}, + {-10190800, -34379200}, {-9990120, -34430800}, + {-9797460, -34507000}, {-9615890, -34606900}, + {-9448250, -34728700}, {-9297200, -34870500}, + {-9165120, -35030200}, {-9054090, -35205100}, + {-8965870, -35392600}, {-8901840, -35589700}, + {-8863010, -35793200}, {-8850000, -36000000}, + {-8863010, -36206800}, {-8901840, -36410300}, + {-8965870, -36607400}, {-9054090, -36794900}, + {-9165120, -36969800}, {-9297200, -37129500}, + {-9448250, -37271300}, {-9615890, -37393100}, + {-9797460, -37493000}, {-9990120, -37569200}, + {-10190800, -37620800}, {-10396400, -37646700}, + }, + }}, + }, + ExPolygons{ + // "extruder-idler-plug.stl": + MyPoly{{ + {-13000000, 42500000}, {-12967200, 42811900}, + {-12906100, 43000000}, {-12870300, 43110100}, + {-12713500, 43381700}, {-12503700, 43614700}, + {-12250000, 43799000}, {-11963500, 43926600}, + {-11656800, 43991800}, {-11343200, 43991800}, + {-11036500, 43926600}, {-10750000, 43799000}, + {-10496300, 43614700}, {-10286500, 43381700}, + {-10129700, 43110100}, {-10093900, 43000000}, + {-10032800, 42811900}, {-10000000, 42500000}, + {-10000000, 40200000}, {-7000000, 40200000}, + {-7000000, 46000000}, {-6400000, 46000000}, + {-6400000, 50500000}, {-11937800, 50500000}, + {-17000000, 47577400}, {-17000000, 40200000}, + {-13000000, 40200000}, + }, + {}}, + }, + ExPolygons{ + // "z-axis-bottom.stl": + MyPoly{{ + {45101600, -4898420}, + {50000000, 0}, + {50000000, 40786800}, + {43286800, 47500000}, + {3500000, 47500000}, + {0, 44000000}, + {0, -2000000}, + {3000000, -5000000}, + {45000000, -5000000}, + }, + { + { + {13696400, 33853300}, {13509500, 33876900}, + {13490800, 33879200}, {13308400, 33926100}, + {13290100, 33930800}, {13097500, 34007000}, + {12915900, 34106900}, {12748300, 34228700}, + {12597200, 34370500}, {12465100, 34530200}, + {12354100, 34705100}, {12265900, 34892600}, + {12201800, 35089700}, {12163000, 35293200}, + {12150000, 35500000}, {12163000, 35706800}, + {12201800, 35910300}, {12265900, 36107400}, + {12354100, 36294900}, {12465100, 36469800}, + {12597200, 36629500}, {12748300, 36771300}, + {12915900, 36893100}, {13097500, 36993000}, + {13290100, 37069200}, {13308400, 37073900}, + {13490800, 37120800}, {13509500, 37123100}, + {13696400, 37146700}, {13903600, 37146700}, + {14090500, 37123100}, {14109200, 37120800}, + {14291600, 37073900}, {14309900, 37069200}, + {14502500, 36993000}, {14684100, 36893100}, + {14791899, 36814806}, {14851700, 36771300}, + {14851800, 36771300}, {15002800, 36629500}, + {15134900, 36469800}, {15245900, 36294900}, + {15334100, 36107400}, {15398200, 35910300}, + {15437000, 35706800}, {15450000, 35500000}, + {15437000, 35293200}, {15398200, 35089700}, + {15334100, 34892600}, {15245900, 34705100}, + {15134900, 34530200}, {15002800, 34370500}, + {14851800, 34228700}, {14851700, 34228700}, + {14791899, 34185194}, {14684100, 34106900}, + {14502500, 34007000}, {14309900, 33930800}, + {14291600, 33926100}, {14109200, 33879200}, + {14090500, 33876900}, {13903600, 33853300}, + }, + { + {44696400, 33853300}, {44509500, 33876900}, + {44490800, 33879200}, {44308400, 33926100}, + {44290100, 33930800}, {44097500, 34007000}, + {43915900, 34106900}, {43748200, 34228700}, + {43597200, 34370500}, {43465100, 34530200}, + {43354100, 34705100}, {43265900, 34892600}, + {43201800, 35089700}, {43163000, 35293200}, + {43150000, 35500000}, {43163000, 35706800}, + {43201800, 35910300}, {43265900, 36107400}, + {43354100, 36294900}, {43465100, 36469800}, + {43597200, 36629500}, {43748200, 36771300}, + {43915900, 36893100}, {44097500, 36993000}, + {44290100, 37069200}, {44308400, 37073900}, + {44490800, 37120800}, {44509500, 37123100}, + {44696400, 37146700}, {44903600, 37146700}, + {45090500, 37123100}, {45109200, 37120800}, + {45291600, 37073900}, {45309900, 37069200}, + {45502500, 36993000}, {45684100, 36893100}, + {45851700, 36771300}, {46002800, 36629500}, + {46134900, 36469800}, {46245900, 36294900}, + {46334100, 36107400}, {46398200, 35910300}, + {46437000, 35706800}, {46450000, 35500000}, + {46437000, 35293200}, {46398200, 35089700}, + {46334100, 34892600}, {46245900, 34705100}, + {46134900, 34530200}, {46002800, 34370500}, + {45851700, 34228700}, {45684100, 34106900}, + {45502500, 34007000}, {45309900, 33930800}, + {45291600, 33926100}, {45109200, 33879200}, + {45090500, 33876900}, {44903600, 33853300}, + }, + { + {28300000, 8702230}, {28300000, 8861350}, + {28129300, 8861350}, {25839000, 9348170}, + {23700000, 10300500}, {21805700, 11676800}, + {20239000, 13416800}, {19068300, 15444600}, + {18344700, 17671400}, {18100000, 20000000}, + {18344700, 22328600}, {19068300, 24555500}, + {20239000, 26583200}, {21805700, 28323200}, + {23700000, 29699500}, {25839000, 30651800}, + {28129300, 31138600}, {30470700, 31138600}, + {32761002, 30651800}, {34900000, 29699500}, + {36794300, 28323200}, {38361000, 26583200}, + {39531700, 24555500}, {40255300, 22328600}, + {40500000, 20000000}, {40255300, 17671400}, + {39531700, 15444600}, {38361000, 13416800}, + {36794300, 11676800}, {34900000, 10300500}, + {32761002, 9348170}, {30470700, 8861350}, + {30300000, 8861350}, {30300000, 8702230}, + }, + { + {29045700, -1042009}, {28541100, -978263}, + {28048500, -851778}, {27575600, -664549}, + {27129900, -419528}, {26718400, -120578}, + {26347700, 227584}, {26023500, 619470}, + {25751000, 1048900}, {25534400, 1509100}, + {25377200, 1992810}, {25281900, 2492400}, + {25250000, 3000000}, {25281900, 3507600}, + {25377200, 4007190}, {25534400, 4490900}, + {25751000, 4951100}, {26023500, 5380530}, + {26347700, 5772420}, {26718400, 6120580}, + {27129900, 6419530}, {27575600, 6664550}, + {28048500, 6851780}, {28300000, 6916360}, + {28300000, 7213590}, {28487100, 7261610}, + {28717100, 7290670}, {29027600, 7329900}, + {29572400, 7329900}, {29882900, 7290670}, + {30112900, 7261610}, {30300000, 7213590}, + {30300000, 6916360}, {30551500, 6851780}, + {31024400, 6664550}, {31470100, 6419530}, + {31881600, 6120580}, {32252300, 5772420}, + {32576500, 5380530}, {32849000, 4951100}, + {33065602, 4490900}, {33222802, 4007190}, + {33318100, 3507600}, {33349998, 3000000}, + {33318100, 2492400}, {33222802, 1992810}, + {33065602, 1509100}, {32849000, 1048900}, + {32576500, 619470}, {32252300, 227584}, + {31881600, -120578}, {31470100, -419528}, + {31024400, -664549}, {30551500, -851778}, + {30058900, -978263}, {29554300, -1042009}, + }, + { + {44696400, 2853260}, {44509500, 2876870}, + {44490800, 2879230}, {44308400, 2926070}, + {44290100, 2930760}, {44097500, 3007040}, + {43915900, 3106860}, {43748200, 3228650}, + {43597200, 3370500}, {43465100, 3530160}, + {43354100, 3705110}, {43265900, 3892600}, + {43201800, 4089660}, {43163000, 4293200}, + {43150000, 4500000}, {43163000, 4706800}, + {43201800, 4910340}, {43265900, 5107410}, + {43354100, 5294890}, {43465100, 5469850}, + {43597200, 5629500}, {43748200, 5771350}, + {43915900, 5893140}, {44097500, 5992960}, + {44290100, 6069240}, {44308400, 6073930}, + {44490800, 6120770}, {44696400, 6146740}, + {44903600, 6146740}, {45109200, 6120770}, + {45291600, 6073930}, {45309900, 6069240}, + {45502500, 5992960}, {45684100, 5893140}, + {45851700, 5771350}, {46002800, 5629500}, + {46134900, 5469850}, {46245900, 5294890}, + {46334100, 5107410}, {46398200, 4910340}, + {46437000, 4706800}, {46450000, 4500000}, + {46437000, 4293200}, {46398200, 4089660}, + {46334100, 3892600}, {46245900, 3705110}, + {46134900, 3530160}, {46002800, 3370500}, + {45851700, 3228650}, {45684100, 3106860}, + {45502500, 3007040}, {45309900, 2930760}, + {45291600, 2926070}, {45109200, 2879230}, + {45090500, 2876870}, {44903600, 2853260}, + }, + { + {13696400, 2853260}, {13509500, 2876870}, + {13490800, 2879230}, {13308400, 2926070}, + {13290100, 2930760}, {13097500, 3007040}, + {12915900, 3106860}, {12748300, 3228650}, + {12597200, 3370500}, {12465100, 3530160}, + {12354100, 3705110}, {12265900, 3892600}, + {12201800, 4089660}, {12163000, 4293200}, + {12150000, 4500000}, {12163000, 4706800}, + {12201800, 4910340}, {12265900, 5107410}, + {12354100, 5294890}, {12465100, 5469850}, + {12597200, 5629500}, {12748300, 5771350}, + {12915900, 5893140}, {13097500, 5992960}, + {13290100, 6069240}, {13308400, 6073930}, + {13490800, 6120770}, {13696400, 6146740}, + {13903600, 6146740}, {14109200, 6120770}, + {14291600, 6073930}, {14309900, 6069240}, + {14502500, 5992960}, {14684100, 5893140}, + {14754724, 5841850}, {14851700, 5771350}, + {14851800, 5771350}, {15002800, 5629500}, + {15134900, 5469850}, {15245900, 5294890}, + {15334100, 5107410}, {15398200, 4910340}, + {15437000, 4706800}, {15450000, 4500000}, + {15437000, 4293200}, {15398200, 4089660}, + {15334100, 3892600}, {15245900, 3705110}, + {15134900, 3530160}, {15002800, 3370500}, + {14851800, 3228650}, {14851700, 3228650}, + {14754724, 3158150}, {14684100, 3106860}, + {14502500, 3007040}, {14309900, 2930760}, + {14291600, 2926070}, {14109200, 2879230}, + {14090500, 2876870}, {13903600, 2853260}, + }, + }}, + MyPoly{{ + {50000000, -53786800}, + {50000000, -13000000}, + {45101600, -8101579}, + {45000000, -8000000}, + {3000000, -8000000}, + {0, -11000000}, + {0, -57000000}, + {3500000, -60500000}, + {43286800, -60500000}, + }, + { + { + {29027600, -20329900}, {28717100, -20290700}, + {28487100, -20261600}, {28300000, -20213600}, + {28300000, -19916400}, {28048500, -19851800}, + {27575600, -19664500}, {27129900, -19419500}, + {26718400, -19120600}, {26347700, -18772400}, + {26023500, -18380500}, {25751000, -17951100}, + {25534400, -17490900}, {25377200, -17007200}, + {25281900, -16507601}, {25250000, -16000000}, + {25281900, -15492400}, {25377200, -14992800}, + {25534400, -14509100}, {25751000, -14048900}, + {26023500, -13619500}, {26347700, -13227600}, + {26718400, -12879400}, {27129900, -12580500}, + {27575600, -12335500}, {28048500, -12148200}, + {28541100, -12021700}, {29045700, -11958000}, + {29554300, -11958000}, {30058900, -12021700}, + {30551500, -12148200}, {31024400, -12335500}, + {31470100, -12580500}, {31881600, -12879400}, + {32252300, -13227600}, {32576500, -13619500}, + {32849000, -14048900}, {33065602, -14509100}, + {33222802, -14992800}, {33318100, -15492400}, + {33349998, -16000000}, {33318100, -16507601}, + {33222802, -17007200}, {33065602, -17490900}, + {32849000, -17951100}, {32576500, -18380500}, + {32252300, -18772400}, {31881600, -19120600}, + {31470100, -19419500}, {31024400, -19664500}, + {30551500, -19851800}, {30300000, -19916400}, + {30300000, -20213600}, {30112900, -20261600}, + {29882900, -20290700}, {29572400, -20329900}, + }, + { + {13696400, -19146700}, {13509500, -19123100}, + {13490800, -19120800}, {13308400, -19073900}, + {13290100, -19069200}, {13097500, -18993000}, + {12915900, -18893100}, {12748300, -18771300}, + {12597200, -18629500}, {12465100, -18469800}, + {12354100, -18294900}, {12265900, -18107400}, + {12201800, -17910300}, {12163000, -17706800}, + {12150000, -17500000}, {12163000, -17293200}, + {12201800, -17089700}, {12265900, -16892600}, + {12354100, -16705099}, {12465100, -16530199}, + {12597200, -16370501}, {12748300, -16228701}, + {12915900, -16106899}, {13097500, -16007000}, + {13290100, -15930800}, {13308400, -15926100}, + {13490800, -15879200}, {13509500, -15876900}, + {13696400, -15853300}, {13903600, -15853300}, + {14090500, -15876900}, {14109200, -15879200}, + {14291600, -15926100}, {14309900, -15930800}, + {14502500, -16007000}, {14684100, -16106899}, + {14791305, -16184763}, {14851700, -16228701}, + {14851800, -16228701}, {15002800, -16370501}, + {15134900, -16530199}, {15245900, -16705099}, + {15334100, -16892600}, {15398200, -17089700}, + {15437000, -17293200}, {15450000, -17500000}, + {15437000, -17706800}, {15398200, -17910300}, + {15334100, -18107400}, {15245900, -18294900}, + {15134900, -18469800}, {15002800, -18629500}, + {14851800, -18771300}, {14851700, -18771300}, + {14791899, -18814806}, {14684100, -18893100}, + {14502500, -18993000}, {14309900, -19069200}, + {14291600, -19073900}, {14109200, -19120800}, + {14090500, -19123100}, {13903600, -19146700}, + }, + { + {44696400, -19146700}, {44509500, -19123100}, + {44490800, -19120800}, {44308400, -19073900}, + {44290100, -19069200}, {44097500, -18993000}, + {43915900, -18893100}, {43748200, -18771300}, + {43597200, -18629500}, {43465100, -18469800}, + {43354100, -18294900}, {43265900, -18107400}, + {43201800, -17910300}, {43163000, -17706800}, + {43150000, -17500000}, {43163000, -17293200}, + {43201800, -17089700}, {43265900, -16892600}, + {43354100, -16705099}, {43465100, -16530199}, + {43597200, -16370501}, {43748200, -16228701}, + {43915900, -16106899}, {44097500, -16007000}, + {44290100, -15930800}, {44308400, -15926100}, + {44490800, -15879200}, {44509500, -15876900}, + {44696400, -15853300}, {44903600, -15853300}, + {45090500, -15876900}, {45109200, -15879200}, + {45291600, -15926100}, {45309900, -15930800}, + {45502500, -16007000}, {45684100, -16106899}, + {45851700, -16228701}, {46002800, -16370501}, + {46134900, -16530199}, {46245900, -16705099}, + {46334100, -16892600}, {46398200, -17089700}, + {46437000, -17293200}, {46450000, -17500000}, + {46437000, -17706800}, {46398200, -17910300}, + {46334100, -18107400}, {46245900, -18294900}, + {46134900, -18469800}, {46002800, -18629500}, + {45851700, -18771300}, {45684100, -18893100}, + {45502500, -18993000}, {45309900, -19069200}, + {45291600, -19073900}, {45109200, -19120800}, + {45090500, -19123100}, {44903600, -19146700}, + }, + { + {28129300, -44138600}, {25839000, -43651800}, + {23700000, -42699500}, {21805700, -41323200}, + {20239000, -39583200}, {19068300, -37555500}, + {18344700, -35328600}, {18100000, -33000000}, + {18344700, -30671400}, {19068300, -28444500}, + {20239000, -26416800}, {21805700, -24676800}, + {23700000, -23300500}, {25839000, -22348200}, + {28129300, -21861400}, {28300000, -21861400}, + {28300000, -21702200}, {30300000, -21702200}, + {30300000, -21861400}, {30470700, -21861400}, + {32761002, -22348200}, {34900000, -23300500}, + {36794300, -24676800}, {38361000, -26416800}, + {39531700, -28444500}, {40255300, -30671400}, + {40500000, -33000000}, {40255300, -35328600}, + {39531700, -37555500}, {38361000, -39583200}, + {36794300, -41323200}, {34900000, -42699500}, + {32761002, -43651800}, {30470700, -44138600}, + }, + { + {44696400, -50146700}, {44509500, -50123100}, + {44490800, -50120800}, {44308400, -50073900}, + {44290100, -50069200}, {44097500, -49993000}, + {43915900, -49893100}, {43748200, -49771300}, + {43597200, -49629500}, {43465100, -49469800}, + {43354100, -49294900}, {43265900, -49107400}, + {43201800, -48910300}, {43163000, -48706800}, + {43150000, -48500000}, {43163000, -48293200}, + {43201800, -48089700}, {43265900, -47892600}, + {43354100, -47705100}, {43465100, -47530200}, + {43597200, -47370500}, {43748200, -47228700}, + {43915900, -47106900}, {44097500, -47007000}, + {44290100, -46930800}, {44308400, -46926100}, + {44490800, -46879200}, {44509500, -46876900}, + {44696400, -46853300}, {44903600, -46853300}, + {45090500, -46876900}, {45109200, -46879200}, + {45291600, -46926100}, {45309900, -46930800}, + {45502500, -47007000}, {45684100, -47106900}, + {45851700, -47228700}, {46002800, -47370500}, + {46134900, -47530200}, {46245900, -47705100}, + {46334100, -47892600}, {46398200, -48089700}, + {46437000, -48293200}, {46450000, -48500000}, + {46437000, -48706800}, {46398200, -48910300}, + {46334100, -49107400}, {46245900, -49294900}, + {46134900, -49469800}, {46002800, -49629500}, + {45851700, -49771300}, {45684100, -49893100}, + {45502500, -49993000}, {45309900, -50069200}, + {45291600, -50073900}, {45109200, -50120800}, + {45090500, -50123100}, {44903600, -50146700}, + }, + { + {13696400, -50146700}, {13509500, -50123100}, + {13490800, -50120800}, {13308400, -50073900}, + {13290100, -50069200}, {13097500, -49993000}, + {12915900, -49893100}, {12748300, -49771300}, + {12597200, -49629500}, {12465100, -49469800}, + {12354100, -49294900}, {12265900, -49107400}, + {12201800, -48910300}, {12163000, -48706800}, + {12150000, -48500000}, {12163000, -48293200}, + {12201800, -48089700}, {12265900, -47892600}, + {12354100, -47705100}, {12465100, -47530200}, + {12597200, -47370500}, {12748300, -47228700}, + {12915900, -47106900}, {13097500, -47007000}, + {13290100, -46930800}, {13308400, -46926100}, + {13490800, -46879200}, {13509500, -46876900}, + {13696400, -46853300}, {13903600, -46853300}, + {14090500, -46876900}, {14109200, -46879200}, + {14291600, -46926100}, {14309900, -46930800}, + {14502500, -47007000}, {14684100, -47106900}, + {14791899, -47185194}, {14851700, -47228700}, + {14851800, -47228700}, {15002800, -47370500}, + {15134900, -47530200}, {15245900, -47705100}, + {15334100, -47892600}, {15398200, -48089700}, + {15437000, -48293200}, {15450000, -48500000}, + {15437000, -48706800}, {15398200, -48910300}, + {15334100, -49107400}, {15245900, -49294900}, + {15134900, -49469800}, {15002800, -49629500}, + {14851800, -49771300}, {14851700, -49771300}, + {14791899, -49814806}, {14684100, -49893100}, + {14502500, -49993000}, {14309900, -50069200}, + {14291600, -50073900}, {14109200, -50120800}, + {14090500, -50123100}, {13903600, -50146700}, + }, + }}, + }, + ExPolygons{ + // "extruder-cover.stl": + MyPoly{{ + {20500000, 366025}, {21732100, 2500000}, + {24500000, 2500000}, {24500000, -1500000}, + {31500000, -1500000}, {31500000, 1500000}, + {27250000, 5750000}, {-17000000, 5750000}, + {-17000000, -26799100}, {-35109600, -33390400}, + {-40700000, -33390400}, {-43650000, -38500000}, + {-40700000, -43609600}, {-34800000, -43609600}, + {-33470820, -41307370}, {-17000000, -35312500}, + {-17000000, -36500000}, {-15000000, -36500000}, + {-15000000, -44000000}, {20500000, -44000000}, + }, + { + { + {16832800, 1408760}, {16667299, 1434960}, + {16505600, 1478310}, {16349199, 1538330}, + {16200001, 1614360}, {16059500, 1705570}, + {15929400, 1810970}, {15811000, 1929390}, + {15705600, 2059540}, {15614400, 2200000}, + {15538300, 2349220}, {15478300, 2505570}, + {15435000, 2667340}, {15408800, 2832750}, + {15400000, 3000000}, {15408800, 3167240}, + {15435000, 3332660}, {15478300, 3494430}, + {15538300, 3650780}, {15614400, 3800000}, + {15705600, 3940460}, {15811000, 4070610}, + {15929400, 4189030}, {16059500, 4294430}, + {16200001, 4385640}, {16349199, 4461670}, + {16505600, 4521690}, {16667299, 4565040}, + {16832800, 4591230}, {17000000, 4600000}, + {17167200, 4591230}, {17332700, 4565040}, + {17494400, 4521690}, {17650800, 4461670}, + {17800000, 4385640}, {17940500, 4294430}, + {18070600, 4189030}, {18189000, 4070610}, + {18294400, 3940460}, {18385600, 3800000}, + {18461700, 3650780}, {18521700, 3494430}, + {18565000, 3332660}, {18591200, 3167240}, + {18600000, 3000000}, {18591200, 2832750}, + {18565000, 2667340}, {18521700, 2505570}, + {18461700, 2349220}, {18385600, 2200000}, + {18294400, 2059540}, {18189000, 1929390}, + {18070600, 1810970}, {17940500, 1705570}, + {17800000, 1614360}, {17650800, 1538330}, + {17494400, 1478310}, {17332700, 1434960}, + {17167200, 1408760}, {17000000, 1400000}, + }, + { + {-11603600, -2146740}, {-11809200, -2120770}, + {-12009900, -2069240}, {-12202500, -1992960}, + {-12384100, -1893140}, {-12551700, -1771350}, + {-12702800, -1629500}, {-12834900, -1469840}, + {-12945900, -1294890}, {-13034100, -1107400}, + {-13098200, -910337}, {-13137000, -706800}, + {-13150000, -499999}, {-13137000, -293200}, + {-13098200, -89661}, {-13034100, 107405}, + {-12945900, 294893}, {-12834900, 469845}, + {-12702800, 629502}, {-12551700, 771346}, + {-12384100, 893141}, {-12202500, 992964}, + {-12009900, 1069240}, {-11809200, 1120770}, + {-11603600, 1146740}, {-11396400, 1146740}, + {-11190800, 1120770}, {-10990100, 1069240}, + {-10797500, 992964}, {-10615900, 893141}, + {-10448200, 771346}, {-10297200, 629502}, + {-10165100, 469845}, {-10054100, 294893}, + {-9965870, 107405}, {-9901840, -89661}, + {-9863010, -293200}, {-9850000, -500000}, + {-9863010, -706800}, {-9901840, -910337}, + {-9965870, -1107400}, {-10054100, -1294890}, + {-10165100, -1469840}, {-10297200, -1629500}, + {-10448200, -1771350}, {-10615900, -1893140}, + {-10797500, -1992960}, {-10990100, -2069240}, + {-11190800, -2120770}, {-11396400, -2146740}, + }, + { + {-37917200, -40091200}, {-38244400, -40021700}, + {-38550000, -39885600}, {-38820600, -39689000}, + {-39044400, -39440500}, {-39211700, -39150800}, + {-39315000, -38832700}, {-39350000, -38500000}, + {-39315000, -38167300}, {-39211700, -37849200}, + {-39044400, -37559500}, {-38820600, -37311000}, + {-38550000, -37114400}, {-38244400, -36978300}, + {-37917200, -36908800}, {-37582800, -36908800}, + {-37255600, -36978300}, {-36950000, -37114400}, + {-36679400, -37311000}, {-36455600, -37559500}, + {-36288300, -37849200}, {-36185000, -38167300}, + {-36150000, -38500000}, {-36185000, -38832700}, + {-36288300, -39150800}, {-36455600, -39440500}, + {-36679400, -39689000}, {-36950000, -39885600}, + {-37255600, -40021700}, {-37582800, -40091200}, + }, + { + {14353700, -41892300}, {14067400, -41831500}, + {13800000, -41712400}, {13563200, -41540400}, + {13367400, -41322900}, {13221000, -41069400}, + {13130600, -40791100}, {13100000, -40500000}, + {13130600, -40208900}, {13221000, -39930600}, + {13367400, -39677100}, {13563200, -39459600}, + {13800000, -39287600}, {14067400, -39168500}, + {14353700, -39107700}, {14646300, -39107700}, + {14932600, -39168500}, {15200000, -39287600}, + {15436800, -39459600}, {15632600, -39677100}, + {15779000, -39930600}, {15869400, -40208900}, + {15900000, -40500000}, {15869400, -40791100}, + {15779000, -41069400}, {15632600, -41322900}, + {15436800, -41540400}, {15200000, -41712400}, + {14932600, -41831500}, {14646300, -41892300}, + }, + }}, + }, + ExPolygons{ + // "Einsy-base.stl": + MyPoly{{ + {85000000, 2000000}, + {87000000, 5464100}, + {91000000, 5464100}, + {93000000, 2000000}, + {91845296, 0}, + {118500000, 0}, + {118500000, 79000000}, + {105500000, 92000000}, + {0, 92000000}, + {0, 41000000}, + {-5000000, 41000000}, + {-9000000, 38000000}, + {-9000000, 18000000}, + {-5000000, 15000000}, + {0, 15000000}, + {0, 0}, + {86154704, 0}, + }, + { + { + {58301400, 86110400}, {57912900, 86193000}, + {57550000, 86354600}, {57228700, 86588000}, + {56962900, 86883200}, {56764300, 87227200}, + {56641500, 87605000}, {56600000, 88000000}, + {56641500, 88395000}, {56764300, 88772800}, + {56962900, 89116800}, {57228700, 89412000}, + {57550000, 89645400}, {57912900, 89807000}, + {58301400, 89889600}, {58698600, 89889600}, + {59087100, 89807000}, {59450000, 89645400}, + {59771300, 89412000}, {60037100, 89116800}, + {60235700, 88772800}, {60358500, 88395000}, + {60400000, 88000000}, {60358500, 87605000}, + {60235700, 87227200}, {60037100, 86883200}, + {59771300, 86588000}, {59450000, 86354600}, + {59087100, 86193000}, {58698600, 86110400}, + }, + { + {78916400, 80204400}, {78752800, 80239200}, + {78600000, 80307200}, {78464696, 80405504}, + {78352800, 80529800}, {78269200, 80674600}, + {78217496, 80833704}, {78200000, 81000000}, + {78217496, 81166296}, {78269200, 81325400}, + {78352800, 81470200}, {78464696, 81594496}, + {78600000, 81692800}, {78752800, 81760800}, + {78916400, 81795600}, {79083600, 81795600}, + {79247200, 81760800}, {79400000, 81692800}, + {79535304, 81594496}, {79647200, 81470200}, + {79730800, 81325400}, {79782504, 81166296}, + {79800000, 81000000}, {79782504, 80833704}, + {79730800, 80674600}, {79647200, 80529800}, + {79535304, 80405504}, {79400000, 80307200}, + {79247200, 80239200}, {79083600, 80204400}, + }, + { + {20916400, 80204400}, {20752800, 80239200}, + {20600000, 80307200}, {20464700, 80405504}, + {20352800, 80529800}, {20269200, 80674600}, + {20217500, 80833704}, {20200000, 81000000}, + {20217500, 81166296}, {20269200, 81325400}, + {20352800, 81470200}, {20464700, 81594496}, + {20600000, 81692800}, {20752800, 81760800}, + {20916400, 81795600}, {21083600, 81795600}, + {21247200, 81760800}, {21400000, 81692800}, + {21535300, 81594496}, {21647200, 81470200}, + {21730800, 81325400}, {21782500, 81166296}, + {21800000, 81000000}, {21782500, 80833704}, + {21730800, 80674600}, {21647200, 80529800}, + {21535300, 80405504}, {21400000, 80307200}, + {21247200, 80239200}, {21083600, 80204400}, + }, + { + {81000000, 60500000}, + {81000000, 78500000}, + {84650000, 78500000}, + {84650000, 60500000}, + }, + { + {70000000, 60500000}, + {70000000, 78500000}, + {73650000, 78500000}, + {73650000, 60500000}, + }, + { + {75500000, 60500000}, + {75500000, 78500000}, + {79150000, 78500000}, + {79150000, 60500000}, + }, + { + {26000000, 60500000}, + {26000000, 78500000}, + {29650000, 78500000}, + {29650000, 60500000}, + }, + { + {86500000, 60500000}, + {86500000, 78500000}, + {90150000, 78500000}, + {90150000, 60500000}, + }, + { + {48000000, 60500000}, + {48000000, 78500000}, + {51650000, 78500000}, + {51650000, 60500000}, + }, + { + {64500000, 60500000}, + {64500000, 78500000}, + {68150000, 78500000}, + {68150000, 60500000}, + }, + { + {59000000, 60500000}, + {59000000, 78500000}, + {62650000, 78500000}, + {62650000, 60500000}, + }, + { + {20500000, 60500000}, + {20500000, 78500000}, + {24150000, 78500000}, + {24150000, 60500000}, + }, + { + {92000000, 60500000}, + {92000000, 78500000}, + {95650000, 78500000}, + {95650000, 60500000}, + }, + { + {42500000, 60500000}, + {42500000, 78500000}, + {46150000, 78500000}, + {46150000, 60500000}, + }, + { + {31500000, 60500000}, + {31500000, 78500000}, + {35150000, 78500000}, + {35150000, 60500000}, + }, + { + {37000000, 60500000}, + {37000000, 78500000}, + {40650000, 78500000}, + {40650000, 60500000}, + }, + { + {53500000, 60500000}, + {53500000, 78500000}, + {57150000, 78500000}, + {57150000, 60500000}, + }, + { + {7301400, 73110400}, {6912870, 73193000}, + {6550000, 73354600}, {6228650, 73588000}, + {5962870, 73883200}, {5900000, 73992104}, + {5764260, 74227200}, {5641520, 74605000}, + {5600000, 75000000}, {5641520, 75395000}, + {5764260, 75772800}, {5900000, 76007896}, + {5962870, 76116800}, {6228650, 76412000}, + {6550000, 76645400}, {6912870, 76807000}, + {7301400, 76889600}, {7698600, 76889600}, + {8087129, 76807000}, {8450000, 76645400}, + {8771350, 76412000}, {9037130, 76116800}, + {9100000, 76007896}, {9235740, 75772800}, + {9358480, 75395000}, {9400000, 75000000}, + {9358480, 74605000}, {9235740, 74227200}, + {9100000, 73992104}, {9037130, 73883200}, + {8771350, 73588000}, {8450000, 73354600}, + {8087129, 73193000}, {7698600, 73110400}, + }, + { + {102301000, 73110400}, {101913000, 73193000}, + {101550000, 73354600}, {101229000, 73588000}, + {100963000, 73883200}, {100764000, 74227200}, + {100642000, 74605000}, {100600000, 75000000}, + {100642000, 75395000}, {100764000, 75772800}, + {100963000, 76116800}, {101229000, 76412000}, + {101550000, 76645400}, {101913000, 76807000}, + {102301000, 76889600}, {102699000, 76889600}, + {103087000, 76807000}, {103450000, 76645400}, + {103771000, 76412000}, {104037000, 76116800}, + {104236000, 75772800}, {104358000, 75395000}, + {104400000, 75000000}, {104358000, 74605000}, + {104236000, 74227200}, {104037000, 73883200}, + {103771000, 73588000}, {103450000, 73354600}, + {103087000, 73193000}, {102699000, 73110400}, + }, + { + {37000000, 35500000}, + {37000000, 53500000}, + {40650000, 53500000}, + {40650000, 35500000}, + }, + { + {53500000, 35500000}, + {53500000, 53500000}, + {57150000, 53500000}, + {57150000, 35500000}, + }, + { + {75500000, 35500000}, + {75500000, 53500000}, + {79150000, 53500000}, + {79150000, 35500000}, + }, + { + {31500000, 35500000}, + {31500000, 53500000}, + {35150000, 53500000}, + {35150000, 35500000}, + }, + { + {92000000, 35500000}, + {92000000, 53500000}, + {95650000, 53500000}, + {95650000, 35500000}, + }, + { + {81000000, 35500000}, + {81000000, 53500000}, + {84650000, 53500000}, + {84650000, 35500000}, + }, + { + {86500000, 35500000}, + {86500000, 53500000}, + {90150000, 53500000}, + {90150000, 35500000}, + }, + { + {48000000, 35500000}, + {48000000, 53500000}, + {51650000, 53500000}, + {51650000, 35500000}, + }, + { + {42500000, 35500000}, + {42500000, 53500000}, + {46150000, 53500000}, + {46150000, 35500000}, + }, + { + {70000000, 35500000}, + {70000000, 53500000}, + {73650000, 53500000}, + {73650000, 35500000}, + }, + { + {20500000, 35500000}, + {20500000, 53500000}, + {24150000, 53500000}, + {24150000, 35500000}, + }, + { + {59000000, 35500000}, + {59000000, 53500000}, + {62650000, 53500000}, + {62650000, 35500000}, + }, + { + {64500000, 35500000}, + {64500000, 53500000}, + {68150000, 53500000}, + {68150000, 35500000}, + }, + { + {26000000, 35500000}, + {26000000, 53500000}, + {29650000, 53500000}, + {29650000, 35500000}, + }, + { + {16290899, 8010959}, {15882000, 8097890}, + {15500000, 8267950}, {15161700, 8513710}, + {14882000, 8824430}, {14672900, 9186530}, + {14543700, 9584180}, {14500000, 10000000}, + {14500000, 34000000}, {14543700, 34415800}, + {14672900, 34813500}, {14882000, 35175600}, + {15161700, 35486300}, {15500000, 35732000}, + {15882000, 35902100}, {16290899, 35989000}, + {16709101, 35989000}, {17118000, 35902100}, + {17500000, 35732000}, {17838300, 35486300}, + {18118000, 35175600}, {18327100, 34813500}, + {18456300, 34415800}, {18500000, 34000000}, + {18500000, 10000000}, {18456300, 9584180}, + {18327100, 9186530}, {18118000, 8824430}, + {17838300, 8513710}, {17500000, 8267950}, + {17118000, 8097890}, {16709101, 8010959}, + }, + { + {59000000, 10500000}, + {59000000, 28500000}, + {62650000, 28500000}, + {62650000, 10500000}, + }, + { + {81000000, 10500000}, + {81000000, 28500000}, + {84650000, 28500000}, + {84650000, 10500000}, + }, + { + {75500000, 10500000}, + {75500000, 28500000}, + {79150000, 28500000}, + {79150000, 10500000}, + }, + { + {70000000, 10500000}, + {70000000, 28500000}, + {73650000, 28500000}, + {73650000, 10500000}, + }, + { + {20500000, 10500000}, + {20500000, 28500000}, + {24150000, 28500000}, + {24150000, 10500000}, + }, + { + {92000000, 10500000}, + {92000000, 28500000}, + {95650000, 28500000}, + {95650000, 10500000}, + }, + { + {26000000, 10500000}, + {26000000, 28500000}, + {29650000, 28500000}, + {29650000, 10500000}, + }, + { + {53500000, 10500000}, + {53500000, 28500000}, + {57150000, 28500000}, + {57150000, 10500000}, + }, + { + {48000000, 10500000}, + {48000000, 28500000}, + {51650000, 28500000}, + {51650000, 10500000}, + }, + { + {42500000, 10500000}, + {42500000, 28500000}, + {46150000, 28500000}, + {46150000, 10500000}, + }, + { + {37000000, 10500000}, + {37000000, 28500000}, + {40650000, 28500000}, + {40650000, 10500000}, + }, + { + {31500000, 10500000}, + {31500000, 28500000}, + {35150000, 28500000}, + {35150000, 10500000}, + }, + { + {64500000, 10500000}, + {64500000, 28500000}, + {68150000, 28500000}, + {68150000, 10500000}, + }, + { + {86500000, 10500000}, + {86500000, 28500000}, + {90150000, 28500000}, + {90150000, 10500000}, + }, + { + {102301000, 12110400}, {101913000, 12193000}, + {101550000, 12354600}, {101229000, 12588000}, + {100963000, 12883200}, {100764000, 13227200}, + {100642000, 13605000}, {100600000, 14000000}, + {100642000, 14395000}, {100764000, 14772800}, + {100963000, 15116800}, {101229000, 15412000}, + {101550000, 15645400}, {101913000, 15807000}, + {102301000, 15889600}, {102699000, 15889600}, + {103087000, 15807000}, {103450000, 15645400}, + {103771000, 15412000}, {104037000, 15116800}, + {104236000, 14772800}, {104358000, 14395000}, + {104400000, 14000000}, {104358000, 13605000}, + {104236000, 13227200}, {104037000, 12883200}, + {103771000, 12588000}, {103450000, 12354600}, + {103087000, 12193000}, {102699000, 12110400}, + }, + { + {7301400, 12110400}, {6912870, 12193000}, + {6550000, 12354600}, {6228650, 12588000}, + {5962870, 12883200}, {5900000, 12992100}, + {5764260, 13227200}, {5641520, 13605000}, + {5600000, 14000000}, {5641520, 14395000}, + {5764260, 14772800}, {5900000, 15007900}, + {5962870, 15116800}, {6228650, 15412000}, + {6550000, 15645400}, {6912870, 15807000}, + {7301400, 15889600}, {7698600, 15889600}, + {8087129, 15807000}, {8450000, 15645400}, + {8771350, 15412000}, {9037130, 15116800}, + {9100000, 15007900}, {9235740, 14772800}, + {9358480, 14395000}, {9400000, 14000000}, + {9358480, 13605000}, {9235740, 13227200}, + {9100000, 12992100}, {9037130, 12883200}, + {8771350, 12588000}, {8450000, 12354600}, + {8087129, 12193000}, {7698600, 12110400}, + }, + }}, + }, + ExPolygons{ + // "lcd-supports.stl": + MyPoly{{ + {4192390, 4192390}, {4192390, 5707110}, + {2474870, 7424620}, {1626350, 6576090}, + {3040560, 5161880}, {1767770, 3889090}, + {-2474870, 8131730}, {-5303300, 5303300}, + {-36769600, 36769600}, {-33941100, 39598000}, + {-38183750, 43840650}, {-36911000, 45113400}, + {-35496800, 43699200}, {-34648200, 44547700}, + {-36769600, 46669000}, {-38183800, 46669000}, + {-46852800, 38000000}, {-61500000, 38000000}, + {-61500000, 12000000}, {-50000000, 12000000}, + {-50000000, 11984300}, {-37204500, -811183}, + {-811183, -811183}, + }, + { + { + {-36000000, 8000000}, + {-51500000, 23500000}, + {-37357900, 23500000}, + {-21857900, 8000000}, + }, + }}, + MyPoly{{ + {-13147200, -40000000}, {1500000, -40000000}, + {1500000, -14000000}, {-10000000, -14000000}, + {-10000000, -13984300}, {-22795500, -1188820}, + {-59188800, -1188820}, {-64192400, -6192390}, + {-64192400, -7707110}, {-62474900, -9424620}, + {-61626300, -8576090}, {-63040571, -7161851}, + {-61767800, -5889090}, {-57525100, -10131700}, + {-54696700, -7303300}, {-23230400, -38769600}, + {-26058900, -41598000}, {-21816250, -45840650}, + {-23089000, -47113400}, {-24503200, -45699200}, + {-25351800, -46547700}, {-23230400, -48669000}, + {-21816200, -48669000}, + }, + { + { + {-22642100, -25500000}, + {-38142100, -10000000}, + {-24000000, -10000000}, + {-9357800, -24642200}, + {-9288210, -24711800}, + {-8500000, -25500000}, + }, + }}, + }, +}; diff --git a/src/libseqarrange/test/prusaparts.hpp b/src/libseqarrange/test/prusaparts.hpp new file mode 100644 index 0000000000..e4fa33cf49 --- /dev/null +++ b/src/libseqarrange/test/prusaparts.hpp @@ -0,0 +1,14 @@ +#ifndef PRUSAPARTS_H +#define PRUSAPARTS_H + +#include +#include "libslic3r/ExPolygon.hpp" + +using TestData = std::vector; +using TestDataEx = std::vector; + +extern const TestData PRUSA_PART_POLYGONS; +extern const TestData PRUSA_STEGOSAUR_POLYGONS; +extern const TestDataEx PRUSA_PART_POLYGONS_EX; + +#endif // PRUSAPARTS_H diff --git a/src/libseqarrange/test/seq_test_arrangement.cpp b/src/libseqarrange/test/seq_test_arrangement.cpp new file mode 100644 index 0000000000..6df36e482c --- /dev/null +++ b/src/libseqarrange/test/seq_test_arrangement.cpp @@ -0,0 +1,1023 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_arrangement.cpp + * + * Basic steel sheet object arrangement test via + * Constraint Programming tools. + */ +/*================================================================*/ + +#include +#include +#include + +#include +#include +#include +#include + +#include "seq_defs.hpp" + +#include "seq_test_arrangement.hpp" + + +/*----------------------------------------------------------------*/ + + +using namespace Gecode; + + +/*----------------------------------------------------------------*/ + +class Queens : public Script { +public: + /// Position of queens on boards + IntVarArray q; + /// Propagation to use for model + + Queens(const SizeOptions& opt) + : Script(opt), q(*this, opt.size(), 0, opt.size()-1) { + + const int n = q.size(); + + for (int i = 0; i(opt); + + + printf("Testing sheet arrangement 1 ... finished\n"); +} + + +class SimpleProblem : public Space +{ +public: + IntVarArray vars; + IntVar X, Y, Z; + +public: + SimpleProblem() + : vars(*this, 3, 0, 3) + , X(vars[0]) + , Y(vars[1]) + , Z(vars[2]) + { + rel(*this, X != Y); + rel(*this, Y != Z); + rel(*this, X != Z); + + branch(*this, vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + }; + + SimpleProblem(SimpleProblem &s) + : Space(s) + { + X.update(*this, s.X); + Y.update(*this, s.Y); + Z.update(*this, s.Z); + } + + virtual Space* copy(void) { + return new SimpleProblem(*this); + }; + + void print(void) const + { + /* + cout << X << endl; + cout << Y << endl; + cout << Z << endl; + */ + printf("XYZ: %d, %d, %d\n", X.val(), Y.val(), Z.val()); + }; +}; + + +const int sheet_size = 9; + +const int Obj1_width = 5; +const int Obj1_height = 4; + +const int Obj2_width = 3; +const int Obj2_height = 7; + +const int Obj3_width = 5; +const int Obj3_height = 5; + +class ArrangementProblem : public Space +{ +public: + IntVarArray vars; + IntVar Obj1_x, Obj1_y; + IntVar Obj2_x, Obj2_y; + IntVar Obj3_x, Obj3_y; + +public: + ArrangementProblem() + : vars(*this, 6, 0, sheet_size - 1) + , Obj1_x(vars[0]) + , Obj1_y(vars[1]) + , Obj2_x(vars[2]) + , Obj2_y(vars[3]) + , Obj3_x(vars[4]) + , Obj3_y(vars[5]) + { + IntArgs widths(3); + widths[0] = Obj1_width; + widths[1] = Obj2_width; + widths[2] = Obj3_width; + + IntArgs heights(3); + heights[0] = Obj1_height; + heights[1] = Obj2_height; + heights[2] = Obj3_height; + + IntVarArgs Xs(3); + Xs[0] = Obj1_x; + Xs[1] = Obj2_x; + Xs[2] = Obj3_x; + + IntVarArgs Ys(3); + Ys[0] = Obj1_y; + Ys[1] = Obj2_y; + Ys[2] = Obj3_y; + + nooverlap(*this, Xs, widths, Ys, heights); + + rel(*this, Obj1_x + Obj1_width <= sheet_size); + rel(*this, Obj2_x + Obj2_width <= sheet_size); + rel(*this, Obj3_x + Obj3_width <= sheet_size); + + rel(*this, Obj2_x == Obj1_x + 5); + rel(*this, Obj2_y == Obj1_y + 1); + + rel(*this, Obj1_y + Obj1_height <= sheet_size); + rel(*this, Obj2_y + Obj2_height <= sheet_size); + rel(*this, Obj3_y + Obj3_height <= sheet_size); + + branch(*this, vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + }; + + ArrangementProblem(ArrangementProblem &s) + : Space(s) + { + Obj1_x.update(*this, s.Obj1_x); + Obj1_y.update(*this, s.Obj1_y); + + Obj2_x.update(*this, s.Obj2_x); + Obj2_y.update(*this, s.Obj2_y); + + Obj3_x.update(*this, s.Obj3_x); + Obj3_y.update(*this, s.Obj3_y); + } + + virtual Space* copy(void) { + return new ArrangementProblem(*this); + }; + + void print(void) const + { + /* + cout << X << endl; + cout << Y << endl; + cout << Z << endl; + */ + printf("Position obj1: %d, %d\n", Obj1_x.val(), Obj1_y.val()); + printf("Position obj2: %d, %d\n", Obj2_x.val(), Obj2_y.val()); + printf("Position obj2: %d, %d\n", Obj3_x.val(), Obj3_y.val()); + }; +}; + + +const int sheet_resolution = 20; +const int time_resolution = 80; + +const int low_Obj1_width = 5; +const int low_Obj1_height = 4; +const int low_Obj1_duration = 10; + +const int low_Obj2_width = 3; +const int low_Obj2_height = 7; +const int low_Obj2_duration = 15; + +const int low_Obj3_width = 4; +const int low_Obj3_height = 4; +const int low_Obj3_duration = 5; + +const int high_Obj1_width = 2; +const int high_Obj1_height = 2; +const int high_Obj1_duration = 35; + +const int kine_width = 100; +const int kine_height = 10; + + +class SimpleSequentialProblem : public Space +{ +public: + IntVarArray space_vars; + IntVarArray time_vars; + IntVarArray kine_vars; + + IntVar low_Obj1_x, low_Obj1_y, low_Obj1_t; + IntVar low_Obj2_x, low_Obj2_y, low_Obj2_t; + IntVar low_Obj3_x, low_Obj3_y, low_Obj3_t; + + IntVar high_Obj1_x, high_Obj1_y, high_Obj1_t; + +public: + SimpleSequentialProblem() + : space_vars(*this, 8, 0, sheet_resolution) + , time_vars(*this, 4, 0, time_resolution) + , kine_vars(*this, 2, 0, sheet_resolution) + + , low_Obj1_x(space_vars[0]) + , low_Obj1_y(space_vars[1]) + , low_Obj1_t(time_vars[0]) + + , low_Obj2_x(space_vars[2]) + , low_Obj2_y(space_vars[3]) + , low_Obj2_t(time_vars[1]) + + , low_Obj3_x(space_vars[4]) + , low_Obj3_y(space_vars[5]) + , low_Obj3_t(time_vars[2]) + + , high_Obj1_x(space_vars[6]) + , high_Obj1_y(space_vars[7]) + , high_Obj1_t(time_vars[3]) + { + printf("alpha 1\n"); + BoolVar low_Obj1_present = expr(*this, low_Obj1_t >= 0); + BoolVar low_Obj2_present = expr(*this, low_Obj2_t >= 0); + BoolVar low_Obj3_present = expr(*this, low_Obj3_t >= 0); + BoolVar high_Obj1_present = expr(*this, high_Obj1_t >= 0); + //BoolVar low_Obj1_above_high_Obj1 = expr(*this, low_Obj1_t >= high_Obj1_t); + + printf("alpha 2\n"); + BoolVarArgs objects_present(4); + objects_present[0] = low_Obj1_present; + objects_present[1] = low_Obj2_present; + objects_present[2] = low_Obj3_present; + objects_present[3] = high_Obj1_present; + //objects_present[3] = low_Obj1_above_high_Obj1; + + IntArgs kine_widths(1); + IntArgs kine_heights(1); + + IntVar kine_Obj1_x(kine_vars[0]); + IntVar kine_Obj1_y(kine_vars[1]); + printf("alpha 3\n"); + kine_widths[0] = kine_width; + kine_heights[0] = kine_height; + + rel(*this, kine_Obj1_x == high_Obj1_x + high_Obj1_width); + rel(*this, kine_Obj1_y == high_Obj1_y - 3); + + IntArgs widths(4); + widths[0] = low_Obj1_width; + widths[1] = low_Obj2_width; + widths[2] = low_Obj3_width; + widths[3] = high_Obj1_width; + //widths[3] = kine_width; + + IntArgs heights(4); + heights[0] = low_Obj1_height; + heights[1] = low_Obj2_height; + heights[2] = low_Obj3_height; + heights[3] = high_Obj1_height; + //heights[3] = kine_height; + printf("alpha 4\n"); + + IntVarArgs Xs(4); + Xs[0] = low_Obj1_x; + Xs[1] = low_Obj2_x; + Xs[2] = low_Obj3_x; + Xs[3] = high_Obj1_x; + //Xs[3] = kine_Obj1_x; + + IntVarArgs Ys(4); + Ys[0] = low_Obj1_y; + Ys[1] = low_Obj2_y; + Ys[2] = low_Obj3_y; + Ys[3] = high_Obj1_y; + //Ys[3] = kine_Obj1_y; + printf("alpha 5\n"); + + nooverlap(*this, Xs, widths, Ys, heights/*, objects_present*/); + printf("alpha 6\n"); + + rel(*this, low_Obj1_t >= low_Obj2_t + low_Obj2_duration || low_Obj2_t >= low_Obj1_t + low_Obj1_duration); + rel(*this, low_Obj1_t >= low_Obj3_t + low_Obj3_duration || low_Obj3_t >= low_Obj1_t + low_Obj1_duration); + rel(*this, low_Obj2_t >= low_Obj3_t + low_Obj3_duration || low_Obj3_t >= low_Obj2_t + low_Obj2_duration); + + rel(*this, low_Obj3_t >= high_Obj1_t + high_Obj1_duration || high_Obj1_t >= low_Obj3_t + low_Obj3_duration); + rel(*this, low_Obj2_t >= high_Obj1_t + high_Obj1_duration || high_Obj1_t >= low_Obj2_t + low_Obj2_duration); + rel(*this, low_Obj1_t >= high_Obj1_t + high_Obj1_duration || high_Obj1_t >= low_Obj1_t + low_Obj1_duration); + + rel(*this, low_Obj1_x + low_Obj1_width <= sheet_resolution); + rel(*this, low_Obj2_x + low_Obj2_width <= sheet_resolution); + rel(*this, low_Obj3_x + low_Obj3_width <= sheet_resolution); + rel(*this, high_Obj1_x + high_Obj1_width <= sheet_resolution); + + rel(*this, low_Obj1_y + low_Obj1_height <= sheet_resolution); + rel(*this, low_Obj2_y + low_Obj2_height <= sheet_resolution); + rel(*this, low_Obj3_y + low_Obj3_height <= sheet_resolution); + rel(*this, high_Obj1_y + high_Obj1_height <= sheet_resolution); + + rel(*this, low_Obj1_t + low_Obj1_duration <= time_resolution); + rel(*this, low_Obj2_t + low_Obj2_duration <= time_resolution); + rel(*this, low_Obj3_t + low_Obj3_duration <= time_resolution); + rel(*this, high_Obj1_t + high_Obj1_duration <= time_resolution); + + rel(*this, low_Obj1_t < high_Obj1_t || low_Obj1_x >= kine_Obj1_x + kine_width || kine_Obj1_x >= low_Obj1_x + low_Obj1_width + || low_Obj1_y >= kine_Obj1_y + kine_height || kine_Obj1_y >= low_Obj1_y + low_Obj1_height); + + rel(*this, low_Obj2_t < high_Obj1_t || low_Obj2_x >= kine_Obj1_x + kine_width || kine_Obj1_x >= low_Obj2_x + low_Obj2_width + || low_Obj2_y >= kine_Obj1_y + kine_height || kine_Obj1_y >= low_Obj2_y + low_Obj2_height); + + rel(*this, low_Obj3_t < high_Obj1_t || low_Obj3_x >= kine_Obj1_x + kine_width || kine_Obj1_x >= low_Obj3_x + low_Obj3_width + || low_Obj3_y >= kine_Obj1_y + kine_height || kine_Obj1_y >= low_Obj3_y + low_Obj3_height); + + rel(*this, high_Obj1_t < 10); + rel(*this, high_Obj1_x == 0); + + printf("alpha 7\n"); + + branch(*this, space_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, time_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, kine_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + printf("alpha 8\n"); + }; + + SimpleSequentialProblem(SimpleSequentialProblem &s) + : Space(s) + { + low_Obj1_x.update(*this, s.low_Obj1_x); + low_Obj1_y.update(*this, s.low_Obj1_y); + low_Obj1_t.update(*this, s.low_Obj1_t); + + low_Obj2_x.update(*this, s.low_Obj2_x); + low_Obj2_y.update(*this, s.low_Obj2_y); + low_Obj2_t.update(*this, s.low_Obj2_t); + + low_Obj3_x.update(*this, s.low_Obj3_x); + low_Obj3_y.update(*this, s.low_Obj3_y); + low_Obj3_t.update(*this, s.low_Obj3_t); + + high_Obj1_x.update(*this, s.high_Obj1_x); + high_Obj1_y.update(*this, s.high_Obj1_y); + high_Obj1_t.update(*this, s.high_Obj1_t); + } + + virtual Space* copy(void) { + return new SimpleSequentialProblem(*this); + }; + + void print(void) const + { + /* + cout << X << endl; + cout << Y << endl; + cout << Z << endl; + */ + printf("Position low obj1 : x:%d, y:%d, t:%d\n", low_Obj1_x.val(), low_Obj1_y.val(), low_Obj1_t.val()); + printf("Position low obj2 : x:%d, y:%d, t:%d\n", low_Obj2_x.val(), low_Obj2_y.val(), low_Obj2_t.val()); + printf("Position low obj3 : x:%d, y:%d, t:%d\n", low_Obj3_x.val(), low_Obj3_y.val(), low_Obj3_t.val()); + printf("Position high obj1: x:%d, y:%d, t:%d\n", high_Obj1_x.val(), high_Obj1_y.val(), high_Obj1_t.val()); + }; +}; + + +int complex_sheet_resolution = 30; + +int complex_sheet_resolution_min = 10; +int complex_sheet_resolution_max = 200; + +int complex_time_resolution = 1000; +int complex_height_threshold = 25; + +const int complex_Obj_count = 10; + +int complex_Obj_widths[complex_Obj_count]; +int complex_Obj_heights[complex_Obj_count]; +int complex_Obj_durations[complex_Obj_count]; + +const int min_width = 4; +const int max_width = 20; + +const int min_height = 4; +const int max_height = 20; + +const int min_duration = 2; +const int max_duration = 50; + +const int gantry_left_height = 10; +const int gantry_left_shift = 4; + +const int gantry_right_height = 10; +const int gantry_right_shift = 4; + + +class ComplexSequentialProblem : public Space +{ +public: + IntVarArray space_vars; + IntVarArray time_vars; + IntVarArray kine_vars; + + IntVar complex_Obj_x[complex_Obj_count]; + IntVar complex_Obj_y[complex_Obj_count]; + IntVar complex_Obj_t[complex_Obj_count]; + + IntVar gantry_left_y[complex_Obj_count]; + IntVar gantry_right_y[complex_Obj_count]; + +public: + ComplexSequentialProblem() + : space_vars(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution) + , time_vars(*this, complex_Obj_count, 0, complex_time_resolution) + , kine_vars(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution) + { + /* + int width_span = max_width - min_width; + int height_span = max_height - min_height; + int duration_span = max_duration - min_duration; + + for (int i = 0; i < complex_Obj_count; ++i) + { + complex_Obj_widths[i] = min_width + rand() % width_span; + complex_Obj_heights[i] = min_height + rand() % height_span; + complex_Obj_durations[i] = min_duration + rand() % duration_span; + } + */ + for (int i = 0; i < complex_Obj_count; ++i) + { + complex_Obj_x[i] = space_vars[2 * i]; + complex_Obj_y[i] = space_vars[2 * i + 1]; + complex_Obj_t[i] = time_vars[i]; + + gantry_left_y[i] = kine_vars[2 * i]; + gantry_right_y[i] = kine_vars[2 * i + 1]; + } + + IntArgs widths(complex_Obj_count); + IntArgs heights(complex_Obj_count); + + IntVarArgs X_vars(complex_Obj_count); + IntVarArgs Y_vars(complex_Obj_count); + + for (int i = 0; i < complex_Obj_count; ++i) + { + widths[i] = complex_Obj_widths[i]; + heights[i] = complex_Obj_heights[i]; + + X_vars[i] = complex_Obj_x[i]; + Y_vars[i] = complex_Obj_y[i]; + } + + nooverlap(*this, X_vars, widths, Y_vars, heights, IPL_BND); + + for (int i = 0; i < complex_Obj_count - 1; ++i) + { + for (int j = i + 1; j < complex_Obj_count; ++j) + { + rel(*this, complex_Obj_t[i] >= complex_Obj_t[j] + complex_Obj_durations[j] || complex_Obj_t[j] >= complex_Obj_t[i] + complex_Obj_durations[i], IPL_BND); + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + rel(*this, complex_Obj_x[i] + complex_Obj_widths[i] <= complex_sheet_resolution, IPL_BND); + rel(*this, complex_Obj_y[i] + complex_Obj_heights[i] <= complex_sheet_resolution, IPL_BND); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + rel(*this, gantry_left_y[i] == complex_Obj_y[i] + gantry_left_shift); + rel(*this, gantry_right_y[i] == complex_Obj_y[i] + gantry_right_shift); + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (j != i) + { + rel(*this, complex_Obj_t[j] < complex_Obj_t[i] + || complex_Obj_y[j] >= gantry_right_y[i] + gantry_right_height + || gantry_right_y[i] >= complex_Obj_y[j] + complex_Obj_heights[j], IPL_BND); + + rel(*this, complex_Obj_t[j] < complex_Obj_t[i] + || complex_Obj_y[j] >= gantry_left_y[i] + gantry_left_height + || gantry_left_y[i] >= complex_Obj_y[j] + complex_Obj_heights[j], IPL_BND); + } + } + } + } + + branch(*this, space_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, time_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, kine_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + }; + + ComplexSequentialProblem(ComplexSequentialProblem &s) + : Space(s) + { + for (int i = 0; i < complex_Obj_count; ++i) + { + complex_Obj_x[i].update(*this, s.complex_Obj_x[i]); + complex_Obj_y[i].update(*this, s.complex_Obj_y[i]); + complex_Obj_t[i].update(*this, s.complex_Obj_t[i]); + + gantry_left_y[i].update(*this, s.gantry_left_y[i]); + gantry_right_y[i].update(*this, s.gantry_right_y[i]); + } + } + + virtual Space* copy(void) { + return new ComplexSequentialProblem(*this); + }; + + void print(void) const + { + for (int i = 0; i < complex_Obj_count; ++i) + { + printf("Position object: x:%d, y:%d, t:%d (w:%d, h:%d, d:%d)\n", + complex_Obj_x[i].val(), + complex_Obj_y[i].val(), + complex_Obj_t[i].val(), + complex_Obj_widths[i], + complex_Obj_heights[i], + complex_Obj_durations[i]); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + printf("Gantry position (%d): left_y:%d right_y:%d\n", i, + gantry_left_y[i].val(), + gantry_right_y[i].val()); + } + } + }; +}; + + +int complex_sheet_resolution_X = 200; + +int complex_sheet_resolution_X_min = 10; +int complex_sheet_resolution_X_max = 200; + + +int complex_sheet_resolution_Y = 30; + +int complex_sheet_resolution_Y_min = 10; +int complex_sheet_resolution_Y_max = 200; + + +void generate_random_complex_objects(void) +{ + int width_span = max_width - min_width; + int height_span = max_height - min_height; + int duration_span = max_duration - min_duration; + + for (int i = 0; i < complex_Obj_count; ++i) + { + printf("Generating random object %d ...\n", i); + complex_Obj_widths[i] = min_width + rand() % width_span; + complex_Obj_heights[i] = min_height + rand() % height_span; + complex_Obj_durations[i] = min_duration + rand() % duration_span; + } +} + + +class ComplexSequentialProblemXY : public Space +{ +public: + IntVarArray space_vars_X; + IntVarArray space_vars_Y; + + IntVarArray time_vars; + + IntVarArray kine_vars_L; + IntVarArray kine_vars_R; + + IntVar complex_Obj_x[complex_Obj_count]; + IntVar complex_Obj_y[complex_Obj_count]; + IntVar complex_Obj_t[complex_Obj_count]; + + IntVar gantry_left_y[complex_Obj_count]; + IntVar gantry_right_y[complex_Obj_count]; + +public: + ComplexSequentialProblemXY() + : space_vars_X(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution_X) + , space_vars_Y(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution_Y) + , time_vars(*this, complex_Obj_count, 0, complex_time_resolution) + , kine_vars_L(*this, complex_Obj_count, 0, complex_sheet_resolution_Y) + , kine_vars_R(*this, complex_Obj_count, 0, complex_sheet_resolution_Y) + { + for (int i = 0; i < complex_Obj_count; ++i) + { + complex_Obj_x[i] = space_vars_X[2 * i]; + complex_Obj_y[i] = space_vars_X[2 * i + 1]; + + complex_Obj_t[i] = time_vars[i]; + + gantry_left_y[i] = kine_vars_L[i]; + gantry_right_y[i] = kine_vars_R[i]; + } + + IntArgs widths(complex_Obj_count); + IntArgs heights(complex_Obj_count); + + IntVarArgs X_vars(complex_Obj_count); + IntVarArgs Y_vars(complex_Obj_count); + + for (int i = 0; i < complex_Obj_count; ++i) + { + widths[i] = complex_Obj_widths[i]; + heights[i] = complex_Obj_heights[i]; + + X_vars[i] = complex_Obj_x[i]; + Y_vars[i] = complex_Obj_y[i]; + } + + nooverlap(*this, X_vars, widths, Y_vars, heights, IPL_BND); + + for (int i = 0; i < complex_Obj_count - 1; ++i) + { + for (int j = i + 1; j < complex_Obj_count; ++j) + { + rel(*this, complex_Obj_t[i] >= complex_Obj_t[j] + complex_Obj_durations[j] || complex_Obj_t[j] >= complex_Obj_t[i] + complex_Obj_durations[i], IPL_BND); + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + rel(*this, complex_Obj_x[i] + complex_Obj_widths[i] <= complex_sheet_resolution_X, IPL_BND); + rel(*this, complex_Obj_y[i] + complex_Obj_heights[i] <= complex_sheet_resolution_Y, IPL_BND); + } + + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + rel(*this, gantry_left_y[i] == complex_Obj_y[i] + gantry_left_shift); + rel(*this, gantry_right_y[i] == complex_Obj_y[i] + gantry_right_shift); + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (j != i) + { + rel(*this, complex_Obj_t[j] < complex_Obj_t[i] + || complex_Obj_y[j] >= gantry_right_y[i] + gantry_right_height + || gantry_right_y[i] >= complex_Obj_y[j] + complex_Obj_heights[j], IPL_BND); + + rel(*this, complex_Obj_t[j] < complex_Obj_t[i] + || complex_Obj_y[j] >= gantry_left_y[i] + gantry_left_height + || gantry_left_y[i] >= complex_Obj_y[j] + complex_Obj_heights[j], IPL_BND); + } + } + } + } + + branch(*this, space_vars_Y, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, space_vars_X, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, time_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, kine_vars_L, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + branch(*this, kine_vars_R, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); + }; + + ComplexSequentialProblemXY(ComplexSequentialProblemXY &s) + : Space(s) + { + for (int i = 0; i < complex_Obj_count; ++i) + { + complex_Obj_x[i].update(*this, s.complex_Obj_x[i]); + complex_Obj_y[i].update(*this, s.complex_Obj_y[i]); + complex_Obj_t[i].update(*this, s.complex_Obj_t[i]); + + gantry_left_y[i].update(*this, s.gantry_left_y[i]); + gantry_right_y[i].update(*this, s.gantry_right_y[i]); + } + } + + virtual Space* copy(void) { + return new ComplexSequentialProblemXY(*this); + }; + + void print(void) const + { + for (int i = 0; i < complex_Obj_count; ++i) + { + printf("Position object: x:%d, y:%d, t:%d (w:%d, h:%d, d:%d)\n", + complex_Obj_x[i].val(), + complex_Obj_y[i].val(), + complex_Obj_t[i].val(), + complex_Obj_widths[i], + complex_Obj_heights[i], + complex_Obj_durations[i]); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + printf("Gantry position (%d): left_y:%d right_y:%d\n", i, + gantry_left_y[i].val(), + gantry_right_y[i].val()); + } + } + }; +}; + + +void test_arrangement_2(void) +{ + printf("Testing sheet arrangement 2 ...\n"); + + SimpleProblem *simple_problem = new SimpleProblem(); + DFS engine(simple_problem); + delete simple_problem; + + while (SimpleProblem *simple_P = engine.next()) + { + simple_P->print(); + delete simple_P; + } + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + + printf("Testing sheet arrangement 2 ... finished\n"); +} + + +void test_arrangement_3(void) +{ + printf("Testing sheet arrangement 3 ...\n"); + + ArrangementProblem *arrangement_problem = new ArrangementProblem(); + DFS engine(arrangement_problem); + delete arrangement_problem; + + while (ArrangementProblem *arrangement_P = engine.next()) + { + arrangement_P->print(); + delete arrangement_P; + printf("\n"); + getchar(); + } + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + + printf("Testing sheet arrangement 3 ... finished\n"); +} + + +void test_arrangement_4(void) +{ + printf("Testing sheet arrangement 4 ...\n"); + + SimpleSequentialProblem *sequential_problem = new SimpleSequentialProblem(); + DFS engine(sequential_problem); + delete sequential_problem; + + while (SimpleSequentialProblem *sequential_P = engine.next()) + { + sequential_P->print(); + delete sequential_P; + + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + printf("\n"); + getchar(); + } + + printf("Testing sheet arrangement 4 ... finished\n"); +} + + +void test_arrangement_5(void) +{ + printf("Testing sheet arrangement 5 ...\n"); + generate_random_complex_objects(); + + ComplexSequentialProblem *sequential_problem = new ComplexSequentialProblem(); + Search::Options options; + options.cutoff = Search::Cutoff::linear(); + options.nogoods_limit = 512; + DFS engine(sequential_problem, options); + delete sequential_problem; + + clock_t begin = clock(); + + while (ComplexSequentialProblem *sequential_P = engine.next()) + { + sequential_P->print(); + clock_t end = clock(); + printf("Time (CPU): %.3fs\n", (end - begin) / (double)CLOCKS_PER_SEC); + + delete sequential_P; + + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + printf("\n"); + getchar(); + } + clock_t end = clock(); + printf("Time (CPU): %.3fs\n", (end - begin) / (double)CLOCKS_PER_SEC); + + printf("Testing sheet arrangement 5 ... finished\n"); +} + + +void test_arrangement_6(void) +{ + printf("Testing sheet arrangement 6 ...\n"); + generate_random_complex_objects(); + + complex_sheet_resolution = complex_sheet_resolution_max; + + while (complex_sheet_resolution > complex_sheet_resolution_min) + { + printf("Trying sheet resolution = %d\n", complex_sheet_resolution); + + ComplexSequentialProblem *sequential_problem = new ComplexSequentialProblem(); + + Search::Options options; + /* + options.cutoff = Search::Cutoff::linear(); + options.nogoods_limit = 16 * 512; + */ + options.stop = Search::Stop::time(512); + + DFS engine(sequential_problem, options); + delete sequential_problem; + + clock_t begin = clock(); + + ComplexSequentialProblem *sequential_P = engine.next(); + + if (sequential_P != NULL) + { + sequential_P->print(); + clock_t end = clock(); + printf("Time (CPU): %.3fs\n", (end - begin) / (double)CLOCKS_PER_SEC); + + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + printf("\n"); + printf("SUCCESS\n"); + } + else + { + clock_t end = clock(); + printf("Time (CPU): %.3fs\n", (end - begin) / (double)CLOCKS_PER_SEC); + + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + + printf("FAIL\n"); + } + delete sequential_P; + + complex_sheet_resolution -= 1; + + } + printf("Testing sheet arrangement 6 ... finished\n"); +} + + +void test_arrangement_7(void) +{ + printf("Testing sheet arrangement 7 ...\n"); + generate_random_complex_objects(); + + complex_sheet_resolution_X = complex_sheet_resolution_X_max; + + while (complex_sheet_resolution_X > complex_sheet_resolution_X_min) + { + printf("Trying sheet resolution X = %d, Y = %d\n", complex_sheet_resolution_X, complex_sheet_resolution_Y); + + ComplexSequentialProblemXY *sequential_problem = new ComplexSequentialProblemXY(); + Search::Options options; + /* + options.cutoff = Search::Cutoff::linear(); + options.nogoods_limit = 16 * 512; + */ + options.stop = Search::Stop::time(10 * 512); + + DFS engine(sequential_problem, options); + delete sequential_problem; + + clock_t begin = clock(); + + ComplexSequentialProblemXY *sequential_P = engine.next(); + + if (sequential_P != NULL) + { + sequential_P->print(); + + clock_t end = clock(); + printf("Time (CPU): %.3fs\n", (end - begin) / (double)CLOCKS_PER_SEC); + + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + printf("SUCCESS\n"); + } + else + { + clock_t end = clock(); + printf("Time (CPU): %.3fs\n", (end - begin) / (double)CLOCKS_PER_SEC); + Search::Statistics stat = engine.statistics(); + printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); + + printf("FAIL\n"); + } + delete sequential_P; + + complex_sheet_resolution_X -= 1; + + } + printf("Testing sheet arrangement 7 ... finished\n"); +} + + + +/*----------------------------------------------------------------*/ + +int main(int UNUSED(argc), char **UNUSED(argv)) +{ +// test_arrangement_1(); +// test_arrangement_2(); +// test_arrangement_3(); +// test_arrangement_4(); +// test_arrangement_5(); +// test_arrangement_6(); + test_arrangement_7(); + + return 0; +} + diff --git a/src/libseqarrange/test/seq_test_arrangement.hpp b/src/libseqarrange/test/seq_test_arrangement.hpp new file mode 100644 index 0000000000..005b778ddd --- /dev/null +++ b/src/libseqarrange/test/seq_test_arrangement.hpp @@ -0,0 +1,44 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_arrangement.hpp + * + * Basic steel sheet object arrangement test via + * Constraint Programming tools. + */ +/*================================================================*/ + +#ifndef __SEQ_TEST_ARRANGEMENT_HPP__ +#define __SEQ_TEST_ARRANGEMENT_HPP__ + +/*----------------------------------------------------------------*/ + +/* Plate arrangment test 1 */ +void test_arrangement_1(void); + +/* Plate arrangment test 2 */ +void test_arrangement_2(void); + +/* Plate arrangment test 3 */ +void test_arrangement_3(void); + +/* Plate arrangment test 4 */ +void test_arrangement_4(void); + +/* Plate arrangment test 5 */ +void test_arrangement_5(void); + +/* Plate arrangment test 6 */ +void test_arrangement_6(void); + +/* Plate arrangment test 7 */ +void test_arrangement_7(void); + + + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_TEST_ARRANGEMENT_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp new file mode 100644 index 0000000000..0118a30eb1 --- /dev/null +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -0,0 +1,413 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_interface.cpp + * + * Tests of the sequential printing interface for Prusa Slic3r + */ +/*================================================================*/ + +#include +#include +#include +#include + +#include "libslic3r/Polygon.hpp" +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/SVG.hpp" + +#include + +#include "seq_interface.hpp" +#include "seq_utilities.hpp" + +#include "seq_test_interface.hpp" + + +/*----------------------------------------------------------------*/ + + +using namespace Sequential; + + +/*----------------------------------------------------------------*/ + +static bool find_and_remove(std::string& src, const std::string& key) +{ + size_t pos = src.find(key); + if (pos != std::string::npos) { + src.erase(pos, key.length()); + return true; + } + return false; +} + +/* +std::vector load_exported_data(const std::string& filename) +{ + std::vector objects_to_print; + + std::ifstream in(filename); + if (!in) + throw std::runtime_error("NO EXPORTED FILE WAS FOUND"); + std::string line; + + while (in) { + std::getline(in, line); + if (find_and_remove(line, "OBJECT_ID")) { + objects_to_print.push_back(ObjectToPrint()); + objects_to_print.back().id = std::stoi(line); + } + if (find_and_remove(line, "TOTAL_HEIGHT")) + objects_to_print.back().total_height = std::stoi(line); + if (find_and_remove(line, "POLYGON_AT_HEIGHT")) + objects_to_print.back().pgns_at_height.emplace_back(std::make_pair(std::stoi(line), Polygon())); + if (find_and_remove(line, "POINT")) { + std::stringstream ss(line); + std::string val; + ss >> val; + Point pt(std::stoi(val), 0); + ss >> val; + pt.y() = std::stoi(val); + objects_to_print.back().pgns_at_height.back().second.append(pt); + } + } + return objects_to_print; +} +*/ + + +void save_import_data(const std::string &filename, + const std::map &scheduled_polygons, + const map &original_index_map, + const vector &poly_positions_X, + const vector &poly_positions_Y) +{ + std::ofstream out(filename); + if (!out) + throw std::runtime_error("CANNOT CREATE IMPORT FILE"); + + for (const auto& scheduled_polygon: scheduled_polygons) + { + coord_t X, Y; + + scaleUp_PositionForSlicer(poly_positions_X[scheduled_polygon.second], + poly_positions_Y[scheduled_polygon.second], + X, + Y); + const auto& original_index = original_index_map.find(scheduled_polygon.second); + +// out << original_index_map[scheduled_polygon.second] << " " << X << " " << Y << endl; + out << original_index->second << " " << X << " " << Y << endl; + } +} + + +/*----------------------------------------------------------------*/ + +void test_interface_1(void) +{ + clock_t start, finish; + + printf("Testing interface 1 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; + + printf("Loading objects ...\n"); + std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + + std::vector scheduled_plates; + printf("Scheduling objects for sequential print ...\n"); + int result = schedule_ObjectsForSequentialPrint(solver_configuration, + objects_to_print, + scheduled_plates); + + if (result == 0) + { + printf("Object scheduling for sequential print SUCCESSFUL !\n"); + + printf("Number of plates: %ld\n", scheduled_plates.size()); + + for (int plate = 0; plate < scheduled_plates.size(); ++plate) + { + printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + + for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) + { + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + } + } + } + else + { + printf("Something went WRONG during sequential scheduling (code: %d)\n", result); + } + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing interface 1 ... finished\n"); +} + + +void test_interface_2(void) +{ + clock_t start, finish; + + printf("Testing interface 2 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; + + printf("Loading objects ...\n"); + std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + + std::vector > convex_unreachable_zones; + std::vector > box_unreachable_zones; + + printf("Preparing extruder unreachable zones ...\n"); + setup_ExtruderUnreachableZones(solver_configuration, convex_unreachable_zones, box_unreachable_zones); + + std::vector scheduled_plates; + printf("Scheduling objects for sequential print ...\n"); + + int result = schedule_ObjectsForSequentialPrint(solver_configuration, + objects_to_print, + convex_unreachable_zones, + box_unreachable_zones, + scheduled_plates); + + if (result == 0) + { + printf("Object scheduling for sequential print SUCCESSFUL !\n"); + + printf("Number of plates: %ld\n", scheduled_plates.size()); + + for (int plate = 0; plate < scheduled_plates.size(); ++plate) + { + printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + + for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) + { + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + } + } + } + else + { + printf("Something went WRONG during sequential scheduling (code: %d)\n", result); + } + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing interface 2 ... finished\n"); +} + + +void test_interface_3(void) +{ + clock_t start, finish; + + printf("Testing interface 3 ...\n"); + + start = clock(); + + PrinterGeometry printer_geometry; + if (load_printer_geometry("printer_geometry.mk4.txt", printer_geometry) != 0) + { + printf("Printer geometry load error.\n"); + return; + } + + printf("x_size: %d\n", printer_geometry.x_size); + printf("y_size: %d\n", printer_geometry.y_size); + + for (const auto& convex_height: printer_geometry.convex_heights) + { + cout << "convex_height:" << convex_height << endl; + } + + for (const auto& box_height: printer_geometry.box_heights) + { + cout << "box_height:" << box_height << endl; + } + + printf("extruder slices:\n"); + + for (std::map >::const_iterator extruder_slice = printer_geometry.extruder_slices.begin(); extruder_slice != printer_geometry.extruder_slices.end(); ++extruder_slice) + { + for (const auto &polygon: extruder_slice->second) + { + printf(" polygon height: %d\n", extruder_slice->first); + + for (const auto &point: polygon.points) + { + cout << " " << point.x() << " " << point.y() << endl; + } + } + } + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing interface 3 ... finished\n"); +} + + +int test_interface_4(void) +{ + clock_t start, finish; + + printf("Testing interface 4 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; + solver_configuration.object_group_size = 4; + + printf("Loading objects ...\n"); + std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + printf("Loading objects ... finished\n"); + + PrinterGeometry printer_geometry; + + printf("Loading printer geometry ...\n"); + int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); + + if (result != 0) + { + printf("Cannot load printer geometry (code: %d).\n", result); + return result; + } + solver_configuration.setup(printer_geometry); + printf("Loading printer geometry ... finished\n"); + + std::vector scheduled_plates; + printf("Scheduling objects for sequential print ...\n"); + + scheduled_plates = schedule_ObjectsForSequentialPrint(solver_configuration, + printer_geometry, + objects_to_print); + + printf("Object scheduling for sequential print SUCCESSFUL !\n"); + + printf("Number of plates: %ld\n", scheduled_plates.size()); + + for (int plate = 0; plate < scheduled_plates.size(); ++plate) + { + printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + + for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) + { + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + } + } + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing interface 4 ... finished\n"); + + return 0; +} + + +int test_interface_5(void) +{ + clock_t start, finish; + + printf("Testing interface 5 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; + solver_configuration.object_group_size = 4; + + printf("Loading objects ...\n"); + std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + printf("Loading objects ... finished\n"); + + PrinterGeometry printer_geometry; + + printf("Loading printer geometry ...\n"); + int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); + + if (result != 0) + { + printf("Cannot load printer geometry (code: %d).\n", result); + return result; + } + solver_configuration.setup(printer_geometry); + printf("Loading printer geometry ... finished\n"); + + std::vector scheduled_plates; + printf("Scheduling objects for sequential print ...\n"); + + scheduled_plates = schedule_ObjectsForSequentialPrint(solver_configuration, + printer_geometry, + objects_to_print); + + printf("Object scheduling for sequential print SUCCESSFUL !\n"); + + printf("Number of plates: %ld\n", scheduled_plates.size()); + + for (int plate = 0; plate < scheduled_plates.size(); ++plate) + { + printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + + for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) + { + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + } + } + + finish = clock(); + printf("Solving time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + + start = clock(); + + printf("Checking sequential printability ...\n"); + + bool printable = check_ScheduledObjectsForSequentialPrintability(solver_configuration, + printer_geometry, + objects_to_print, + scheduled_plates); + + printf(" Scheduled/arranged objects are sequentially printable: %s\n", (printable ? "YES" : "NO")); + + printf("Checking sequential printability ... finished\n"); + + finish = clock(); + printf("Checking time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + + printf("Testing interface 5 ... finished\n"); + + return 0; +} + + +/*----------------------------------------------------------------*/ + +int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) +{ +// test_interface_1(); +// test_interface_2(); +// test_interface_3(); +// test_interface_4(); + test_interface_5(); + + return 0; +} + + diff --git a/src/libseqarrange/test/seq_test_interface.hpp b/src/libseqarrange/test/seq_test_interface.hpp new file mode 100644 index 0000000000..de92e28f01 --- /dev/null +++ b/src/libseqarrange/test/seq_test_interface.hpp @@ -0,0 +1,35 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_interface.hpp + * + * Tests of the sequential printing interface for Prusa Slic3r + */ +/*================================================================*/ + +#ifndef __SEQ_TEST_INTERFACE_HPP__ +#define __SEQ_TEST_INTERFACE_HPP__ + +/*----------------------------------------------------------------*/ + +/* Interface test 1 */ +void test_interface_1(void); + +/* Interface test 2 */ +void test_interface_2(void); + +/* Interface test 3 */ +void test_interface_3(void); + +/* Interface test 4 */ +int test_interface_4(void); + +/* Interface test 5 */ +int test_interface_5(void); + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_TEST_PREPROCESS_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_polygon.cpp b/src/libseqarrange/test/seq_test_polygon.cpp new file mode 100644 index 0000000000..e8852d2696 --- /dev/null +++ b/src/libseqarrange/test/seq_test_polygon.cpp @@ -0,0 +1,3054 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_polygon.cpp + * + * Basic polygon tests. + */ +/*================================================================*/ + +#include +#include +#include + +#include +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/SVG.hpp" + +#include + +#include "prusaparts.hpp" + +#include "seq_defs.hpp" + +#include "seq_sequential.hpp" +#include "seq_preprocess.hpp" + +#include "seq_test_polygon.hpp" + + +/*----------------------------------------------------------------*/ + +using namespace Slic3r; +using namespace Slic3r::Geometry; + +using namespace z3; + +using namespace Sequential; + +#define SCALE_FACTOR 100000 + + +/*----------------------------------------------------------------*/ + + +void test_polygon_1(void) +{ + printf("Testing polygon 1 ...\n"); + + Polygon polygon_1 = {{-1000000, -1000000}, {1000000, -1000000}, {1000000, 1000000}, {-1000000, 1000000} }; + + for (int i = 0; i < polygon_1.size(); ++i) + { + Point point = polygon_1[i]; + printf("%d,%d\n", point.x(), point.y()); + } + + printf("Testing polygon 1 ... finished\n"); +} + + +void test_polygon_2(void) +{ + printf("Testing polygon 2 ...\n"); + + for (int k = 0; k < PRUSA_PART_POLYGONS.size(); ++k) + { + printf("k = %d\n", k); + + const Polygon &polygon_1 = PRUSA_PART_POLYGONS[k]; + Polygon hull_1 = convex_hull(polygon_1); + + for (int i = 0; i < polygon_1.size(); ++i) + { + const Point &point = polygon_1[i]; + printf("poly %d: %d,%d\n", i, point.x(), point.y()); + } + printf("\n"); + + for (int i = 0; i < hull_1.size(); ++i) + { + const Point &point = hull_1[i]; + printf("hull %d: %d,%d\n", i, point.x(), point.y()); + } + + if (hull_1.size() >= 2) + { + const Point &point_1 = hull_1[0]; + const Point &point_2 = hull_1[1]; + + Point v = (point_2 - point_1); //.normalized(); + printf("v: %d,%d\n", v.x(), v.y()); + cout << v << endl; + + Point u = v.normalized(); + printf("u: %d,%d\n", u.x(), u.y()); + cout << u << endl; + + printf("Ortho:\n"); + Point n(v.y(), -v.x()); + cout << n << endl; + + coord_t d = n.x() * point_1.x() + n.y() * point_1.y(); + printf("%d\n", d); + cout << d << endl; + + auto is_inside=[&](const Point &p) + { + coord_t d1 = n.x() * p.x() + n.y() * p.y() - d; + printf("d1: %d\n", d1); + + if (d1 >= 0) + { + return true; + } + else + { + return false; + } + }; + + bool ins1 = is_inside(point_1); + printf("%s\n", ins1 ? "yes" : "no"); + bool ins2 = is_inside(point_2); + printf("%s\n", ins2 ? "yes" : "no"); + bool ins3 = is_inside(point_1 + point_2); + printf("%s\n", ins3 ? "yes" : "no"); + bool ins4 = is_inside(point_1 - point_2); + printf("%s\n", ins4 ? "yes" : "no"); + } + + getchar(); + } + + printf("Testing polygon 2 ... finished\n"); +} + + +int line_count = 4; +Line lines[] = {{Point(100,100), Point(200,200)}, {Point(200,100), Point(100,200)}, {Point(0,0), Point(100,10)}, {Point(50,0), Point(60,100)} }; + +void test_polygon_3(void) +{ + clock_t start, finish; + + printf("Testing polygon 3 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T_parameters(z_context); + + for (int i = 0; i < line_count; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < line_count; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < line_count; ++i) + { + string name = "t_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + introduce_LineNonIntersection_explicit(z_solver, + z_context, + X_positions[0], + Y_positions[0], + T_parameters[0], + lines[0], + X_positions[1], + Y_positions[1], + T_parameters[1], + lines[1]); + + introduce_LineNonIntersection_explicit(z_solver, + z_context, + X_positions[2], + Y_positions[2], + T_parameters[2], + lines[2], + X_positions[3], + Y_positions[3], + T_parameters[3], + lines[3]); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + return; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + finish = clock(); + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + + printf("value: %.3f\n", value); + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 3 ... finished\n"); +} + + +void test_polygon_4(void) +{ + clock_t start, finish; + + printf("Testing polygon 4 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T_parameters(z_context); + + for (int i = 0; i < line_count; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < line_count; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < line_count; ++i) + { + string name = "t_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + introduce_LineNonIntersection_implicit(z_solver, + z_context, + X_positions[0], + Y_positions[0], + T_parameters[0], + lines[0], + X_positions[1], + Y_positions[1], + T_parameters[1], + lines[1]); + + introduce_LineNonIntersection_implicit(z_solver, + z_context, + X_positions[2], + Y_positions[2], + T_parameters[2], + lines[2], + X_positions[3], + Y_positions[3], + T_parameters[3], + lines[3]); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + return; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + finish = clock(); + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + + printf("value: %.3f\n", value); + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 4 ... finished\n"); +} + + +int poly_line_count = 4; +Line poly_lines[] = {{Point(100,100), Point(200,100)}, {Point(200,100), Point(200,200)}, {Point(200,200), Point(100,200)}, {Point(100,200), Point(100,100)} }; + + +void test_polygon_5(void) +{ + clock_t start, finish; + + printf("Testing polygon 5 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + + for (int i = 0; i < poly_line_count; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < poly_line_count; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + introduce_PointInsideHalfPlane(z_solver, + X_positions[0], + Y_positions[0], + X_positions[1], + Y_positions[1], + poly_lines[0]); + + introduce_PointInsideHalfPlane(z_solver, + X_positions[0], + Y_positions[0], + X_positions[1], + Y_positions[1], + poly_lines[1]); + + introduce_PointInsideHalfPlane(z_solver, + X_positions[0], + Y_positions[0], + X_positions[1], + Y_positions[1], + poly_lines[2]); + + introduce_PointInsideHalfPlane(z_solver, + X_positions[0], + Y_positions[0], + X_positions[1], + Y_positions[1], + poly_lines[3]); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + return; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + finish = clock(); + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + + printf("value: %.3f\n", value); + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 5 ... finished\n"); +} + + +Polygon polygon_1 = {{0, 0}, {50, 0}, {50, 50}, {0, 50}}; +//Polygon polygon_1 = {{scale_(0), scale_(0)}, {scale_(50), scale_(0)}, {scale_(50), scale_(50)}, {scale_(0), scale_(50)}}; + + +void test_polygon_6(void) +{ + clock_t start, finish; + + printf("Testing polygon 6 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + + for (int i = 0; i < poly_line_count; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < poly_line_count; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + introduce_PointOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + X_positions[1], + Y_positions[1], + polygon_1); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + return; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + finish = clock(); + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + + z3::expr valo_1 = z_model.get_const_interp(z_model[i]); + z3::expr deco_1 = expr(z_context.real_const("deco_1")); + + z3::expr lino_1 = (valo_1 * deco_1 == 0); + + printf("value: %.3f\n", value); + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 6 ... finished\n"); +} + + +Polygon polygon_2 = {{0, 0}, {150, 0}, {150, 50}, {75, 120}, {0, 50} }; +//Polygon polygon_2 = {{scale_(0), scale_(0)}, {scale_(150), scale_(0)}, {scale_(150), scale_(50)}, {scale_(75), scale_(120)}, {scale_(0), scale_(50)} }; + + +void test_polygon_7(void) +{ + clock_t start, finish; + + printf("Testing polygon 7 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T1_parameters(z_context); + z3::expr_vector T2_parameters(z_context); + + for (int i = 0; i < 2; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < 2; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_1.points.size(); ++i) + { + string name = "t1_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_2.points.size(); ++i) + { + string name = "t2_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); + introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[1], + Y_positions[1], + polygon_2); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + return; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + finish = clock(); + + double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y; + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + + printf("Positions: %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y); + + /* + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); + + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } + */ + + SVG preview_svg("polygon_test_7.svg"); + +// preview_svg.draw(polygon_1); +// preview_svg.draw(polygon_2); + + preview_svg.Close(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 7 ... finished\n"); +} + + +Polygon scale_UP(const Polygon &polygon) +{ + Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); + } + + return poly; +} + + +Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) +{ + Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); + } + + return poly; +} + + +Polygon polygon_3 = {{40, 0}, {80, 40}, {40, 80}, {0, 40}}; +//Polygon polygon_3 = {{20, 0}, {40, 0}, {60, 30}, {30, 50}, {0, 30}}; + +void test_polygon_8(void) +{ + clock_t start, finish; + + printf("Testing polygon 8 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T1_parameters(z_context); + z3::expr_vector T2_parameters(z_context); + z3::expr_vector T3_parameters(z_context); + + for (int i = 0; i < 3; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < 3; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_1.points.size(); ++i) + { + string name = "t1_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_2.points.size(); ++i) + { + string name = "t2_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_3.points.size(); ++i) + { + string name = "t3_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + /* + introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); + introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); + */ + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[1], + Y_positions[1], + polygon_2); + + /* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygon_2, + X_positions[0], + Y_positions[0], + polygon_1); + */ + + introduce_PolygonLineNonIntersection(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[1], + Y_positions[1], + polygon_2); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygon_2, + X_positions[2], + Y_positions[2], + polygon_3); + + /* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[2], + Y_positions[2], + polygon_3, + X_positions[1], + Y_positions[1], + polygon_2); + */ + + introduce_PolygonLineNonIntersection(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygon_2, + X_positions[2], + Y_positions[2], + polygon_3); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[2], + Y_positions[2], + polygon_3); + +/* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[2], + Y_positions[2], + polygon_3, + X_positions[0], + Y_positions[0], + polygon_1); +*/ + + introduce_PolygonLineNonIntersection(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[2], + Y_positions[2], + polygon_3); + + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + int last_solvable_decision_box_size = -1; + double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y; + + for (int decision_box_size = 300; decision_box_size > 10; decision_box_size -= 4) + { + z3::expr_vector decision_box_assumptions(z_context); + + assume_DecisionBox(X_positions[0], Y_positions[0], decision_box_size, decision_box_size, decision_box_assumptions); + assume_DecisionBox(X_positions[1], Y_positions[1], decision_box_size, decision_box_size, decision_box_assumptions); + assume_DecisionBox(X_positions[2], Y_positions[2], decision_box_size, decision_box_size, decision_box_assumptions); + + bool sat = false; + + switch (z_solver.check(decision_box_assumptions)) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + last_solvable_decision_box_size = decision_box_size; + sat = true; + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + sat = false; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = value; + } + } + } + else + { + break; + } + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + finish = clock(); + + printf("Solvable decision box: %d\n", last_solvable_decision_box_size); + printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y); + + /* + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); + + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } + */ + + SVG preview_svg("polygon_test_8.svg"); + + Polygon display_polygon_1 = scale_UP(polygon_1, poly_1_pos_x, poly_1_pos_y); + Polygon display_polygon_2 = scale_UP(polygon_2, poly_2_pos_x, poly_2_pos_y); + Polygon display_polygon_3 = scale_UP(polygon_3, poly_3_pos_x, poly_3_pos_y); + + preview_svg.draw(display_polygon_1, "green"); + preview_svg.draw(display_polygon_2, "blue"); + preview_svg.draw(display_polygon_3, "red"); + + preview_svg.Close(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 8 ... finished\n"); +} + + +void test_polygon_9(void) +{ + clock_t start, finish; + + printf("Testing polygon 9 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T1_parameters(z_context); + z3::expr_vector T2_parameters(z_context); + z3::expr_vector T3_parameters(z_context); + + for (int i = 0; i < 3; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < 3; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_1.points.size(); ++i) + { + string name = "t1_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_2.points.size(); ++i) + { + string name = "t2_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_3.points.size(); ++i) + { + string name = "t3_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + /* + introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); + introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); + */ + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[1], + Y_positions[1], + polygon_2); +/* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygon_2, + X_positions[0], + Y_positions[0], + polygon_1); +*/ + + introduce_PolygonLineNonIntersection(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[1], + Y_positions[1], + polygon_2); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygon_2, + X_positions[2], + Y_positions[2], + polygon_3); +/* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[2], + Y_positions[2], + polygon_3, + X_positions[1], + Y_positions[1], + polygon_2); +*/ + introduce_PolygonLineNonIntersection(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygon_2, + X_positions[2], + Y_positions[2], + polygon_3); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[2], + Y_positions[2], + polygon_3); +/* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[2], + Y_positions[2], + polygon_3, + X_positions[0], + Y_positions[0], + polygon_1); +*/ + + introduce_PolygonLineNonIntersection(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygon_1, + X_positions[2], + Y_positions[2], + polygon_3); + + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + int last_solvable_bounding_box_size = -1; + double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y; + + for (int bounding_box_size = 300; bounding_box_size > 10; bounding_box_size -= 4) + { + z3::expr_vector bounding_box_assumptions(z_context); + + assume_BedBoundingBox(X_positions[0], Y_positions[0], polygon_1, bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[1], Y_positions[1], polygon_2, bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[2], Y_positions[2], polygon_3, bounding_box_size, bounding_box_size, bounding_box_assumptions); + + bool sat = false; + + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + last_solvable_bounding_box_size = bounding_box_size; + sat = true; + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + sat = false; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = value; + } + } + } + else + { + break; + } + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + finish = clock(); + + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); + printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y); + + /* + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); + + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } + */ + + SVG preview_svg("polygon_test_9.svg"); + + Polygon display_polygon_1 = scale_UP(polygon_1, poly_1_pos_x, poly_1_pos_y); + Polygon display_polygon_2 = scale_UP(polygon_2, poly_2_pos_x, poly_2_pos_y); + Polygon display_polygon_3 = scale_UP(polygon_3, poly_3_pos_x, poly_3_pos_y); + + preview_svg.draw(display_polygon_1, "green"); + preview_svg.draw(display_polygon_2, "blue"); + preview_svg.draw(display_polygon_3, "red"); + + preview_svg.Close(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 9 ... finished\n"); +} + + +Polygon polygon_4 = {{20, 0}, {40, 0}, {60, 30}, {30, 50}, {0, 30}}; + +void test_polygon_10(void) +{ + clock_t start, finish; + + printf("Testing polygon 10 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T1_parameters(z_context); + z3::expr_vector T2_parameters(z_context); + z3::expr_vector T3_parameters(z_context); + z3::expr_vector T4_parameters(z_context); + + for (int i = 0; i < 4; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < 4; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_1.points.size(); ++i) + { + string name = "t1_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_2.points.size(); ++i) + { + string name = "t2_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_3.points.size(); ++i) + { + string name = "t3_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_4.points.size(); ++i) + { + string name = "t4_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T4_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + vector polygons; + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + /* + introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); + introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); + */ + + /* + for (int i = 0; i < 3; ++i) + { + for (int j = i + 1; j < 4; ++j) + { + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[i], + Y_positions[i], + polygons[i], + X_positions[j], + Y_positions[j], + polygons[j]); + } + } + */ + +/* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygons[0], + X_positions[2], + Y_positions[2], + polygons[2]); + + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygons[0], + X_positions[1], + Y_positions[1], + polygons[1]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygons[0], + X_positions[3], + Y_positions[3], + polygons[3]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygons[1], + X_positions[3], + Y_positions[3], + polygons[3]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygons[1], + X_positions[2], + Y_positions[2], + polygons[2]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[2], + Y_positions[2], + polygons[2], + X_positions[3], + Y_positions[3], + polygons[3]); +*/ + +/* + introduce_PolygonWeakNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + polygons); +*/ + introduce_PolygonStrongNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + polygons); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + int last_solvable_bounding_box_size = -1; + double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; + + for (int bounding_box_size = 300; bounding_box_size > 10; bounding_box_size -= 4) + { + z3::expr_vector bounding_box_assumptions(z_context); + + //assume_BedBoundingBox(X_positions, Y_positions, polygons, bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[0], Y_positions[0], polygons[0], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[1], Y_positions[1], polygons[1], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[2], Y_positions[2], polygons[2], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[3], Y_positions[3], polygons[3], bounding_box_size, bounding_box_size, bounding_box_assumptions); + + bool sat = false; + + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + last_solvable_bounding_box_size = bounding_box_size; + sat = true; + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + sat = false; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-3") + { + poly_4_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-3") + { + poly_4_pos_y = value; + } + } + } + else + { + break; + } + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + finish = clock(); + + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); + printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, + poly_1_pos_y, + poly_2_pos_x, + poly_2_pos_y, + poly_3_pos_x, + poly_3_pos_y, + poly_4_pos_x, + poly_4_pos_y); + + /* + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); + + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } + */ + + SVG preview_svg("polygon_test_10.svg"); + + Polygon display_polygon_1 = scale_UP(polygons[0], poly_1_pos_x, poly_1_pos_y); + Polygon display_polygon_2 = scale_UP(polygons[1], poly_2_pos_x, poly_2_pos_y); + Polygon display_polygon_3 = scale_UP(polygons[2], poly_3_pos_x, poly_3_pos_y); + Polygon display_polygon_4 = scale_UP(polygons[3], poly_4_pos_x, poly_4_pos_y); + + preview_svg.draw(display_polygon_1, "green"); + preview_svg.draw(display_polygon_2, "blue"); + preview_svg.draw(display_polygon_3, "red"); + preview_svg.draw(display_polygon_4, "grey"); + + preview_svg.Close(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 10 ... finished\n"); +} + + +void test_polygon_11(void) +{ + clock_t start, finish; + + printf("Testing polygon 11 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T1_parameters(z_context); + z3::expr_vector T2_parameters(z_context); + z3::expr_vector T3_parameters(z_context); + z3::expr_vector T4_parameters(z_context); + + for (int i = 0; i < 4; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < 4; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_1.points.size(); ++i) + { + string name = "t1_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_2.points.size(); ++i) + { + string name = "t2_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_3.points.size(); ++i) + { + string name = "t3_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_4.points.size(); ++i) + { + string name = "t4_par-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T4_parameters.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + vector polygons; + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + /* + introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); + introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); + */ + + /* + for (int i = 0; i < 3; ++i) + { + for (int j = i + 1; j < 4; ++j) + { + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[i], + Y_positions[i], + polygons[i], + X_positions[j], + Y_positions[j], + polygons[j]); + } + } + */ + +/* + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygons[0], + X_positions[2], + Y_positions[2], + polygons[2]); + + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygons[0], + X_positions[1], + Y_positions[1], + polygons[1]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[0], + Y_positions[0], + polygons[0], + X_positions[3], + Y_positions[3], + polygons[3]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygons[1], + X_positions[3], + Y_positions[3], + polygons[3]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[1], + Y_positions[1], + polygons[1], + X_positions[2], + Y_positions[2], + polygons[2]); + + introduce_PolygonOutsidePolygon(z_solver, + z_context, + X_positions[2], + Y_positions[2], + polygons[2], + X_positions[3], + Y_positions[3], + polygons[3]); +*/ + + introduce_PolygonWeakNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + polygons); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + int last_solvable_bounding_box_size = -1; + double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; + + for (int bounding_box_size = 200; bounding_box_size > 10; bounding_box_size -= 4) + { + printf("BB: %d\n", bounding_box_size); + z3::expr_vector bounding_box_assumptions(z_context); + + //assume_BedBoundingBox(X_positions, Y_positions, polygons, bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[0], Y_positions[0], polygons[0], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[1], Y_positions[1], polygons[1], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[2], Y_positions[2], polygons[2], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[3], Y_positions[3], polygons[3], bounding_box_size, bounding_box_size, bounding_box_assumptions); + + bool sat = false; + + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + sat = true; + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + sat = false; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-3") + { + poly_4_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-3") + { + poly_4_pos_y = value; + } + } + + printf("preRefined positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, + poly_1_pos_y, + poly_2_pos_x, + poly_2_pos_y, + poly_3_pos_x, + poly_3_pos_y, + poly_4_pos_x, + poly_4_pos_y); + + while (true) + { + vector dec_values_X; + dec_values_X.push_back(poly_1_pos_x); + dec_values_X.push_back(poly_2_pos_x); + dec_values_X.push_back(poly_3_pos_x); + dec_values_X.push_back(poly_4_pos_x); + + vector dec_values_Y; + dec_values_Y.push_back(poly_1_pos_y); + dec_values_Y.push_back(poly_2_pos_y); + dec_values_Y.push_back(poly_3_pos_y); + dec_values_Y.push_back(poly_4_pos_y); + + bool refined = refine_PolygonWeakNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + dec_values_X, + dec_values_Y, + polygons); + + bool refined_sat = false; + + if (refined) + { + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" sat\n"); + refined_sat = true; + break; + } + case z3::unsat: + { + printf(" unsat\n"); + refined_sat = false; + break; + } + case z3::unknown: + { + printf(" unknown\n"); + break; + } + default: + { + break; + } + } + + if (refined_sat) + { + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + for (int i = 0; i < z_model.size(); ++i) + { + //printf("Variable:%s ", z_model[i].name().str().c_str()); + double value = z_model.get_const_interp(z_model[i]).as_double(); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-3") + { + poly_4_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-3") + { + poly_4_pos_y = value; + } + } + printf("Refined positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, + poly_1_pos_y, + poly_2_pos_x, + poly_2_pos_y, + poly_3_pos_x, + poly_3_pos_y, + poly_4_pos_x, + poly_4_pos_y); + } + else + { + break; + } + } + else + { + last_solvable_bounding_box_size = bounding_box_size; + break; + } + } + } + else + { + break; + } + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + finish = clock(); + + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); + printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, + poly_1_pos_y, + poly_2_pos_x, + poly_2_pos_y, + poly_3_pos_x, + poly_3_pos_y, + poly_4_pos_x, + poly_4_pos_y); + + /* + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); + + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } + */ + + SVG preview_svg("polygon_test_11.svg"); + + Polygon display_polygon_1 = scale_UP(polygons[0], poly_1_pos_x, poly_1_pos_y); + Polygon display_polygon_2 = scale_UP(polygons[1], poly_2_pos_x, poly_2_pos_y); + Polygon display_polygon_3 = scale_UP(polygons[2], poly_3_pos_x, poly_3_pos_y); + Polygon display_polygon_4 = scale_UP(polygons[3], poly_4_pos_x, poly_4_pos_y); + + preview_svg.draw(display_polygon_1, "green"); + preview_svg.draw(display_polygon_2, "blue"); + preview_svg.draw(display_polygon_3, "red"); + preview_svg.draw(display_polygon_4, "grey"); + + preview_svg.Close(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 11 ... finished\n"); +} + + +void test_polygon_12(void) +{ + clock_t start, finish; + + printf("Testing polygon 12 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + + std::vector X_values; + std::vector Y_values; + + string_map dec_var_names_map; + + z3::solver z_solver(z_context); + + vector polygons; + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + build_WeakPolygonNonoverlapping(z_solver, z_context, polygons, X_positions, Y_positions, X_values, Y_values, dec_var_names_map); + + bool optimized = optimize_WeakPolygonNonoverlapping(z_solver, + z_context, + solver_configuration, + X_positions, + Y_positions, + X_values, + Y_values, + dec_var_names_map, + polygons); + + finish = clock(); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < polygons.size(); ++i) + { + printf(" %.3f, %.3f\n", X_values[i], Y_values[i]); + } + + SVG preview_svg("polygon_test_12.svg"); + + for (int i = 0; i < polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[i], X_values[i], Y_values[i]); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 12 ... finished\n"); +} + + +void test_polygon_13(void) +{ + clock_t start, finish; + + printf("Testing polygon 13 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + + std::vector X_values; + std::vector Y_values; + + string_map dec_var_names_map; + + /* + z3::params z_parameters(z_context); + z_parameters.set("timeout", 1000); + */ + Z3_global_param_set("timeout", "8000"); + + z3::solver z_solver(z_context); + + vector polygons; + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + build_WeakPolygonNonoverlapping(z_solver, z_context, polygons, X_positions, Y_positions, X_values, Y_values, dec_var_names_map); + + bool optimized = optimize_WeakPolygonNonoverlapping(z_solver, + z_context, + solver_configuration, + X_positions, + Y_positions, + X_values, + Y_values, + dec_var_names_map, + polygons); + + finish = clock(); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < polygons.size(); ++i) + { + printf(" %.3f, %.3f\n", X_values[i], Y_values[i]); + } + + SVG preview_svg("polygon_test_13.svg"); + + for (int i = 0; i < polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[i], X_values[i], Y_values[i]); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 13 ... finished\n"); +} + + +void test_polygon_14(void) +{ + clock_t start, finish; + + printf("Testing polygon 14 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + vector polygons; + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + vector decided; + vector undecided; + + vector poly_positions_X; + vector poly_positions_Y; + poly_positions_X.resize(polygons.size()); + poly_positions_Y.resize(polygons.size()); + + bool optimized; + { + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + + vector X_values; + vector Y_values; + + string_map dec_var_names_map; + + /* + Z3_global_param_set("timeout", "8000"); + */ + + z3::solver z_solver(z_context); + + X_values.resize(polygons.size()); + Y_values.resize(polygons.size()); + + undecided.push_back(0); + undecided.push_back(1); + undecided.push_back(2); + undecided.push_back(3); + + build_WeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + X_positions, + Y_positions, + X_values, + Y_values, + decided, + undecided, + dec_var_names_map); + + optimized = optimize_WeakPolygonNonoverlapping(z_solver, + z_context, + solver_configuration, + X_positions, + Y_positions, + X_values, + Y_values, + decided, + undecided, + dec_var_names_map, + polygons); + + for (int i = 0; i < undecided.size(); ++i) + { + poly_positions_X[undecided[i]] = X_values[undecided[i]]; + poly_positions_Y[undecided[i]] = Y_values[undecided[i]]; + } + + printf("Optimized 1: %d\n", optimized); + } + + { + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + + vector X_values; + vector Y_values; + + string_map dec_var_names_map; + + z3::solver z_solver(z_context); + + X_values.resize(polygons.size()); + Y_values.resize(polygons.size()); + + decided.push_back(0); + decided.push_back(1); + decided.push_back(2); + decided.push_back(3); + + for (int i = 0; i < decided.size(); ++i) + { + X_values[decided[i]] = poly_positions_X[decided[i]]; + Y_values[decided[i]] = poly_positions_Y[decided[i]]; + } + + undecided.clear(); + undecided.push_back(4); + undecided.push_back(5); + undecided.push_back(6); + undecided.push_back(7); + + build_WeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + X_positions, + Y_positions, + X_values, + Y_values, + decided, + undecided, + dec_var_names_map); + + optimized = optimize_WeakPolygonNonoverlapping(z_solver, + z_context, + solver_configuration, + X_positions, + Y_positions, + X_values, + Y_values, + decided, + undecided, + dec_var_names_map, + polygons); + printf("Optimized 2: %d\n", optimized); + + decided.push_back(4); + decided.push_back(5); + decided.push_back(6); + decided.push_back(7); + + finish = clock(); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided.size(); ++i) + { + printf(" %.3f, %.3f\n", X_values[decided[i]].as_double(), Y_values[decided[i]].as_double()); + } + + SVG preview_svg("polygon_test_14.svg"); + + for (int i = 0; i < decided.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[decided[i]], X_values[decided[i]].as_double(), Y_values[decided[i]].as_double()); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 14 ... finished\n"); +} + + +void test_polygon_15(void) +{ + clock_t start, finish; + + printf("Testing polygon 15 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + vector polygons; + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + + /* + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + */ + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + + /* + poly_positions_X.resize(polygons.size()); + poly_positions_Y.resize(polygons.size()); + */ + + do + { + decided_polygons.clear(); + remaining_polygons.clear(); + + bool optimized = optimize_SubglobalPolygonNonoverlapping(solver_configuration, + poly_positions_X, + poly_positions_Y, + polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" %.3f, %.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" %d\n", remaining_polygons[i]); + } + + SVG preview_svg("polygon_test_15.svg"); + + for (int i = 0; i < decided_polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + getchar(); + + vector next_polygons; + + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + } + + polygon_index_map = remaining_polygons; + polygons.clear(); + polygons = next_polygons; + } + while (!remaining_polygons.empty()); + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 15 ... finished\n"); +} + + +void test_polygon_16(void) +{ + clock_t start, finish; + + printf("Testing polygon 16 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + vector polygons; + + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + double area = calc_PolygonUnreachableZoneArea(polygon_1, polygons); + printf("Polygons area: %.3f\n", area); + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing polygon 16 ... finished\n"); +} + + +/*----------------------------------------------------------------*/ + +int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) +{ + //test_polygon_1(); + //test_polygon_2(); + //test_polygon_3(); + //test_polygon_4(); + //test_polygon_5(); + //test_polygon_6(); + //test_polygon_7(); + //test_polygon_8(); + //test_polygon_9(); + //test_polygon_10(); + //test_polygon_11(); + //test_polygon_12(); + //test_polygon_13(); + //test_polygon_14(); + //test_polygon_15(); + test_polygon_16(); + + return 0; +} + diff --git a/src/libseqarrange/test/seq_test_polygon.hpp b/src/libseqarrange/test/seq_test_polygon.hpp new file mode 100644 index 0000000000..4f77968ade --- /dev/null +++ b/src/libseqarrange/test/seq_test_polygon.hpp @@ -0,0 +1,67 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_polygon.hpp + * + * Basic polygon tests. + */ +/*================================================================*/ + +#ifndef __SEQ_TEST_POLYGON_HPP__ +#define __SEQ_TEST_POLYGON_HPP__ + +/*----------------------------------------------------------------*/ + +/* Polygon test 1 */ +void test_polygon_1(void); + +/* Polygon test 2 */ +void test_polygon_2(void); + +/* Polygon test 3 */ +void test_polygon_3(void); + +/* Polygon test 4 */ +void test_polygon_4(void); + +/* Polygon test 5 */ +void test_polygon_5(void); + +/* Polygon test 6 */ +void test_polygon_6(void); + +/* Polygon test 7 */ +void test_polygon_7(void); + +/* Polygon test 8 */ +void test_polygon_8(void); + +/* Polygon test 9 */ +void test_polygon_9(void); + +/* Polygon test 10 */ +void test_polygon_10(void); + +/* Polygon test 11 */ +void test_polygon_11(void); + +/* Polygon test 12 */ +void test_polygon_12(void); + +/* Polygon test 13 */ +void test_polygon_13(void); + +/* Polygon test 14 */ +void test_polygon_14(void); + +/* Polygon test 15 */ +void test_polygon_15(void); + +/* Polygon test 16 */ +void test_polygon_16(void); + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_TEST_POLYGON_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp new file mode 100644 index 0000000000..899e8079fe --- /dev/null +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -0,0 +1,1134 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_preprocess.cpp + * + * Object preprocessing preprocess priting via SMT. + */ +/*================================================================*/ + + +#include +#include +#include +#include + +#include +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/SVG.hpp" + +#include + +#include "prusaparts.hpp" + +#include "seq_defs.hpp" + +#include "seq_sequential.hpp" +#include "seq_preprocess.hpp" + +#include "seq_test_sequential.hpp" + + +/*----------------------------------------------------------------*/ + +using namespace z3; + +using namespace Slic3r; +using namespace Slic3r::Geometry; + +using namespace Sequential; + + +#define SCALE_FACTOR 50000.0 + +/*----------------------------------------------------------------*/ + + +Polygon scale_UP(const Polygon &polygon) +{ + Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); + } + + return poly; +} + + +Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) +{ + Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, + poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); + } + + return poly; +} + + +std::vector test_polygons; + +void test_preprocess_1(void) +{ + clock_t start, finish; + + printf("Testing preprocessing 1 ...\n"); + + SolverConfiguration solver_configuration; + + start = clock(); + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + { + Polygon scale_down_polygon; + scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); + test_polygons.push_back(scale_down_polygon); + } + + for (int i = 0; i < test_polygons.size(); ++i) + { + SVG preview_svg("preprocess_test_1.svg"); + Polygon display_polygon = scale_UP(test_polygons[i], 1000, 1000); + preview_svg.draw(display_polygon, "blue"); + preview_svg.Close(); + getchar(); + } + + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing preprocessing 1 ... finished\n"); +} + + +void test_preprocess_2(void) +{ + clock_t start, finish; + + printf("Testing preprocess 2 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + vector polygons; + vector unreachable_polygons; + + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + { + Polygon scale_down_polygon; + scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); + scale_down_polygon.make_counter_clockwise(); + polygons.push_back(scale_down_polygon); + unreachable_polygons.push_back(scale_down_polygon); + } + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + do + { + decided_polygons.clear(); + remaining_polygons.clear(); + + bool optimized = optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + printf("----> Optimization finished <----\n"); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" %d\n", remaining_polygons[i]); + } + + SVG preview_svg("preprocess_test_2.svg"); + + if (!unreachable_polygons.empty()) + { + for (int i = 0; i < decided_polygons.size(); ++i) + { + /* + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } + */ +// for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + { + /* + for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + { + printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + } + */ + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + preview_svg.draw(display_unreachable_polygon, "lightgrey"); + } + } + } + + for (int i = 0; i < decided_polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + finish = clock(); + printf("Intermediate time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + getchar(); + + vector next_polygons; + vector next_unreachable_polygons; + + for (int i = 0; i < polygon_index_map.size(); ++i) + { + printf(" %d\n", polygon_index_map[i]); + } + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + } + while (!remaining_polygons.empty()); + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing preprocess 2 ... finished\n"); +} + + +void test_preprocess_3(void) +{ + clock_t start, finish; + + SolverConfiguration solver_configuration; + printf("Testing preprocessing 3 ...\n"); + + start = clock(); + + std::vector nozzle_unreachable_polygons; + std::vector extruder_unreachable_polygons; + std::vector hose_unreachable_polygons; + std::vector gantry_unreachable_polygons; + + for (int p = 0; p < PRUSA_PART_POLYGONS.size(); ++p) + { + { + nozzle_unreachable_polygons.clear(); + + extend_PolygonConvexUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S, + nozzle_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S[j], "lightgrey"); + } + + if (!nozzle_unreachable_polygons.empty()) + { + for (int j = 0; j < nozzle_unreachable_polygons.size(); ++j) + { + preview_svg.draw(nozzle_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + preview_svg.Close(); + getchar(); + } + + { + nozzle_unreachable_polygons.clear(); + + extend_PolygonBoxUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S, + nozzle_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S[j], "lightgrey"); + } + + if (!nozzle_unreachable_polygons.empty()) + { + for (int j = 0; j < nozzle_unreachable_polygons.size(); ++j) + { + preview_svg.draw(nozzle_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "red"); + + preview_svg.Close(); + getchar(); + } + + { + extruder_unreachable_polygons.clear(); + + extend_PolygonConvexUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S, + extruder_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S[j], "lightgrey"); + } + + if (!extruder_unreachable_polygons.empty()) + { + for (int j = 0; j < extruder_unreachable_polygons.size(); ++j) + { + preview_svg.draw(extruder_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "green"); + + preview_svg.Close(); + getchar(); + } + + { + extruder_unreachable_polygons.clear(); + + extend_PolygonBoxUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S, + extruder_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S[j], "lightgrey"); + } + + if (!extruder_unreachable_polygons.empty()) + { + for (int j = 0; j < extruder_unreachable_polygons.size(); ++j) + { + preview_svg.draw(extruder_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "magenta"); + + preview_svg.Close(); + getchar(); + } + + { + hose_unreachable_polygons.clear(); + + extend_PolygonConvexUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S, + hose_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S[j], "lightgrey"); + } + + if (!hose_unreachable_polygons.empty()) + { + for (int j = 0; j < hose_unreachable_polygons.size(); ++j) + { + preview_svg.draw(hose_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "yellow"); + + preview_svg.Close(); + getchar(); + } + + { + hose_unreachable_polygons.clear(); + + extend_PolygonBoxUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S, + hose_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S[j], "lightgrey"); + } + + if (!hose_unreachable_polygons.empty()) + { + for (int j = 0; j < hose_unreachable_polygons.size(); ++j) + { + preview_svg.draw(hose_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "orange"); + + preview_svg.Close(); + getchar(); + } + + { + gantry_unreachable_polygons.clear(); + + extend_PolygonConvexUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S, + gantry_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S[j], "lightgrey"); + } + + if (!gantry_unreachable_polygons.empty()) + { + for (int j = 0; j < gantry_unreachable_polygons.size(); ++j) + { + preview_svg.draw(gantry_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "grey"); + + preview_svg.Close(); + getchar(); + } + + { + gantry_unreachable_polygons.clear(); + + extend_PolygonBoxUnreachableZone(solver_configuration, + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S, + gantry_unreachable_polygons); + + SVG preview_svg("preprocess_test_3.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + + for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) + { + preview_svg.draw(SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S[j], "lightgrey"); + } + + if (!gantry_unreachable_polygons.empty()) + { + for (int j = 0; j < gantry_unreachable_polygons.size(); ++j) + { + preview_svg.draw(gantry_unreachable_polygons[j], "lightgrey"); + } + } + preview_svg.draw(PRUSA_PART_POLYGONS[p], "black"); + + preview_svg.Close(); + getchar(); + } + } + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing preprocess 3 ... finished\n"); + +} + + +void test_preprocess_4(void) +{ + clock_t start, finish; + + printf("Testing preprocess 4 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + std::vector polygons; + std::vector > unreachable_polygons; + for (int i = 0; i < 12/*PRUSA_PART_POLYGONS.size()*/; ++i) + { + Polygon scale_down_polygon; + scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); + polygons.push_back(scale_down_polygon); + + std::vector convex_level_polygons; + convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + std::vector box_level_polygons; + box_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + box_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + + std::vector scale_down_unreachable_polygons; + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S, + scale_down_unreachable_polygons); + unreachable_polygons.push_back(scale_down_unreachable_polygons); + } + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + do + { + decided_polygons.clear(); + remaining_polygons.clear(); + + bool optimized = optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + printf("----> Optimization finished <----\n"); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" %d\n", remaining_polygons[i]); + } + + SVG preview_svg("preprocess_test_4.svg"); + + if (!unreachable_polygons.empty()) + { + for (int i = 0; i < decided_polygons.size(); ++i) + { + /* + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } + */ + for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + { + /* + for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + { + printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + } + */ + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]][j], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + preview_svg.draw(display_unreachable_polygon, "lightgrey"); + } + } + } + + for (int i = 0; i < decided_polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + finish = clock(); + printf("Intermediate time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + getchar(); + + vector next_polygons; + vector > next_unreachable_polygons; + + for (int i = 0; i < polygon_index_map.size(); ++i) + { + printf(" %d\n", polygon_index_map[i]); + } + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + } + while (!remaining_polygons.empty()); + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing preprocess 4 ... finished\n"); +} + + +void test_preprocess_5(void) +{ + clock_t start, finish; + + printf("Testing preprocess 5 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + std::vector polygons; + std::vector > unreachable_polygons; + + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + { + Polygon simplified_polygon; + + decimate_PolygonForSequentialSolver(solver_configuration, + PRUSA_PART_POLYGONS[i], + simplified_polygon); + /* + scaleDown_PolygonForSequentialSolver(solver_configuration, PRUSA_PART_POLYGONS[i], scale_down_polygon); + polygons.push_back(scale_down_polygon); + + std::vector convex_level_polygons; + convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + std::vector box_level_polygons; + box_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + box_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + + std::vector scale_down_unreachable_polygons; + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S, + scale_down_unreachable_polygons); + unreachable_polygons.push_back(scale_down_unreachable_polygons); + */ + SVG preview_svg("preprocess_test_5.svg"); + + //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); + + preview_svg.draw(simplified_polygon, "lightgrey"); + preview_svg.draw(PRUSA_PART_POLYGONS[i], "blue"); + + preview_svg.Close(); + getchar(); + } + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing preprocess 5 ... finished\n"); +} + + +void test_preprocess_6(void) +{ + clock_t start, finish; + + printf("Testing preprocess 6 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + std::vector polygons; + std::vector > unreachable_polygons; + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + { + Polygon decimated_polygon; + decimate_PolygonForSequentialSolver(solver_configuration, + PRUSA_PART_POLYGONS[i], + decimated_polygon); + + Polygon scale_down_polygon; + scaleDown_PolygonForSequentialSolver(decimated_polygon, scale_down_polygon); + polygons.push_back(scale_down_polygon); + + std::vector convex_level_polygons; + convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + std::vector box_level_polygons; + box_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + box_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); + + std::vector scale_down_unreachable_polygons; + prepare_UnreachableZonePolygons(solver_configuration, + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S, + scale_down_unreachable_polygons); + unreachable_polygons.push_back(scale_down_unreachable_polygons); + } + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + do + { + decided_polygons.clear(); + remaining_polygons.clear(); + + bool optimized = optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + printf("----> Optimization finished <----\n"); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" %d\n", remaining_polygons[i]); + } + + SVG preview_svg("preprocess_test_6.svg"); + + if (!unreachable_polygons.empty()) + { + for (int i = 0; i < decided_polygons.size(); ++i) + { + /* + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } + */ + for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + { + /* + for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + { + printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + } + */ + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]][j], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + preview_svg.draw(display_unreachable_polygon, "lightgrey"); + } + } + } + + for (int i = 0; i < decided_polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + finish = clock(); + printf("Intermediate time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + getchar(); + + vector next_polygons; + vector > next_unreachable_polygons; + + for (int i = 0; i < polygon_index_map.size(); ++i) + { + printf(" %d\n", polygon_index_map[i]); + } + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + } + while (!remaining_polygons.empty()); + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing preprocess 6 ... finished\n"); +} + + +/*----------------------------------------------------------------*/ + +int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) +{ + //test_preprocess_1(); + //test_preprocess_2(); + //test_preprocess_3(); + //test_preprocess_4(); + //test_preprocess_5(); + test_preprocess_6(); + + return 0; +} + diff --git a/src/libseqarrange/test/seq_test_preprocess.hpp b/src/libseqarrange/test/seq_test_preprocess.hpp new file mode 100644 index 0000000000..ec57751b36 --- /dev/null +++ b/src/libseqarrange/test/seq_test_preprocess.hpp @@ -0,0 +1,38 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_preprocess.hpp + * + * Object preprocessing for sequential priting via SMT. + */ +/*================================================================*/ + +#ifndef __SEQ_TEST_PREPROCESS_HPP__ +#define __SEQ_TEST_PREPROCESS_HPP__ + +/*----------------------------------------------------------------*/ + +/* Preprocess test 1 */ +void test_preprocess_1(void); + +/* Preprocess test 2 */ +void test_preprocess_2(void); + +/* Preprocess test 3 */ +void test_preprocess_3(void); + +/* Preprocess test 4 */ +void test_preprocess_4(void); + +/* Preprocess test 5 */ +void test_preprocess_5(void); + +/* Preprocess test 6 */ +void test_preprocess_6(void); + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_TEST_PREPROCESS_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_sequential.cpp b/src/libseqarrange/test/seq_test_sequential.cpp new file mode 100644 index 0000000000..9f7757b58f --- /dev/null +++ b/src/libseqarrange/test/seq_test_sequential.cpp @@ -0,0 +1,2307 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_sequential.cpp + * + * Basic steel plate sequential object scheduling via SMT. + */ +/*================================================================*/ + +#include +#include +#include +#include + +#include +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/SVG.hpp" + +#include + +#include "seq_defs.hpp" +#include "seq_sequential.hpp" + +#include "seq_test_sequential.hpp" + +#ifndef M_PI +#define M_PI 3.14159 +#endif + + +/*----------------------------------------------------------------*/ + +using namespace z3; + +using namespace Slic3r; +using namespace Slic3r::Geometry; + +using namespace Sequential; + + +#define SCALE_FACTOR 100000.0 + +/*----------------------------------------------------------------*/ + + +Polygon scale_UP(const Polygon &polygon) +{ + Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); + } + + return poly; +} + + +Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) +{ + Polygon poly = polygon; + + for (int i = 0; i < poly.points.size(); ++i) + { + poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, + poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); + } + + return poly; +} + + +void test_sequential_1(void) +{ + printf("Testing sequential scheduling 1 ...\n"); + + z3::context z_context; + + z3::expr x(z_context.bool_const("x")); + z3::expr y(z_context.bool_const("y")); + z3::expr z(z_context.bool_const("z")); + + z3::expr a(z_context.int_const("a")); + z3::expr b(z_context.int_const("b")); + + z3::expr c(z_context.real_const("cf")); + z3::expr d(z_context.real_const("df")); + + +// z3::expr lhs(!x || y); + z3::expr lhs(x || y); + z3::expr rhs(implies(x, y)); + z3::expr final(lhs == rhs); + + z3::expr lhs1(a); + z3::expr rhs1(b); + z3::expr final2(lhs1 == rhs1); + + z3::expr lhs2(a > 2); + z3::expr rhs2(b < 4); + z3::expr final3(lhs2 || rhs2); + z3::expr final4(a > 5); + z3::expr final5(final3 && final4); + + z3::expr ef1((c > 3 && d < 6) && c < d); + + z3::solver z_solver(z_context); + //z_solver.add(!final); + z_solver.add(final2); + z_solver.add(final5); + z_solver.add(ef1); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s\n", z_model[i].name().str().c_str()); + printf("Printing interpretation:\n"); + + cout << z_model.get_const_interp(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).is_bool()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + } + + printf("Testing sequential scheduling 1 ... finished\n"); +} + + +int complex_sheet_resolution_X = 200; +int complex_sheet_resolution_Y = 50; + +int complex_sheet_resolution_X_min = 10; +int complex_sheet_resolution_X_max = 200; +int complex_sheet_resolution_Y_min = 10; +int complex_sheet_resolution_Y_max = 200; + +int complex_time_resolution = 1000; +int complex_height_threshold = 25; + +const int complex_Obj_count = 26; + +int complex_Obj_widths[complex_Obj_count]; +int complex_Obj_heights[complex_Obj_count]; +int complex_Obj_durations[complex_Obj_count]; + +const int min_width = 4; +const int max_width = 20; + +const int min_height = 4; +const int max_height = 20; + +const int min_duration = 2; +const int max_duration = 50; + +const int gantry_left_height = 10; +const int gantry_left_shift = 4; + +const int gantry_right_height = 10; +const int gantry_right_shift = 4; + + +void generate_random_complex_objects(void) +{ + int width_span = max_width - min_width; + int height_span = max_height - min_height; + int duration_span = max_duration - min_duration; + + for (int i = 0; i < complex_Obj_count; ++i) + { + printf("Generating random object %d ...\n", i); + + complex_Obj_widths[i] = min_width + rand() % width_span; + complex_Obj_heights[i] = min_height + rand() % height_span; + complex_Obj_durations[i] = min_duration + rand() % duration_span; + + printf("O %d: w:%d h:%d d:%d\n", i, complex_Obj_widths[i], complex_Obj_heights[i], complex_Obj_durations[i]); + } +} + + +typedef std::basic_string sString; + +void test_sequential_2(void) +{ + clock_t start, finish; + + printf("Testing sequential scheduling 2 ...\n"); + generate_random_complex_objects(); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T_schedules(z_context); + + z3::expr_vector gantry_lefts(z_context); + z3::expr_vector gantry_rights(z_context); + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "time-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T_schedules.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name_L = "gantry_L-" + to_string(i); + printf("name_L: %s\n", name_L.c_str()); + + sString name_R = "gantry_R-" + to_string(i); + printf("name_R: %s\n", name_R.c_str()); + + gantry_lefts.push_back(expr(z_context.real_const(name_L.c_str()))); + gantry_rights.push_back(expr(z_context.real_const(name_R.c_str()))); + } + +// z3::expr lhs(!x || y); + /* + z3::expr final(lhs == rhs); + + z3::expr lhs1(a); + z3::expr rhs1(b); + z3::expr final2(lhs1 == rhs1); + + z3::expr ef1((c > 3 && d < 6) && c < d); + */ + z3::solver z_solver(z_context); + + for (int i = 0; i < complex_Obj_count; ++i) + { + z_solver.add(X_positions[i] >= 0 && X_positions[i] + complex_Obj_widths[i] <= complex_sheet_resolution_X); + z_solver.add(Y_positions[i] >= 0 && Y_positions[i] + complex_Obj_heights[i] <= complex_sheet_resolution_Y); + z_solver.add(T_schedules[i] >= 0 && T_schedules[i] + complex_Obj_durations[i] <= complex_time_resolution); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (i < j) + { + z_solver.add( X_positions[i] >= X_positions[j] + complex_Obj_widths[j] + || X_positions[j] >= X_positions[i] + complex_Obj_widths[i] + || Y_positions[i] >= Y_positions[j] + complex_Obj_heights[j] + || Y_positions[j] >= Y_positions[i] + complex_Obj_heights[i]); + } + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (i < j) + { + z_solver.add( T_schedules[i] >= T_schedules[j] + complex_Obj_durations[j] + || T_schedules[j] >= T_schedules[i] + complex_Obj_durations[i]); + } + } + + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + z_solver.add(gantry_lefts[i] == Y_positions[i] + gantry_left_shift && gantry_rights[i] == Y_positions[i] + gantry_right_shift); + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (i != j) + { + z_solver.add( T_schedules[j] < T_schedules[i] + || Y_positions[j] >= gantry_rights[i] + gantry_right_height + || gantry_rights[i] >= Y_positions[j] + complex_Obj_heights[j]); + + z_solver.add( T_schedules[j] < T_schedules[i] + || Y_positions[j] >= gantry_lefts[i] + gantry_left_height + || Y_positions[i] >= Y_positions[j] + complex_Obj_heights[j]); + } + } + } + } + + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + return; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + finish = clock(); + + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s\n", z_model[i].name().str().c_str()); + + printf("Printing interpretation:\n"); + cout << z_model.get_const_interp(z_model[i]) << "\n"; + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + //double val; + //printf("%s\n", z_model.get_const_interp(z_model[i]).get_string().c_str()); + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing sequential scheduling 2 ... finished\n"); +} + + +const int complex_max_rotation = 8; + +int rotated_Obj_widths[complex_Obj_count][complex_max_rotation]; +int rotated_Obj_heights[complex_Obj_count][complex_max_rotation]; + +void generate_random_rotated_complex_objects(void) +{ + int width_span = max_width - min_width; + int height_span = max_height - min_height; + int duration_span = max_duration - min_duration; + + for (int i = 0; i < complex_Obj_count; ++i) + { + printf("Generating random object %d ...\n", i); + + int base_width = min_width + rand() % width_span; + int base_height = min_height + rand() % height_span; + + double angle = 0; + double angle_step = 0.5 * M_PI / complex_max_rotation; + + for (int r = 0; r < complex_max_rotation; ++r) + { + int width = cos(angle) * base_width + min_width; + int height = sin(angle) * base_height + min_height; + + printf("w: %d, h: %d\n", width, height); + + rotated_Obj_widths[i][r] = width; + rotated_Obj_heights[i][r] = height; + + angle += angle_step; + + printf("O %d: w:%d h:%d d:%d\n", i, rotated_Obj_widths[i][r], rotated_Obj_heights[i][r], complex_Obj_durations[i]); + } + + complex_Obj_durations[i] = min_duration + rand() % duration_span; + } +} + + +void test_sequential_3(void) +{ + clock_t start, finish; + + printf("Testing sequential scheduling 3 ...\n"); + generate_random_rotated_complex_objects(); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T_schedules(z_context); + + z3::expr_vector gantry_lefts(z_context); + z3::expr_vector gantry_rights(z_context); + + z3::expr_vector rotations(z_context); + z3::expr_vector widths(z_context); + z3::expr_vector heights(z_context); + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "time-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T_schedules.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "width-" + to_string(i); + printf("name: %s\n", name.c_str()); + + widths.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "height-" + to_string(i); + printf("name: %s\n", name.c_str()); + + heights.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name = "rot-" + to_string(i); + printf("name: %s\n", name.c_str()); + + rotations.push_back(expr(z_context.int_const(name.c_str()))); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + sString name_L = "gantry_L-" + to_string(i); + printf("name_L: %s\n", name_L.c_str()); + + sString name_R = "gantry_R-" + to_string(i); + printf("name_R: %s\n", name_R.c_str()); + + gantry_lefts.push_back(expr(z_context.real_const(name_L.c_str()))); + gantry_rights.push_back(expr(z_context.real_const(name_R.c_str()))); + } + + z3::solver z_solver(z_context); + + for (int i = 0; i < complex_Obj_count; ++i) + { + z_solver.add(X_positions[i] >= 0 && X_positions[i] + complex_Obj_widths[i] <= complex_sheet_resolution_X); + z_solver.add(Y_positions[i] >= 0 && Y_positions[i] + complex_Obj_heights[i] <= complex_sheet_resolution_Y); + z_solver.add(T_schedules[i] >= 0 && T_schedules[i] + complex_Obj_durations[i] <= complex_time_resolution); + z_solver.add(rotations[i] >= 0 && rotations[i] < complex_max_rotation); + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + for (int r = 0; r < complex_max_rotation; ++r) + { + z_solver.add(rotations[i] != r || widths[i] == rotated_Obj_widths[i][r]); + z_solver.add(rotations[i] != r || heights[i] == rotated_Obj_heights[i][r]); + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (i < j) + { + z_solver.add( X_positions[i] >= X_positions[j] + widths[j] + || X_positions[j] >= X_positions[i] + widths[i] + || Y_positions[i] >= Y_positions[j] + heights[j] + || Y_positions[j] >= Y_positions[i] + heights[i]); + } + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (i < j) + { + z_solver.add( T_schedules[i] >= T_schedules[j] + complex_Obj_durations[j] + || T_schedules[j] >= T_schedules[i] + complex_Obj_durations[i]); + } + } + + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + z_solver.add(gantry_lefts[i] == Y_positions[i] + gantry_left_shift && gantry_rights[i] == Y_positions[i] + gantry_right_shift); + } + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + if (complex_Obj_durations[i] >= complex_height_threshold) + { + for (int j = 0; j < complex_Obj_count; ++j) + { + if (i != j) + { + z_solver.add( T_schedules[j] < T_schedules[i] + || Y_positions[j] >= gantry_rights[i] + gantry_right_height + || gantry_rights[i] >= Y_positions[j] + heights[j]); + + z_solver.add( T_schedules[j] < T_schedules[i] + || Y_positions[j] >= gantry_lefts[i] + gantry_left_height + || Y_positions[i] >= Y_positions[j] + heights[j]); + } + } + } + } + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + + switch (z_solver.check()) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + return; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + + finish = clock(); + + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s\n", z_model[i].name().str().c_str()); + + printf("Printing interpretation:\n"); + cout << z_model.get_const_interp(z_model[i]) << "\n"; + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + + for (int i = 0; i < complex_Obj_count; ++i) + { + //double val; + //printf("%s\n", z_model.get_const_interp(z_model[i]).get_string().c_str()); + } + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing sequential scheduling 3 ... finished\n"); +} + + +Polygon polygon_1 = {{0, 0}, {50, 0}, {50, 50}, {0, 50}}; +Polygon polygon_2 = {{0, 0}, {150, 10}, {150, 50}, {75, 120}, {0, 50} }; +//Polygon polygon_2 = {{0, 0}, {0, 50}, {75, 120}, {150, 50}, {150, 0} }; +Polygon polygon_3 = {{40, 0}, {80, 40}, {40, 80}, {0, 40}}; +//Polygon polygon_3 = {{40, 0}, {0, 40},{40, 80}, {80, 40}}; +Polygon polygon_4 = {{20, 0}, {40, 0}, {60, 30}, {30, 50}, {0, 30}}; +//Polygon polygon_4 = {{20, 0}, {0, 30}, {30, 50}, {60, 30}, {40, 0} }; + +Polygon unreachable_polygon_1 = {{-5, -5}, {60, -5}, {60, 60}, {-5, 60}}; +Polygon unreachable_polygon_2 = {{-20, -20}, {170, -20}, {170, 86}, {85, 140}, {-20, 60} }; +Polygon unreachable_polygon_3 = {{40, -10}, {90, 40}, {40, 90}, {-10, 40}}; +Polygon unreachable_polygon_4 = {{10, -10}, {40, -10}, {70, 40}, {30, 60}, {-10, 40}}; +//Polygon unreachable_polygon_4 = {{10, -1}, {40, -1}, {70, 40}, {30, 60}, {0, 40}}; +//Polygon unreachable_polygon_4 = {{10, -10}, {-10, 40}, {30, 60}, {70, 40}, {40, -10}}; + + +std::vector unreachable_polygons_1 = { + {{-5, -5}, {60, -5}, {60, 60}, {-5, 60}}, +// {{-20,-20}, {-25,-20}, {-25,-25}, {-20,-25}} +// {{-20,20}, {-25,20}, {-25,25}, {-20,25}} +// {{-20,20}, {-40,20}, {-40,40}, {-20,40}} +// {{-20,20}, {-80,20}, {-80,40}, {-20,40}} /* CW */ + {{-20,20}, {-20,40}, {-180,40}, {-180,20}}, /* CCW */ + {{80,20}, {240,20}, {240,40}, {80,40}} /* CCW */ +// {{-5,-5}, {-100,-5}, {-100,10}, {-5,10}} +}; + +std::vector unreachable_polygons_2 = { + {{-20, -20}, {170, -20}, {170, 86}, {85, 140}, {-20, 60} } +}; + +std::vector unreachable_polygons_3 = { + {{40, -10}, {90, 40}, {40, 90}, {-10, 40}}, + {{-20,20}, {-20,40}, {-180,40}, {-180,20}}, /* CCW */ + {{80,20}, {240,20}, {240,40}, {80,40}} /* CCW */ +}; + +std::vector unreachable_polygons_4 = { + {{10, -10}, {40, -10}, {70, 40}, {30, 60}, {-10, 40}} +}; + + +void test_sequential_4(void) +{ + clock_t start, finish; + + printf("Testing sequential 4 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T_times(z_context); + + for (int i = 0; i < 4; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < 4; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_1.points.size(); ++i) + { + string name = "t_time-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T_times.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::set_param("parallel.enable", "true"); + //Z3_global_param_set("threads", "4"); + z3::solver z_solver(z_context); + + vector polygons; + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + vector unreachable_polygons; + unreachable_polygons.push_back(unreachable_polygon_1); + unreachable_polygons.push_back(unreachable_polygon_2); + unreachable_polygons.push_back(unreachable_polygon_3); + unreachable_polygons.push_back(unreachable_polygon_4); + + introduce_SequentialPolygonWeakNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + T_times, + polygons, + unreachable_polygons); + introduce_TemporalOrdering(z_solver, z_context, T_times, 16, polygons); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + /* + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + */ + + int last_solvable_bounding_box_size = -1; + double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; + double time_1_t, time_2_t, time_3_t, time_4_t; + + double _poly_1_pos_x, _poly_1_pos_y, _poly_2_pos_x, _poly_2_pos_y, _poly_3_pos_x, _poly_3_pos_y, _poly_4_pos_x, _poly_4_pos_y; + double _time_1_t, _time_2_t, _time_3_t, _time_4_t; + + //time_1_t = time_2_t = time_3_t = time_4_t = -1.0; + + + for (int bounding_box_size = 200; bounding_box_size > 10; bounding_box_size -= 4) + { + printf("BB: %d\n", bounding_box_size); + z3::expr_vector bounding_box_assumptions(z_context); + + assume_BedBoundingBox(X_positions[0], Y_positions[0], polygons[0], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[1], Y_positions[1], polygons[1], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[2], Y_positions[2], polygons[2], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[3], Y_positions[3], polygons[3], bounding_box_size, bounding_box_size, bounding_box_assumptions); + + bool sat = false; + + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + sat = true; + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + sat = false; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model z_model(z_solver.get_model()); + /* + printf("Printing model:\n"); + cout << z_model << "\n"; + */ + + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-3") + { + poly_4_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-3") + { + poly_4_pos_y = value; + } + else if (z_model[i].name().str() == "t_time-0") + { + time_1_t = value; + } + else if (z_model[i].name().str() == "t_time-1") + { + time_2_t = value; + } + else if (z_model[i].name().str() == "t_time-2") + { + time_3_t = value; + } + else if (z_model[i].name().str() == "t_time-3") + { + time_4_t = value; + } + } + + printf("Times: %.3f, %.3f, %.3f, %3f\n", + time_1_t, + time_2_t, + time_3_t, + time_4_t); + + printf("preRefined positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", + poly_1_pos_x, + poly_1_pos_y, + time_1_t, + poly_2_pos_x, + poly_2_pos_y, + time_2_t, + poly_3_pos_x, + poly_3_pos_y, + time_3_t, + poly_4_pos_x, + poly_4_pos_y, + time_4_t); + + while (true) + { + vector dec_values_X; + dec_values_X.push_back(poly_1_pos_x); + dec_values_X.push_back(poly_2_pos_x); + dec_values_X.push_back(poly_3_pos_x); + dec_values_X.push_back(poly_4_pos_x); + + vector dec_values_Y; + dec_values_Y.push_back(poly_1_pos_y); + dec_values_Y.push_back(poly_2_pos_y); + dec_values_Y.push_back(poly_3_pos_y); + dec_values_Y.push_back(poly_4_pos_y); + + vector dec_values_T; + dec_values_T.push_back(time_1_t); + dec_values_T.push_back(time_2_t); + dec_values_T.push_back(time_3_t); + dec_values_T.push_back(time_4_t); + + bool refined = refine_SequentialPolygonWeakNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + T_times, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + unreachable_polygons); + + bool refined_sat = false; + + if (refined) + { + printf("alpha 1\n"); + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" sat\n"); + refined_sat = true; + break; + } + case z3::unsat: + { + printf(" unsat\n"); + refined_sat = false; + break; + } + case z3::unknown: + { + printf(" unknown\n"); + break; + } + default: + { + break; + } + } + printf("alpha 2: %d\n", (int)refined_sat); + + if (refined_sat) + { + z3::model z_model(z_solver.get_model()); + /* + printf("Printing model:\n"); + cout << z_model << "\n"; + */ + + for (int i = 0; i < z_model.size(); ++i) + { + //printf("Variable:%s ", z_model[i].name().str().c_str()); + double value = z_model.get_const_interp(z_model[i]).as_double(); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = value; + } + else if (z_model[i].name().str() == "x_pos-3") + { + poly_4_pos_x = value; + } + else if (z_model[i].name().str() == "y_pos-3") + { + poly_4_pos_y = value; + } + else if (z_model[i].name().str() == "t_time-0") + { + time_1_t = value; + } + else if (z_model[i].name().str() == "t_time-1") + { + time_2_t = value; + } + else if (z_model[i].name().str() == "t_time-2") + { + time_3_t = value; + } + else if (z_model[i].name().str() == "t_time-3") + { + time_4_t = value; + } + } + printf("Refined positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", + poly_1_pos_x, + poly_1_pos_y, + time_1_t, + poly_2_pos_x, + poly_2_pos_y, + time_2_t, + poly_3_pos_x, + poly_3_pos_y, + time_3_t, + poly_4_pos_x, + poly_4_pos_y, + time_4_t); + } + else + { + break; + } + } + else + { + printf("-------------------------------------------------------------------\n"); + + _poly_1_pos_x = poly_1_pos_x; + _poly_1_pos_y = poly_1_pos_y; + _time_1_t = time_1_t; + _poly_2_pos_x = poly_2_pos_x; + _poly_2_pos_y = poly_2_pos_y; + _time_2_t = time_2_t; + _poly_3_pos_x = poly_3_pos_x; + _poly_3_pos_y = poly_3_pos_y; + _time_3_t = time_3_t; + _poly_4_pos_x = poly_4_pos_x; + _poly_4_pos_y = poly_4_pos_y; + _time_4_t = time_4_t; + + last_solvable_bounding_box_size = bounding_box_size; + break; + } + } + } + else + { + break; + } + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + finish = clock(); + + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); + + printf("Final spatio-temporal positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", + _poly_1_pos_x, + _poly_1_pos_y, + _time_1_t, + _poly_2_pos_x, + _poly_2_pos_y, + _time_2_t, + _poly_3_pos_x, + _poly_3_pos_y, + _time_3_t, + _poly_4_pos_x, + _poly_4_pos_y, + _time_4_t); + + /* + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i]; + printf("Orig X: %.3f\n", value); + + value = Y_positions[i]; + printf("Orig Y: %.3f\n", value); + } + */ + + SVG preview_svg("sequential_test_4.svg"); + + Polygon display_pro_polygon_1 = scale_UP(unreachable_polygons[0], _poly_1_pos_x, _poly_1_pos_y); + Polygon display_pro_polygon_2 = scale_UP(unreachable_polygons[1], _poly_2_pos_x, _poly_2_pos_y); + Polygon display_pro_polygon_3 = scale_UP(unreachable_polygons[2], _poly_3_pos_x, _poly_3_pos_y); + Polygon display_pro_polygon_4 = scale_UP(unreachable_polygons[3], _poly_4_pos_x, _poly_4_pos_y); + + preview_svg.draw(display_pro_polygon_1, "lightgrey"); + preview_svg.draw(display_pro_polygon_2, "lightgrey"); + preview_svg.draw(display_pro_polygon_3, "lightgrey"); + preview_svg.draw(display_pro_polygon_4, "lightgrey"); + + Polygon display_polygon_1 = scale_UP(polygons[0], _poly_1_pos_x, _poly_1_pos_y); + Polygon display_polygon_2 = scale_UP(polygons[1], _poly_2_pos_x, _poly_2_pos_y); + Polygon display_polygon_3 = scale_UP(polygons[2], _poly_3_pos_x, _poly_3_pos_y); + Polygon display_polygon_4 = scale_UP(polygons[3], _poly_4_pos_x, _poly_4_pos_y); + + preview_svg.draw(display_polygon_1, "green"); + preview_svg.draw(display_polygon_2, "blue"); + preview_svg.draw(display_polygon_3, "red"); + preview_svg.draw(display_polygon_4, "grey"); + + preview_svg.Close(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing sequential 4 ... finished\n"); +} + + +void test_sequential_5(void) +{ + clock_t start, finish; + + printf("Testing sequential 5 ...\n"); + + start = clock(); + + z3::context z_context; + z3::expr_vector X_positions(z_context); + z3::expr_vector Y_positions(z_context); + z3::expr_vector T_times(z_context); + + for (int i = 0; i < 4; ++i) + { + printf("i:%d\n", i); + string name = "x_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + X_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < 4; ++i) + { + string name = "y_pos-" + to_string(i); + printf("name: %s\n", name.c_str()); + + Y_positions.push_back(expr(z_context.real_const(name.c_str()))); + } + + for (int i = 0; i < polygon_1.points.size(); ++i) + { + string name = "t_time-" + to_string(i); + printf("name: %s\n", name.c_str()); + + T_times.push_back(expr(z_context.real_const(name.c_str()))); + } + + z3::solver z_solver(z_context); + + Z3_global_param_set("parallel.enable", "false"); + //Z3_global_param_set("threads", "4"); + + vector polygons; + polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + + vector > unreachable_polygons; + unreachable_polygons.push_back(unreachable_polygons_1); + unreachable_polygons.push_back(unreachable_polygons_2); + unreachable_polygons.push_back(unreachable_polygons_3); + unreachable_polygons.push_back(unreachable_polygons_4); + + printf("pp: %ld\n", unreachable_polygons[0].size()); + printf("pp: %ld\n", unreachable_polygons[1].size()); + printf("pp: %ld\n", unreachable_polygons[2].size()); + printf("pp: %ld\n", unreachable_polygons[3].size()); + + introduce_SequentialPolygonWeakNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + T_times, + polygons, + unreachable_polygons); + introduce_TemporalOrdering(z_solver, z_context, T_times, 16, polygons); + + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + /* + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + */ + + int last_solvable_bounding_box_size = -1; + Rational poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; + Rational time_1_t, time_2_t, time_3_t, time_4_t; + + Rational _poly_1_pos_x, _poly_1_pos_y, _poly_2_pos_x, _poly_2_pos_y, _poly_3_pos_x, _poly_3_pos_y, _poly_4_pos_x, _poly_4_pos_y; + Rational _time_1_t, _time_2_t, _time_3_t, _time_4_t; + + for (int bounding_box_size = 200; bounding_box_size > 10; bounding_box_size -= 4) + { + printf("BB: %d\n", bounding_box_size); + z3::expr_vector bounding_box_assumptions(z_context); + + assume_BedBoundingBox(X_positions[0], Y_positions[0], polygons[0], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[1], Y_positions[1], polygons[1], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[2], Y_positions[2], polygons[2], bounding_box_size, bounding_box_size, bounding_box_assumptions); + assume_BedBoundingBox(X_positions[3], Y_positions[3], polygons[3], bounding_box_size, bounding_box_size, bounding_box_assumptions); + + bool sat = false; + + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" SATISFIABLE\n"); + sat = true; + break; + } + case z3::unsat: + { + printf(" UNSATISFIABLE\n"); + sat = false; + break; + } + case z3::unknown: + { + printf(" UNKNOWN\n"); + break; + } + default: + { + break; + } + } + + if (sat) + { + z3::model z_model(z_solver.get_model()); + + /* + printf("Printing model:\n"); + cout << z_model << "\n"; + */ + printf("Printing interpretation:\n"); + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + Rational rational(z_model.get_const_interp(z_model[i]).numerator().as_int64(), z_model.get_const_interp(z_model[i]).denominator().as_int64()); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = rational; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = rational; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = rational; + } + else if (z_model[i].name().str() == "x_pos-3") + { + poly_4_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-3") + { + poly_4_pos_y = rational; + } + else if (z_model[i].name().str() == "t_time-0") + { + time_1_t = rational; + } + else if (z_model[i].name().str() == "t_time-1") + { + time_2_t = rational; + } + else if (z_model[i].name().str() == "t_time-2") + { + time_3_t = rational; + } + else if (z_model[i].name().str() == "t_time-3") + { + time_4_t = rational; + } + } + + /* + _poly_1_pos_x = poly_1_pos_x; + _poly_1_pos_y = poly_1_pos_y; + _time_1_t = time_1_t; + _poly_2_pos_x = poly_2_pos_x; + _poly_2_pos_y = poly_2_pos_y; + _time_2_t = time_2_t; + _poly_3_pos_x = poly_3_pos_x; + _poly_3_pos_y = poly_3_pos_y; + _time_3_t = time_3_t; + _poly_4_pos_x = poly_4_pos_x; + _poly_4_pos_y = poly_4_pos_y; + _time_4_t = time_4_t; + */ + + printf("Times: %.3f, %.3f, %.3f, %3f\n", + time_1_t.as_double(), + time_2_t.as_double(), + time_3_t.as_double(), + time_4_t.as_double()); + + printf("preRefined positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", + poly_1_pos_x.as_double(), + poly_1_pos_y.as_double(), + time_1_t.as_double(), + poly_2_pos_x.as_double(), + poly_2_pos_y.as_double(), + time_2_t.as_double(), + poly_3_pos_x.as_double(), + poly_3_pos_y.as_double(), + time_3_t.as_double(), + poly_4_pos_x.as_double(), + poly_4_pos_y.as_double(), + time_4_t.as_double()); + + while (true) + { + vector dec_values_X; + dec_values_X.push_back(poly_1_pos_x); + dec_values_X.push_back(poly_2_pos_x); + dec_values_X.push_back(poly_3_pos_x); + dec_values_X.push_back(poly_4_pos_x); + + vector dec_values_Y; + dec_values_Y.push_back(poly_1_pos_y); + dec_values_Y.push_back(poly_2_pos_y); + dec_values_Y.push_back(poly_3_pos_y); + dec_values_Y.push_back(poly_4_pos_y); + + vector dec_values_T; + dec_values_T.push_back(time_1_t); + dec_values_T.push_back(time_2_t); + dec_values_T.push_back(time_3_t); + dec_values_T.push_back(time_4_t); + + bool refined = refine_SequentialPolygonWeakNonoverlapping(z_solver, + z_context, + X_positions, + Y_positions, + T_times, + dec_values_X, + dec_values_Y, + dec_values_T, + polygons, + unreachable_polygons); + + bool refined_sat = false; + + if (refined) + { + printf("alpha 1\n"); + switch (z_solver.check(bounding_box_assumptions)) + { + case z3::sat: + { + printf(" sat\n"); + refined_sat = true; + break; + } + case z3::unsat: + { + printf(" unsat\n"); + refined_sat = false; + break; + } + case z3::unknown: + { + printf(" unknown\n"); + break; + } + default: + { + break; + } + } + printf("alpha 2: %d\n", (int)refined_sat); + + if (refined_sat) + { + z3::model z_model(z_solver.get_model()); + /* + printf("Printing model:\n"); + cout << z_model << "\n"; + */ + + for (int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + double value = z_model.get_const_interp(z_model[i]).as_double(); + printf("value: %.3f\n", value); + + Rational rational(z_model.get_const_interp(z_model[i]).numerator().as_int64(), z_model.get_const_interp(z_model[i]).denominator().as_int64()); + + if (z_model[i].name().str() == "x_pos-0") + { + poly_1_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-0") + { + poly_1_pos_y = rational; + } + else if (z_model[i].name().str() == "x_pos-1") + { + poly_2_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-1") + { + poly_2_pos_y = rational; + } + else if (z_model[i].name().str() == "x_pos-2") + { + poly_3_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-2") + { + poly_3_pos_y = rational; + } + else if (z_model[i].name().str() == "x_pos-3") + { + poly_4_pos_x = rational; + } + else if (z_model[i].name().str() == "y_pos-3") + { + poly_4_pos_y = rational; + } + else if (z_model[i].name().str() == "t_time-0") + { + time_1_t = rational; + } + else if (z_model[i].name().str() == "t_time-1") + { + time_2_t = rational; + } + else if (z_model[i].name().str() == "t_time-2") + { + time_3_t = rational; + } + else if (z_model[i].name().str() == "t_time-3") + { + time_4_t = rational; + } + } + printf("Refined positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", + poly_1_pos_x.as_double(), + poly_1_pos_y.as_double(), + time_1_t.as_double(), + poly_2_pos_x.as_double(), + poly_2_pos_y.as_double(), + time_2_t.as_double(), + poly_3_pos_x.as_double(), + poly_3_pos_y.as_double(), + time_3_t.as_double(), + poly_4_pos_x.as_double(), + poly_4_pos_y.as_double(), + time_4_t.as_double()); + } + else + { + break; + } + } + else + { + printf("-------------------------------------------------------------------\n"); + + _poly_1_pos_x = poly_1_pos_x; + _poly_1_pos_y = poly_1_pos_y; + _time_1_t = time_1_t; + _poly_2_pos_x = poly_2_pos_x; + _poly_2_pos_y = poly_2_pos_y; + _time_2_t = time_2_t; + _poly_3_pos_x = poly_3_pos_x; + _poly_3_pos_y = poly_3_pos_y; + _time_3_t = time_3_t; + _poly_4_pos_x = poly_4_pos_x; + _poly_4_pos_y = poly_4_pos_y; + _time_4_t = time_4_t; + + last_solvable_bounding_box_size = bounding_box_size; + break; + } + } + } + else + { + break; + } + + //cout << float(z_model[i]) << "\n"; + /* + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + */ + } + finish = clock(); + + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); + + printf("Final spatio-temporal positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", + _poly_1_pos_x.as_double(), + _poly_1_pos_y.as_double(), + _time_1_t.as_double(), + _poly_2_pos_x.as_double(), + _poly_2_pos_y.as_double(), + _time_2_t.as_double(), + _poly_3_pos_x.as_double(), + _poly_3_pos_y.as_double(), + _time_3_t.as_double(), + _poly_4_pos_x.as_double(), + _poly_4_pos_y.as_double(), + _time_4_t.as_double()); + + /* + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); + + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } + */ + + SVG preview_svg("sequential_test_5.svg"); + + for (int i = 0; i < unreachable_polygons[0].size(); ++i) + { + Polygon display_pro_polygon_1 = scale_UP(unreachable_polygons[0][i], _poly_1_pos_x.as_double(), _poly_1_pos_y.as_double()); + preview_svg.draw(display_pro_polygon_1, "lightgrey"); + } + + for (int i = 0; i < unreachable_polygons[1].size(); ++i) + { + Polygon display_pro_polygon_2 = scale_UP(unreachable_polygons[1][i], _poly_2_pos_x.as_double(), _poly_2_pos_y.as_double()); + preview_svg.draw(display_pro_polygon_2, "lightgrey"); + } + + for (int i = 0; i < unreachable_polygons[2].size(); ++i) + { + Polygon display_pro_polygon_3 = scale_UP(unreachable_polygons[2][i], _poly_3_pos_x.as_double(), _poly_3_pos_y.as_double()); + preview_svg.draw(display_pro_polygon_3, "lightgrey"); + } + + for (int i = 0; i < unreachable_polygons[3].size(); ++i) + { + Polygon display_pro_polygon_4 = scale_UP(unreachable_polygons[3][i], _poly_4_pos_x.as_double(), _poly_4_pos_y.as_double()); + preview_svg.draw(display_pro_polygon_4, "lightgrey"); + } + + Polygon display_polygon_1 = scale_UP(polygons[0], _poly_1_pos_x.as_double(), _poly_1_pos_y.as_double()); + Polygon display_polygon_2 = scale_UP(polygons[1], _poly_2_pos_x.as_double(), _poly_2_pos_y.as_double()); + Polygon display_polygon_3 = scale_UP(polygons[2], _poly_3_pos_x.as_double(), _poly_3_pos_y.as_double()); + Polygon display_polygon_4 = scale_UP(polygons[3], _poly_4_pos_x.as_double(), _poly_4_pos_y.as_double()); + + preview_svg.draw(display_polygon_1, "green"); + preview_svg.draw(display_polygon_2, "blue"); + preview_svg.draw(display_polygon_3, "red"); + preview_svg.draw(display_polygon_4, "grey"); + + preview_svg.Close(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing sequential 5 ... finished\n"); +} + + + +void test_sequential_6(void) +{ + clock_t start, finish; + + printf("Testing polygon 6 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + vector polygons; + vector unreachable_polygons; + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + /* + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygon_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygon_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygon_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygon_4); + */ + +/* + polygons.push_back(polygon_1); + unreachable_polygons.push_back(polygon_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(polygon_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(polygon_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(polygon_4); +*/ + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygon_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygon_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygon_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygon_4); + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygon_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygon_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygon_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygon_4); + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygon_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygon_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygon_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygon_4); + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygon_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygon_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygon_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygon_4); + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygon_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygon_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygon_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygon_4); + + /* + for (int j = 0; j < unreachable_polygons_1.size(); ++j) + { + for (int k = 0; k < unreachable_polygons_1[j].points.size(); ++k) + { + printf(" Ppxy: %d, %d\n", unreachable_polygons_1[j].points[k].x(), unreachable_polygons_1[j].points[k].y()); + } + } + */ + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + /* + poly_positions_X.resize(polygons.size()); + poly_positions_Y.resize(polygons.size()); + */ + + do + { + decided_polygons.clear(); + remaining_polygons.clear(); + + bool optimized = optimize_SubglobalSequentialPolygonNonoverlapping(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + /* + bool optimized = optimize_SubglobalPolygonNonoverlapping(solver_configuration, + poly_positions_X, + poly_positions_Y, + polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + */ + printf("----> Optimization finished <----\n"); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + // printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); + printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" %d\n", remaining_polygons[i]); + } + + SVG preview_svg("sequential_test_6.svg"); + + if (!unreachable_polygons.empty()) + { + for (int i = 0; i < decided_polygons.size(); ++i) + { + /* + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } + */ + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + //if (decided_polygons[i] != 2) + { + preview_svg.draw(display_unreachable_polygon, "lightgrey"); + } + } + } + + for (int i = 0; i < decided_polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + getchar(); + + vector next_polygons; + vector next_unreachable_polygons; + + for (int i = 0; i < polygon_index_map.size(); ++i) + { + printf(" %d\n", polygon_index_map[i]); + } + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + } + while (!remaining_polygons.empty()); + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing sequential 6 ... finished\n"); +} + + +void test_sequential_7(void) +{ + clock_t start, finish; + + printf("Testing polygon 7 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + + vector polygons; + vector > unreachable_polygons; + + vector remaining_polygons; + vector polygon_index_map; + vector decided_polygons; + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygons_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygons_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygons_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygons_4); + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygons_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygons_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygons_3); + +/* + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygons_4); +*/ + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygons_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygons_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygons_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygons_4); + +/* + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygons_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygons_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygons_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygons_4); + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygons_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygons_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygons_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygons_4); + + polygons.push_back(polygon_1); + unreachable_polygons.push_back(unreachable_polygons_1); + polygons.push_back(polygon_2); + unreachable_polygons.push_back(unreachable_polygons_2); + polygons.push_back(polygon_3); + unreachable_polygons.push_back(unreachable_polygons_3); + polygons.push_back(polygon_4); + unreachable_polygons.push_back(unreachable_polygons_4); +*/ + /* + for (int j = 0; j < unreachable_polygons_1.size(); ++j) + { + for (int k = 0; k < unreachable_polygons_1[j].points.size(); ++k) + { + printf(" Ppxy: %d, %d\n", unreachable_polygons_1[j].points[k].x(), unreachable_polygons_1[j].points[k].y()); + } + } + */ + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + + vector poly_positions_X; + vector poly_positions_Y; + vector times_T; + + /* + poly_positions_X.resize(polygons.size()); + poly_positions_Y.resize(polygons.size()); + */ + + do + { + decided_polygons.clear(); + remaining_polygons.clear(); + + bool optimized = optimize_SubglobalSequentialPolygonNonoverlapping(solver_configuration, + poly_positions_X, + poly_positions_Y, + times_T, + polygons, + unreachable_polygons, + polygon_index_map, + decided_polygons, + remaining_polygons); + + printf("----> Optimization finished <----\n"); + + if (optimized) + { + printf("Polygon positions:\n"); + for (int i = 0; i < decided_polygons.size(); ++i) + { + printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); + } + printf("Remaining polygons: %ld\n", remaining_polygons.size()); + for (int i = 0; i < remaining_polygons.size(); ++i) + { + printf(" %d\n", remaining_polygons[i]); + } + + SVG preview_svg("sequential_test_7.svg"); + + if (!unreachable_polygons.empty()) + { + for (int i = 0; i < decided_polygons.size(); ++i) + { + /* + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } + */ + for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + { + /* + for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + { + printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + } + */ + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]][j], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + preview_svg.draw(display_unreachable_polygon, "lightgrey"); + } + } + } + + for (int i = 0; i < decided_polygons.size(); ++i) + { + Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], + poly_positions_X[decided_polygons[i]].as_double(), + poly_positions_Y[decided_polygons[i]].as_double()); + + string color; + + switch(i) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + case 9: + { + color = "olive"; + break; + } + case 10: + { + color = "aqua"; + break; + } + case 11: + { + color = "violet"; + break; + } + default: + { + break; + } + } + + preview_svg.draw(display_polygon, color); + } + + preview_svg.Close(); + } + else + { + printf("Polygon optimization FAILED.\n"); + } + getchar(); + + vector next_polygons; + vector > next_unreachable_polygons; + + for (int i = 0; i < polygon_index_map.size(); ++i) + { + printf(" %d\n", polygon_index_map[i]); + } + for (int i = 0; i < remaining_polygons.size(); ++i) + { + next_polygons.push_back(polygons[remaining_polygons[i]]); + next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + } + + polygons.clear(); + unreachable_polygons.clear(); + polygon_index_map.clear(); + + polygons = next_polygons; + unreachable_polygons = next_unreachable_polygons; + + for (int index = 0; index < polygons.size(); ++index) + { + polygon_index_map.push_back(index); + } + } + while (!remaining_polygons.empty()); + + finish = clock(); + + printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + printf("Testing sequential 7 ... finished\n"); +} + + +/*----------------------------------------------------------------*/ + +int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) +{ + // test_sequential_1(); + // test_sequential_2(); + // test_sequential_3(); + // test_sequential_4(); + // test_sequential_5(); + // test_sequential_6(); + test_sequential_7(); + + return 0; +} + diff --git a/src/libseqarrange/test/seq_test_sequential.hpp b/src/libseqarrange/test/seq_test_sequential.hpp new file mode 100644 index 0000000000..4ac36d7b5b --- /dev/null +++ b/src/libseqarrange/test/seq_test_sequential.hpp @@ -0,0 +1,41 @@ +/*================================================================*/ +/* + * Author: Pavel Surynek, 2023 - 2024 + * Company: Prusa Research + * + * File: seq_test_sequential.hpp + * + * Basic steel plate sequential object scheduling via SMT. + */ +/*================================================================*/ + +#ifndef __SEQ_TEST_SEQUENTIAL_HPP__ +#define __SEQ_TEST_SEQUENTIAL_HPP__ + +/*----------------------------------------------------------------*/ + +/* Sequential arrangment test 1 */ +void test_sequential_1(void); + +/* Sequential arrangment test 2 */ +void test_sequential_2(void); + +/* Sequential arrangment test 3 */ +void test_sequential_3(void); + +/* Sequential arrangment test 4 */ +void test_sequential_4(void); + +/* Sequential arrangment test 5 */ +void test_sequential_5(void); + +/* Sequential arrangment test 6 */ +void test_sequential_6(void); + +/* Sequential arrangment test 7 */ +void test_sequential_7(void); + + +/*----------------------------------------------------------------*/ + +#endif /* __SEQ_TEST_SEQUENTIAL_HPP__ */ From a52a4bcbb215f8157de55d8cdb1f2c497147bf4a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Sun, 29 Sep 2024 13:18:13 +0200 Subject: [PATCH 03/88] Start using the new interface --- src/slic3r/GUI/ArrangeHelper.cpp | 222 +++++++++++-------------------- src/slic3r/GUI/ArrangeHelper.hpp | 5 +- src/slic3r/GUI/GLCanvas3D.cpp | 50 +++---- 3 files changed, 97 insertions(+), 180 deletions(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 5b39409eab..f90ae679cd 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -3,180 +3,122 @@ #include "libslic3r/Model.hpp" #include "libslic3r/TriangleMesh.hpp" -#include "boost/algorithm/string/split.hpp" -#include "boost/filesystem/path.hpp" - #include +#include "libseqarrange/include/seq_interface.hpp" +#include "libseqarrange/include/seq_sequential.hpp" + namespace Slic3r { +static Sequential::PrinterGeometry get_printer_geometry() { + enum ShapeType { + BOX, + CONVEX + }; + struct ExtruderSlice { + coord_t height; + ShapeType shape_type; + std::vector polygons; -static bool find_and_remove(std::string& src, const std::string& key) -{ - size_t pos = src.find(key); - if (pos != std::string::npos) { - src.erase(pos, key.length()); - return true; + }; + + // Just hardcode MK4 geometry for now. + std::vector slices; + slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -500000, -500000 }, { 500000, -500000 }, { 500000, 500000 }, { -500000, 500000 } } } }); + slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -1000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -1000000, 44000000 } }, + { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); + slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -4000000 }, {350000000, -4000000 }, {350000000, -14000000 }, {-350000000, -14000000 } } } }); + slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -12000000, -350000000 }, { 9000000, -350000000 }, { 9000000, -39000000 }, { -12000000, -39000000 } }, + { { -12000000, -350000000 }, {250000000, -350000000 }, {250000000, -82000000 }, { -12000000, -82000000} } } }); + + Sequential::PrinterGeometry out; + out.x_size = 250000000; + out.y_size = 210000000; + for (const ExtruderSlice& slice : slices) { + (slice.shape_type == CONVEX ? out.convex_heights : out.box_heights).emplace(slice.height); + out.extruder_slices.insert(std::make_pair(slice.height, slice.polygons)); } - return false; + return out; } -struct ObjectToPrint { - int id = 0; - coord_t total_height = 0; - std::vector> pgns_at_height; -}; - -std::vector load_exported_data(const std::string& filename) +static Sequential::SolverConfiguration get_solver_config(const Sequential::PrinterGeometry& printer_geometry) { - std::vector objects_to_print; - - std::ifstream in(filename); - if (! in) - throw std::runtime_error("NO EXPORTED FILE WAS FOUND"); - std::string line; - - while (in) { - std::getline(in, line); - if (find_and_remove(line, "OBJECT_ID")) { - objects_to_print.push_back(ObjectToPrint()); - objects_to_print.back().id = std::stoi(line); - } - if (find_and_remove(line, "TOTAL_HEIGHT")) - objects_to_print.back().total_height = std::stoi(line); - if (find_and_remove(line, "POLYGON_AT_HEIGHT")) - objects_to_print.back().pgns_at_height.emplace_back(std::make_pair(std::stoi(line), Polygon())); - if (find_and_remove(line, "POINT")) { - std::stringstream ss(line); - std::string val; - ss >> val; - Point pt(std::stoi(val), 0); - ss >> val; - pt.y() = std::stoi(val); - objects_to_print.back().pgns_at_height.back().second.append(pt); - } - } - return objects_to_print; + return Sequential::SolverConfiguration(printer_geometry); } -std::vector read_required_heights() +static std::vector get_objects_to_print(const Model& model, const Sequential::PrinterGeometry& printer_geometry) { + // First extract the heights of interest. std::vector heights; - std::ifstream out("printer_geometry.mk4.txt"); - std::string line; - std::array keys = {"CONVEX_HEIGHT", "BOX_HEIGHT"}; - while (out) { - std::getline(out, line); - for (const std::string& key : keys) { - if (size_t pos = line.find(key); pos != std::string::npos) { - line = line.substr(pos + key.size()); - heights.push_back(double(std::stoi(line)) * SCALING_FACTOR); - break; - } - } - } - return heights; -} + for (const auto& [height, pgns] : printer_geometry.extruder_slices) + heights.push_back(unscaled(height)); + Slic3r::sort_remove_duplicates(heights); - - -void export_arrange_data(const Model& model, const std::vector& heights) -{ - std::ofstream out("arrange_data_export.txt"); + // Now collect all objects and projections of convex hull above respective heights. + std::vector objects; for (const ModelObject* mo : model.objects) { - // Calculate polygon describing convex hull of everything above given heights. const ModelInstance* mi = mo->instances.front(); - out << "OBJECT_ID" << mo->id().id << std::endl; - out << "TOTAL_HEIGHT" << scaled(mo->instance_bounding_box(0).size().z()) << std::endl;; + objects.emplace_back(Sequential::ObjectToPrint{int(mo->id().id), scaled(mo->instance_bounding_box(0).size().z()), {}}); for (double height : heights) { auto tr = Transform3d::Identity(); Vec3d offset = mi->get_offset(); tr.translate(Vec3d(-offset.x(), -offset.y(), 0.)); Polygon pgn = its_convex_hull_2d_above(mo->mesh().its, tr.cast(), height); - out << "POLYGON_AT_HEIGHT" << scaled(height) << std::endl; - for (const Point& pt : pgn) - out << "POINT" << pt.x() << " " << pt.y() << std::endl; + objects.back().pgns_at_height.emplace_back(std::make_pair(scaled(height), pgn)); } } + return objects; } -void import_arrange_data(Model& model, bool delete_files) +void arrange_model_sequential(Model& model) { - // First go through all files in the current directory - // and remember all which match the pattern. - namespace fs = boost::filesystem; - fs::path p("."); - fs::directory_iterator end_itr; - std::vector filenames; - for (fs::directory_iterator itr(p); itr != end_itr; ++itr) - { - if (fs::is_regular_file(itr->path())) { - std::string name = itr->path().filename().string(); - if (boost::starts_with(name, "arrange_data_import") && boost::ends_with(name, ".txt")) - filenames.emplace_back(name); - } - } - // Sort the files alphabetically. - std::sort(filenames.begin(), filenames.end()); - + Sequential::PrinterGeometry printer_geometry = get_printer_geometry(); + Sequential::SolverConfiguration solver_config = get_solver_config(printer_geometry); + std::vector objects = get_objects_to_print(model, printer_geometry); + + // Everything ready - let libseqarrange do the actual arrangement. + std::vector plates = + Sequential::schedule_ObjectsForSequentialPrint( + solver_config, + printer_geometry, + objects); + // Extract the result and move the objects in Model accordingly. struct MoveData { - size_t id; - coord_t x; - coord_t y; + Sequential::ScheduledObject scheduled_object; size_t bed_idx; }; - // A vector to collect move data for all the files. + // A vector to collect move data for all the objects. std::vector move_data_all; - // Now iterate through all the files, read the data and move the objects accordingly. // Save the move data from this file to move_data_all. size_t bed_idx = 0; - for (const std::string& name : filenames) { - std::cout << " - loading file " << name << "..." << std::endl; - std::ifstream in(name); - - std::string line; - std::vector move_data; - while (in) { - std::getline(in, line); - std::vector values; - boost::split(values, line, boost::is_any_of(" ")); - if (values.size() > 2) - move_data.emplace_back(MoveData{size_t(std::stoi(values[0])), std::stoi(values[1]), std::stoi(values[2]), bed_idx}); - } - + for (const Sequential::ScheduledPlate& plate : plates) { // Iterate the same way as when exporting. for (ModelObject* mo : model.objects) { ModelInstance* mi = mo->instances.front(); const ObjectID& oid = mo->id(); - auto it = std::find_if(move_data.begin(), move_data.end(), [&oid](const auto& md) { return md.id == oid.id; }); - if (it != move_data.end()) { + auto it = std::find_if(plate.scheduled_objects.begin(), plate.scheduled_objects.end(), [&oid](const auto& md) { return md.id == oid.id; }); + if (it != plate.scheduled_objects.end()) { mi->set_offset(Vec3d(unscaled(it->x) + bed_idx * 300, unscaled(it->y), mi->get_offset().z())); } } - move_data_all.insert(move_data_all.end(), move_data.begin(), move_data.end()); + for (const Sequential::ScheduledObject& object : plate.scheduled_objects) + move_data_all.push_back({ object, bed_idx }); ++bed_idx; } - if (delete_files) { - std::cout << " - removing all the files..."; - for (const std::string& name : filenames) - fs::remove(fs::path(name)); - std::cout << "done" << std::endl; - } - // Now reorder the objects in the model so they are in the same order as requested. auto comp = [&move_data_all](ModelObject* mo1, ModelObject* mo2) { - auto it1 = std::find_if(move_data_all.begin(), move_data_all.end(), [&mo1](const auto& md) { return md.id == mo1->id().id; }); - auto it2 = std::find_if(move_data_all.begin(), move_data_all.end(), [&mo2](const auto& md) { return md.id == mo2->id().id; }); + auto it1 = std::find_if(move_data_all.begin(), move_data_all.end(), [&mo1](const auto& md) { return md.scheduled_object.id == mo1->id().id; }); + auto it2 = std::find_if(move_data_all.begin(), move_data_all.end(), [&mo2](const auto& md) { return md.scheduled_object.id == mo2->id().id; }); return it1->bed_idx == it2->bed_idx ? it1 < it2 : it1->bed_idx < it2->bed_idx; }; std::sort(model.objects.begin(), model.objects.end(), comp); @@ -184,35 +126,21 @@ void import_arrange_data(Model& model, bool delete_files) -void export_run_and_import_arrange_data(Model& model, const std::string& cmd, bool delete_files) +bool check_seq_printability(const Model& model) { - std::cout << "Reading height from printer_geometry.mk4.txt" << std::endl; - std::vector heights = read_required_heights(); - if (heights.empty()) { - std::cout << "unable" << std::endl; - return; + Sequential::PrinterGeometry printer_geometry = get_printer_geometry(); + Sequential::SolverConfiguration solver_config = get_solver_config(printer_geometry); + std::vector objects = get_objects_to_print(model, printer_geometry); + + // FIXME: This does not consider plates, non-printable objects and instances. + Sequential::ScheduledPlate plate; + for (ModelObject* mo : model.objects) { + ModelInstance* mi = mo->instances.front(); + plate.scheduled_objects.emplace_back(mo->id().id, scaled(mi->get_offset().x()), scaled(mi->get_offset().y())); } - std::cout << "Exporting the arrange data..."; - export_arrange_data(model, heights); - std::cout << "done" << std::endl; - - std::cout << "Running " << cmd << std::endl; - int out = wxExecute(wxString::FromUTF8(cmd), wxEXEC_SYNC); - if (out == -1) { - std::cout << "unable" << std::endl; - return; - } - std::cout << "sequential_prusa returned " << out << (out == 0 ? ": ok" : ": appears to be an error") << std::endl; - - if (out ==0 ) { - std::cout << "Importing the arrange data..." << std::endl; - import_arrange_data(model, delete_files); - std::cout << "Import done" << std::endl; - } + return Sequential::check_ScheduledObjectsForSequentialPrintability(solver_config, printer_geometry, objects, std::vector(1, plate)); } - - -} +} // namespace Slic3r diff --git a/src/slic3r/GUI/ArrangeHelper.hpp b/src/slic3r/GUI/ArrangeHelper.hpp index 63cc351e56..953babe43e 100644 --- a/src/slic3r/GUI/ArrangeHelper.hpp +++ b/src/slic3r/GUI/ArrangeHelper.hpp @@ -4,9 +4,8 @@ class Model; namespace Slic3r { - void export_run_and_import_arrange_data(Model&, const std::string&, bool); - void export_arrange_data(const Model& model, const std::vector& heights); - void import_arrange_data(Model& model, bool delete_files); + void arrange_model_sequential(Model& model); + bool check_seq_printability(const Model& model); } #endif // slic3r_Arrange_Helper_hpp \ No newline at end of file diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4eda5dca27..4848105926 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2224,39 +2224,29 @@ void GLCanvas3D::render() // This is just temporary pipe to export data to the separate arrange algorithm // and importing the result back. TESTING ONLY !!! ImGui::Begin("TESTING ONLY (arrange)"); - static bool decimation = true; - static bool precision_high = false; - static bool assumptions = false; - static int object_group_size = 4; - static bool delete_files = true; - static std::string printer_file = "printer_geometry.mk4.txt"; - ImGui::Checkbox("Decimation", &decimation); - ImGui::Checkbox("Precision", &precision_high); - ImGui::Checkbox("Assumptions", &assumptions); - ImGui::InputInt("Group size", &object_group_size); - wxGetApp().imgui()->disabled_begin(true); - ImGui::InputText("Printer file", printer_file.data(), printer_file.size()); - wxGetApp().imgui()->disabled_end(); - ImGui::Separator(); - ImGui::Checkbox("Delete files after use", &delete_files); - - std::stringstream ss; - ss << "./sequential_prusa" - << " --decimation=" << (decimation ? "yes" : "no") - << " --precision=" << (precision_high ? "high" : "low") - << " --assumptions=" << (assumptions ? "yes" : "no") - << " --object-group-size=" << object_group_size - << " --printer-file=" << printer_file - << " --interactive=no"; - ImGui::Text((std::string("Command: '") + ss.str() + "'").c_str()); - - - if (ImGui::Button("Do external arrange")) { - export_run_and_import_arrange_data(wxGetApp().plater()->model(), ss.str(), delete_files); + if (ImGui::Button("Do sequential arrange")) { + arrange_model_sequential(wxGetApp().plater()->model()); reload_scene(true, true); wxGetApp().obj_list()->update_after_undo_redo(); } - ImGui::End(); + + static auto time_start = std::chrono::high_resolution_clock::now(); + auto time_now = std::chrono::high_resolution_clock::now(); + int time_limit_s = 1; + static bool last_res = 0; + bool valid = std::chrono::duration_cast(time_now - time_start).count() < time_limit_s; + + ImGui::Text(""); + ImGui::Separator(); + ImGui::Text(""); + if (ImGui::Button("Test:")) { + last_res = check_seq_printability(wxGetApp().plater()->model()); + time_start = std::chrono::high_resolution_clock::now(); + } + ImGui::SameLine(); + ImGui::TextColored((valid && last_res ? ImVec4(0.,1.,0.,1.) : (valid ? ImVec4(1.,0.,0.,1.) : ImVec4(0.5,.5,0.5,1.))) , "\u25a0"); + ImGui::Text("(So far, multiple beds are not accounted for.)"); + ImGui::End(); } From f03ee0a1b0bc22352a9771743af0cb846330de31 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 30 Sep 2024 14:53:43 +0200 Subject: [PATCH 04/88] Updated to 193 - no conflicts fixed --- .../data/arrange_data_export.txt | 300 - .../data/arrange_data_export.txt.1 | 280 - .../data/arrange_data_export.txt.10 | 16 - .../data/arrange_data_export.txt.11 | 54 - .../data/arrange_data_export.txt.12 | 27 - .../data/arrange_data_export.txt.13 | 12 - .../data/arrange_data_export.txt.14 | 16 - .../data/arrange_data_export.txt.15 | 20 - .../data/arrange_data_export.txt.16 | 27 - .../data/arrange_data_export.txt.17 | 81 - .../data/arrange_data_export.txt.2 | 1396 -- .../data/arrange_data_export.txt.3 | 64 - .../data/arrange_data_export.txt.4 | 300 - .../data/arrange_data_export.txt.5 | 19054 ---------------- .../data/arrange_data_export.txt.6 | 300 - .../data/arrange_data_export.txt.7 | 995 - .../data/arrange_data_export.txt.8 | 203 - .../data/arrange_data_export.txt.9 | 209 - .../data/arrange_data_export.txt.body.mk4 | 116 - .../data/arrange_data_export.txt.composed.mk4 | 88 - .../arrange_data_export.txt.composed_hose.mk4 | 24 - .../data/arrange_data_export.txt.extruder.mk4 | 135 - .../data/arrange_data_export.txt.fan.mk4 | 139 - .../data/arrange_data_export.txt.gantry.mk4 | 416 - .../data/arrange_data_export.txt.hose.mk4 | 102 - .../data/arrange_data_export.txt.nozzle.mk4 | 385 - .../data/arrange_data_import.txt | 103 - .../data/arrange_data_import.txt.1 | 3 - .../data/arrange_data_import.txt.2 | 5 - .../data/arrange_data_import.txt.3 | 4 - .../data/arrange_data_import_000.txt | 6 - .../data/arrange_data_import_001.txt | 5 - .../data/arrange_data_import_002.txt | 2 - src/libseqarrange/data/combo_body.txt | 38 - src/libseqarrange/data/combo_fac.txt | 38 - src/libseqarrange/data/combo_fan.txt | 38 - src/libseqarrange/data/combo_gantry.txt | 36 - src/libseqarrange/data/combo_hose.txt | 32 - src/libseqarrange/data/combo_nozzle.txt | 47 - src/libseqarrange/data/export.body.mk4 | 35 - src/libseqarrange/data/export.composed.mk4 | 90 - src/libseqarrange/data/export.fan.mk4 | 35 - src/libseqarrange/data/export.gantry.mk4 | 33 - src/libseqarrange/data/export.hose.mk4 | 29 - src/libseqarrange/data/export.nozzle.mk4 | 44 - .../data/extruder_bounding_boxes.mk4.svg | 20 - src/libseqarrange/data/polygon_test_10.svg | 12 - src/libseqarrange/data/polygon_test_11.svg | 12 - src/libseqarrange/data/polygon_test_12.svg | 12 - src/libseqarrange/data/polygon_test_13.svg | 20 - src/libseqarrange/data/polygon_test_14.svg | 20 - src/libseqarrange/data/polygon_test_15.svg | 10 - src/libseqarrange/data/polygon_test_7.svg | 11 - src/libseqarrange/data/polygon_test_8.svg | 11 - src/libseqarrange/data/polygon_test_9.svg | 11 - src/libseqarrange/data/preprocess_test_1.svg | 9 - src/libseqarrange/data/preprocess_test_2.svg | 28 - src/libseqarrange/data/preprocess_test_3.svg | 11 - src/libseqarrange/data/preprocess_test_4.svg | 15 - src/libseqarrange/data/preprocess_test_5.svg | 10 - src/libseqarrange/data/preprocess_test_6.svg | 71 - .../data/sequential_decimator.svg | 20 - src/libseqarrange/data/sequential_prusa.svg | 16 - .../data/sequential_prusa_000.svg | 54 - .../data/sequential_prusa_001.svg | 51 - .../data/sequential_prusa_002.svg | 27 - src/libseqarrange/data/sequential_test_4.svg | 16 - src/libseqarrange/data/sequential_test_5.svg | 18 - src/libseqarrange/data/sequential_test_6.svg | 16 - src/libseqarrange/data/sequential_test_7.svg | 42 - src/libseqarrange/include/seq_interface.hpp | 88 +- src/libseqarrange/include/seq_preprocess.hpp | 1 + src/libseqarrange/include/seq_sequential.hpp | 150 +- src/libseqarrange/include/seq_step | 1 - src/libseqarrange/include/seq_version.hpp | 2 +- src/libseqarrange/include/seq_version.sh | 7 - .../printers/printer_geometry.mk3s.txt | 31 - .../printer_geometry.mk4.compatibility.txt | 43 - .../printers/printer_geometry.mk4.txt | 45 - src/libseqarrange/src/seq_interface.cpp | 119 + src/libseqarrange/src/seq_preprocess.cpp | 15 +- src/libseqarrange/src/seq_sequential.cpp | 7 - src/libseqarrange/src/seq_utilities.cpp | 1 + .../src/sequential_decimator.cpp | 2 +- src/libseqarrange/src/sequential_prusa.cpp | 2 +- src/libseqarrange/test/seq_test_interface.cpp | 7 +- src/libseqarrange/test/seq_test_polygon.cpp | 2 +- .../test/seq_test_preprocess.cpp | 2 +- .../test/seq_test_sequential.cpp | 14 +- 89 files changed, 232 insertions(+), 26232 deletions(-) delete mode 100644 src/libseqarrange/data/arrange_data_export.txt delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.1 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.10 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.11 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.12 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.13 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.14 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.15 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.16 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.17 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.2 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.3 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.5 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.6 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.7 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.8 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.9 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.body.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.composed.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.fan.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.hose.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 delete mode 100644 src/libseqarrange/data/arrange_data_import.txt delete mode 100644 src/libseqarrange/data/arrange_data_import.txt.1 delete mode 100644 src/libseqarrange/data/arrange_data_import.txt.2 delete mode 100644 src/libseqarrange/data/arrange_data_import.txt.3 delete mode 100644 src/libseqarrange/data/arrange_data_import_000.txt delete mode 100644 src/libseqarrange/data/arrange_data_import_001.txt delete mode 100644 src/libseqarrange/data/arrange_data_import_002.txt delete mode 100644 src/libseqarrange/data/combo_body.txt delete mode 100644 src/libseqarrange/data/combo_fac.txt delete mode 100644 src/libseqarrange/data/combo_fan.txt delete mode 100644 src/libseqarrange/data/combo_gantry.txt delete mode 100644 src/libseqarrange/data/combo_hose.txt delete mode 100644 src/libseqarrange/data/combo_nozzle.txt delete mode 100644 src/libseqarrange/data/export.body.mk4 delete mode 100644 src/libseqarrange/data/export.composed.mk4 delete mode 100644 src/libseqarrange/data/export.fan.mk4 delete mode 100644 src/libseqarrange/data/export.gantry.mk4 delete mode 100644 src/libseqarrange/data/export.hose.mk4 delete mode 100644 src/libseqarrange/data/export.nozzle.mk4 delete mode 100644 src/libseqarrange/data/extruder_bounding_boxes.mk4.svg delete mode 100644 src/libseqarrange/data/polygon_test_10.svg delete mode 100644 src/libseqarrange/data/polygon_test_11.svg delete mode 100644 src/libseqarrange/data/polygon_test_12.svg delete mode 100644 src/libseqarrange/data/polygon_test_13.svg delete mode 100644 src/libseqarrange/data/polygon_test_14.svg delete mode 100644 src/libseqarrange/data/polygon_test_15.svg delete mode 100644 src/libseqarrange/data/polygon_test_7.svg delete mode 100644 src/libseqarrange/data/polygon_test_8.svg delete mode 100644 src/libseqarrange/data/polygon_test_9.svg delete mode 100644 src/libseqarrange/data/preprocess_test_1.svg delete mode 100644 src/libseqarrange/data/preprocess_test_2.svg delete mode 100644 src/libseqarrange/data/preprocess_test_3.svg delete mode 100644 src/libseqarrange/data/preprocess_test_4.svg delete mode 100644 src/libseqarrange/data/preprocess_test_5.svg delete mode 100644 src/libseqarrange/data/preprocess_test_6.svg delete mode 100644 src/libseqarrange/data/sequential_decimator.svg delete mode 100644 src/libseqarrange/data/sequential_prusa.svg delete mode 100644 src/libseqarrange/data/sequential_prusa_000.svg delete mode 100644 src/libseqarrange/data/sequential_prusa_001.svg delete mode 100644 src/libseqarrange/data/sequential_prusa_002.svg delete mode 100644 src/libseqarrange/data/sequential_test_4.svg delete mode 100644 src/libseqarrange/data/sequential_test_5.svg delete mode 100644 src/libseqarrange/data/sequential_test_6.svg delete mode 100644 src/libseqarrange/data/sequential_test_7.svg delete mode 100644 src/libseqarrange/include/seq_step delete mode 100644 src/libseqarrange/include/seq_version.sh delete mode 100644 src/libseqarrange/printers/printer_geometry.mk3s.txt delete mode 100644 src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt delete mode 100644 src/libseqarrange/printers/printer_geometry.mk4.txt diff --git a/src/libseqarrange/data/arrange_data_export.txt b/src/libseqarrange/data/arrange_data_export.txt deleted file mode 100644 index 3df8886cb3..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt +++ /dev/null @@ -1,300 +0,0 @@ -OBJECT_ID131 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID66 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID44 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 11999992 -POINT17000000 15999992 -POINT-17000000 15999992 -POINT-21000000 11999992 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 3999992 -POINT-21000000 3999992 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID88 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID77 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000008 -POINT17000000 16000008 -POINT-17000000 16000008 -POINT-21000000 12000008 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID120 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID99 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID151 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID162 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 12000000 -POINT24439178 16000000 -POINT-24439194 16000000 -POINT-30189590 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 12000000 -POINT26286238 14715178 -POINT24439178 16000000 -POINT-24439194 16000000 -POINT-28342532 13284822 -POINT-30189590 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 4000000 -POINT-30189590 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 4000000 -POINT-30189590 4000000 -OBJECT_ID192 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID203 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 12000002 -POINT17000000 16000002 -POINT-17000000 16000002 -POINT-21000000 12000002 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 12000002 -POINT17000000 16000002 -POINT-17000000 16000002 -POINT-21000000 12000002 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID223 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 12000000 -POINT17000004 16000000 -POINT-16999998 16000000 -POINT-20999998 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 12000000 -POINT17000004 16000000 -POINT-16999998 16000000 -POINT-20999998 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 4000000 -POINT-20999998 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 4000000 -POINT-20999998 4000000 -OBJECT_ID234 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000002 16000000 -POINT-21000002 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000002 16000000 -POINT-21000002 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000002 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000002 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.1 b/src/libseqarrange/data/arrange_data_export.txt.1 deleted file mode 100644 index 717147177a..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.1 +++ /dev/null @@ -1,280 +0,0 @@ -OBJECT_ID0 -TOTAL_HEIGHT7499881 -POLYGON_AT_HEIGHT0 -POLYGON_AT_HEIGHT2000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID1 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID2 -TOTAL_HEIGHT12500000 -POLYGON_AT_HEIGHT0 -POINT53955696 36312440 -POINT53960332 35812212 -POINT53974232 35312152 -POINT53980368 35158472 -POINT53980696 35150836 -POINT53997396 34812440 -POINT54177468 32858964 -POINT54180408 32836238 -POINT54570228 30584692 -POINT54578356 30547374 -POINT55155776 28352270 -POINT55171592 28301194 -POINT55929840 26178012 -POINT55955728 26114322 -POINT56886760 24077800 -POINT56924948 24002958 -POINT58019548 22066986 -POINT58072092 21982728 -POINT59319916 20160258 -POINT59388652 20068590 -POINT60778372 18371550 -POINT60832636 18310702 -POINT60864892 18274716 -POINT61169608 17940972 -POINT61513376 17577550 -POINT61863816 17220556 -POINT62220808 16870118 -POINT62384256 16713928 -POINT62489872 16614386 -POINT62584228 16526354 -POINT62953956 16189381 -POINT64125840 15199509 -POINT64251572 15099894 -POINT65990388 13839354 -POINT66136932 13742451 -POINT67964288 12643402 -POINT68132016 12552109 -POINT70033112 11620394 -POINT70222040 11537682 -POINT72181736 10777802 -POINT72391536 10706677 -POINT74394488 10121782 -POINT74624424 10065249 -POINT76655160 9657131 -POINT76904200 9618143 -POINT78947264 9387243 -POINT79213968 9368675 -POINT79455696 9354137 -POINT79955416 9330975 -POINT80455464 9317074 -POINT80955696 9312439 -POINT103955696 9312439 -POINT107594760 31912408 -POINT107855744 33991392 -POINT107865312 34105032 -POINT107914000 34812440 -POINT107937168 35312152 -POINT107951064 35812212 -POINT107955696 36312440 -POINT107951064 36812668 -POINT107937168 37312724 -POINT107914000 37812440 -POINT107865312 38519844 -POINT107855744 38633488 -POINT107594760 40712472 -POINT103955696 63312440 -POINT80955696 63312440 -POINT80455464 63307804 -POINT79955416 63293904 -POINT79455696 63270740 -POINT79213968 63256204 -POINT78947264 63237632 -POINT76904200 63006736 -POINT76655160 62967748 -POINT74624424 62559632 -POINT74394488 62503096 -POINT72391536 61918200 -POINT72181736 61847076 -POINT70222040 61087196 -POINT70033112 61004488 -POINT68132016 60072768 -POINT67964288 59981476 -POINT66136932 58882428 -POINT65990388 58785524 -POINT64251572 57524988 -POINT64125840 57425368 -POINT62953956 56435496 -POINT62584228 56098528 -POINT62489872 56010492 -POINT62384256 55910948 -POINT62220808 55754760 -POINT61863816 55404320 -POINT61513376 55047328 -POINT61169608 54683908 -POINT60864892 54350164 -POINT60832636 54314180 -POINT60778372 54253328 -POINT59388652 52556288 -POINT59319916 52464624 -POINT58072092 50642152 -POINT58019548 50557892 -POINT56924948 48621916 -POINT56886760 48547076 -POINT55955728 46510556 -POINT55929840 46446864 -POINT55171592 44323684 -POINT55155776 44272608 -POINT54578356 42077504 -POINT54570228 42040184 -POINT54180408 39788640 -POINT54177468 39765916 -POINT53997396 37812440 -POINT53980696 37474040 -POINT53980368 37466408 -POINT53974232 37312724 -POINT53960332 36812668 -POLYGON_AT_HEIGHT2000000 -POINT53955696 36312440 -POINT53960332 35812212 -POINT53974232 35312152 -POINT53980368 35158472 -POINT53997396 34812440 -POINT54177468 32858964 -POINT54179940 32839874 -POINT54242780 32475990 -POINT54570228 30584692 -POINT54577056 30553344 -POINT54670744 30196158 -POINT55155776 28352270 -POINT55169064 28309366 -POINT55292912 27961484 -POINT55929840 26178012 -POINT55951584 26124514 -POINT56104692 25788478 -POINT56886760 24077800 -POINT56918840 24014932 -POINT57100088 23693204 -POINT58019548 22066986 -POINT58063684 21996208 -POINT58271744 21691132 -POINT59319916 20160258 -POINT59377656 20083258 -POINT60778372 18371550 -POINT60832636 18310702 -POINT61169608 17940972 -POINT61513376 17577550 -POINT61863816 17220556 -POINT62220808 16870118 -POINT62384256 16713928 -POINT62584228 16526354 -POINT62953956 16189381 -POINT64125840 15199509 -POINT64231452 15115832 -POINT64529784 14898207 -POINT65990388 13839354 -POINT66113488 13757956 -POINT66429308 13566603 -POINT67964288 12643402 -POINT68105176 12566715 -POINT68436192 12403034 -POINT70033112 11620394 -POINT70191808 11550916 -POINT70535592 11416101 -POINT72181736 10777802 -POINT72357960 10718057 -POINT72712008 10613093 -POINT74394488 10121782 -POINT74587640 10074294 -POINT74949352 9999949 -POINT76655160 9657131 -POINT76864352 9624381 -POINT78947264 9387243 -POINT79375120 9358983 -POINT79455696 9354137 -POINT79955416 9330975 -POINT80455464 9317074 -POINT80955696 9312439 -POINT103955696 9312439 -POINT107594760 31912408 -POINT107813992 33658752 -POINT107857280 34009576 -POINT107865312 34105032 -POINT107914000 34812440 -POINT107937168 35312152 -POINT107951064 35812212 -POINT107955696 36312440 -POINT107951064 36812668 -POINT107937168 37312724 -POINT107914000 37812440 -POINT107865312 38519844 -POINT107857280 38615304 -POINT107813992 38966124 -POINT107594760 40712472 -POINT103955696 63312440 -POINT80955696 63312440 -POINT80455464 63307804 -POINT79955416 63293904 -POINT79455696 63270740 -POINT79375120 63265896 -POINT78947264 63237632 -POINT76864352 63000500 -POINT76655160 62967748 -POINT74949352 62624932 -POINT74587640 62550588 -POINT74394488 62503096 -POINT72712008 62011784 -POINT72357960 61906824 -POINT72181736 61847076 -POINT70535592 61208780 -POINT70191808 61073964 -POINT70033112 61004488 -POINT68436192 60221844 -POINT68105176 60058164 -POINT67964288 59981476 -POINT66429308 59058272 -POINT66113488 58866924 -POINT65990388 58785524 -POINT64529784 57726672 -POINT64231452 57509048 -POINT64125840 57425368 -POINT62953956 56435496 -POINT62584228 56098528 -POINT62384256 55910948 -POINT62220808 55754760 -POINT61863816 55404320 -POINT61513376 55047328 -POINT61169608 54683908 -POINT60832636 54314180 -POINT60778372 54253328 -POINT59377656 52541624 -POINT59319916 52464624 -POINT58271744 50933748 -POINT58063684 50628668 -POINT58019548 50557892 -POINT57100088 48931676 -POINT56918840 48609944 -POINT56886760 48547076 -POINT56104692 46836400 -POINT55951584 46500368 -POINT55929840 46446864 -POINT55292912 44663396 -POINT55169064 44315512 -POINT55155776 44272608 -POINT54670744 42428720 -POINT54577056 42071532 -POINT54570228 42040184 -POINT54242780 40148888 -POINT54179940 39785004 -POINT54177468 39765916 -POINT53997396 37812440 -POINT53980368 37466408 -POINT53974232 37312724 -POINT53960332 36812668 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.10 b/src/libseqarrange/data/arrange_data_export.txt.10 deleted file mode 100644 index 5ad5c01397..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.10 +++ /dev/null @@ -1,16 +0,0 @@ -OBJECT_ID1988 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.11 b/src/libseqarrange/data/arrange_data_export.txt.11 deleted file mode 100644 index bfc7c68d08..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.11 +++ /dev/null @@ -1,54 +0,0 @@ -OBJECT_ID2107 -TOTAL_HEIGHT57960411 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-19619748 13380253 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID2130 -TOTAL_HEIGHT57960411 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-19619748 13380253 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.12 b/src/libseqarrange/data/arrange_data_export.txt.12 deleted file mode 100644 index 1f633763cc..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.12 +++ /dev/null @@ -1,27 +0,0 @@ -OBJECT_ID2107 -TOTAL_HEIGHT57960411 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-19619748 13380253 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.13 b/src/libseqarrange/data/arrange_data_export.txt.13 deleted file mode 100644 index db8c8443f3..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.13 +++ /dev/null @@ -1,12 +0,0 @@ -OBJECT_ID44 -TOTAL_HEIGHT1000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.14 b/src/libseqarrange/data/arrange_data_export.txt.14 deleted file mode 100644 index 6a91e1e626..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.14 +++ /dev/null @@ -1,16 +0,0 @@ -OBJECT_ID44 -TOTAL_HEIGHT2500000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.15 b/src/libseqarrange/data/arrange_data_export.txt.15 deleted file mode 100644 index 0dd319d2dc..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.15 +++ /dev/null @@ -1,20 +0,0 @@ -OBJECT_ID44 -TOTAL_HEIGHT18000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.16 b/src/libseqarrange/data/arrange_data_export.txt.16 deleted file mode 100644 index e2b84a008d..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.16 +++ /dev/null @@ -1,27 +0,0 @@ -OBJECT_ID44 -TOTAL_HEIGHT30000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-18333334 14666667 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.17 b/src/libseqarrange/data/arrange_data_export.txt.17 deleted file mode 100644 index 3647a91554..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.17 +++ /dev/null @@ -1,81 +0,0 @@ -OBJECT_ID44 -TOTAL_HEIGHT30000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-18333334 14666667 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID82 -TOTAL_HEIGHT30000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000008 -POINT21000000 -16000008 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000008 -POINT21000000 -16000008 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-18333334 14666667 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000008 -POINT21000000 -16000008 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000008 -POINT21000000 -16000008 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID102 -TOTAL_HEIGHT30000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-18333334 14666667 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.2 b/src/libseqarrange/data/arrange_data_export.txt.2 deleted file mode 100644 index 3fd568824a..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.2 +++ /dev/null @@ -1,1396 +0,0 @@ -OBJECT_ID0 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID1 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID2 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID3 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID4 -TOTAL_HEIGHT12500000 -POLYGON_AT_HEIGHT0 -POINT-54000000 0 -POINT-53990732 -1000457 -POINT-53962928 -2000572 -POINT-53948816 -2350650 -POINT-53948604 -2355446 -POINT-53916604 -3000000 -POINT-53795348 -4696844 -POINT-53794512 -4706410 -POINT-53539900 -7034134 -POINT-53538020 -7048414 -POINT-53182948 -9358089 -POINT-53179620 -9377002 -POINT-52725176 -11664301 -POINT-52719988 -11687739 -POINT-52167444 -13948401 -POINT-52159996 -13976229 -POINT-51510812 -16206057 -POINT-51500716 -16238113 -POINT-50756528 -18432990 -POINT-50743400 -18469088 -POINT-49906012 -20624978 -POINT-49889496 -20664906 -POINT-48960892 -22777864 -POINT-48940620 -22821386 -POINT-47922948 -24887568 -POINT-47898588 -24934426 -POINT-46794152 -26950088 -POINT-46765372 -27000000 -POINT-45576644 -28961520 -POINT-45543136 -29014180 -POINT-44272728 -30918044 -POINT-44234212 -30973128 -POINT-42884884 -32815952 -POINT-42841080 -32873116 -POINT-41415736 -34651648 -POINT-41366400 -34710528 -POINT-40246116 -36003476 -POINT-39868072 -36421652 -POINT-39812976 -36481872 -POINT-39572172 -36742936 -POINT-38884644 -37469780 -POINT-38244828 -38122608 -POINT-38183764 -38183764 -POINT-37469780 -38884644 -POINT-36742936 -39572172 -POINT-36549076 -39751288 -POINT-36481872 -39812976 -POINT-36003476 -40246116 -POINT-34784036 -41304612 -POINT-34710528 -41366400 -POINT-32953048 -42779628 -POINT-32873116 -42841080 -POINT-31059592 -44173544 -POINT-30973128 -44234212 -POINT-29107252 -45483712 -POINT-29014180 -45543136 -POINT-27099730 -46707652 -POINT-27000000 -46765372 -POINT-25040830 -47843044 -POINT-24934426 -47898588 -POINT-22934460 -48887732 -POINT-22821386 -48940620 -POINT-20784608 -49839744 -POINT-20664906 -49889496 -POINT-18595356 -50697264 -POINT-18469088 -50743400 -POINT-16370850 -51458676 -POINT-16238113 -51500716 -POINT-14115306 -52122532 -POINT-13976229 -52159996 -POINT-11833003 -52687568 -POINT-11687739 -52719988 -POINT-9528267 -53152724 -POINT-9377002 -53179620 -POINT-7205467 -53517112 -POINT-7048414 -53538020 -POINT-4869007 -53780040 -POINT-4706410 -53794512 -POINT-3000000 -53916604 -POINT-2523316 -53941012 -POINT-2355446 -53948604 -POINT-2000572 -53962928 -POINT-1000457 -53990732 -POINT-172841 -53999720 -POINT0 -54000000 -POINT46000000 -54000000 -POINT53190920 -9312667 -POINT53538020 -7048414 -POINT53544396 -6999841 -POINT53794512 -4706410 -POINT53797352 -4673873 -POINT53916604 -3000000 -POINT53948604 -2355446 -POINT53949316 -2339132 -POINT53962928 -2000572 -POINT53990732 -1000457 -POINT54000000 0 -POINT53990732 1000457 -POINT53962928 2000572 -POINT53949316 2339132 -POINT53948604 2355446 -POINT53916604 3000000 -POINT53797352 4673873 -POINT53794512 4706410 -POINT53544396 6999841 -POINT53538020 7048414 -POINT53190920 9312667 -POINT46000000 54000000 -POINT0 54000000 -POINT-172841 53999720 -POINT-1000457 53990732 -POINT-2000572 53962928 -POINT-2355446 53948604 -POINT-2523316 53941012 -POINT-3000000 53916604 -POINT-4706410 53794512 -POINT-4869007 53780040 -POINT-7048414 53538020 -POINT-7205467 53517112 -POINT-9377002 53179620 -POINT-9528267 53152724 -POINT-11687739 52719988 -POINT-11833003 52687568 -POINT-13976229 52159996 -POINT-14115306 52122532 -POINT-16238113 51500716 -POINT-16370850 51458676 -POINT-18469088 50743400 -POINT-18595356 50697264 -POINT-20664906 49889496 -POINT-20784608 49839744 -POINT-22821386 48940620 -POINT-22934460 48887732 -POINT-24934426 47898588 -POINT-25040830 47843044 -POINT-27000000 46765372 -POINT-27099730 46707652 -POINT-29014180 45543136 -POINT-29107252 45483712 -POINT-30973128 44234212 -POINT-31059592 44173544 -POINT-32873116 42841080 -POINT-32953048 42779628 -POINT-34710528 41366400 -POINT-34784036 41304612 -POINT-36003476 40246116 -POINT-36481872 39812976 -POINT-36549076 39751288 -POINT-36742936 39572172 -POINT-37469780 38884644 -POINT-38183764 38183764 -POINT-38244828 38122608 -POINT-38884644 37469780 -POINT-39572172 36742936 -POINT-39812976 36481872 -POINT-39868072 36421652 -POINT-40246116 36003476 -POINT-41366400 34710528 -POINT-41415736 34651648 -POINT-42841080 32873116 -POINT-42884884 32815952 -POINT-44234212 30973128 -POINT-44272728 30918044 -POINT-45543136 29014180 -POINT-45576644 28961520 -POINT-46765372 27000000 -POINT-46794152 26950088 -POINT-47898588 24934426 -POINT-47922948 24887568 -POINT-48940620 22821386 -POINT-48960892 22777864 -POINT-49889496 20664906 -POINT-49906012 20624978 -POINT-50743400 18469088 -POINT-50756528 18432990 -POINT-51500716 16238113 -POINT-51510812 16206057 -POINT-52159996 13976229 -POINT-52167444 13948401 -POINT-52719988 11687739 -POINT-52725176 11664301 -POINT-53179620 9377002 -POINT-53182948 9358089 -POINT-53538020 7048414 -POINT-53539900 7034134 -POINT-53794512 4706410 -POINT-53795348 4696844 -POINT-53916604 3000000 -POINT-53948604 2355446 -POINT-53948816 2350650 -POINT-53962928 2000572 -POINT-53990732 1000457 -POLYGON_AT_HEIGHT2000000 -POINT-54000000 0 -POINT-53990732 -1000457 -POINT-53962928 -2000572 -POINT-53948816 -2350650 -POINT-53916604 -3000000 -POINT-53795348 -4696844 -POINT-53794648 -4704879 -POINT-53753776 -5078846 -POINT-53539900 -7034134 -POINT-53538324 -7046129 -POINT-53481208 -7417962 -POINT-53182948 -9358089 -POINT-53180152 -9373976 -POINT-53106908 -9742970 -POINT-52725176 -11664301 -POINT-52720816 -11683990 -POINT-52631580 -12049445 -POINT-52167444 -13948401 -POINT-52161188 -13971776 -POINT-52056124 -14333001 -POINT-51510812 -16206057 -POINT-51502332 -16232985 -POINT-51381644 -16589294 -POINT-50756528 -18432990 -POINT-50745504 -18463312 -POINT-50609416 -18814030 -POINT-49906012 -20624978 -POINT-49892140 -20658518 -POINT-49740920 -21002980 -POINT-48960892 -22777864 -POINT-48943864 -22814422 -POINT-48777796 -23151976 -POINT-47922948 -24887568 -POINT-47902484 -24926928 -POINT-47721880 -25256932 -POINT-46794152 -26950088 -POINT-46769976 -26992014 -POINT-46575176 -27313842 -POINT-45576644 -28961520 -POINT-45548496 -29005754 -POINT-45339872 -29318798 -POINT-44272728 -30918044 -POINT-44240376 -30964314 -POINT-44018320 -31267978 -POINT-42884884 -32815952 -POINT-42848088 -32863968 -POINT-42613024 -33157680 -POINT-41415736 -34651648 -POINT-41374296 -34701108 -POINT-40619544 -35572496 -POINT-40246116 -36003476 -POINT-39868072 -36421652 -POINT-39572172 -36742936 -POINT-38884644 -37469780 -POINT-38244828 -38122608 -POINT-38183764 -38183764 -POINT-37469780 -38884644 -POINT-36742936 -39572172 -POINT-36549076 -39751288 -POINT-36003476 -40246116 -POINT-34784036 -41304612 -POINT-34722292 -41356516 -POINT-34429332 -41592516 -POINT-32953048 -42779628 -POINT-32885906 -42831248 -POINT-32582950 -43054276 -POINT-31059592 -44173544 -POINT-30986962 -44224504 -POINT-30674588 -44434132 -POINT-29107252 -45483712 -POINT-29029072 -45533632 -POINT-28707866 -45729456 -POINT-27099730 -46707652 -POINT-27015956 -46756136 -POINT-26686534 -46937800 -POINT-25040830 -47843044 -POINT-24951450 -47889700 -POINT-24614432 -48056852 -POINT-22934460 -48887732 -POINT-22839478 -48932160 -POINT-22495502 -49084480 -POINT-20784608 -49839744 -POINT-20684058 -49881536 -POINT-20333778 -50018736 -POINT-18595356 -50697264 -POINT-18489290 -50736020 -POINT-18133370 -50857844 -POINT-16370850 -51458676 -POINT-16259352 -51493992 -POINT-15898464 -51600208 -POINT-14115306 -52122532 -POINT-13998481 -52154004 -POINT-13633312 -52244408 -POINT-11833003 -52687568 -POINT-11710981 -52714800 -POINT-11342224 -52789224 -POINT-9528267 -53152724 -POINT-9401204 -53175316 -POINT-9029556 -53233620 -POINT-7205467 -53517112 -POINT-7073542 -53534676 -POINT-6699709 -53576744 -POINT-4869007 -53780040 -POINT-4732425 -53792200 -POINT-3568803 -53875908 -POINT-3000000 -53916604 -POINT-2523316 -53941012 -POINT-2000572 -53962928 -POINT-1000457 -53990732 -POINT-172841 -53999720 -POINT0 -54000000 -POINT46000000 -54000000 -POINT53190920 -9312667 -POINT53482488 -7410694 -POINT53539040 -7040642 -POINT53544396 -6999841 -POINT53754492 -5073359 -POINT53794968 -4701204 -POINT53797352 -4673873 -POINT53916604 -3000000 -POINT53949316 -2339132 -POINT53962928 -2000572 -POINT53990732 -1000457 -POINT54000000 0 -POINT53990732 1000457 -POINT53962928 2000572 -POINT53949316 2339132 -POINT53916604 3000000 -POINT53797352 4673873 -POINT53794968 4701204 -POINT53754492 5073359 -POINT53544396 6999841 -POINT53539040 7040642 -POINT53482488 7410694 -POINT53190920 9312667 -POINT46000000 54000000 -POINT0 54000000 -POINT-172841 53999720 -POINT-1000457 53990732 -POINT-2000572 53962928 -POINT-2523316 53941012 -POINT-3000000 53916604 -POINT-3568803 53875908 -POINT-4732425 53792200 -POINT-4869007 53780040 -POINT-6699709 53576744 -POINT-7073542 53534676 -POINT-7205467 53517112 -POINT-9029556 53233620 -POINT-9401204 53175316 -POINT-9528267 53152724 -POINT-11342224 52789224 -POINT-11710981 52714800 -POINT-11833003 52687568 -POINT-13633312 52244408 -POINT-13998481 52154004 -POINT-14115306 52122532 -POINT-15898464 51600208 -POINT-16259352 51493992 -POINT-16370850 51458676 -POINT-18133370 50857844 -POINT-18489290 50736020 -POINT-18595356 50697264 -POINT-20333778 50018736 -POINT-20684058 49881536 -POINT-20784608 49839744 -POINT-22495502 49084480 -POINT-22839478 48932160 -POINT-22934460 48887732 -POINT-24614432 48056852 -POINT-24951450 47889700 -POINT-25040830 47843044 -POINT-26686534 46937800 -POINT-27015956 46756136 -POINT-27099730 46707652 -POINT-28707866 45729456 -POINT-29029072 45533632 -POINT-29107252 45483712 -POINT-30674588 44434132 -POINT-30986962 44224504 -POINT-31059592 44173544 -POINT-32582950 43054276 -POINT-32885906 42831248 -POINT-32953048 42779628 -POINT-34429332 41592516 -POINT-34722292 41356516 -POINT-34784036 41304612 -POINT-36003476 40246116 -POINT-36549076 39751288 -POINT-36742936 39572172 -POINT-37469780 38884644 -POINT-38183764 38183764 -POINT-38244828 38122608 -POINT-38884644 37469780 -POINT-39572172 36742936 -POINT-39868072 36421652 -POINT-40246116 36003476 -POINT-40619544 35572496 -POINT-41374296 34701108 -POINT-41415736 34651648 -POINT-42613024 33157680 -POINT-42848088 32863968 -POINT-42884884 32815952 -POINT-44018320 31267978 -POINT-44240376 30964314 -POINT-44272728 30918044 -POINT-45339872 29318798 -POINT-45548496 29005754 -POINT-45576644 28961520 -POINT-46575176 27313842 -POINT-46769976 26992014 -POINT-46794152 26950088 -POINT-47721880 25256932 -POINT-47902484 24926928 -POINT-47922948 24887568 -POINT-48777796 23151976 -POINT-48943864 22814422 -POINT-48960892 22777864 -POINT-49740920 21002980 -POINT-49892140 20658518 -POINT-49906012 20624978 -POINT-50609416 18814030 -POINT-50745504 18463312 -POINT-50756528 18432990 -POINT-51381644 16589294 -POINT-51502332 16232985 -POINT-51510812 16206057 -POINT-52056124 14333001 -POINT-52161188 13971776 -POINT-52167444 13948401 -POINT-52631580 12049445 -POINT-52720816 11683990 -POINT-52725176 11664301 -POINT-53106908 9742970 -POINT-53180152 9373976 -POINT-53182948 9358089 -POINT-53481208 7417962 -POINT-53538324 7046129 -POINT-53539900 7034134 -POINT-53753776 5078846 -POINT-53794648 4704879 -POINT-53795348 4696844 -POINT-53916604 3000000 -POINT-53948816 2350650 -POINT-53962928 2000572 -POINT-53990732 1000457 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID5 -TOTAL_HEIGHT12500000 -POLYGON_AT_HEIGHT0 -POINT-54000000 0 -POINT-53990732 -1000457 -POINT-53962928 -2000572 -POINT-53948816 -2350650 -POINT-53948604 -2355446 -POINT-53916604 -3000000 -POINT-53795348 -4696844 -POINT-53794512 -4706410 -POINT-53539900 -7034134 -POINT-53538020 -7048414 -POINT-53182948 -9358089 -POINT-53179620 -9377002 -POINT-52725176 -11664301 -POINT-52719988 -11687739 -POINT-52167444 -13948401 -POINT-52159996 -13976229 -POINT-51510812 -16206057 -POINT-51500716 -16238113 -POINT-50756528 -18432990 -POINT-50743400 -18469088 -POINT-49906012 -20624978 -POINT-49889496 -20664906 -POINT-48960892 -22777864 -POINT-48940620 -22821386 -POINT-47922948 -24887568 -POINT-47898588 -24934426 -POINT-46794152 -26950088 -POINT-46765372 -27000000 -POINT-45576644 -28961520 -POINT-45543136 -29014180 -POINT-44272728 -30918044 -POINT-44234212 -30973128 -POINT-42884884 -32815952 -POINT-42841080 -32873116 -POINT-41415736 -34651648 -POINT-41366400 -34710528 -POINT-40246116 -36003476 -POINT-39868072 -36421652 -POINT-39812976 -36481872 -POINT-39572172 -36742936 -POINT-38884644 -37469780 -POINT-38244828 -38122608 -POINT-38183764 -38183764 -POINT-37469780 -38884644 -POINT-36742936 -39572172 -POINT-36549076 -39751288 -POINT-36481872 -39812976 -POINT-36003476 -40246116 -POINT-34784036 -41304612 -POINT-34710528 -41366400 -POINT-32953048 -42779628 -POINT-32873116 -42841080 -POINT-31059592 -44173544 -POINT-30973128 -44234212 -POINT-29107252 -45483712 -POINT-29014180 -45543136 -POINT-27099730 -46707652 -POINT-27000000 -46765372 -POINT-25040830 -47843044 -POINT-24934426 -47898588 -POINT-22934460 -48887732 -POINT-22821386 -48940620 -POINT-20784608 -49839744 -POINT-20664906 -49889496 -POINT-18595356 -50697264 -POINT-18469088 -50743400 -POINT-16370850 -51458676 -POINT-16238113 -51500716 -POINT-14115306 -52122532 -POINT-13976229 -52159996 -POINT-11833003 -52687568 -POINT-11687739 -52719988 -POINT-9528267 -53152724 -POINT-9377002 -53179620 -POINT-7205467 -53517112 -POINT-7048414 -53538020 -POINT-4869007 -53780040 -POINT-4706410 -53794512 -POINT-3000000 -53916604 -POINT-2523316 -53941012 -POINT-2355446 -53948604 -POINT-2000572 -53962928 -POINT-1000457 -53990732 -POINT-172841 -53999720 -POINT0 -54000000 -POINT46000000 -54000000 -POINT53190920 -9312667 -POINT53538020 -7048414 -POINT53544396 -6999841 -POINT53794512 -4706410 -POINT53797352 -4673873 -POINT53916604 -3000000 -POINT53948604 -2355446 -POINT53949316 -2339132 -POINT53962928 -2000572 -POINT53990732 -1000457 -POINT54000000 0 -POINT53990732 1000457 -POINT53962928 2000572 -POINT53949316 2339132 -POINT53948604 2355446 -POINT53916604 3000000 -POINT53797352 4673873 -POINT53794512 4706410 -POINT53544396 6999841 -POINT53538020 7048414 -POINT53190920 9312667 -POINT46000000 54000000 -POINT0 54000000 -POINT-172841 53999720 -POINT-1000457 53990732 -POINT-2000572 53962928 -POINT-2355446 53948604 -POINT-2523316 53941012 -POINT-3000000 53916604 -POINT-4706410 53794512 -POINT-4869007 53780040 -POINT-7048414 53538020 -POINT-7205467 53517112 -POINT-9377002 53179620 -POINT-9528267 53152724 -POINT-11687739 52719988 -POINT-11833003 52687568 -POINT-13976229 52159996 -POINT-14115306 52122532 -POINT-16238113 51500716 -POINT-16370850 51458676 -POINT-18469088 50743400 -POINT-18595356 50697264 -POINT-20664906 49889496 -POINT-20784608 49839744 -POINT-22821386 48940620 -POINT-22934460 48887732 -POINT-24934426 47898588 -POINT-25040830 47843044 -POINT-27000000 46765372 -POINT-27099730 46707652 -POINT-29014180 45543136 -POINT-29107252 45483712 -POINT-30973128 44234212 -POINT-31059592 44173544 -POINT-32873116 42841080 -POINT-32953048 42779628 -POINT-34710528 41366400 -POINT-34784036 41304612 -POINT-36003476 40246116 -POINT-36481872 39812976 -POINT-36549076 39751288 -POINT-36742936 39572172 -POINT-37469780 38884644 -POINT-38183764 38183764 -POINT-38244828 38122608 -POINT-38884644 37469780 -POINT-39572172 36742936 -POINT-39812976 36481872 -POINT-39868072 36421652 -POINT-40246116 36003476 -POINT-41366400 34710528 -POINT-41415736 34651648 -POINT-42841080 32873116 -POINT-42884884 32815952 -POINT-44234212 30973128 -POINT-44272728 30918044 -POINT-45543136 29014180 -POINT-45576644 28961520 -POINT-46765372 27000000 -POINT-46794152 26950088 -POINT-47898588 24934426 -POINT-47922948 24887568 -POINT-48940620 22821386 -POINT-48960892 22777864 -POINT-49889496 20664906 -POINT-49906012 20624978 -POINT-50743400 18469088 -POINT-50756528 18432990 -POINT-51500716 16238113 -POINT-51510812 16206057 -POINT-52159996 13976229 -POINT-52167444 13948401 -POINT-52719988 11687739 -POINT-52725176 11664301 -POINT-53179620 9377002 -POINT-53182948 9358089 -POINT-53538020 7048414 -POINT-53539900 7034134 -POINT-53794512 4706410 -POINT-53795348 4696844 -POINT-53916604 3000000 -POINT-53948604 2355446 -POINT-53948816 2350650 -POINT-53962928 2000572 -POINT-53990732 1000457 -POLYGON_AT_HEIGHT2000000 -POINT-54000000 0 -POINT-53990732 -1000457 -POINT-53962928 -2000572 -POINT-53948816 -2350650 -POINT-53916604 -3000000 -POINT-53795348 -4696844 -POINT-53794648 -4704879 -POINT-53753776 -5078846 -POINT-53539900 -7034134 -POINT-53538324 -7046129 -POINT-53481208 -7417962 -POINT-53182948 -9358089 -POINT-53180152 -9373976 -POINT-53106908 -9742970 -POINT-52725176 -11664301 -POINT-52720816 -11683990 -POINT-52631580 -12049445 -POINT-52167444 -13948401 -POINT-52161188 -13971776 -POINT-52056124 -14333001 -POINT-51510812 -16206057 -POINT-51502332 -16232985 -POINT-51381644 -16589294 -POINT-50756528 -18432990 -POINT-50745504 -18463312 -POINT-50609416 -18814030 -POINT-49906012 -20624978 -POINT-49892140 -20658518 -POINT-49740920 -21002980 -POINT-48960892 -22777864 -POINT-48943864 -22814422 -POINT-48777796 -23151976 -POINT-47922948 -24887568 -POINT-47902484 -24926928 -POINT-47721880 -25256932 -POINT-46794152 -26950088 -POINT-46769976 -26992014 -POINT-46575176 -27313842 -POINT-45576644 -28961520 -POINT-45548496 -29005754 -POINT-45339872 -29318798 -POINT-44272728 -30918044 -POINT-44240376 -30964314 -POINT-44018320 -31267978 -POINT-42884884 -32815952 -POINT-42848088 -32863968 -POINT-42613024 -33157680 -POINT-41415736 -34651648 -POINT-41374296 -34701108 -POINT-40619544 -35572496 -POINT-40246116 -36003476 -POINT-39868072 -36421652 -POINT-39572172 -36742936 -POINT-38884644 -37469780 -POINT-38244828 -38122608 -POINT-38183764 -38183764 -POINT-37469780 -38884644 -POINT-36742936 -39572172 -POINT-36549076 -39751288 -POINT-36003476 -40246116 -POINT-34784036 -41304612 -POINT-34722292 -41356516 -POINT-34429332 -41592516 -POINT-32953048 -42779628 -POINT-32885906 -42831248 -POINT-32582950 -43054276 -POINT-31059592 -44173544 -POINT-30986962 -44224504 -POINT-30674588 -44434132 -POINT-29107252 -45483712 -POINT-29029072 -45533632 -POINT-28707866 -45729456 -POINT-27099730 -46707652 -POINT-27015956 -46756136 -POINT-26686534 -46937800 -POINT-25040830 -47843044 -POINT-24951450 -47889700 -POINT-24614432 -48056852 -POINT-22934460 -48887732 -POINT-22839478 -48932160 -POINT-22495502 -49084480 -POINT-20784608 -49839744 -POINT-20684058 -49881536 -POINT-20333778 -50018736 -POINT-18595356 -50697264 -POINT-18489290 -50736020 -POINT-18133370 -50857844 -POINT-16370850 -51458676 -POINT-16259352 -51493992 -POINT-15898464 -51600208 -POINT-14115306 -52122532 -POINT-13998481 -52154004 -POINT-13633312 -52244408 -POINT-11833003 -52687568 -POINT-11710981 -52714800 -POINT-11342224 -52789224 -POINT-9528267 -53152724 -POINT-9401204 -53175316 -POINT-9029556 -53233620 -POINT-7205467 -53517112 -POINT-7073542 -53534676 -POINT-6699709 -53576744 -POINT-4869007 -53780040 -POINT-4732425 -53792200 -POINT-3568803 -53875908 -POINT-3000000 -53916604 -POINT-2523316 -53941012 -POINT-2000572 -53962928 -POINT-1000457 -53990732 -POINT-172841 -53999720 -POINT0 -54000000 -POINT46000000 -54000000 -POINT53190920 -9312667 -POINT53482488 -7410694 -POINT53539040 -7040642 -POINT53544396 -6999841 -POINT53754492 -5073359 -POINT53794968 -4701204 -POINT53797352 -4673873 -POINT53916604 -3000000 -POINT53949316 -2339132 -POINT53962928 -2000572 -POINT53990732 -1000457 -POINT54000000 0 -POINT53990732 1000457 -POINT53962928 2000572 -POINT53949316 2339132 -POINT53916604 3000000 -POINT53797352 4673873 -POINT53794968 4701204 -POINT53754492 5073359 -POINT53544396 6999841 -POINT53539040 7040642 -POINT53482488 7410694 -POINT53190920 9312667 -POINT46000000 54000000 -POINT0 54000000 -POINT-172841 53999720 -POINT-1000457 53990732 -POINT-2000572 53962928 -POINT-2523316 53941012 -POINT-3000000 53916604 -POINT-3568803 53875908 -POINT-4732425 53792200 -POINT-4869007 53780040 -POINT-6699709 53576744 -POINT-7073542 53534676 -POINT-7205467 53517112 -POINT-9029556 53233620 -POINT-9401204 53175316 -POINT-9528267 53152724 -POINT-11342224 52789224 -POINT-11710981 52714800 -POINT-11833003 52687568 -POINT-13633312 52244408 -POINT-13998481 52154004 -POINT-14115306 52122532 -POINT-15898464 51600208 -POINT-16259352 51493992 -POINT-16370850 51458676 -POINT-18133370 50857844 -POINT-18489290 50736020 -POINT-18595356 50697264 -POINT-20333778 50018736 -POINT-20684058 49881536 -POINT-20784608 49839744 -POINT-22495502 49084480 -POINT-22839478 48932160 -POINT-22934460 48887732 -POINT-24614432 48056852 -POINT-24951450 47889700 -POINT-25040830 47843044 -POINT-26686534 46937800 -POINT-27015956 46756136 -POINT-27099730 46707652 -POINT-28707866 45729456 -POINT-29029072 45533632 -POINT-29107252 45483712 -POINT-30674588 44434132 -POINT-30986962 44224504 -POINT-31059592 44173544 -POINT-32582950 43054276 -POINT-32885906 42831248 -POINT-32953048 42779628 -POINT-34429332 41592516 -POINT-34722292 41356516 -POINT-34784036 41304612 -POINT-36003476 40246116 -POINT-36549076 39751288 -POINT-36742936 39572172 -POINT-37469780 38884644 -POINT-38183764 38183764 -POINT-38244828 38122608 -POINT-38884644 37469780 -POINT-39572172 36742936 -POINT-39868072 36421652 -POINT-40246116 36003476 -POINT-40619544 35572496 -POINT-41374296 34701108 -POINT-41415736 34651648 -POINT-42613024 33157680 -POINT-42848088 32863968 -POINT-42884884 32815952 -POINT-44018320 31267978 -POINT-44240376 30964314 -POINT-44272728 30918044 -POINT-45339872 29318798 -POINT-45548496 29005754 -POINT-45576644 28961520 -POINT-46575176 27313842 -POINT-46769976 26992014 -POINT-46794152 26950088 -POINT-47721880 25256932 -POINT-47902484 24926928 -POINT-47922948 24887568 -POINT-48777796 23151976 -POINT-48943864 22814422 -POINT-48960892 22777864 -POINT-49740920 21002980 -POINT-49892140 20658518 -POINT-49906012 20624978 -POINT-50609416 18814030 -POINT-50745504 18463312 -POINT-50756528 18432990 -POINT-51381644 16589294 -POINT-51502332 16232985 -POINT-51510812 16206057 -POINT-52056124 14333001 -POINT-52161188 13971776 -POINT-52167444 13948401 -POINT-52631580 12049445 -POINT-52720816 11683990 -POINT-52725176 11664301 -POINT-53106908 9742970 -POINT-53180152 9373976 -POINT-53182948 9358089 -POINT-53481208 7417962 -POINT-53538324 7046129 -POINT-53539900 7034134 -POINT-53753776 5078846 -POINT-53794648 4704879 -POINT-53795348 4696844 -POINT-53916604 3000000 -POINT-53948816 2350650 -POINT-53962928 2000572 -POINT-53990732 1000457 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID6 -TOTAL_HEIGHT12500000 -POLYGON_AT_HEIGHT0 -POINT-54000000 0 -POINT-53990732 -1000457 -POINT-53962928 -2000572 -POINT-53948816 -2350650 -POINT-53948604 -2355446 -POINT-53916604 -3000000 -POINT-53795348 -4696844 -POINT-53794512 -4706410 -POINT-53539900 -7034134 -POINT-53538020 -7048414 -POINT-53182948 -9358089 -POINT-53179620 -9377002 -POINT-52725176 -11664301 -POINT-52719988 -11687739 -POINT-52167444 -13948401 -POINT-52159996 -13976229 -POINT-51510812 -16206057 -POINT-51500716 -16238113 -POINT-50756528 -18432990 -POINT-50743400 -18469088 -POINT-49906012 -20624978 -POINT-49889496 -20664906 -POINT-48960892 -22777864 -POINT-48940620 -22821386 -POINT-47922948 -24887568 -POINT-47898588 -24934426 -POINT-46794152 -26950088 -POINT-46765372 -27000000 -POINT-45576644 -28961520 -POINT-45543136 -29014180 -POINT-44272728 -30918044 -POINT-44234212 -30973128 -POINT-42884884 -32815952 -POINT-42841080 -32873116 -POINT-41415736 -34651648 -POINT-41366400 -34710528 -POINT-40246116 -36003476 -POINT-39868072 -36421652 -POINT-39812976 -36481872 -POINT-39572172 -36742936 -POINT-38884644 -37469780 -POINT-38244828 -38122608 -POINT-38183764 -38183764 -POINT-37469780 -38884644 -POINT-36742936 -39572172 -POINT-36549076 -39751288 -POINT-36481872 -39812976 -POINT-36003476 -40246116 -POINT-34784036 -41304612 -POINT-34710528 -41366400 -POINT-32953048 -42779628 -POINT-32873116 -42841080 -POINT-31059592 -44173544 -POINT-30973128 -44234212 -POINT-29107252 -45483712 -POINT-29014180 -45543136 -POINT-27099730 -46707652 -POINT-27000000 -46765372 -POINT-25040830 -47843044 -POINT-24934426 -47898588 -POINT-22934460 -48887732 -POINT-22821386 -48940620 -POINT-20784608 -49839744 -POINT-20664906 -49889496 -POINT-18595356 -50697264 -POINT-18469088 -50743400 -POINT-16370850 -51458676 -POINT-16238113 -51500716 -POINT-14115306 -52122532 -POINT-13976229 -52159996 -POINT-11833003 -52687568 -POINT-11687739 -52719988 -POINT-9528267 -53152724 -POINT-9377002 -53179620 -POINT-7205467 -53517112 -POINT-7048414 -53538020 -POINT-4869007 -53780040 -POINT-4706410 -53794512 -POINT-3000000 -53916604 -POINT-2523316 -53941012 -POINT-2355446 -53948604 -POINT-2000572 -53962928 -POINT-1000457 -53990732 -POINT-172841 -53999720 -POINT0 -54000000 -POINT46000000 -54000000 -POINT53190920 -9312667 -POINT53538020 -7048414 -POINT53544396 -6999841 -POINT53794512 -4706410 -POINT53797352 -4673873 -POINT53916604 -3000000 -POINT53948604 -2355446 -POINT53949316 -2339132 -POINT53962928 -2000572 -POINT53990732 -1000457 -POINT54000000 0 -POINT53990732 1000457 -POINT53962928 2000572 -POINT53949316 2339132 -POINT53948604 2355446 -POINT53916604 3000000 -POINT53797352 4673873 -POINT53794512 4706410 -POINT53544396 6999841 -POINT53538020 7048414 -POINT53190920 9312667 -POINT46000000 54000000 -POINT0 54000000 -POINT-172841 53999720 -POINT-1000457 53990732 -POINT-2000572 53962928 -POINT-2355446 53948604 -POINT-2523316 53941012 -POINT-3000000 53916604 -POINT-4706410 53794512 -POINT-4869007 53780040 -POINT-7048414 53538020 -POINT-7205467 53517112 -POINT-9377002 53179620 -POINT-9528267 53152724 -POINT-11687739 52719988 -POINT-11833003 52687568 -POINT-13976229 52159996 -POINT-14115306 52122532 -POINT-16238113 51500716 -POINT-16370850 51458676 -POINT-18469088 50743400 -POINT-18595356 50697264 -POINT-20664906 49889496 -POINT-20784608 49839744 -POINT-22821386 48940620 -POINT-22934460 48887732 -POINT-24934426 47898588 -POINT-25040830 47843044 -POINT-27000000 46765372 -POINT-27099730 46707652 -POINT-29014180 45543136 -POINT-29107252 45483712 -POINT-30973128 44234212 -POINT-31059592 44173544 -POINT-32873116 42841080 -POINT-32953048 42779628 -POINT-34710528 41366400 -POINT-34784036 41304612 -POINT-36003476 40246116 -POINT-36481872 39812976 -POINT-36549076 39751288 -POINT-36742936 39572172 -POINT-37469780 38884644 -POINT-38183764 38183764 -POINT-38244828 38122608 -POINT-38884644 37469780 -POINT-39572172 36742936 -POINT-39812976 36481872 -POINT-39868072 36421652 -POINT-40246116 36003476 -POINT-41366400 34710528 -POINT-41415736 34651648 -POINT-42841080 32873116 -POINT-42884884 32815952 -POINT-44234212 30973128 -POINT-44272728 30918044 -POINT-45543136 29014180 -POINT-45576644 28961520 -POINT-46765372 27000000 -POINT-46794152 26950088 -POINT-47898588 24934426 -POINT-47922948 24887568 -POINT-48940620 22821386 -POINT-48960892 22777864 -POINT-49889496 20664906 -POINT-49906012 20624978 -POINT-50743400 18469088 -POINT-50756528 18432990 -POINT-51500716 16238113 -POINT-51510812 16206057 -POINT-52159996 13976229 -POINT-52167444 13948401 -POINT-52719988 11687739 -POINT-52725176 11664301 -POINT-53179620 9377002 -POINT-53182948 9358089 -POINT-53538020 7048414 -POINT-53539900 7034134 -POINT-53794512 4706410 -POINT-53795348 4696844 -POINT-53916604 3000000 -POINT-53948604 2355446 -POINT-53948816 2350650 -POINT-53962928 2000572 -POINT-53990732 1000457 -POLYGON_AT_HEIGHT2000000 -POINT-54000000 0 -POINT-53990732 -1000457 -POINT-53962928 -2000572 -POINT-53948816 -2350650 -POINT-53916604 -3000000 -POINT-53795348 -4696844 -POINT-53794648 -4704879 -POINT-53753776 -5078846 -POINT-53539900 -7034134 -POINT-53538324 -7046129 -POINT-53481208 -7417962 -POINT-53182948 -9358089 -POINT-53180152 -9373976 -POINT-53106908 -9742970 -POINT-52725176 -11664301 -POINT-52720816 -11683990 -POINT-52631580 -12049445 -POINT-52167444 -13948401 -POINT-52161188 -13971776 -POINT-52056124 -14333001 -POINT-51510812 -16206057 -POINT-51502332 -16232985 -POINT-51381644 -16589294 -POINT-50756528 -18432990 -POINT-50745504 -18463312 -POINT-50609416 -18814030 -POINT-49906012 -20624978 -POINT-49892140 -20658518 -POINT-49740920 -21002980 -POINT-48960892 -22777864 -POINT-48943864 -22814422 -POINT-48777796 -23151976 -POINT-47922948 -24887568 -POINT-47902484 -24926928 -POINT-47721880 -25256932 -POINT-46794152 -26950088 -POINT-46769976 -26992014 -POINT-46575176 -27313842 -POINT-45576644 -28961520 -POINT-45548496 -29005754 -POINT-45339872 -29318798 -POINT-44272728 -30918044 -POINT-44240376 -30964314 -POINT-44018320 -31267978 -POINT-42884884 -32815952 -POINT-42848088 -32863968 -POINT-42613024 -33157680 -POINT-41415736 -34651648 -POINT-41374296 -34701108 -POINT-40619544 -35572496 -POINT-40246116 -36003476 -POINT-39868072 -36421652 -POINT-39572172 -36742936 -POINT-38884644 -37469780 -POINT-38244828 -38122608 -POINT-38183764 -38183764 -POINT-37469780 -38884644 -POINT-36742936 -39572172 -POINT-36549076 -39751288 -POINT-36003476 -40246116 -POINT-34784036 -41304612 -POINT-34722292 -41356516 -POINT-34429332 -41592516 -POINT-32953048 -42779628 -POINT-32885906 -42831248 -POINT-32582950 -43054276 -POINT-31059592 -44173544 -POINT-30986962 -44224504 -POINT-30674588 -44434132 -POINT-29107252 -45483712 -POINT-29029072 -45533632 -POINT-28707866 -45729456 -POINT-27099730 -46707652 -POINT-27015956 -46756136 -POINT-26686534 -46937800 -POINT-25040830 -47843044 -POINT-24951450 -47889700 -POINT-24614432 -48056852 -POINT-22934460 -48887732 -POINT-22839478 -48932160 -POINT-22495502 -49084480 -POINT-20784608 -49839744 -POINT-20684058 -49881536 -POINT-20333778 -50018736 -POINT-18595356 -50697264 -POINT-18489290 -50736020 -POINT-18133370 -50857844 -POINT-16370850 -51458676 -POINT-16259352 -51493992 -POINT-15898464 -51600208 -POINT-14115306 -52122532 -POINT-13998481 -52154004 -POINT-13633312 -52244408 -POINT-11833003 -52687568 -POINT-11710981 -52714800 -POINT-11342224 -52789224 -POINT-9528267 -53152724 -POINT-9401204 -53175316 -POINT-9029556 -53233620 -POINT-7205467 -53517112 -POINT-7073542 -53534676 -POINT-6699709 -53576744 -POINT-4869007 -53780040 -POINT-4732425 -53792200 -POINT-3568803 -53875908 -POINT-3000000 -53916604 -POINT-2523316 -53941012 -POINT-2000572 -53962928 -POINT-1000457 -53990732 -POINT-172841 -53999720 -POINT0 -54000000 -POINT46000000 -54000000 -POINT53190920 -9312667 -POINT53482488 -7410694 -POINT53539040 -7040642 -POINT53544396 -6999841 -POINT53754492 -5073359 -POINT53794968 -4701204 -POINT53797352 -4673873 -POINT53916604 -3000000 -POINT53949316 -2339132 -POINT53962928 -2000572 -POINT53990732 -1000457 -POINT54000000 0 -POINT53990732 1000457 -POINT53962928 2000572 -POINT53949316 2339132 -POINT53916604 3000000 -POINT53797352 4673873 -POINT53794968 4701204 -POINT53754492 5073359 -POINT53544396 6999841 -POINT53539040 7040642 -POINT53482488 7410694 -POINT53190920 9312667 -POINT46000000 54000000 -POINT0 54000000 -POINT-172841 53999720 -POINT-1000457 53990732 -POINT-2000572 53962928 -POINT-2523316 53941012 -POINT-3000000 53916604 -POINT-3568803 53875908 -POINT-4732425 53792200 -POINT-4869007 53780040 -POINT-6699709 53576744 -POINT-7073542 53534676 -POINT-7205467 53517112 -POINT-9029556 53233620 -POINT-9401204 53175316 -POINT-9528267 53152724 -POINT-11342224 52789224 -POINT-11710981 52714800 -POINT-11833003 52687568 -POINT-13633312 52244408 -POINT-13998481 52154004 -POINT-14115306 52122532 -POINT-15898464 51600208 -POINT-16259352 51493992 -POINT-16370850 51458676 -POINT-18133370 50857844 -POINT-18489290 50736020 -POINT-18595356 50697264 -POINT-20333778 50018736 -POINT-20684058 49881536 -POINT-20784608 49839744 -POINT-22495502 49084480 -POINT-22839478 48932160 -POINT-22934460 48887732 -POINT-24614432 48056852 -POINT-24951450 47889700 -POINT-25040830 47843044 -POINT-26686534 46937800 -POINT-27015956 46756136 -POINT-27099730 46707652 -POINT-28707866 45729456 -POINT-29029072 45533632 -POINT-29107252 45483712 -POINT-30674588 44434132 -POINT-30986962 44224504 -POINT-31059592 44173544 -POINT-32582950 43054276 -POINT-32885906 42831248 -POINT-32953048 42779628 -POINT-34429332 41592516 -POINT-34722292 41356516 -POINT-34784036 41304612 -POINT-36003476 40246116 -POINT-36549076 39751288 -POINT-36742936 39572172 -POINT-37469780 38884644 -POINT-38183764 38183764 -POINT-38244828 38122608 -POINT-38884644 37469780 -POINT-39572172 36742936 -POINT-39868072 36421652 -POINT-40246116 36003476 -POINT-40619544 35572496 -POINT-41374296 34701108 -POINT-41415736 34651648 -POINT-42613024 33157680 -POINT-42848088 32863968 -POINT-42884884 32815952 -POINT-44018320 31267978 -POINT-44240376 30964314 -POINT-44272728 30918044 -POINT-45339872 29318798 -POINT-45548496 29005754 -POINT-45576644 28961520 -POINT-46575176 27313842 -POINT-46769976 26992014 -POINT-46794152 26950088 -POINT-47721880 25256932 -POINT-47902484 24926928 -POINT-47922948 24887568 -POINT-48777796 23151976 -POINT-48943864 22814422 -POINT-48960892 22777864 -POINT-49740920 21002980 -POINT-49892140 20658518 -POINT-49906012 20624978 -POINT-50609416 18814030 -POINT-50745504 18463312 -POINT-50756528 18432990 -POINT-51381644 16589294 -POINT-51502332 16232985 -POINT-51510812 16206057 -POINT-52056124 14333001 -POINT-52161188 13971776 -POINT-52167444 13948401 -POINT-52631580 12049445 -POINT-52720816 11683990 -POINT-52725176 11664301 -POINT-53106908 9742970 -POINT-53180152 9373976 -POINT-53182948 9358089 -POINT-53481208 7417962 -POINT-53538324 7046129 -POINT-53539900 7034134 -POINT-53753776 5078846 -POINT-53794648 4704879 -POINT-53795348 4696844 -POINT-53916604 3000000 -POINT-53948816 2350650 -POINT-53962928 2000572 -POINT-53990732 1000457 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.3 b/src/libseqarrange/data/arrange_data_export.txt.3 deleted file mode 100644 index bcdc436975..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.3 +++ /dev/null @@ -1,64 +0,0 @@ -OBJECT_ID44 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID66 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID86 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID106 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.4 b/src/libseqarrange/data/arrange_data_export.txt.4 deleted file mode 100644 index 3df8886cb3..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.4 +++ /dev/null @@ -1,300 +0,0 @@ -OBJECT_ID131 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID66 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID44 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 11999992 -POINT17000000 15999992 -POINT-17000000 15999992 -POINT-21000000 11999992 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 3999992 -POINT-21000000 3999992 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID88 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID77 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000008 -POINT17000000 16000008 -POINT-17000000 16000008 -POINT-21000000 12000008 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID120 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID99 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID151 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID162 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 12000000 -POINT24439178 16000000 -POINT-24439194 16000000 -POINT-30189590 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 12000000 -POINT26286238 14715178 -POINT24439178 16000000 -POINT-24439194 16000000 -POINT-28342532 13284822 -POINT-30189590 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 4000000 -POINT-30189590 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 4000000 -POINT-30189590 4000000 -OBJECT_ID192 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID203 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 12000002 -POINT17000000 16000002 -POINT-17000000 16000002 -POINT-21000000 12000002 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 12000002 -POINT17000000 16000002 -POINT-17000000 16000002 -POINT-21000000 12000002 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID223 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 12000000 -POINT17000004 16000000 -POINT-16999998 16000000 -POINT-20999998 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 12000000 -POINT17000004 16000000 -POINT-16999998 16000000 -POINT-20999998 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 4000000 -POINT-20999998 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 4000000 -POINT-20999998 4000000 -OBJECT_ID234 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000002 16000000 -POINT-21000002 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000002 16000000 -POINT-21000002 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000002 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000002 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.5 b/src/libseqarrange/data/arrange_data_export.txt.5 deleted file mode 100644 index fc6d91f42e..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.5 +++ /dev/null @@ -1,19054 +0,0 @@ -OBJECT_ID44 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804161 0 -POINT-5800148 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704155 -1072845 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482231 -1906242 -POINT-5407585 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807083 -3252884 -POINT-4682853 -3429336 -POINT-4552147 -3601043 -POINT-4415153 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235847 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651283 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2744712 -5114479 -POINT-2552711 -5212990 -POINT-2357177 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545234 -5595070 -POINT-1336196 -5648659 -POINT-1125312 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377906 -5792381 -POINT592948 -5774353 -POINT807167 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855705 -5500213 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837616 -POINT3386161 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308891 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4746795 -3341682 -POINT4867729 -3162956 -POINT4981926 -2979858 -POINT5089248 -2792633 -POINT5189537 -2601555 -POINT5282646 -2406883 -POINT5368461 -2208885 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5724121 -966621 -POINT5756096 -753204 -POINT5780113 -538749 -POINT5796142 -323547 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796142 323547 -POINT5780113 538749 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636497 1389144 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208877 -POINT5282646 2406883 -POINT5189537 2601555 -POINT5089248 2792633 -POINT4981926 2979850 -POINT4867729 3162956 -POINT4746795 3341682 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849205 -POINT4199280 4008041 -POINT4047401 4161338 -POINT3889923 4308891 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386161 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855705 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748344 -POINT592948 5774353 -POINT377906 5792381 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784370 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-1125312 5694443 -POINT-1336196 5648659 -POINT-1545234 5595070 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357177 5304291 -POINT-2552711 5212990 -POINT-2744712 5114479 -POINT-2932922 5008903 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4682853 3429329 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-5035454 2886741 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407585 2108719 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800148 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804161 0 -POINT-5800148 -215759 -POINT-5788124 -431221 -POINT-5785186 -462745 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5704155 -1072845 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5599982 -1524106 -POINT-5549301 -1701133 -POINT-5539461 -1731226 -POINT-5482231 -1906242 -POINT-5407585 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807083 -3252884 -POINT-4682853 -3429336 -POINT-4663677 -3454528 -POINT-4552147 -3601043 -POINT-4532048 -3625506 -POINT-4415153 -3767776 -POINT-4394158 -3791475 -POINT-4272049 -3929306 -POINT-4250188 -3952208 -POINT-4123047 -4085403 -POINT-3968338 -4235847 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651283 -POINT-3446495 -4669749 -POINT-3296920 -4777145 -POINT-3270535 -4794643 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2905309 -5024400 -POINT-2744712 -5114479 -POINT-2716543 -5128932 -POINT-2552711 -5212990 -POINT-2357177 -5304291 -POINT-2158393 -5388260 -POINT-2128790 -5399487 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1721780 -5542749 -POINT-1545234 -5595070 -POINT-1336196 -5648659 -POINT-1125312 -5694443 -POINT-1094144 -5700005 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-667677 -5765576 -POINT-484504 -5784370 -POINT-452910 -5786429 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377906 -5792381 -POINT592948 -5774353 -POINT624378 -5770537 -POINT807167 -5748344 -POINT838434 -5743362 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1262788 -5665241 -POINT1441970 -5622841 -POINT1472488 -5614410 -POINT1649978 -5565376 -POINT1855705 -5500213 -POINT1885512 -5489539 -POINT2058868 -5427459 -POINT2088258 -5415684 -POINT2259185 -5347198 -POINT2288116 -5334338 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2867637 -5046568 -POINT3026527 -4953514 -POINT3053234 -4936510 -POINT3208557 -4837616 -POINT3386161 -4715027 -POINT3411531 -4696085 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3750966 -4429711 -POINT3889923 -4308891 -POINT4047401 -4161346 -POINT4069684 -4138854 -POINT4199280 -4008041 -POINT4345360 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4638006 -3490248 -POINT4746795 -3341682 -POINT4764539 -3315460 -POINT4867729 -3162956 -POINT4884484 -3136093 -POINT4981926 -2979858 -POINT4997672 -2952389 -POINT5089248 -2792633 -POINT5189537 -2601555 -POINT5282646 -2406883 -POINT5368461 -2208885 -POINT5379963 -2179386 -POINT5446853 -2007827 -POINT5457251 -1977923 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5589111 -1567083 -POINT5636497 -1389144 -POINT5643501 -1358268 -POINT5684234 -1178695 -POINT5690087 -1147581 -POINT5724121 -966621 -POINT5756096 -753204 -POINT5780113 -538749 -POINT5782465 -507176 -POINT5796142 -323547 -POINT5797320 -291908 -POINT5804168 -107902 -POINT5804168 107894 -POINT5802991 139534 -POINT5796142 323547 -POINT5793791 355121 -POINT5780113 538749 -POINT5756096 753204 -POINT5751405 784514 -POINT5724121 966613 -POINT5718269 997729 -POINT5684234 1178695 -POINT5677231 1209572 -POINT5636497 1389144 -POINT5628350 1419740 -POINT5580963 1597679 -POINT5571685 1627949 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5435352 2037324 -POINT5368461 2208877 -POINT5355871 2237928 -POINT5282646 2406883 -POINT5268986 2435444 -POINT5189537 2601555 -POINT5089248 2792633 -POINT4981926 2979850 -POINT4867729 3162956 -POINT4746795 3341682 -POINT4728090 3367227 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849205 -POINT4199280 4008041 -POINT4047401 4161338 -POINT4024296 4182987 -POINT3889923 4308891 -POINT3727073 4450485 -POINT3702425 4470356 -POINT3559074 4585922 -POINT3533705 4604864 -POINT3386161 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2999207 4969514 -POINT2840316 5062568 -POINT2812420 5077542 -POINT2650177 5164627 -POINT2621743 5178553 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2229796 5358974 -POINT2058868 5427459 -POINT1855705 5500213 -POINT1825521 5509773 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1200919 5678672 -POINT1020278 5714386 -POINT807167 5748344 -POINT592948 5774353 -POINT561398 5776998 -POINT377906 5792381 -POINT346279 5793852 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784370 -POINT-515999 5781139 -POINT-699173 5762344 -POINT-730526 5757944 -POINT-912872 5732353 -POINT-1125312 5694443 -POINT-1336196 5648659 -POINT-1545234 5595070 -POINT-1752136 5533752 -POINT-1782137 5523633 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357177 5304291 -POINT-2552711 5212990 -POINT-2580881 5198537 -POINT-2744712 5114479 -POINT-2772326 5098989 -POINT-2932922 5008903 -POINT-2959941 4992399 -POINT-3117080 4896408 -POINT-3143466 4878910 -POINT-3296920 4777145 -POINT-3322639 4758678 -POINT-3472213 4651275 -POINT-3497227 4631866 -POINT-3642700 4518982 -POINT-3666974 4498656 -POINT-3808151 4380440 -POINT-3831653 4359226 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4435252 3743314 -POINT-4552147 3601043 -POINT-4571324 3575850 -POINT-4682853 3429329 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-4940928 3044766 -POINT-5035454 2886741 -POINT-5050686 2858986 -POINT-5139274 2697563 -POINT-5153465 2669260 -POINT-5235992 2504654 -POINT-5249120 2475843 -POINT-5325470 2308281 -POINT-5337518 2279002 -POINT-5407585 2108719 -POINT-5418537 2079012 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5616273 1462926 -POINT-5660339 1284141 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800148 215759 -POINT-5800737 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804161 0 -POINT-5800148 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704155 -1072845 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5527809 -1766859 -POINT-5482231 -1906242 -POINT-5407585 -2108719 -POINT-5381272 -2172667 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5205000 -2566470 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4886993 -3129921 -POINT-4807083 -3252884 -POINT-4682853 -3429336 -POINT-4640969 -3484359 -POINT-4552147 -3601043 -POINT-4508248 -3654472 -POINT-4415153 -3767776 -POINT-4369296 -3819538 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235847 -POINT-3808151 -4380447 -POINT-3755133 -4424840 -POINT-3642700 -4518982 -POINT-3472213 -4651283 -POINT-3416042 -4691615 -POINT-3296920 -4777145 -POINT-3239292 -4815362 -POINT-3117080 -4896408 -POINT-3058068 -4932459 -POINT-2932922 -5008911 -POINT-2872611 -5042740 -POINT-2744712 -5114479 -POINT-2683187 -5146046 -POINT-2552711 -5212990 -POINT-2357177 -5304291 -POINT-2158393 -5388260 -POINT-2093736 -5412781 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545234 -5595070 -POINT-1336196 -5648659 -POINT-1125312 -5694443 -POINT-912872 -5732353 -POINT-844393 -5741964 -POINT-699173 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT231416 -5799199 -POINT377906 -5792381 -POINT592948 -5774353 -POINT661594 -5766019 -POINT807167 -5748344 -POINT1020278 -5714386 -POINT1088117 -5700974 -POINT1231979 -5672531 -POINT1299270 -5656608 -POINT1441970 -5622841 -POINT1508625 -5604427 -POINT1649978 -5565376 -POINT1715902 -5544495 -POINT1855705 -5500213 -POINT1920807 -5476900 -POINT2058868 -5427459 -POINT2123059 -5401740 -POINT2259185 -5347198 -POINT2322374 -5319110 -POINT2456375 -5259544 -POINT2518478 -5229129 -POINT2650177 -5164627 -POINT2711106 -5131923 -POINT2840316 -5062568 -POINT2899987 -5027622 -POINT3026527 -4953514 -POINT3084858 -4916375 -POINT3208557 -4837616 -POINT3386161 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308891 -POINT3940386 -4261611 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4660156 -3460000 -POINT4746795 -3341682 -POINT4785548 -3284410 -POINT4867729 -3162956 -POINT4904323 -3104283 -POINT4981926 -2979858 -POINT5016317 -2919863 -POINT5089248 -2792633 -POINT5189537 -2601555 -POINT5282646 -2406883 -POINT5368461 -2208885 -POINT5393582 -2144457 -POINT5446853 -2007827 -POINT5469563 -1942512 -POINT5517723 -1804000 -POINT5537988 -1737886 -POINT5580963 -1597679 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5697016 -1110737 -POINT5724121 -966621 -POINT5756096 -753204 -POINT5780113 -538749 -POINT5796142 -323547 -POINT5798714 -254445 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796142 323547 -POINT5791006 392507 -POINT5780113 538749 -POINT5772417 607470 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5668937 1246133 -POINT5636497 1389144 -POINT5618702 1455968 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5495013 1869316 -POINT5446853 2007827 -POINT5421733 2072253 -POINT5368461 2208877 -POINT5282646 2406883 -POINT5189537 2601555 -POINT5089248 2792633 -POINT4981926 2979850 -POINT4867729 3162956 -POINT4746795 3341682 -POINT4705940 3397475 -POINT4619301 3515792 -POINT4576402 3570028 -POINT4485428 3685043 -POINT4345360 3849205 -POINT4199280 4008041 -POINT4047401 4161338 -POINT3996938 4208621 -POINT3889923 4308891 -POINT3837739 4354264 -POINT3727073 4450485 -POINT3673239 4493885 -POINT3559074 4585922 -POINT3503665 4627293 -POINT3386161 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2966857 4988460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1993765 5450773 -POINT1855705 5500213 -POINT1789781 5521092 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT951988 5725268 -POINT807167 5748344 -POINT592948 5774353 -POINT524039 5780130 -POINT377906 5792381 -POINT308829 5795594 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-338169 5793905 -POINT-484504 5784370 -POINT-553294 5777312 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-980947 5720205 -POINT-1125312 5694443 -POINT-1336196 5648659 -POINT-1545234 5595070 -POINT-1611535 5575421 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2021277 5440261 -POINT-2158393 5388260 -POINT-2357177 5304291 -POINT-2552711 5212990 -POINT-2744712 5114479 -POINT-2805023 5080648 -POINT-2932922 5008903 -POINT-2991935 4972855 -POINT-3117080 4896408 -POINT-3174709 4858191 -POINT-3296920 4777145 -POINT-3353092 4736811 -POINT-3472213 4651275 -POINT-3526845 4608883 -POINT-3642700 4518982 -POINT-3695718 4474587 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4317906 3877545 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4682853 3429329 -POINT-4722662 3372788 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-5035454 2886741 -POINT-5139274 2697563 -POINT-5170267 2635746 -POINT-5235992 2504654 -POINT-5264665 2441727 -POINT-5325470 2308281 -POINT-5407585 2108719 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5568334 1634652 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5674380 1216432 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800148 215759 -POINT-5801434 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804161 0 -POINT-5800520 -195760 -POINT-5800148 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704155 -1072845 -POINT-5660339 -1284141 -POINT-5613483 -1474246 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5488448 -1887230 -POINT-5482231 -1906242 -POINT-5407585 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5148239 -2679682 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807083 -3252884 -POINT-4694369 -3412981 -POINT-4682853 -3429336 -POINT-4564262 -3585128 -POINT-4552147 -3601043 -POINT-4415153 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3982678 -4221903 -POINT-3968338 -4235847 -POINT-3822999 -4367044 -POINT-3808151 -4380447 -POINT-3658036 -4506141 -POINT-3642700 -4518982 -POINT-3488016 -4639020 -POINT-3472213 -4651283 -POINT-3313169 -4765479 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2949992 -4998483 -POINT-2932922 -5008911 -POINT-2762158 -5104694 -POINT-2744712 -5114479 -POINT-2570508 -5203859 -POINT-2552711 -5212990 -POINT-2375302 -5295828 -POINT-2357177 -5304291 -POINT-2158393 -5388260 -POINT-1975322 -5457690 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545234 -5595070 -POINT-1336196 -5648659 -POINT-1125312 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT357925 -5793311 -POINT377906 -5792381 -POINT573016 -5776024 -POINT592948 -5774353 -POINT787310 -5750755 -POINT807167 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855705 -5500213 -POINT2040036 -5434203 -POINT2058868 -5427459 -POINT2240618 -5354638 -POINT2259185 -5347198 -POINT2438097 -5267669 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2822692 -5072028 -POINT2840316 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837616 -POINT3369699 -4726390 -POINT3386161 -4715027 -POINT3543047 -4597889 -POINT3559074 -4585922 -POINT3711501 -4463039 -POINT3727073 -4450485 -POINT3874828 -4322016 -POINT3889923 -4308891 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4734978 -3357821 -POINT4746795 -3341682 -POINT4867729 -3162956 -POINT4971341 -2996830 -POINT4981926 -2979858 -POINT5079301 -2809987 -POINT5089248 -2792633 -POINT5189537 -2601555 -POINT5274016 -2424927 -POINT5282646 -2406883 -POINT5360507 -2227238 -POINT5368461 -2208885 -POINT5439587 -2026464 -POINT5446853 -2007827 -POINT5511154 -1822893 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5631350 -1408474 -POINT5636497 -1389144 -POINT5679810 -1198202 -POINT5684234 -1178695 -POINT5720424 -986278 -POINT5724121 -966621 -POINT5756096 -753204 -POINT5777887 -558627 -POINT5780113 -538749 -POINT5794657 -343494 -POINT5796142 -323547 -POINT5803425 -127890 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796886 303558 -POINT5796142 323547 -POINT5781599 518802 -POINT5780113 538749 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5640922 1369638 -POINT5636497 1389144 -POINT5580963 1597679 -POINT5523585 1784876 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208877 -POINT5282646 2406883 -POINT5189537 2601555 -POINT5098544 2774922 -POINT5089248 2792633 -POINT4991874 2962497 -POINT4981926 2979850 -POINT4878314 3145984 -POINT4867729 3162956 -POINT4758005 3325116 -POINT4746795 3341682 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849205 -POINT4199280 4008041 -POINT4061479 4147129 -POINT4047401 4161338 -POINT3904520 4295214 -POINT3889923 4308891 -POINT3742168 4437361 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3402189 4703060 -POINT3386161 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2857576 5052460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2077436 5420020 -POINT2058868 5427459 -POINT1874536 5493470 -POINT1855705 5500213 -POINT1669047 5559329 -POINT1649978 5565368 -POINT1461251 5617507 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT826920 5745197 -POINT807167 5748344 -POINT592948 5774353 -POINT397839 5790710 -POINT377906 5792381 -POINT182319 5801477 -POINT162338 5802406 -POINT-33449 5804227 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-464544 5785671 -POINT-484504 5784370 -POINT-679275 5764386 -POINT-699173 5762344 -POINT-893064 5735133 -POINT-912872 5732353 -POINT-1125312 5694443 -POINT-1336196 5648659 -POINT-1545234 5595070 -POINT-1732958 5539436 -POINT-1752136 5533752 -POINT-1937665 5471175 -POINT-1956619 5464782 -POINT-2139691 5395353 -POINT-2158393 5388260 -POINT-2338752 5312074 -POINT-2357177 5304291 -POINT-2552711 5212990 -POINT-2726916 5123610 -POINT-2744712 5114479 -POINT-2915477 5018689 -POINT-2932922 5008903 -POINT-3100011 4906835 -POINT-3117080 4896408 -POINT-3280251 4788200 -POINT-3296920 4777145 -POINT-3455965 4662942 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3953490 4249250 -POINT-3968338 4235847 -POINT-4108707 4099341 -POINT-4123047 4085395 -POINT-4258238 3943774 -POINT-4272049 3929306 -POINT-4401889 3782749 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4670738 3445245 -POINT-4682853 3429329 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-5035454 2886741 -POINT-5129651 2715098 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5399974 2127216 -POINT-5407585 2108719 -POINT-5475312 1925010 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5700094 1092430 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5786268 451137 -POINT-5788124 431221 -POINT-5800148 215759 -OBJECT_ID69 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325477 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807091 -3252884 -POINT-4682853 -3429329 -POINT-4552154 -3601043 -POINT-4415153 -3767776 -POINT-4272056 -3929306 -POINT-4123054 -4085395 -POINT-3968345 -4235847 -POINT-3808159 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296928 -4777145 -POINT-3117080 -4896408 -POINT-2932930 -5008903 -POINT-2744720 -5114479 -POINT-2552719 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1752143 -5533752 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-912879 -5732353 -POINT-699173 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748344 -POINT1020271 -5714386 -POINT1231971 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565368 -POINT1855697 -5500213 -POINT2058860 -5427459 -POINT2259178 -5347198 -POINT2456375 -5259544 -POINT2650169 -5164627 -POINT2840309 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161338 -POINT4199272 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746788 -3341682 -POINT4867721 -3162956 -POINT4981926 -2979850 -POINT5089241 -2792633 -POINT5189529 -2601555 -POINT5282646 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724113 -966613 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5796142 -323547 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796142 323547 -POINT5780105 538749 -POINT5756088 753204 -POINT5724113 966621 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368454 2208885 -POINT5282646 2406883 -POINT5189529 2601555 -POINT5089241 2792640 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4746788 3341682 -POINT4619301 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199272 4008049 -POINT4047393 4161338 -POINT3889923 4308891 -POINT3727073 4450477 -POINT3559074 4585930 -POINT3386154 4715034 -POINT3208557 4837608 -POINT3026527 4953514 -POINT2840309 5062568 -POINT2650169 5164634 -POINT2456375 5259544 -POINT2259178 5347191 -POINT2058860 5427452 -POINT1855697 5500221 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231971 5672539 -POINT1020271 5714393 -POINT807167 5748344 -POINT592941 5774360 -POINT377899 5792381 -POINT162338 5802406 -POINT-53451 5804420 -POINT-269165 5798393 -POINT-484504 5784370 -POINT-699173 5762336 -POINT-912879 5732353 -POINT-1125320 5694450 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533745 -POINT-1956619 5464775 -POINT-2158393 5388252 -POINT-2357185 5304283 -POINT-2552719 5212990 -POINT-2744720 5114479 -POINT-2932930 5008903 -POINT-3117080 4896415 -POINT-3296928 4777153 -POINT-3472213 4651283 -POINT-3642700 4518989 -POINT-3808159 4380440 -POINT-3968345 4235847 -POINT-4123054 4085395 -POINT-4272056 3929298 -POINT-4415153 3767784 -POINT-4552154 3601051 -POINT-4682853 3429329 -POINT-4807091 3252876 -POINT-4924675 3071937 -POINT-5035454 2886741 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325477 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803580 -31655 -POINT-5800155 -215759 -POINT-5798390 -247370 -POINT-5788124 -431221 -POINT-5785186 -462745 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5697733 -1103846 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5599982 -1524106 -POINT-5549301 -1701133 -POINT-5539462 -1731226 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325477 -2308281 -POINT-5312349 -2337092 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807091 -3252884 -POINT-4682853 -3429329 -POINT-4663678 -3454522 -POINT-4552154 -3601043 -POINT-4532054 -3625506 -POINT-4415153 -3767776 -POINT-4394159 -3791475 -POINT-4272056 -3929306 -POINT-4123054 -4085395 -POINT-4100356 -4107469 -POINT-3968345 -4235847 -POINT-3808159 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296928 -4777145 -POINT-3270542 -4794643 -POINT-3117080 -4896408 -POINT-3090062 -4912913 -POINT-2932930 -5008903 -POINT-2744720 -5114479 -POINT-2552719 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-2128790 -5399487 -POINT-1956619 -5464782 -POINT-1752143 -5533752 -POINT-1721788 -5542749 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-1094152 -5700005 -POINT-912879 -5732353 -POINT-699173 -5762344 -POINT-667677 -5765576 -POINT-484504 -5784370 -POINT-452910 -5786429 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748344 -POINT838432 -5743362 -POINT1020271 -5714386 -POINT1231971 -5672531 -POINT1262782 -5665241 -POINT1441970 -5622841 -POINT1472488 -5614409 -POINT1649978 -5565368 -POINT1680160 -5555809 -POINT1855697 -5500213 -POINT1885505 -5489539 -POINT2058860 -5427459 -POINT2088250 -5415684 -POINT2259178 -5347198 -POINT2288110 -5334338 -POINT2456375 -5259544 -POINT2650169 -5164627 -POINT2840309 -5062568 -POINT3026527 -4953514 -POINT3053234 -4936510 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3750966 -4429711 -POINT3889923 -4308891 -POINT3913026 -4287243 -POINT4047393 -4161338 -POINT4069677 -4138847 -POINT4199272 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4638005 -3490248 -POINT4746788 -3341682 -POINT4764531 -3315460 -POINT4867721 -3162956 -POINT4884477 -3136091 -POINT4981926 -2979850 -POINT5089241 -2792633 -POINT5189529 -2601555 -POINT5203191 -2572993 -POINT5282646 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5457251 -1977923 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5589110 -1567083 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5690085 -1147579 -POINT5724113 -966613 -POINT5756088 -753204 -POINT5759612 -721740 -POINT5780105 -538749 -POINT5782458 -507176 -POINT5796142 -323547 -POINT5797319 -291907 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796142 323547 -POINT5793790 355121 -POINT5780105 538749 -POINT5776582 570213 -POINT5756088 753204 -POINT5751397 784516 -POINT5724113 966621 -POINT5684234 1178695 -POINT5677230 1209572 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5571685 1627949 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5435351 2037326 -POINT5368454 2208885 -POINT5282646 2406883 -POINT5189529 2601555 -POINT5089241 2792640 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4746788 3341682 -POINT4619301 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4323920 3872510 -POINT4199272 4008049 -POINT4176989 4030539 -POINT4047393 4161338 -POINT4024290 4182987 -POINT3889923 4308891 -POINT3727073 4450477 -POINT3702425 4470351 -POINT3559074 4585930 -POINT3533704 4604872 -POINT3386154 4715034 -POINT3360098 4733018 -POINT3208557 4837608 -POINT3181850 4854614 -POINT3026527 4953514 -POINT2999206 4969514 -POINT2840309 5062568 -POINT2812412 5077543 -POINT2650169 5164634 -POINT2621736 5178559 -POINT2456375 5259544 -POINT2259178 5347191 -POINT2058860 5427452 -POINT1855697 5500221 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231971 5672539 -POINT1020271 5714393 -POINT807167 5748344 -POINT592941 5774360 -POINT561391 5777004 -POINT377899 5792381 -POINT346272 5793852 -POINT162338 5802406 -POINT130678 5802702 -POINT-53451 5804420 -POINT-85100 5803536 -POINT-269165 5798393 -POINT-484504 5784370 -POINT-515999 5781138 -POINT-699173 5762336 -POINT-912879 5732353 -POINT-944048 5726792 -POINT-1125320 5694450 -POINT-1156260 5687732 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533745 -POINT-1782143 5523626 -POINT-1956619 5464775 -POINT-2158393 5388252 -POINT-2357185 5304283 -POINT-2385873 5290889 -POINT-2552719 5212990 -POINT-2744720 5114479 -POINT-2932930 5008903 -POINT-3117080 4896415 -POINT-3143467 4878918 -POINT-3296928 4777153 -POINT-3322645 4758686 -POINT-3472213 4651283 -POINT-3497227 4631873 -POINT-3642700 4518989 -POINT-3808159 4380440 -POINT-3968345 4235847 -POINT-4123054 4085395 -POINT-4272056 3929298 -POINT-4293051 3905601 -POINT-4415153 3767784 -POINT-4552154 3601051 -POINT-4571330 3575857 -POINT-4682853 3429329 -POINT-4807091 3252876 -POINT-4924675 3071937 -POINT-4940928 3044766 -POINT-5035454 2886741 -POINT-5050686 2858986 -POINT-5139274 2697563 -POINT-5153465 2669260 -POINT-5235992 2504654 -POINT-5249121 2475843 -POINT-5325477 2308281 -POINT-5337525 2279002 -POINT-5407593 2108719 -POINT-5418545 2079012 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5616273 1462926 -POINT-5660339 1284141 -POINT-5666769 1253141 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5796300 -284802 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5728582 -928247 -POINT-5704162 -1072845 -POINT-5690120 -1140554 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325477 -2308281 -POINT-5235992 -2504654 -POINT-5205000 -2566470 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4886996 -3129921 -POINT-4807091 -3252884 -POINT-4682853 -3429329 -POINT-4552154 -3601043 -POINT-4508253 -3654472 -POINT-4415153 -3767776 -POINT-4369299 -3819538 -POINT-4272056 -3929306 -POINT-4224309 -3979324 -POINT-4123054 -4085395 -POINT-4073478 -4133607 -POINT-3968345 -4235847 -POINT-3808159 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3416044 -4691610 -POINT-3296928 -4777145 -POINT-3239297 -4815362 -POINT-3117080 -4896408 -POINT-2932930 -5008903 -POINT-2744720 -5114479 -POINT-2552719 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-2093736 -5412781 -POINT-1956619 -5464782 -POINT-1891096 -5486883 -POINT-1752143 -5533752 -POINT-1685843 -5553401 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-1057245 -5706591 -POINT-912879 -5732353 -POINT-844398 -5741964 -POINT-699173 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT15697 -5803770 -POINT162338 -5802406 -POINT231413 -5799194 -POINT377899 -5792381 -POINT592941 -5774353 -POINT661588 -5766019 -POINT807167 -5748344 -POINT1020271 -5714386 -POINT1088109 -5700974 -POINT1231971 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565368 -POINT1715900 -5544490 -POINT1855697 -5500213 -POINT1920800 -5476900 -POINT2058860 -5427459 -POINT2123051 -5401740 -POINT2259178 -5347198 -POINT2456375 -5259544 -POINT2518475 -5229129 -POINT2650169 -5164627 -POINT2711098 -5131923 -POINT2840309 -5062568 -POINT3026527 -4953514 -POINT3084858 -4916375 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308891 -POINT3940383 -4261609 -POINT4047393 -4161338 -POINT4096062 -4112215 -POINT4199272 -4008041 -POINT4246083 -3957143 -POINT4345352 -3849205 -POINT4390239 -3796600 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746788 -3341682 -POINT4867721 -3162956 -POINT4904318 -3104281 -POINT4981926 -2979850 -POINT5089241 -2792633 -POINT5121378 -2731403 -POINT5189529 -2601555 -POINT5282646 -2406883 -POINT5310143 -2343435 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5469563 -1942512 -POINT5517723 -1804000 -POINT5537988 -1737886 -POINT5580963 -1597679 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5697013 -1110735 -POINT5724113 -966613 -POINT5734360 -898227 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5785244 -469789 -POINT5796142 -323547 -POINT5798712 -254442 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796142 323547 -POINT5780105 538749 -POINT5772409 607470 -POINT5756088 753204 -POINT5745842 821592 -POINT5724113 966621 -POINT5711334 1034579 -POINT5684234 1178695 -POINT5668935 1246133 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5495013 1869316 -POINT5446853 2007827 -POINT5421731 2072255 -POINT5368454 2208885 -POINT5282646 2406883 -POINT5189529 2601555 -POINT5089241 2792640 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4828969 3220228 -POINT4746788 3341682 -POINT4619301 3515800 -POINT4576402 3570036 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199272 4008049 -POINT4150603 4057170 -POINT4047393 4161338 -POINT3996933 4208621 -POINT3889923 4308891 -POINT3837739 4354262 -POINT3727073 4450477 -POINT3673239 4493882 -POINT3559074 4585930 -POINT3503663 4627301 -POINT3386154 4715034 -POINT3208557 4837608 -POINT3026527 4953514 -POINT2840309 5062568 -POINT2779379 5095275 -POINT2650169 5164634 -POINT2588069 5195048 -POINT2456375 5259544 -POINT2259178 5347191 -POINT2058860 5427452 -POINT1855697 5500221 -POINT1789776 5521100 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231971 5672539 -POINT1164133 5685951 -POINT1020271 5714393 -POINT951983 5725273 -POINT807167 5748344 -POINT738519 5756681 -POINT592941 5774360 -POINT524032 5780135 -POINT377899 5792381 -POINT308823 5795594 -POINT162338 5802406 -POINT93189 5803052 -POINT-53451 5804420 -POINT-122575 5802489 -POINT-269165 5798393 -POINT-484504 5784370 -POINT-553294 5777310 -POINT-699173 5762336 -POINT-912879 5732353 -POINT-1125320 5694450 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533745 -POINT-1956619 5464775 -POINT-2158393 5388252 -POINT-2222095 5361345 -POINT-2357185 5304283 -POINT-2552719 5212990 -POINT-2744720 5114479 -POINT-2805031 5080648 -POINT-2932930 5008903 -POINT-2991940 4972857 -POINT-3117080 4896415 -POINT-3174712 4858198 -POINT-3296928 4777153 -POINT-3353097 4736819 -POINT-3472213 4651283 -POINT-3526845 4608890 -POINT-3642700 4518989 -POINT-3808159 4380440 -POINT-3859490 4334106 -POINT-3968345 4235847 -POINT-4017921 4187636 -POINT-4123054 4085395 -POINT-4170801 4035375 -POINT-4272056 3929298 -POINT-4317911 3877542 -POINT-4415153 3767784 -POINT-4459055 3714355 -POINT-4552154 3601051 -POINT-4682853 3429329 -POINT-4722665 3372785 -POINT-4807091 3252876 -POINT-4924675 3071937 -POINT-5035454 2886741 -POINT-5139274 2697563 -POINT-5170267 2635746 -POINT-5235992 2504654 -POINT-5325477 2308281 -POINT-5351791 2244332 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5568334 1634652 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5674382 1216432 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800155 215759 -POINT-5801441 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804168 0 -POINT-5800527 -195760 -POINT-5800155 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5707493 -1053122 -POINT-5704162 -1072845 -POINT-5664401 -1264556 -POINT-5660339 -1284141 -POINT-5613483 -1474246 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5333089 -2289783 -POINT-5325477 -2308281 -POINT-5244287 -2486451 -POINT-5235992 -2504654 -POINT-5148239 -2679682 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4817990 -3236112 -POINT-4807091 -3252884 -POINT-4694369 -3412974 -POINT-4682853 -3429329 -POINT-4564269 -3585127 -POINT-4552154 -3601043 -POINT-4415153 -3767776 -POINT-4272056 -3929306 -POINT-4123054 -4085395 -POINT-3982685 -4221902 -POINT-3968345 -4235847 -POINT-3808159 -4380440 -POINT-3642700 -4518982 -POINT-3488016 -4639013 -POINT-3472213 -4651275 -POINT-3296928 -4777145 -POINT-3133751 -4885353 -POINT-3117080 -4896408 -POINT-2949999 -4998476 -POINT-2932930 -5008903 -POINT-2744720 -5114479 -POINT-2570516 -5203859 -POINT-2552719 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1975322 -5457690 -POINT-1956619 -5464782 -POINT-1771097 -5527359 -POINT-1752143 -5533752 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-932571 -5728839 -POINT-912879 -5732353 -POINT-699173 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT787310 -5750755 -POINT807167 -5748344 -POINT1020271 -5714386 -POINT1231971 -5672531 -POINT1441970 -5622841 -POINT1630698 -5570696 -POINT1649978 -5565368 -POINT1836629 -5506253 -POINT1855697 -5500213 -POINT2040029 -5434203 -POINT2058860 -5427459 -POINT2240610 -5354638 -POINT2259178 -5347198 -POINT2456375 -5259544 -POINT2632206 -5173425 -POINT2650169 -5164627 -POINT2840309 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543046 -4597889 -POINT3559074 -4585922 -POINT3711501 -4463039 -POINT3727073 -4450485 -POINT3874828 -4322016 -POINT3889923 -4308891 -POINT4032797 -4175015 -POINT4047393 -4161338 -POINT4199272 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4734971 -3357821 -POINT4746788 -3341682 -POINT4856512 -3179522 -POINT4867721 -3162956 -POINT4971340 -2996823 -POINT4981926 -2979850 -POINT5089241 -2792633 -POINT5189529 -2601555 -POINT5282646 -2406883 -POINT5368454 -2208885 -POINT5439586 -2026464 -POINT5446853 -2007827 -POINT5511154 -1822893 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5631343 -1408474 -POINT5636490 -1389144 -POINT5679809 -1198202 -POINT5684234 -1178695 -POINT5720417 -986271 -POINT5724113 -966613 -POINT5756088 -753204 -POINT5777879 -558627 -POINT5780105 -538749 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796886 303559 -POINT5796142 323547 -POINT5781592 518802 -POINT5780105 538749 -POINT5756088 753204 -POINT5727077 946839 -POINT5724113 966621 -POINT5687931 1159038 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5523585 1784876 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5375721 2190249 -POINT5368454 2208885 -POINT5290600 2388530 -POINT5282646 2406883 -POINT5189529 2601555 -POINT5098537 2774928 -POINT5089241 2792640 -POINT4991873 2962498 -POINT4981926 2979850 -POINT4878307 3145984 -POINT4867721 3162956 -POINT4746788 3341682 -POINT4631118 3499661 -POINT4619301 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199272 4008049 -POINT4061471 4147130 -POINT4047393 4161338 -POINT3889923 4308891 -POINT3727073 4450477 -POINT3574646 4573375 -POINT3559074 4585930 -POINT3402182 4703068 -POINT3386154 4715034 -POINT3225018 4826247 -POINT3208557 4837608 -POINT3026527 4953514 -POINT2857570 5052460 -POINT2840309 5062568 -POINT2667793 5155174 -POINT2650169 5164634 -POINT2474338 5250747 -POINT2456375 5259544 -POINT2259178 5347191 -POINT2058860 5427452 -POINT1874529 5493476 -POINT1855697 5500221 -POINT1669047 5559337 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231971 5672539 -POINT1039894 5710514 -POINT1020271 5714393 -POINT807167 5748344 -POINT612798 5771949 -POINT592941 5774360 -POINT397831 5790711 -POINT377899 5792381 -POINT182318 5801477 -POINT162338 5802406 -POINT-53451 5804420 -POINT-249170 5798952 -POINT-269165 5798393 -POINT-464544 5785670 -POINT-484504 5784370 -POINT-679275 5764379 -POINT-699173 5762336 -POINT-912879 5732353 -POINT-1125320 5694450 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533745 -POINT-1937666 5471168 -POINT-1956619 5464775 -POINT-2139691 5395345 -POINT-2158393 5388252 -POINT-2357185 5304283 -POINT-2552719 5212990 -POINT-2744720 5114479 -POINT-2932930 5008903 -POINT-3100011 4906842 -POINT-3117080 4896415 -POINT-3296928 4777153 -POINT-3455966 4662950 -POINT-3472213 4651283 -POINT-3626897 4531252 -POINT-3642700 4518989 -POINT-3808159 4380440 -POINT-3953497 4249250 -POINT-3968345 4235847 -POINT-4108714 4099341 -POINT-4123054 4085395 -POINT-4258245 3943767 -POINT-4272056 3929298 -POINT-4401890 3782755 -POINT-4415153 3767784 -POINT-4539456 3616506 -POINT-4552154 3601051 -POINT-4670739 3445246 -POINT-4682853 3429329 -POINT-4807091 3252876 -POINT-4913776 3088709 -POINT-4924675 3071937 -POINT-5035454 2886741 -POINT-5129651 2715098 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5317183 2326483 -POINT-5325477 2308281 -POINT-5407593 2108719 -POINT-5475320 1925010 -POINT-5482239 1906242 -POINT-5543085 1720145 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5786268 451137 -POINT-5788124 431221 -POINT-5799040 235730 -POINT-5800155 215759 -POINT-5803797 19998 -OBJECT_ID80 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804161 0 -POINT-5800155 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5704162 -1072845 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482231 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807083 -3252884 -POINT-4682853 -3429329 -POINT-4552147 -3601043 -POINT-4415153 -3767776 -POINT-4272056 -3929302 -POINT-4123047 -4085399 -POINT-3968345 -4235847 -POINT-3808151 -4380443 -POINT-3642700 -4518982 -POINT-3472213 -4651279 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008907 -POINT-2744712 -5114479 -POINT-2552711 -5212986 -POINT-2357185 -5304287 -POINT-2158393 -5388256 -POINT-1956619 -5464779 -POINT-1752143 -5533748 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-912879 -5732353 -POINT-699173 -5762340 -POINT-484504 -5784366 -POINT-269165 -5798397 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748340 -POINT1020278 -5714386 -POINT1231971 -5672531 -POINT1441970 -5622837 -POINT1649978 -5565372 -POINT1855705 -5500213 -POINT2058860 -5427456 -POINT2259178 -5347194 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837612 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450481 -POINT3889923 -4308887 -POINT4047401 -4161342 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685047 -POINT4619301 -3515792 -POINT4746795 -3341682 -POINT4867721 -3162956 -POINT4981926 -2979850 -POINT5089248 -2792633 -POINT5189529 -2601555 -POINT5282646 -2406883 -POINT5368461 -2208877 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5796142 -323547 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796142 323547 -POINT5780113 538749 -POINT5756096 753204 -POINT5724121 966621 -POINT5684234 1178695 -POINT5636497 1389152 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208885 -POINT5282646 2406883 -POINT5189529 2601562 -POINT5089248 2792640 -POINT4981926 2979858 -POINT4867721 3162956 -POINT4746795 3341682 -POINT4619301 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4047401 4161346 -POINT3889923 4308891 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2058860 5427459 -POINT1855705 5500213 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231971 5672531 -POINT1020278 5714386 -POINT807167 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784370 -POINT-699173 5762344 -POINT-912879 5732353 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212990 -POINT-2744712 5114486 -POINT-2932922 5008911 -POINT-3117080 4896415 -POINT-3296920 4777145 -POINT-3472213 4651283 -POINT-3642700 4518989 -POINT-3808151 4380447 -POINT-3968345 4235847 -POINT-4123047 4085403 -POINT-4272056 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4682853 3429336 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-5035454 2886749 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5608696 1493675 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804161 0 -POINT-5800155 -215759 -POINT-5798390 -247370 -POINT-5788124 -431221 -POINT-5785186 -462745 -POINT-5768097 -646087 -POINT-5763989 -677480 -POINT-5740097 -860054 -POINT-5704162 -1072845 -POINT-5697733 -1103846 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5599982 -1524106 -POINT-5549301 -1701133 -POINT-5539461 -1731226 -POINT-5482231 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807083 -3252884 -POINT-4682853 -3429329 -POINT-4663677 -3454522 -POINT-4552147 -3601043 -POINT-4532048 -3625506 -POINT-4415153 -3767776 -POINT-4394159 -3791474 -POINT-4272056 -3929302 -POINT-4250194 -3952204 -POINT-4123047 -4085399 -POINT-4100350 -4107473 -POINT-3968345 -4235847 -POINT-3944842 -4257062 -POINT-3808151 -4380443 -POINT-3783877 -4400769 -POINT-3642700 -4518982 -POINT-3617687 -4538392 -POINT-3472213 -4651279 -POINT-3446495 -4669746 -POINT-3296920 -4777145 -POINT-3270535 -4794643 -POINT-3117080 -4896408 -POINT-2932922 -5008907 -POINT-2905309 -5024396 -POINT-2744712 -5114479 -POINT-2552711 -5212986 -POINT-2357185 -5304287 -POINT-2158393 -5388256 -POINT-2128790 -5399483 -POINT-1956619 -5464779 -POINT-1926619 -5474898 -POINT-1752143 -5533748 -POINT-1721788 -5542745 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-1094152 -5700005 -POINT-912879 -5732353 -POINT-881525 -5736753 -POINT-699173 -5762340 -POINT-667677 -5765572 -POINT-484504 -5784366 -POINT-452910 -5786425 -POINT-269165 -5798397 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748340 -POINT838434 -5743359 -POINT1020278 -5714386 -POINT1231971 -5672531 -POINT1262782 -5665240 -POINT1441970 -5622837 -POINT1472488 -5614406 -POINT1649978 -5565372 -POINT1680162 -5555813 -POINT1855705 -5500213 -POINT2058860 -5427456 -POINT2259178 -5347194 -POINT2288110 -5334335 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2867637 -5046568 -POINT3026527 -4953514 -POINT3208557 -4837612 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3583722 -4566051 -POINT3727073 -4450481 -POINT3750966 -4429707 -POINT3889923 -4308887 -POINT4047401 -4161342 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685047 -POINT4505069 -3660215 -POINT4619301 -3515792 -POINT4638006 -3490248 -POINT4746795 -3341682 -POINT4764537 -3315460 -POINT4867721 -3162956 -POINT4884477 -3136091 -POINT4981926 -2979850 -POINT4997672 -2952383 -POINT5089248 -2792633 -POINT5189529 -2601555 -POINT5203191 -2572993 -POINT5282646 -2406883 -POINT5368461 -2208877 -POINT5379963 -2179380 -POINT5446853 -2007827 -POINT5457251 -1977923 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5589111 -1567083 -POINT5636497 -1389144 -POINT5643501 -1358268 -POINT5684234 -1178695 -POINT5690087 -1147579 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5782465 -507169 -POINT5796142 -323547 -POINT5797319 -291907 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796142 323547 -POINT5793791 355121 -POINT5780113 538749 -POINT5756096 753204 -POINT5751405 784516 -POINT5724121 966621 -POINT5718269 997736 -POINT5684234 1178695 -POINT5677231 1209573 -POINT5636497 1389152 -POINT5628350 1419746 -POINT5580963 1597679 -POINT5571685 1627949 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5435352 2037326 -POINT5368461 2208885 -POINT5355871 2237934 -POINT5282646 2406883 -POINT5189529 2601562 -POINT5089248 2792640 -POINT4981926 2979858 -POINT4867721 3162956 -POINT4849980 3189178 -POINT4746795 3341682 -POINT4728090 3367228 -POINT4619301 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4323921 3872510 -POINT4199280 4008049 -POINT4047401 4161346 -POINT3889923 4308891 -POINT3727073 4450485 -POINT3702425 4470356 -POINT3559074 4585922 -POINT3533704 4604864 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2999207 4969514 -POINT2840316 5062568 -POINT2812420 5077542 -POINT2650177 5164627 -POINT2621743 5178553 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2229788 5358974 -POINT2058860 5427459 -POINT1855705 5500213 -POINT1825521 5509774 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231971 5672531 -POINT1200913 5678672 -POINT1020278 5714386 -POINT807167 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT346272 5793860 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784370 -POINT-515999 5781139 -POINT-699173 5762344 -POINT-730527 5757944 -POINT-912879 5732353 -POINT-944048 5726791 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533752 -POINT-1782143 5523633 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212990 -POINT-2580881 5198538 -POINT-2744712 5114486 -POINT-2772326 5098997 -POINT-2932922 5008911 -POINT-2959941 4992406 -POINT-3117080 4896415 -POINT-3143466 4878917 -POINT-3296920 4777145 -POINT-3322639 4758679 -POINT-3472213 4651283 -POINT-3497227 4631873 -POINT-3642700 4518989 -POINT-3666974 4498663 -POINT-3808151 4380447 -POINT-3831654 4359232 -POINT-3968345 4235847 -POINT-4123047 4085403 -POINT-4272056 3929306 -POINT-4293051 3905607 -POINT-4415153 3767776 -POINT-4435252 3743314 -POINT-4552147 3601043 -POINT-4571324 3575851 -POINT-4682853 3429336 -POINT-4701080 3403448 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-5035454 2886749 -POINT-5139274 2697563 -POINT-5153465 2669260 -POINT-5235992 2504654 -POINT-5249120 2475843 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5608696 1493675 -POINT-5616273 1462934 -POINT-5660339 1284149 -POINT-5666769 1253147 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800155 215759 -POINT-5800743 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804161 0 -POINT-5800155 -215759 -POINT-5796300 -284802 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5728582 -928241 -POINT-5704162 -1072845 -POINT-5690120 -1140554 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5527809 -1766859 -POINT-5482231 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5205000 -2566470 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4886993 -3129921 -POINT-4807083 -3252884 -POINT-4682853 -3429329 -POINT-4640969 -3484354 -POINT-4552147 -3601043 -POINT-4508248 -3654472 -POINT-4415153 -3767776 -POINT-4369299 -3819536 -POINT-4272056 -3929302 -POINT-4224307 -3979323 -POINT-4123047 -4085399 -POINT-4073474 -4133609 -POINT-3968345 -4235847 -POINT-3917012 -4282182 -POINT-3808151 -4380443 -POINT-3642700 -4518982 -POINT-3472213 -4651279 -POINT-3416042 -4691612 -POINT-3296920 -4777145 -POINT-3239292 -4815362 -POINT-3117080 -4896408 -POINT-3058068 -4932458 -POINT-2932922 -5008907 -POINT-2744712 -5114479 -POINT-2683187 -5146045 -POINT-2552711 -5212986 -POINT-2490056 -5242243 -POINT-2357185 -5304287 -POINT-2158393 -5388256 -POINT-1956619 -5464779 -POINT-1891096 -5486880 -POINT-1752143 -5533748 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-1057245 -5706591 -POINT-912879 -5732353 -POINT-699173 -5762340 -POINT-484504 -5784366 -POINT-269165 -5798397 -POINT-200040 -5800325 -POINT-53451 -5804413 -POINT15697 -5803770 -POINT162338 -5802406 -POINT231413 -5799194 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748340 -POINT875457 -5737460 -POINT1020278 -5714386 -POINT1088114 -5700974 -POINT1231971 -5672531 -POINT1299264 -5656607 -POINT1441970 -5622837 -POINT1508625 -5604423 -POINT1649978 -5565372 -POINT1855705 -5500213 -POINT2058860 -5427456 -POINT2259178 -5347194 -POINT2456375 -5259544 -POINT2518478 -5229129 -POINT2650177 -5164627 -POINT2711106 -5131923 -POINT2840316 -5062568 -POINT2899987 -5027622 -POINT3026527 -4953514 -POINT3208557 -4837612 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3612908 -4542521 -POINT3727073 -4450481 -POINT3889923 -4308887 -POINT3940386 -4261607 -POINT4047401 -4161342 -POINT4199280 -4008041 -POINT4246088 -3957143 -POINT4345352 -3849205 -POINT4390239 -3796601 -POINT4485428 -3685047 -POINT4619301 -3515792 -POINT4660156 -3460000 -POINT4746795 -3341682 -POINT4785546 -3284410 -POINT4867721 -3162956 -POINT4904318 -3104281 -POINT4981926 -2979850 -POINT5016317 -2919858 -POINT5089248 -2792633 -POINT5121383 -2731403 -POINT5189529 -2601555 -POINT5282646 -2406883 -POINT5310145 -2343433 -POINT5368461 -2208877 -POINT5393582 -2144452 -POINT5446853 -2007827 -POINT5469563 -1942512 -POINT5517723 -1804000 -POINT5537988 -1737886 -POINT5580963 -1597679 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5697016 -1110735 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5796142 -323547 -POINT5798712 -254442 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796142 323547 -POINT5791006 392507 -POINT5780113 538749 -POINT5772417 607470 -POINT5756096 753204 -POINT5724121 966621 -POINT5684234 1178695 -POINT5668937 1246135 -POINT5636497 1389152 -POINT5618702 1455973 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5495013 1869316 -POINT5446853 2007827 -POINT5421733 2072255 -POINT5368461 2208885 -POINT5282646 2406883 -POINT5189529 2601562 -POINT5157395 2662792 -POINT5089248 2792640 -POINT4981926 2979858 -POINT4867721 3162956 -POINT4828971 3220228 -POINT4746795 3341682 -POINT4619301 3515800 -POINT4576402 3570036 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4047401 4161346 -POINT3889923 4308891 -POINT3837739 4354264 -POINT3727073 4450485 -POINT3673239 4493885 -POINT3559074 4585922 -POINT3503663 4627293 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2966857 4988460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2058860 5427459 -POINT1993760 5450773 -POINT1855705 5500213 -POINT1789781 5521095 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1374677 5638764 -POINT1231971 5672531 -POINT1020278 5714386 -POINT951988 5725268 -POINT807167 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-338169 5793905 -POINT-484504 5784370 -POINT-553294 5777312 -POINT-699173 5762344 -POINT-912879 5732353 -POINT-980955 5720205 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533752 -POINT-1956619 5464782 -POINT-2021277 5440261 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212990 -POINT-2614237 5181425 -POINT-2744712 5114486 -POINT-2805023 5080655 -POINT-2932922 5008911 -POINT-2991935 4972862 -POINT-3117080 4896415 -POINT-3174709 4858196 -POINT-3296920 4777145 -POINT-3353092 4736813 -POINT-3472213 4651283 -POINT-3526845 4608890 -POINT-3642700 4518989 -POINT-3695718 4474594 -POINT-3808151 4380447 -POINT-3859484 4334111 -POINT-3968345 4235847 -POINT-4123047 4085403 -POINT-4272056 3929306 -POINT-4317911 3877545 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4594031 3546021 -POINT-4682853 3429336 -POINT-4722662 3372793 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-5035454 2886749 -POINT-5139274 2697563 -POINT-5170267 2635746 -POINT-5235992 2504654 -POINT-5264665 2441727 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5568334 1634654 -POINT-5608696 1493675 -POINT-5660339 1284149 -POINT-5674382 1216438 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431221 -POINT-5800155 215759 -POINT-5801439 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804161 0 -POINT-5800527 -195760 -POINT-5800155 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5707493 -1053121 -POINT-5704162 -1072845 -POINT-5664401 -1264556 -POINT-5660339 -1284141 -POINT-5613483 -1474246 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5488448 -1887230 -POINT-5482231 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5148239 -2679682 -POINT-5139274 -2697563 -POINT-5035454 -2886741 -POINT-4924675 -3071937 -POINT-4807083 -3252884 -POINT-4694369 -3412974 -POINT-4682853 -3429329 -POINT-4552147 -3601043 -POINT-4415153 -3767776 -POINT-4285320 -3914330 -POINT-4272056 -3929302 -POINT-4136859 -4070931 -POINT-4123047 -4085399 -POINT-3982685 -4221902 -POINT-3968345 -4235847 -POINT-3823000 -4367040 -POINT-3808151 -4380443 -POINT-3642700 -4518982 -POINT-3488016 -4639016 -POINT-3472213 -4651279 -POINT-3313169 -4765478 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2949992 -4998480 -POINT-2932922 -5008907 -POINT-2744712 -5114479 -POINT-2552711 -5212986 -POINT-2375309 -5295824 -POINT-2357185 -5304287 -POINT-2158393 -5388256 -POINT-1975322 -5457686 -POINT-1956619 -5464779 -POINT-1771097 -5527355 -POINT-1752143 -5533748 -POINT-1564420 -5589386 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-932571 -5728839 -POINT-912879 -5732353 -POINT-718981 -5759561 -POINT-699173 -5762340 -POINT-504402 -5782325 -POINT-484504 -5784366 -POINT-269165 -5798397 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748340 -POINT1020278 -5714386 -POINT1231971 -5672531 -POINT1441970 -5622837 -POINT1630698 -5570699 -POINT1649978 -5565372 -POINT1836636 -5506253 -POINT1855705 -5500213 -POINT2040030 -5434200 -POINT2058860 -5427456 -POINT2240610 -5354634 -POINT2259178 -5347194 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2822692 -5072028 -POINT2840316 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837612 -POINT3386154 -4715027 -POINT3543046 -4597889 -POINT3559074 -4585922 -POINT3727073 -4450481 -POINT3874828 -4322012 -POINT3889923 -4308887 -POINT4047401 -4161342 -POINT4185202 -4022251 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685047 -POINT4606892 -3531481 -POINT4619301 -3515792 -POINT4734978 -3357821 -POINT4746795 -3341682 -POINT4856513 -3179522 -POINT4867721 -3162956 -POINT4971340 -2996823 -POINT4981926 -2979850 -POINT5079301 -2809986 -POINT5089248 -2792633 -POINT5180234 -2619266 -POINT5189529 -2601555 -POINT5282646 -2406883 -POINT5360507 -2227231 -POINT5368461 -2208877 -POINT5439587 -2026463 -POINT5446853 -2007827 -POINT5511154 -1822893 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5631350 -1408474 -POINT5636497 -1389144 -POINT5679810 -1198202 -POINT5684234 -1178695 -POINT5720424 -986271 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5777887 -558620 -POINT5780113 -538742 -POINT5794657 -343494 -POINT5796142 -323547 -POINT5804161 -107894 -POINT5804161 107902 -POINT5796886 303559 -POINT5796142 323547 -POINT5781599 518802 -POINT5780113 538749 -POINT5756096 753204 -POINT5724121 966621 -POINT5684234 1178695 -POINT5640922 1369645 -POINT5636497 1389152 -POINT5580963 1597679 -POINT5523585 1784876 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208885 -POINT5282646 2406883 -POINT5189529 2601562 -POINT5089248 2792640 -POINT4981926 2979858 -POINT4867721 3162956 -POINT4758004 3325116 -POINT4746795 3341682 -POINT4619301 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4061479 4147137 -POINT4047401 4161346 -POINT3904520 4295215 -POINT3889923 4308891 -POINT3742168 4437361 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2857576 5052460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2077428 5420020 -POINT2058860 5427459 -POINT1874536 5493470 -POINT1855705 5500213 -POINT1669047 5559336 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231971 5672531 -POINT1020278 5714386 -POINT826920 5745197 -POINT807167 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-464544 5785671 -POINT-484504 5784370 -POINT-679275 5764386 -POINT-699173 5762344 -POINT-893071 5735133 -POINT-912879 5732353 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1732966 5539436 -POINT-1752143 5533752 -POINT-1937666 5471175 -POINT-1956619 5464782 -POINT-2139691 5395353 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212990 -POINT-2726916 5123617 -POINT-2744712 5114486 -POINT-2915477 5018697 -POINT-2932922 5008911 -POINT-3100011 4906843 -POINT-3117080 4896415 -POINT-3280251 4788201 -POINT-3296920 4777145 -POINT-3472213 4651283 -POINT-3626897 4531252 -POINT-3642700 4518989 -POINT-3792815 4393289 -POINT-3808151 4380447 -POINT-3953497 4249250 -POINT-3968345 4235847 -POINT-4123047 4085403 -POINT-4272056 3929306 -POINT-4401890 3782749 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4670738 3445252 -POINT-4682853 3429336 -POINT-4807083 3252884 -POINT-4924675 3071937 -POINT-5035454 2886749 -POINT-5129651 2715099 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482231 1906242 -POINT-5549301 1701133 -POINT-5608696 1493675 -POINT-5660339 1284149 -POINT-5700100 1092431 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5786268 451137 -POINT-5788124 431221 -POINT-5799040 235730 -POINT-5800155 215759 -OBJECT_ID100 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5704162 -1072837 -POINT-5660339 -1284141 -POINT-5608703 -1493667 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-4924682 -3071937 -POINT-4807083 -3252876 -POINT-4682861 -3429329 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929298 -POINT-4123047 -4085395 -POINT-3968353 -4235847 -POINT-3808151 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008903 -POINT-2744720 -5114479 -POINT-2552719 -5212982 -POINT-2357193 -5304283 -POINT-2158401 -5388252 -POINT-1956619 -5464775 -POINT-1752151 -5533745 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784363 -POINT-269165 -5798393 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855697 -5500213 -POINT2058853 -5427452 -POINT2259170 -5347191 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837608 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3727066 -4450477 -POINT3889923 -4308891 -POINT4047393 -4161338 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4746795 -3341682 -POINT4867721 -3162956 -POINT4981918 -2979850 -POINT5089248 -2792633 -POINT5189529 -2601555 -POINT5282638 -2406883 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107902 -POINT5796142 323547 -POINT5780105 538749 -POINT5756088 753204 -POINT5724121 966621 -POINT5684234 1178703 -POINT5636490 1389152 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208885 -POINT5282638 2406883 -POINT5189529 2601562 -POINT5089248 2792640 -POINT4981918 2979858 -POINT4867721 3162956 -POINT4746795 3341690 -POINT4619293 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4047393 4161346 -POINT3889923 4308891 -POINT3727066 4450485 -POINT3559066 4585930 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1855697 5500221 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231964 5672531 -POINT1020278 5714386 -POINT807159 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804420 -POINT-269165 5798401 -POINT-484512 5784370 -POINT-699173 5762344 -POINT-912887 5732353 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212990 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-3117080 4896415 -POINT-3296920 4777145 -POINT-3472213 4651283 -POINT-3642700 4518989 -POINT-3808151 4380447 -POINT-3968353 4235847 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4682861 3429336 -POINT-4807083 3252884 -POINT-4924682 3071937 -POINT-5035461 2886749 -POINT-5139282 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493675 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803580 -31655 -POINT-5800155 -215759 -POINT-5798391 -247370 -POINT-5788131 -431221 -POINT-5785192 -462745 -POINT-5768097 -646087 -POINT-5763989 -677480 -POINT-5740097 -860054 -POINT-5704162 -1072837 -POINT-5697733 -1103839 -POINT-5660339 -1284141 -POINT-5608703 -1493667 -POINT-5599988 -1524106 -POINT-5549301 -1701133 -POINT-5539462 -1731226 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-4924682 -3071937 -POINT-4907429 -3098484 -POINT-4807083 -3252876 -POINT-4788858 -3278764 -POINT-4682861 -3429329 -POINT-4552154 -3601043 -POINT-4532055 -3625506 -POINT-4415161 -3767776 -POINT-4272064 -3929298 -POINT-4250201 -3952200 -POINT-4123047 -4085395 -POINT-3968353 -4235847 -POINT-3944849 -4257061 -POINT-3808151 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3446495 -4669742 -POINT-3296920 -4777145 -POINT-3270535 -4794643 -POINT-3117080 -4896408 -POINT-3090061 -4912913 -POINT-2932922 -5008903 -POINT-2905310 -5024393 -POINT-2744720 -5114479 -POINT-2552719 -5212982 -POINT-2357193 -5304283 -POINT-2158401 -5388252 -POINT-1956619 -5464775 -POINT-1752151 -5533745 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-1094153 -5700005 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-667678 -5765575 -POINT-484512 -5784363 -POINT-269165 -5798393 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807159 -5748337 -POINT838427 -5743356 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1262775 -5665240 -POINT1441970 -5622833 -POINT1472488 -5614402 -POINT1649978 -5565368 -POINT1680160 -5555809 -POINT1855697 -5500213 -POINT1885503 -5489538 -POINT2058853 -5427452 -POINT2259170 -5347191 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837608 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3583715 -4566050 -POINT3727066 -4450477 -POINT3750960 -4429704 -POINT3889923 -4308891 -POINT3913026 -4287243 -POINT4047393 -4161338 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4638000 -3490248 -POINT4746795 -3341682 -POINT4764537 -3315460 -POINT4867721 -3162956 -POINT4884476 -3136091 -POINT4981918 -2979850 -POINT4997665 -2952383 -POINT5089248 -2792633 -POINT5189529 -2601555 -POINT5203190 -2572993 -POINT5282638 -2406883 -POINT5295229 -2377832 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5457250 -1977923 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5589110 -1567077 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5690087 -1147579 -POINT5724121 -966613 -POINT5728811 -935303 -POINT5756088 -753204 -POINT5759612 -721739 -POINT5780105 -538742 -POINT5782458 -507169 -POINT5796142 -323547 -POINT5797318 -291907 -POINT5804153 -107894 -POINT5804153 107902 -POINT5802978 139541 -POINT5796142 323547 -POINT5793790 355121 -POINT5780105 538749 -POINT5776582 570213 -POINT5756088 753204 -POINT5751398 784516 -POINT5724121 966621 -POINT5718269 997737 -POINT5684234 1178703 -POINT5677230 1209579 -POINT5636490 1389152 -POINT5580963 1597679 -POINT5571684 1627949 -POINT5517715 1804000 -POINT5507319 1833905 -POINT5446853 2007827 -POINT5435351 2037326 -POINT5368454 2208885 -POINT5282638 2406883 -POINT5268978 2435445 -POINT5189529 2601562 -POINT5089248 2792640 -POINT5073501 2820108 -POINT4981918 2979858 -POINT4867721 3162956 -POINT4849980 3189179 -POINT4746795 3341690 -POINT4728089 3367235 -POINT4619293 3515800 -POINT4599653 3540632 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4323921 3872510 -POINT4199280 4008049 -POINT4047393 4161346 -POINT4024290 4182993 -POINT3889923 4308891 -POINT3727066 4450485 -POINT3559066 4585930 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2999200 4969514 -POINT2840316 5062568 -POINT2812420 5077542 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2229780 5358974 -POINT2058853 5427459 -POINT2029047 5438135 -POINT1855697 5500221 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231964 5672531 -POINT1200906 5678672 -POINT1020278 5714386 -POINT807159 5748344 -POINT775730 5752160 -POINT592941 5774353 -POINT377899 5792389 -POINT346272 5793860 -POINT162338 5802414 -POINT-53451 5804420 -POINT-85100 5803537 -POINT-269165 5798401 -POINT-484512 5784370 -POINT-516006 5781139 -POINT-699173 5762344 -POINT-730528 5757944 -POINT-912887 5732353 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1366880 5640804 -POINT-1545242 5595077 -POINT-1575599 5586080 -POINT-1752151 5533752 -POINT-1782150 5523633 -POINT-1956619 5464782 -POINT-1986224 5453555 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212990 -POINT-2744720 5114486 -POINT-2772332 5098997 -POINT-2932922 5008911 -POINT-2959941 4992406 -POINT-3117080 4896415 -POINT-3143466 4878917 -POINT-3296920 4777145 -POINT-3322639 4758679 -POINT-3472213 4651283 -POINT-3497227 4631873 -POINT-3642700 4518989 -POINT-3666974 4498663 -POINT-3808151 4380447 -POINT-3968353 4235847 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4293059 3905607 -POINT-4415161 3767776 -POINT-4435260 3743314 -POINT-4552154 3601043 -POINT-4571331 3575851 -POINT-4682861 3429336 -POINT-4807083 3252884 -POINT-4824337 3226336 -POINT-4924682 3071937 -POINT-5035461 2886749 -POINT-5139282 2697563 -POINT-5153471 2669260 -POINT-5235992 2504654 -POINT-5249120 2475843 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5418545 2079012 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493675 -POINT-5616279 1462934 -POINT-5660339 1284149 -POINT-5666769 1253147 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5789896 399609 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5796303 -284802 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5728582 -928239 -POINT-5704162 -1072837 -POINT-5690120 -1140549 -POINT-5660339 -1284141 -POINT-5643793 -1351283 -POINT-5608703 -1493667 -POINT-5589668 -1560149 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-4999963 -2946086 -POINT-4924682 -3071937 -POINT-4886998 -3129918 -POINT-4807083 -3252876 -POINT-4682861 -3429329 -POINT-4640977 -3484354 -POINT-4552154 -3601043 -POINT-4508256 -3654472 -POINT-4415161 -3767776 -POINT-4272064 -3929298 -POINT-4224312 -3979319 -POINT-4123047 -4085395 -POINT-4073476 -4133607 -POINT-3968353 -4235847 -POINT-3808151 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3416042 -4691610 -POINT-3296920 -4777145 -POINT-3239292 -4815362 -POINT-3117080 -4896408 -POINT-2932922 -5008903 -POINT-2744720 -5114479 -POINT-2683194 -5146044 -POINT-2552719 -5212982 -POINT-2490064 -5242239 -POINT-2357193 -5304283 -POINT-2158401 -5388252 -POINT-1956619 -5464775 -POINT-1752151 -5533745 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-844403 -5741964 -POINT-699173 -5762344 -POINT-630386 -5769400 -POINT-484512 -5784363 -POINT-415505 -5788859 -POINT-269165 -5798393 -POINT-53451 -5804413 -POINT15697 -5803770 -POINT162338 -5802406 -POINT231413 -5799194 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020278 -5714386 -POINT1088112 -5700974 -POINT1231964 -5672531 -POINT1441970 -5622833 -POINT1508625 -5604419 -POINT1649978 -5565368 -POINT1715900 -5544490 -POINT1855697 -5500213 -POINT2058853 -5427452 -POINT2123043 -5401733 -POINT2259170 -5347191 -POINT2456375 -5259544 -POINT2518478 -5229129 -POINT2650177 -5164627 -POINT2711106 -5131923 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3084852 -4916373 -POINT3208557 -4837608 -POINT3265467 -4798328 -POINT3386154 -4715027 -POINT3441563 -4673656 -POINT3559066 -4585922 -POINT3727066 -4450477 -POINT3889923 -4308891 -POINT3940383 -4261609 -POINT4047393 -4161338 -POINT4096065 -4112215 -POINT4199280 -4008041 -POINT4246088 -3957143 -POINT4345352 -3849205 -POINT4390239 -3796600 -POINT4485428 -3685043 -POINT4528324 -3630808 -POINT4619293 -3515792 -POINT4660150 -3460000 -POINT4746795 -3341682 -POINT4785546 -3284410 -POINT4867721 -3162956 -POINT4904315 -3104281 -POINT4981918 -2979850 -POINT5016311 -2919858 -POINT5089248 -2792633 -POINT5121383 -2731403 -POINT5189529 -2601555 -POINT5282638 -2406883 -POINT5310138 -2343433 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5469561 -1942512 -POINT5517715 -1804000 -POINT5537983 -1737883 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5697016 -1110735 -POINT5724121 -966613 -POINT5734365 -898227 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5785244 -469784 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107902 -POINT5801586 177004 -POINT5796142 323547 -POINT5780105 538749 -POINT5772409 607470 -POINT5756088 753204 -POINT5724121 966621 -POINT5684234 1178703 -POINT5668935 1246140 -POINT5636490 1389152 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5495008 1869316 -POINT5446853 2007827 -POINT5421731 2072255 -POINT5368454 2208885 -POINT5340955 2272332 -POINT5282638 2406883 -POINT5252802 2469267 -POINT5189529 2601562 -POINT5157395 2662792 -POINT5089248 2792640 -POINT5054855 2852633 -POINT4981918 2979858 -POINT4867721 3162956 -POINT4746795 3341690 -POINT4705938 3397483 -POINT4619293 3515800 -POINT4576397 3570036 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4047393 4161346 -POINT3996933 4208626 -POINT3889923 4308891 -POINT3727066 4450485 -POINT3673231 4493888 -POINT3559066 4585930 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3150224 4874755 -POINT3026519 4953514 -POINT2966852 4988460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1855697 5500221 -POINT1789776 5521100 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1374675 5638764 -POINT1231964 5672531 -POINT1020278 5714386 -POINT951985 5725268 -POINT807159 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804420 -POINT-269165 5798401 -POINT-338171 5793905 -POINT-484512 5784370 -POINT-553299 5777312 -POINT-699173 5762344 -POINT-912887 5732353 -POINT-980960 5720205 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1403194 5631494 -POINT-1545242 5595077 -POINT-1611545 5575426 -POINT-1752151 5533752 -POINT-1817672 5511651 -POINT-1956619 5464782 -POINT-2021279 5440261 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212990 -POINT-2614245 5181425 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-2991935 4972862 -POINT-3117080 4896415 -POINT-3174709 4858196 -POINT-3296920 4777145 -POINT-3353092 4736813 -POINT-3472213 4651283 -POINT-3526845 4608890 -POINT-3642700 4518989 -POINT-3695718 4474594 -POINT-3808151 4380447 -POINT-3859487 4334111 -POINT-3968353 4235847 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4317919 3877545 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4594039 3546021 -POINT-4682861 3429336 -POINT-4807083 3252884 -POINT-4924682 3071937 -POINT-4960181 3012595 -POINT-5035461 2886749 -POINT-5139282 2697563 -POINT-5235992 2504654 -POINT-5264665 2441727 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493675 -POINT-5625250 1426533 -POINT-5660339 1284149 -POINT-5674382 1216438 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5774517 577234 -POINT-5788131 431221 -POINT-5800155 215759 -POINT-5801441 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804168 0 -POINT-5800527 -195760 -POINT-5800155 -215759 -POINT-5789246 -411249 -POINT-5788131 -431221 -POINT-5769954 -626171 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5707493 -1053114 -POINT-5704162 -1072837 -POINT-5660339 -1284141 -POINT-5608703 -1493667 -POINT-5554807 -1681903 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-4934951 -3054771 -POINT-4924682 -3071937 -POINT-4807083 -3252876 -POINT-4682861 -3429329 -POINT-4564270 -3585127 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929298 -POINT-4136859 -4070927 -POINT-4123047 -4085395 -POINT-3982692 -4221902 -POINT-3968353 -4235847 -POINT-3808151 -4380440 -POINT-3642700 -4518982 -POINT-3488016 -4639013 -POINT-3472213 -4651275 -POINT-3313169 -4765478 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2949992 -4998476 -POINT-2932922 -5008903 -POINT-2762165 -5104693 -POINT-2744720 -5114479 -POINT-2552719 -5212982 -POINT-2357193 -5304283 -POINT-2176827 -5380469 -POINT-2158401 -5388252 -POINT-1956619 -5464775 -POINT-1752151 -5533745 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784363 -POINT-289125 -5797093 -POINT-269165 -5798393 -POINT-73446 -5803855 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1000524 -5717533 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1422505 -5627440 -POINT1441970 -5622833 -POINT1630698 -5570695 -POINT1649978 -5565368 -POINT1836629 -5506253 -POINT1855697 -5500213 -POINT2058853 -5427452 -POINT2259170 -5347191 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2822692 -5072028 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3191683 -4848352 -POINT3208557 -4837608 -POINT3386154 -4715027 -POINT3543039 -4597889 -POINT3559066 -4585922 -POINT3711494 -4463032 -POINT3727066 -4450477 -POINT3889923 -4308891 -POINT4032797 -4175015 -POINT4047393 -4161338 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4606885 -3531480 -POINT4619293 -3515792 -POINT4734977 -3357821 -POINT4746795 -3341682 -POINT4856513 -3179522 -POINT4867721 -3162956 -POINT4971333 -2996823 -POINT4981918 -2979850 -POINT5079300 -2809986 -POINT5089248 -2792633 -POINT5180234 -2619266 -POINT5189529 -2601555 -POINT5274008 -2424927 -POINT5282638 -2406883 -POINT5360500 -2227231 -POINT5368454 -2208877 -POINT5439586 -2026463 -POINT5446853 -2007827 -POINT5511147 -1822893 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5679809 -1198202 -POINT5684234 -1178695 -POINT5720424 -986271 -POINT5724121 -966613 -POINT5753125 -772985 -POINT5756088 -753204 -POINT5777879 -558620 -POINT5780105 -538742 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5803411 -127883 -POINT5804153 -107894 -POINT5804153 107902 -POINT5796885 303559 -POINT5796142 323547 -POINT5781592 518802 -POINT5780105 538749 -POINT5756088 753204 -POINT5724121 966621 -POINT5684234 1178703 -POINT5636490 1389152 -POINT5586110 1578350 -POINT5580963 1597679 -POINT5523578 1784876 -POINT5517715 1804000 -POINT5453422 1988934 -POINT5446853 2007827 -POINT5375721 2190249 -POINT5368454 2208885 -POINT5282638 2406883 -POINT5189529 2601562 -POINT5089248 2792640 -POINT4991867 2962504 -POINT4981918 2979858 -POINT4867721 3162956 -POINT4758004 3325123 -POINT4746795 3341690 -POINT4631111 3499662 -POINT4619293 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4061472 4147137 -POINT4047393 4161346 -POINT3904519 4295215 -POINT3889923 4308891 -POINT3742161 4437361 -POINT3727066 4450485 -POINT3559066 4585930 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3043393 4942771 -POINT3026519 4953514 -POINT2857576 5052460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2077420 5420020 -POINT2058853 5427459 -POINT1874528 5493477 -POINT1855697 5500221 -POINT1669047 5559337 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231964 5672531 -POINT1020278 5714386 -POINT826913 5745197 -POINT807159 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804420 -POINT-249170 5798959 -POINT-269165 5798401 -POINT-464551 5785671 -POINT-484512 5784370 -POINT-679275 5764386 -POINT-699173 5762344 -POINT-893078 5735133 -POINT-912887 5732353 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1732972 5539437 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2139698 5395353 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212990 -POINT-2726923 5123617 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-3100011 4906843 -POINT-3117080 4896415 -POINT-3280251 4788201 -POINT-3296920 4777145 -POINT-3472213 4651283 -POINT-3626897 4531252 -POINT-3642700 4518989 -POINT-3792815 4393289 -POINT-3808151 4380447 -POINT-3953504 4249250 -POINT-3968353 4235847 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4401897 3782749 -POINT-4415161 3767776 -POINT-4539456 3616498 -POINT-4552154 3601043 -POINT-4670746 3445252 -POINT-4682861 3429336 -POINT-4807083 3252884 -POINT-4913782 3088709 -POINT-4924682 3071937 -POINT-5025193 2903914 -POINT-5035461 2886749 -POINT-5129659 2715099 -POINT-5139282 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5475320 1925010 -POINT-5482239 1906242 -POINT-5543085 1720145 -POINT-5549301 1701133 -POINT-5608703 1493675 -POINT-5655553 1303570 -POINT-5660339 1284149 -POINT-5700100 1092431 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5799041 235730 -POINT-5800155 215759 -POINT-5803797 19998 -OBJECT_ID110 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431213 -POINT-5768097 -646087 -POINT-5740097 -860046 -POINT-5704162 -1072830 -POINT-5660339 -1284133 -POINT-5608703 -1493667 -POINT-5549301 -1701126 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139282 -2697555 -POINT-5035461 -2886734 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4682861 -3429321 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929290 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3808166 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2744720 -5114471 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2158401 -5388260 -POINT-1956619 -5464767 -POINT-1752151 -5533737 -POINT-1545242 -5595062 -POINT-1336212 -5648651 -POINT-1125320 -5694443 -POINT-912887 -5732345 -POINT-699173 -5762344 -POINT-484512 -5784363 -POINT-269165 -5798385 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855697 -5500213 -POINT2058853 -5427444 -POINT2259170 -5347198 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3026519 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3727066 -4450470 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4199280 -4008041 -POINT4345352 -3849197 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4746795 -3341674 -POINT4867721 -3162948 -POINT4981918 -2979843 -POINT5089248 -2792633 -POINT5189529 -2601547 -POINT5282638 -2406875 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107910 -POINT5796142 323547 -POINT5780105 538757 -POINT5756088 753204 -POINT5724121 966629 -POINT5684234 1178695 -POINT5636490 1389160 -POINT5580963 1597686 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208892 -POINT5282638 2406891 -POINT5189529 2601562 -POINT5089248 2792648 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4619293 3515808 -POINT4485428 3685058 -POINT4345352 3849212 -POINT4199280 4008056 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953521 -POINT2840316 5062576 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1855697 5500229 -POINT1649978 5565384 -POINT1441970 5622848 -POINT1231964 5672531 -POINT1020278 5714386 -POINT807159 5748352 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804428 -POINT-269165 5798401 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-3117080 4896423 -POINT-3296936 4777145 -POINT-3472213 4651291 -POINT-3642700 4518997 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4682861 3429336 -POINT-4807098 3252884 -POINT-4924682 3071945 -POINT-5035461 2886749 -POINT-5139282 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5482239 1906250 -POINT-5549301 1701141 -POINT-5608703 1493682 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431228 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803580 -31655 -POINT-5800155 -215759 -POINT-5798391 -247369 -POINT-5788131 -431213 -POINT-5785192 -462738 -POINT-5768097 -646087 -POINT-5763989 -677478 -POINT-5740097 -860046 -POINT-5704162 -1072830 -POINT-5697733 -1103831 -POINT-5660339 -1284133 -POINT-5608703 -1493667 -POINT-5599988 -1524105 -POINT-5549301 -1701126 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139282 -2697555 -POINT-5124050 -2725311 -POINT-5035461 -2886734 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4788871 -3278770 -POINT-4682861 -3429321 -POINT-4552154 -3601043 -POINT-4532055 -3625506 -POINT-4415161 -3767776 -POINT-4272064 -3929290 -POINT-4250201 -3952192 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3944851 -4257054 -POINT-3808166 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296936 -4777145 -POINT-3270548 -4794643 -POINT-3117080 -4896408 -POINT-3090061 -4912912 -POINT-2932922 -5008896 -POINT-2744720 -5114471 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2328027 -5316597 -POINT-2158401 -5388260 -POINT-1956619 -5464767 -POINT-1752151 -5533737 -POINT-1545242 -5595062 -POINT-1514574 -5602925 -POINT-1336212 -5648651 -POINT-1125320 -5694443 -POINT-912887 -5732345 -POINT-881532 -5736747 -POINT-699173 -5762344 -POINT-667678 -5765575 -POINT-484512 -5784363 -POINT-269165 -5798385 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807159 -5748337 -POINT838427 -5743356 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1262775 -5665240 -POINT1441970 -5622833 -POINT1472488 -5614402 -POINT1649978 -5565368 -POINT1680160 -5555809 -POINT1855697 -5500213 -POINT1885503 -5489537 -POINT2058853 -5427444 -POINT2088243 -5415671 -POINT2259170 -5347198 -POINT2288103 -5334337 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT2867635 -5046561 -POINT3026519 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3583715 -4566049 -POINT3727066 -4450470 -POINT3750960 -4429697 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4199280 -4008041 -POINT4345352 -3849197 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4638000 -3490247 -POINT4746795 -3341674 -POINT4764537 -3315452 -POINT4867721 -3162948 -POINT4884476 -3136084 -POINT4981918 -2979843 -POINT5089248 -2792633 -POINT5189529 -2601547 -POINT5203190 -2572986 -POINT5282638 -2406875 -POINT5295229 -2377826 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5457250 -1977923 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5589110 -1567077 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5690087 -1147579 -POINT5724121 -966613 -POINT5728811 -935303 -POINT5756088 -753204 -POINT5759612 -721739 -POINT5780105 -538742 -POINT5782458 -507169 -POINT5796142 -323547 -POINT5797318 -291907 -POINT5804153 -107894 -POINT5804153 107910 -POINT5802978 139547 -POINT5796142 323547 -POINT5793790 355122 -POINT5780105 538757 -POINT5776582 570220 -POINT5756088 753204 -POINT5751398 784517 -POINT5724121 966629 -POINT5684234 1178695 -POINT5677230 1209574 -POINT5636490 1389160 -POINT5580963 1597686 -POINT5571684 1627956 -POINT5517715 1804000 -POINT5507319 1833905 -POINT5446853 2007827 -POINT5435351 2037327 -POINT5368454 2208892 -POINT5282638 2406891 -POINT5268978 2435452 -POINT5189529 2601562 -POINT5174816 2629598 -POINT5089248 2792648 -POINT5073501 2820115 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4849980 3189185 -POINT4746795 3341690 -POINT4728089 3367236 -POINT4619293 3515808 -POINT4599653 3540640 -POINT4485428 3685058 -POINT4345352 3849212 -POINT4323921 3872517 -POINT4199280 4008056 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3533697 4604864 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953521 -POINT2999200 4969522 -POINT2840316 5062576 -POINT2812420 5077549 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2229780 5358974 -POINT2058853 5427459 -POINT2029047 5438136 -POINT1855697 5500229 -POINT1649978 5565384 -POINT1619460 5573815 -POINT1441970 5622848 -POINT1411159 5630138 -POINT1231964 5672531 -POINT1200906 5678672 -POINT1020278 5714386 -POINT807159 5748352 -POINT775730 5752167 -POINT592941 5774353 -POINT377899 5792389 -POINT346272 5793860 -POINT162338 5802414 -POINT-53451 5804428 -POINT-85100 5803544 -POINT-269165 5798401 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1366880 5640804 -POINT-1545242 5595077 -POINT-1575599 5586080 -POINT-1752151 5533752 -POINT-1782150 5523633 -POINT-1956619 5464782 -POINT-1986224 5453555 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2744720 5114486 -POINT-2772332 5098997 -POINT-2932922 5008911 -POINT-3117080 4896423 -POINT-3143468 4878923 -POINT-3296936 4777145 -POINT-3472213 4651291 -POINT-3497227 4631881 -POINT-3642700 4518997 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4293059 3905607 -POINT-4415161 3767776 -POINT-4435260 3743314 -POINT-4552154 3601043 -POINT-4571331 3575851 -POINT-4682861 3429336 -POINT-4701089 3403448 -POINT-4807098 3252884 -POINT-4824350 3226337 -POINT-4924682 3071945 -POINT-4940935 3044774 -POINT-5035461 2886749 -POINT-5139282 2697570 -POINT-5153471 2669266 -POINT-5235992 2504654 -POINT-5249120 2475844 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5418545 2079013 -POINT-5482239 1906250 -POINT-5549301 1701141 -POINT-5608703 1493682 -POINT-5616279 1462940 -POINT-5660339 1284149 -POINT-5666769 1253147 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788131 431228 -POINT-5789896 399615 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5796303 -284800 -POINT-5788131 -431213 -POINT-5768097 -646087 -POINT-5740097 -860046 -POINT-5728582 -928231 -POINT-5704162 -1072830 -POINT-5690120 -1140541 -POINT-5660339 -1284133 -POINT-5643793 -1351277 -POINT-5608703 -1493667 -POINT-5589668 -1560146 -POINT-5549301 -1701126 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5205002 -2566468 -POINT-5139282 -2697555 -POINT-5035461 -2886734 -POINT-4999963 -2946079 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4682861 -3429321 -POINT-4640977 -3484348 -POINT-4552154 -3601043 -POINT-4508256 -3654472 -POINT-4415161 -3767776 -POINT-4369306 -3819533 -POINT-4272064 -3929290 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3808166 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3416046 -4691610 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-3058068 -4932454 -POINT-2932922 -5008896 -POINT-2872614 -5042727 -POINT-2744720 -5114471 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2158401 -5388260 -POINT-1956619 -5464767 -POINT-1752151 -5533737 -POINT-1545242 -5595062 -POINT-1336212 -5648651 -POINT-1268633 -5663325 -POINT-1125320 -5694443 -POINT-1057247 -5706589 -POINT-912887 -5732345 -POINT-699173 -5762344 -POINT-630386 -5769400 -POINT-484512 -5784363 -POINT-269165 -5798385 -POINT-200040 -5800317 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT231413 -5799186 -POINT377899 -5792373 -POINT446808 -5786599 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020278 -5714386 -POINT1088112 -5700974 -POINT1231964 -5672531 -POINT1441970 -5622833 -POINT1508625 -5604419 -POINT1649978 -5565368 -POINT1715900 -5544490 -POINT1855697 -5500213 -POINT1920797 -5476895 -POINT2058853 -5427444 -POINT2123043 -5401730 -POINT2259170 -5347198 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT2899984 -5027615 -POINT3026519 -4953506 -POINT3084852 -4916370 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3441563 -4673656 -POINT3559066 -4585922 -POINT3612901 -4542517 -POINT3727066 -4450470 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4096065 -4112210 -POINT4199280 -4008041 -POINT4345352 -3849197 -POINT4390239 -3796595 -POINT4485428 -3685043 -POINT4528324 -3630808 -POINT4619293 -3515792 -POINT4746795 -3341674 -POINT4785546 -3284402 -POINT4867721 -3162948 -POINT4904315 -3104273 -POINT4981918 -2979843 -POINT5089248 -2792633 -POINT5121383 -2731400 -POINT5189529 -2601547 -POINT5282638 -2406875 -POINT5310138 -2343428 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5469561 -1942512 -POINT5517715 -1804000 -POINT5537983 -1737883 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5697016 -1110735 -POINT5724121 -966613 -POINT5734365 -898227 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5785244 -469784 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107910 -POINT5801586 177009 -POINT5796142 323547 -POINT5780105 538757 -POINT5772409 607475 -POINT5756088 753204 -POINT5724121 966629 -POINT5684234 1178695 -POINT5668935 1246137 -POINT5636490 1389160 -POINT5580963 1597686 -POINT5517715 1804000 -POINT5495008 1869316 -POINT5446853 2007827 -POINT5421731 2072258 -POINT5368454 2208892 -POINT5340955 2272340 -POINT5282638 2406891 -POINT5252802 2469272 -POINT5189529 2601562 -POINT5157395 2662794 -POINT5089248 2792648 -POINT5054855 2852638 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4705938 3397485 -POINT4619293 3515808 -POINT4576397 3570043 -POINT4485428 3685058 -POINT4440541 3737661 -POINT4345352 3849212 -POINT4298544 3900113 -POINT4199280 4008056 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953521 -POINT2966852 4988467 -POINT2840316 5062576 -POINT2779387 5095278 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1993753 5450778 -POINT1855697 5500229 -POINT1649978 5565384 -POINT1441970 5622848 -POINT1374675 5638769 -POINT1231964 5672531 -POINT1020278 5714386 -POINT807159 5748352 -POINT738514 5756684 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804428 -POINT-122575 5802497 -POINT-269165 5798401 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1403194 5631494 -POINT-1545242 5595077 -POINT-1611545 5575426 -POINT-1752151 5533752 -POINT-1817672 5511651 -POINT-1956619 5464782 -POINT-2021279 5440261 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2614245 5181430 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-2991935 4972865 -POINT-3117080 4896423 -POINT-3174714 4858201 -POINT-3296936 4777145 -POINT-3353103 4736816 -POINT-3472213 4651291 -POINT-3526845 4608898 -POINT-3642700 4518997 -POINT-3695723 4474600 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4317919 3877545 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4594039 3546021 -POINT-4682861 3429336 -POINT-4807098 3252884 -POINT-4924682 3071945 -POINT-4960181 3012600 -POINT-5035461 2886749 -POINT-5068730 2826128 -POINT-5139282 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5482239 1906250 -POINT-5549301 1701141 -POINT-5608703 1493682 -POINT-5625250 1426539 -POINT-5660339 1284149 -POINT-5674382 1216438 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5774517 577237 -POINT-5788131 431228 -POINT-5800155 215759 -POINT-5801441 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804168 0 -POINT-5800527 -195760 -POINT-5800155 -215759 -POINT-5789246 -411242 -POINT-5788131 -431213 -POINT-5769954 -626170 -POINT-5768097 -646087 -POINT-5740097 -860046 -POINT-5707493 -1053107 -POINT-5704162 -1072830 -POINT-5664401 -1264548 -POINT-5660339 -1284133 -POINT-5608703 -1493667 -POINT-5549301 -1701126 -POINT-5488455 -1887223 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5244286 -2486451 -POINT-5235992 -2504654 -POINT-5139282 -2697555 -POINT-5035461 -2886734 -POINT-4934951 -3054763 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4694377 -3412967 -POINT-4682861 -3429321 -POINT-4564270 -3585126 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4285328 -3914319 -POINT-4272064 -3929290 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3808166 -4380432 -POINT-3658037 -4506140 -POINT-3642700 -4518982 -POINT-3488016 -4639013 -POINT-3472213 -4651275 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2762165 -5104685 -POINT-2744720 -5114471 -POINT-2570516 -5203851 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2158401 -5388260 -POINT-1975322 -5457676 -POINT-1956619 -5464767 -POINT-1752151 -5533737 -POINT-1564421 -5589378 -POINT-1545242 -5595062 -POINT-1355587 -5643684 -POINT-1336212 -5648651 -POINT-1125320 -5694443 -POINT-932578 -5728832 -POINT-912887 -5732345 -POINT-718982 -5759564 -POINT-699173 -5762344 -POINT-484512 -5784363 -POINT-289125 -5797086 -POINT-269165 -5798385 -POINT-53451 -5804413 -POINT142336 -5802585 -POINT162338 -5802398 -POINT357918 -5793303 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1000524 -5717533 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1422505 -5627440 -POINT1441970 -5622833 -POINT1630698 -5570695 -POINT1649978 -5565368 -POINT1836629 -5506253 -POINT1855697 -5500213 -POINT2058853 -5427444 -POINT2240603 -5354636 -POINT2259170 -5347198 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3009260 -4963615 -POINT3026519 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543039 -4597889 -POINT3559066 -4585922 -POINT3727066 -4450470 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4199280 -4008041 -POINT4331812 -3863921 -POINT4345352 -3849197 -POINT4472444 -3700259 -POINT4485428 -3685043 -POINT4606885 -3531480 -POINT4619293 -3515792 -POINT4734977 -3357814 -POINT4746795 -3341674 -POINT4856513 -3179515 -POINT4867721 -3162948 -POINT4981918 -2979843 -POINT5079300 -2809986 -POINT5089248 -2792633 -POINT5180234 -2619259 -POINT5189529 -2601547 -POINT5274008 -2424919 -POINT5282638 -2406875 -POINT5360500 -2227230 -POINT5368454 -2208877 -POINT5439586 -2026463 -POINT5446853 -2007827 -POINT5511147 -1822893 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5679809 -1198202 -POINT5684234 -1178695 -POINT5720424 -986271 -POINT5724121 -966613 -POINT5753125 -772985 -POINT5756088 -753204 -POINT5777879 -558620 -POINT5780105 -538742 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5803411 -127883 -POINT5804153 -107894 -POINT5804153 107910 -POINT5796885 303559 -POINT5796142 323547 -POINT5781592 518809 -POINT5780105 538757 -POINT5756088 753204 -POINT5724121 966629 -POINT5684234 1178695 -POINT5636490 1389160 -POINT5586110 1578358 -POINT5580963 1597686 -POINT5523578 1784877 -POINT5517715 1804000 -POINT5453422 1988934 -POINT5446853 2007827 -POINT5375721 2190256 -POINT5368454 2208892 -POINT5282638 2406891 -POINT5189529 2601562 -POINT5089248 2792648 -POINT4991867 2962505 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4619293 3515808 -POINT4485428 3685058 -POINT4358336 3833997 -POINT4345352 3849212 -POINT4199280 4008056 -POINT4061472 4147137 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3043393 4942778 -POINT3026519 4953521 -POINT2857576 5052468 -POINT2840316 5062576 -POINT2667801 5155168 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2077420 5420020 -POINT2058853 5427459 -POINT1874528 5493484 -POINT1855697 5500229 -POINT1669047 5559345 -POINT1649978 5565384 -POINT1461251 5617522 -POINT1441970 5622848 -POINT1251429 5667926 -POINT1231964 5672531 -POINT1020278 5714386 -POINT807159 5748352 -POINT612797 5771943 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804428 -POINT-269165 5798401 -POINT-464551 5785678 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1732972 5539437 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2139698 5395353 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-3100011 4906850 -POINT-3117080 4896423 -POINT-3280265 4788201 -POINT-3296936 4777145 -POINT-3472213 4651291 -POINT-3642700 4518997 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4108708 4099349 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4401897 3782749 -POINT-4415161 3767776 -POINT-4539456 3616498 -POINT-4552154 3601043 -POINT-4670746 3445252 -POINT-4682861 3429336 -POINT-4795583 3269239 -POINT-4807098 3252884 -POINT-4924682 3071945 -POINT-5025193 2903915 -POINT-5035461 2886749 -POINT-5129659 2715106 -POINT-5139282 2697570 -POINT-5235992 2504654 -POINT-5317176 2326490 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5482239 1906250 -POINT-5543085 1720153 -POINT-5549301 1701141 -POINT-5603197 1512912 -POINT-5608703 1493682 -POINT-5655553 1303571 -POINT-5660339 1284149 -POINT-5700100 1092431 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5786274 451144 -POINT-5788131 431228 -POINT-5799041 235731 -POINT-5800155 215759 -POINT-5803797 19998 -OBJECT_ID122 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804165 0 -POINT-5800152 -215759 -POINT-5788124 -431213 -POINT-5768097 -646087 -POINT-5740093 -860061 -POINT-5704159 -1072845 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5549301 -1701126 -POINT-5482231 -1906250 -POINT-5407589 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139274 -2697555 -POINT-5035454 -2886749 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4682853 -3429336 -POINT-4552150 -3601043 -POINT-4415153 -3767776 -POINT-4272053 -3929306 -POINT-4123047 -4085403 -POINT-3968341 -4235855 -POINT-3808155 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-2932926 -5008911 -POINT-2744716 -5114486 -POINT-2552711 -5212982 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1752143 -5533752 -POINT-1545242 -5595077 -POINT-1336204 -5648666 -POINT-1125320 -5694443 -POINT-912879 -5732345 -POINT-699173 -5762344 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855705 -5500213 -POINT2058860 -5427459 -POINT2259178 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3026527 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308883 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849197 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746795 -3341690 -POINT4867721 -3162948 -POINT4981926 -2979858 -POINT5089248 -2792633 -POINT5189529 -2601562 -POINT5282646 -2406875 -POINT5368461 -2208877 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597671 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5796142 -323547 -POINT5804161 -107894 -POINT5804161 107894 -POINT5796142 323547 -POINT5780113 538742 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636497 1389144 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208877 -POINT5282646 2406891 -POINT5189529 2601562 -POINT5089248 2792633 -POINT4981926 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849212 -POINT4199280 4008041 -POINT4047401 4161346 -POINT3889923 4308899 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953521 -POINT2840316 5062576 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2058860 5427459 -POINT1855705 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-912879 5732361 -POINT-1125320 5694443 -POINT-1336204 5648666 -POINT-1545242 5595077 -POINT-1752143 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212982 -POINT-2744716 5114486 -POINT-2932926 5008911 -POINT-3117080 4896408 -POINT-3296924 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808155 4380447 -POINT-3968341 4235855 -POINT-4123047 4085403 -POINT-4272053 3929306 -POINT-4415153 3767776 -POINT-4552150 3601043 -POINT-4682853 3429336 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5035454 2886749 -POINT-5139274 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407589 2108719 -POINT-5482231 1906250 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5704159 1072845 -POINT-5740093 860061 -POINT-5768097 646087 -POINT-5788124 431228 -POINT-5800152 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804165 0 -POINT-5800152 -215759 -POINT-5788124 -431213 -POINT-5785186 -462738 -POINT-5768097 -646087 -POINT-5740093 -860061 -POINT-5734821 -891280 -POINT-5704159 -1072845 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5599982 -1524105 -POINT-5549301 -1701126 -POINT-5539461 -1731221 -POINT-5482231 -1906250 -POINT-5471280 -1935955 -POINT-5407589 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139274 -2697555 -POINT-5124042 -2725313 -POINT-5035454 -2886749 -POINT-5019201 -2913918 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4682853 -3429336 -POINT-4663677 -3454528 -POINT-4552150 -3601043 -POINT-4532051 -3625506 -POINT-4415153 -3767776 -POINT-4394158 -3791475 -POINT-4272053 -3929306 -POINT-4123047 -4085403 -POINT-4100349 -4107477 -POINT-3968341 -4235855 -POINT-3944840 -4257069 -POINT-3808155 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3446496 -4669742 -POINT-3296924 -4777145 -POINT-3270538 -4794643 -POINT-3117080 -4896408 -POINT-3090062 -4912914 -POINT-2932926 -5008911 -POINT-2744716 -5114486 -POINT-2716546 -5128937 -POINT-2552711 -5212982 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-2128790 -5399487 -POINT-1956619 -5464782 -POINT-1752143 -5533752 -POINT-1721788 -5542750 -POINT-1545242 -5595077 -POINT-1514573 -5602940 -POINT-1336204 -5648666 -POINT-1125320 -5694443 -POINT-912879 -5732345 -POINT-881525 -5736747 -POINT-699173 -5762344 -POINT-667677 -5765575 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT409449 -5789743 -POINT592941 -5774353 -POINT807167 -5748337 -POINT838434 -5743356 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1262788 -5665240 -POINT1441970 -5622833 -POINT1472488 -5614402 -POINT1649978 -5565368 -POINT1680162 -5555809 -POINT1855705 -5500213 -POINT1885511 -5489539 -POINT2058860 -5427459 -POINT2088250 -5415684 -POINT2259178 -5347198 -POINT2288110 -5334339 -POINT2456375 -5259552 -POINT2484809 -5245625 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT2867637 -5046561 -POINT3026527 -4953506 -POINT3053234 -4936503 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3750966 -4429710 -POINT3889923 -4308883 -POINT4047401 -4161346 -POINT4069684 -4138854 -POINT4199280 -4008041 -POINT4345360 -3849197 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746795 -3341690 -POINT4764537 -3315466 -POINT4867721 -3162948 -POINT4884477 -3136086 -POINT4981926 -2979858 -POINT4997672 -2952389 -POINT5089248 -2792633 -POINT5103961 -2764600 -POINT5189529 -2601562 -POINT5203191 -2572998 -POINT5282646 -2406875 -POINT5368461 -2208877 -POINT5379963 -2179380 -POINT5446853 -2007827 -POINT5457251 -1977923 -POINT5517723 -1804000 -POINT5580963 -1597671 -POINT5589111 -1567077 -POINT5636497 -1389144 -POINT5643501 -1358268 -POINT5684234 -1178695 -POINT5690087 -1147579 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5782465 -507169 -POINT5796142 -323547 -POINT5797319 -291907 -POINT5804161 -107894 -POINT5804161 107894 -POINT5796142 323547 -POINT5793791 355119 -POINT5780113 538742 -POINT5756096 753204 -POINT5751405 784514 -POINT5724121 966613 -POINT5718269 997729 -POINT5684234 1178695 -POINT5677231 1209572 -POINT5636497 1389144 -POINT5628350 1419739 -POINT5580963 1597671 -POINT5571685 1627943 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5435352 2037324 -POINT5368461 2208877 -POINT5355871 2237929 -POINT5282646 2406891 -POINT5189529 2601562 -POINT5089248 2792633 -POINT4981926 2979858 -POINT4867721 3162964 -POINT4849980 3189185 -POINT4746795 3341690 -POINT4728090 3367233 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849212 -POINT4199280 4008041 -POINT4047401 4161346 -POINT3889923 4308899 -POINT3727073 4450485 -POINT3702425 4470356 -POINT3559074 4585922 -POINT3533704 4604864 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953521 -POINT2999207 4969522 -POINT2840316 5062576 -POINT2812420 5077549 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2229788 5358974 -POINT2058860 5427459 -POINT1855705 5500213 -POINT1825521 5509773 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1200919 5678672 -POINT1020278 5714386 -POINT807167 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT346272 5793860 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-912879 5732361 -POINT-1125320 5694443 -POINT-1336204 5648666 -POINT-1366873 5640804 -POINT-1545242 5595077 -POINT-1575598 5586080 -POINT-1752143 5533752 -POINT-1782143 5523633 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212982 -POINT-2744716 5114486 -POINT-2772330 5098997 -POINT-2932926 5008911 -POINT-3117080 4896408 -POINT-3296924 4777145 -POINT-3322642 4758678 -POINT-3472213 4651275 -POINT-3497227 4631866 -POINT-3642700 4518982 -POINT-3666975 4498657 -POINT-3808155 4380447 -POINT-3831657 4359233 -POINT-3968341 4235855 -POINT-4123047 4085403 -POINT-4272053 3929306 -POINT-4415153 3767776 -POINT-4435253 3743314 -POINT-4552150 3601043 -POINT-4682853 3429336 -POINT-4701081 3403448 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5035454 2886749 -POINT-5139274 2697570 -POINT-5153465 2669266 -POINT-5235992 2504654 -POINT-5249120 2475844 -POINT-5325470 2308288 -POINT-5407589 2108719 -POINT-5482231 1906250 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5616273 1462928 -POINT-5660339 1284149 -POINT-5704159 1072845 -POINT-5740093 860061 -POINT-5768097 646087 -POINT-5788124 431228 -POINT-5789889 399615 -POINT-5800152 215759 -POLYGON_AT_HEIGHT18000000 -POINT-5804165 0 -POINT-5800152 -215759 -POINT-5788124 -431213 -POINT-5768097 -646087 -POINT-5740093 -860061 -POINT-5704159 -1072845 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5549301 -1701126 -POINT-5482231 -1906250 -POINT-5407589 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5205000 -2566468 -POINT-5139274 -2697555 -POINT-5035454 -2886749 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4767277 -3309427 -POINT-4682853 -3429336 -POINT-4640970 -3484359 -POINT-4552150 -3601043 -POINT-4508250 -3654472 -POINT-4415153 -3767776 -POINT-4369297 -3819538 -POINT-4272053 -3929306 -POINT-4123047 -4085403 -POINT-4073472 -4133615 -POINT-3968341 -4235855 -POINT-3917010 -4282189 -POINT-3808155 -4380447 -POINT-3755136 -4424840 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3416043 -4691610 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-3058069 -4932459 -POINT-2932926 -5008911 -POINT-2744716 -5114486 -POINT-2683189 -5146049 -POINT-2552711 -5212982 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-2093736 -5412781 -POINT-1956619 -5464782 -POINT-1891096 -5486883 -POINT-1752143 -5533752 -POINT-1685843 -5553404 -POINT-1545242 -5595077 -POINT-1478257 -5612250 -POINT-1336204 -5648666 -POINT-1125320 -5694443 -POINT-1057245 -5706589 -POINT-912879 -5732345 -POINT-699173 -5762344 -POINT-630383 -5769400 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1088117 -5700974 -POINT1231979 -5672531 -POINT1441970 -5622833 -POINT1508625 -5604419 -POINT1649978 -5565368 -POINT1715902 -5544490 -POINT1855705 -5500213 -POINT1920805 -5476900 -POINT2058860 -5427459 -POINT2123051 -5401740 -POINT2259178 -5347198 -POINT2322368 -5319113 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT2899987 -5027615 -POINT3026527 -4953506 -POINT3084858 -4916370 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3779257 -4405110 -POINT3889923 -4308883 -POINT3940386 -4261606 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849197 -POINT4390244 -3796595 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4660156 -3460002 -POINT4746795 -3341690 -POINT4785546 -3284413 -POINT4867721 -3162948 -POINT4904318 -3104278 -POINT4981926 -2979858 -POINT5016317 -2919863 -POINT5089248 -2792633 -POINT5121383 -2731405 -POINT5189529 -2601562 -POINT5219368 -2539176 -POINT5282646 -2406875 -POINT5310145 -2343428 -POINT5368461 -2208877 -POINT5393582 -2144452 -POINT5446853 -2007827 -POINT5469563 -1942512 -POINT5517723 -1804000 -POINT5537988 -1737883 -POINT5580963 -1597671 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5697016 -1110735 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5796142 -323547 -POINT5798712 -254442 -POINT5804161 -107894 -POINT5804161 107894 -POINT5796142 323547 -POINT5791006 392505 -POINT5780113 538742 -POINT5772417 607465 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5668937 1246133 -POINT5636497 1389144 -POINT5618702 1455966 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5495013 1869316 -POINT5446853 2007827 -POINT5421733 2072253 -POINT5368461 2208877 -POINT5282646 2406891 -POINT5189529 2601562 -POINT5157395 2662790 -POINT5089248 2792633 -POINT4981926 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4619301 3515792 -POINT4576402 3570028 -POINT4485428 3685043 -POINT4345360 3849212 -POINT4199280 4008041 -POINT4150611 4057167 -POINT4047401 4161346 -POINT3889923 4308899 -POINT3727073 4450485 -POINT3673239 4493885 -POINT3559074 4585922 -POINT3503663 4627293 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953521 -POINT2966857 4988467 -POINT2840316 5062576 -POINT2779387 5095278 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2058860 5427459 -POINT1993760 5450773 -POINT1855705 5500213 -POINT1789781 5521092 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-912879 5732361 -POINT-1125320 5694443 -POINT-1192897 5679774 -POINT-1336204 5648666 -POINT-1403189 5631494 -POINT-1545242 5595077 -POINT-1611542 5575426 -POINT-1752143 5533752 -POINT-1956619 5464782 -POINT-2021277 5440261 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212982 -POINT-2614238 5181420 -POINT-2744716 5114486 -POINT-2805027 5080655 -POINT-2932926 5008911 -POINT-3117080 4896408 -POINT-3174710 4858191 -POINT-3296924 4777145 -POINT-3353095 4736811 -POINT-3472213 4651275 -POINT-3526845 4608883 -POINT-3642700 4518982 -POINT-3808155 4380447 -POINT-3968341 4235855 -POINT-4123047 4085403 -POINT-4272053 3929306 -POINT-4317909 3877545 -POINT-4415153 3767776 -POINT-4552150 3601043 -POINT-4594033 3546021 -POINT-4682853 3429336 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5035454 2886749 -POINT-5139274 2697570 -POINT-5170267 2635751 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407589 2108719 -POINT-5482231 1906250 -POINT-5549301 1701126 -POINT-5568334 1634647 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5674381 1216438 -POINT-5704159 1072845 -POINT-5715674 1004660 -POINT-5740093 860061 -POINT-5749067 791494 -POINT-5768097 646087 -POINT-5788124 431228 -POINT-5800152 215759 -POINT-5801438 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804165 0 -POINT-5800524 -195760 -POINT-5800152 -215759 -POINT-5789239 -411242 -POINT-5788124 -431213 -POINT-5768097 -646087 -POINT-5742689 -840228 -POINT-5740093 -860061 -POINT-5704159 -1072845 -POINT-5664401 -1264563 -POINT-5660339 -1284149 -POINT-5613483 -1474247 -POINT-5608696 -1493667 -POINT-5549301 -1701126 -POINT-5482231 -1906250 -POINT-5414508 -2089951 -POINT-5407589 -2108719 -POINT-5325470 -2308273 -POINT-5244286 -2486451 -POINT-5235992 -2504654 -POINT-5148239 -2679675 -POINT-5139274 -2697555 -POINT-5035454 -2886749 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4694369 -3412981 -POINT-4682853 -3429336 -POINT-4564265 -3585128 -POINT-4552150 -3601043 -POINT-4427852 -3752321 -POINT-4415153 -3767776 -POINT-4272053 -3929306 -POINT-4123047 -4085403 -POINT-3968341 -4235855 -POINT-3823003 -4367045 -POINT-3808155 -4380447 -POINT-3642700 -4518982 -POINT-3488016 -4639013 -POINT-3472213 -4651275 -POINT-3313172 -4765478 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-2932926 -5008911 -POINT-2762162 -5104700 -POINT-2744716 -5114486 -POINT-2552711 -5212982 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1975322 -5457690 -POINT-1956619 -5464782 -POINT-1771097 -5527359 -POINT-1752143 -5533752 -POINT-1564420 -5589393 -POINT-1545242 -5595077 -POINT-1355580 -5643699 -POINT-1336204 -5648666 -POINT-1144867 -5690200 -POINT-1125320 -5694443 -POINT-932571 -5728832 -POINT-912879 -5732345 -POINT-718981 -5759564 -POINT-699173 -5762344 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT573008 -5776025 -POINT592941 -5774353 -POINT807167 -5748337 -POINT1000525 -5717533 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1422506 -5627440 -POINT1441970 -5622833 -POINT1630698 -5570695 -POINT1649978 -5565368 -POINT1836636 -5506253 -POINT1855705 -5500213 -POINT2040030 -5434203 -POINT2058860 -5427459 -POINT2240610 -5354638 -POINT2259178 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3009267 -4963615 -POINT3026527 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543046 -4597889 -POINT3559074 -4585922 -POINT3711501 -4463039 -POINT3727073 -4450485 -POINT3874828 -4322009 -POINT3889923 -4308883 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849197 -POINT4472445 -3700259 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4734978 -3357828 -POINT4746795 -3341690 -POINT4856513 -3179516 -POINT4867721 -3162948 -POINT4981926 -2979858 -POINT5079301 -2809987 -POINT5089248 -2792633 -POINT5180234 -2619273 -POINT5189529 -2601562 -POINT5274015 -2424921 -POINT5282646 -2406875 -POINT5360507 -2227230 -POINT5368461 -2208877 -POINT5439587 -2026463 -POINT5446853 -2007827 -POINT5511154 -1822893 -POINT5517723 -1804000 -POINT5580963 -1597671 -POINT5631350 -1408473 -POINT5636497 -1389144 -POINT5679810 -1198202 -POINT5684234 -1178695 -POINT5720424 -986271 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5777887 -558620 -POINT5780113 -538742 -POINT5794657 -343494 -POINT5796142 -323547 -POINT5804161 -107894 -POINT5804161 107894 -POINT5796886 303558 -POINT5796142 323547 -POINT5781599 518795 -POINT5780113 538742 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5640922 1369638 -POINT5636497 1389144 -POINT5580963 1597671 -POINT5523585 1784876 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208877 -POINT5282646 2406891 -POINT5198160 2583518 -POINT5189529 2601562 -POINT5089248 2792633 -POINT4991874 2962504 -POINT4981926 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849212 -POINT4199280 4008041 -POINT4061479 4147136 -POINT4047401 4161346 -POINT3904520 4295222 -POINT3889923 4308899 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3043400 4942778 -POINT3026527 4953521 -POINT2857576 5052468 -POINT2840316 5062576 -POINT2667801 5155168 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2077428 5420020 -POINT2058860 5427459 -POINT1874536 5493470 -POINT1855705 5500213 -POINT1669047 5559329 -POINT1649978 5565368 -POINT1461251 5617507 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-679275 5764385 -POINT-699173 5762344 -POINT-912879 5732361 -POINT-1125320 5694443 -POINT-1336204 5648666 -POINT-1545242 5595077 -POINT-1732966 5539437 -POINT-1752143 5533752 -POINT-1937666 5471175 -POINT-1956619 5464782 -POINT-2139691 5395353 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212982 -POINT-2726919 5123616 -POINT-2744716 5114486 -POINT-2932926 5008911 -POINT-3100011 4906836 -POINT-3117080 4896408 -POINT-3280254 4788200 -POINT-3296924 4777145 -POINT-3455966 4662942 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808155 4380447 -POINT-3968341 4235855 -POINT-4108707 4099349 -POINT-4123047 4085403 -POINT-4272053 3929306 -POINT-4401889 3782749 -POINT-4415153 3767776 -POINT-4539452 3616498 -POINT-4552150 3601043 -POINT-4670738 3445252 -POINT-4682853 3429336 -POINT-4795572 3269239 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5035454 2886749 -POINT-5129651 2715106 -POINT-5139274 2697570 -POINT-5235992 2504654 -POINT-5317176 2326490 -POINT-5325470 2308288 -POINT-5407589 2108719 -POINT-5482231 1906250 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5704159 1072845 -POINT-5740093 860061 -POINT-5768097 646087 -POINT-5786268 451144 -POINT-5788124 431228 -POINT-5800152 215759 -OBJECT_ID133 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804165 0 -POINT-5800155 -215759 -POINT-5788128 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482235 -1906242 -POINT-5407593 -2108719 -POINT-5325474 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035457 -2886741 -POINT-4924675 -3071937 -POINT-4807087 -3252884 -POINT-4682857 -3429336 -POINT-4552150 -3601043 -POINT-4415153 -3767776 -POINT-4272053 -3929306 -POINT-4123050 -4085403 -POINT-3968345 -4235847 -POINT-3808155 -4380447 -POINT-3642704 -4518982 -POINT-3472213 -4651283 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-2932926 -5008911 -POINT-2744716 -5114479 -POINT-2552715 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1752140 -5533752 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-912879 -5732353 -POINT-699176 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162334 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748344 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1441970 -5622841 -POINT1649974 -5565376 -POINT1855701 -5500213 -POINT2058864 -5427459 -POINT2259178 -5347198 -POINT2456375 -5259544 -POINT2650173 -5164627 -POINT2840313 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308891 -POINT4047397 -4161346 -POINT4199276 -4008041 -POINT4345356 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4746792 -3341682 -POINT4867721 -3162956 -POINT4981926 -2979858 -POINT5089245 -2792633 -POINT5189533 -2601555 -POINT5282646 -2406883 -POINT5368458 -2208885 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5636493 -1389144 -POINT5684231 -1178695 -POINT5724117 -966621 -POINT5756092 -753204 -POINT5780109 -538749 -POINT5796142 -323547 -POINT5804161 -107902 -POINT5804161 107894 -POINT5796142 323547 -POINT5780109 538749 -POINT5756092 753204 -POINT5724117 966613 -POINT5684231 1178695 -POINT5636493 1389144 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368458 2208885 -POINT5282646 2406883 -POINT5189533 2601555 -POINT5089245 2792633 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4746792 3341682 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345356 3849205 -POINT4199276 4008041 -POINT4047397 4161338 -POINT3889923 4308891 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2840313 5062568 -POINT2650173 5164627 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2058864 5427459 -POINT1855701 5500213 -POINT1649974 5565368 -POINT1441970 5622841 -POINT1231975 5672531 -POINT1020275 5714386 -POINT807167 5748344 -POINT592941 5774353 -POINT377899 5792381 -POINT162334 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784370 -POINT-699176 5762344 -POINT-912879 5732353 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552715 5212990 -POINT-2744716 5114479 -POINT-2932926 5008903 -POINT-3117080 4896408 -POINT-3296924 4777145 -POINT-3472213 4651275 -POINT-3642704 4518982 -POINT-3808155 4380440 -POINT-3968345 4235847 -POINT-4123050 4085395 -POINT-4272053 3929306 -POINT-4415153 3767776 -POINT-4552150 3601043 -POINT-4682857 3429329 -POINT-4807087 3252884 -POINT-4924675 3071937 -POINT-5035457 2886741 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325474 2308281 -POINT-5407593 2108719 -POINT-5482235 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788128 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804165 0 -POINT-5800155 -215759 -POINT-5798391 -247370 -POINT-5788128 -431221 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5697733 -1103846 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5599982 -1524106 -POINT-5549301 -1701133 -POINT-5482235 -1906242 -POINT-5471284 -1935949 -POINT-5407593 -2108719 -POINT-5325474 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5124043 -2725318 -POINT-5035457 -2886741 -POINT-5019204 -2913912 -POINT-4924675 -3071937 -POINT-4907423 -3098485 -POINT-4807087 -3252884 -POINT-4682857 -3429336 -POINT-4552150 -3601043 -POINT-4532051 -3625506 -POINT-4415153 -3767776 -POINT-4394158 -3791475 -POINT-4272053 -3929306 -POINT-4123050 -4085403 -POINT-4100352 -4107476 -POINT-3968345 -4235847 -POINT-3944843 -4257062 -POINT-3808155 -4380447 -POINT-3642704 -4518982 -POINT-3472213 -4651283 -POINT-3446496 -4669749 -POINT-3296924 -4777145 -POINT-3270538 -4794643 -POINT-3117080 -4896408 -POINT-3090062 -4912914 -POINT-2932926 -5008911 -POINT-2905312 -5024400 -POINT-2744716 -5114479 -POINT-2716547 -5128932 -POINT-2552715 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-2128790 -5399487 -POINT-1956619 -5464782 -POINT-1752140 -5533752 -POINT-1721784 -5542749 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-1094152 -5700005 -POINT-912879 -5732353 -POINT-699176 -5762344 -POINT-667681 -5765576 -POINT-484504 -5784370 -POINT-452910 -5786429 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162334 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807167 -5748344 -POINT838433 -5743362 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1262785 -5665241 -POINT1441970 -5622841 -POINT1472488 -5614410 -POINT1649974 -5565376 -POINT1855701 -5500213 -POINT1885508 -5489539 -POINT2058864 -5427459 -POINT2088253 -5415684 -POINT2259178 -5347198 -POINT2288110 -5334338 -POINT2456375 -5259544 -POINT2650173 -5164627 -POINT2840313 -5062568 -POINT3026527 -4953514 -POINT3053234 -4936510 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3750966 -4429711 -POINT3889923 -4308891 -POINT3913027 -4287244 -POINT4047397 -4161346 -POINT4069680 -4138854 -POINT4199276 -4008041 -POINT4345356 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4746792 -3341682 -POINT4867721 -3162956 -POINT4884477 -3136093 -POINT4981926 -2979858 -POINT5089245 -2792633 -POINT5189533 -2601555 -POINT5282646 -2406883 -POINT5368458 -2208885 -POINT5446853 -2007827 -POINT5457251 -1977923 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5636493 -1389144 -POINT5643497 -1358268 -POINT5684231 -1178695 -POINT5690083 -1147581 -POINT5724117 -966621 -POINT5756092 -753204 -POINT5759616 -721740 -POINT5780109 -538749 -POINT5796142 -323547 -POINT5797319 -291908 -POINT5804161 -107902 -POINT5804161 107894 -POINT5796142 323547 -POINT5793790 355121 -POINT5780109 538749 -POINT5756092 753204 -POINT5751401 784514 -POINT5724117 966613 -POINT5684231 1178695 -POINT5677227 1209572 -POINT5636493 1389144 -POINT5628346 1419740 -POINT5580963 1597679 -POINT5571685 1627949 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5435352 2037326 -POINT5368458 2208885 -POINT5282646 2406883 -POINT5189533 2601555 -POINT5089245 2792633 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4849979 3189178 -POINT4746792 3341682 -POINT4728087 3367227 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345356 3849205 -POINT4199276 4008041 -POINT4047397 4161338 -POINT4024293 4182987 -POINT3889923 4308891 -POINT3727073 4450485 -POINT3702425 4470356 -POINT3559074 4585922 -POINT3533704 4604864 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2840313 5062568 -POINT2812416 5077542 -POINT2650173 5164627 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2229789 5358974 -POINT2058864 5427459 -POINT1855701 5500213 -POINT1825518 5509773 -POINT1649974 5565368 -POINT1441970 5622841 -POINT1231975 5672531 -POINT1200915 5678672 -POINT1020275 5714386 -POINT807167 5748344 -POINT592941 5774353 -POINT561391 5776998 -POINT377899 5792381 -POINT346272 5793852 -POINT162334 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784370 -POINT-516000 5781139 -POINT-699176 5762344 -POINT-730530 5757944 -POINT-912879 5732353 -POINT-944048 5726791 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552715 5212990 -POINT-2580885 5198537 -POINT-2744716 5114479 -POINT-2772330 5098989 -POINT-2932926 5008903 -POINT-2959944 4992399 -POINT-3117080 4896408 -POINT-3296924 4777145 -POINT-3322642 4758678 -POINT-3472213 4651275 -POINT-3497227 4631866 -POINT-3642704 4518982 -POINT-3666978 4498656 -POINT-3808155 4380440 -POINT-3968345 4235847 -POINT-3991043 4213773 -POINT-4123050 4085395 -POINT-4272053 3929306 -POINT-4415153 3767776 -POINT-4435253 3743314 -POINT-4552150 3601043 -POINT-4571327 3575850 -POINT-4682857 3429329 -POINT-4807087 3252884 -POINT-4924675 3071937 -POINT-5035457 2886741 -POINT-5050689 2858986 -POINT-5139274 2697563 -POINT-5153465 2669260 -POINT-5235992 2504654 -POINT-5325474 2308281 -POINT-5407593 2108719 -POINT-5482235 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5616273 1462926 -POINT-5660339 1284141 -POINT-5666769 1253141 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788128 431221 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804165 0 -POINT-5800155 -215759 -POINT-5788128 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5728582 -928247 -POINT-5704162 -1072845 -POINT-5690120 -1140554 -POINT-5660339 -1284141 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482235 -1906242 -POINT-5407593 -2108719 -POINT-5325474 -2308281 -POINT-5235992 -2504654 -POINT-5205000 -2566470 -POINT-5139274 -2697563 -POINT-5106007 -2758184 -POINT-5035457 -2886741 -POINT-4999958 -2946086 -POINT-4924675 -3071937 -POINT-4807087 -3252884 -POINT-4682857 -3429336 -POINT-4640973 -3484359 -POINT-4552150 -3601043 -POINT-4508250 -3654472 -POINT-4415153 -3767776 -POINT-4369297 -3819538 -POINT-4272053 -3929306 -POINT-4123050 -4085403 -POINT-4073476 -4133612 -POINT-3968345 -4235847 -POINT-3808155 -4380447 -POINT-3755137 -4424840 -POINT-3642704 -4518982 -POINT-3472213 -4651283 -POINT-3416043 -4691615 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-3058069 -4932459 -POINT-2932926 -5008911 -POINT-2872615 -5042740 -POINT-2744716 -5114479 -POINT-2552715 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-2093736 -5412781 -POINT-1956619 -5464782 -POINT-1891095 -5486883 -POINT-1752140 -5533752 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-1057245 -5706591 -POINT-912879 -5732353 -POINT-844399 -5741964 -POINT-699176 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT15695 -5803770 -POINT162334 -5802406 -POINT231411 -5799194 -POINT377899 -5792381 -POINT592941 -5774353 -POINT661588 -5766019 -POINT807167 -5748344 -POINT1020275 -5714386 -POINT1088113 -5700974 -POINT1231975 -5672531 -POINT1441970 -5622841 -POINT1508624 -5604427 -POINT1649974 -5565376 -POINT1715898 -5544495 -POINT1855701 -5500213 -POINT1920804 -5476900 -POINT2058864 -5427459 -POINT2123054 -5401740 -POINT2259178 -5347198 -POINT2456375 -5259544 -POINT2518476 -5229129 -POINT2650173 -5164627 -POINT2711102 -5131923 -POINT2840313 -5062568 -POINT3026527 -4953514 -POINT3084858 -4916375 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308891 -POINT4047397 -4161346 -POINT4199276 -4008041 -POINT4345356 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4660155 -3460000 -POINT4746792 -3341682 -POINT4867721 -3162956 -POINT4904318 -3104283 -POINT4981926 -2979858 -POINT5016316 -2919863 -POINT5089245 -2792633 -POINT5121382 -2731403 -POINT5189533 -2601555 -POINT5219371 -2539173 -POINT5282646 -2406883 -POINT5368458 -2208885 -POINT5446853 -2007827 -POINT5469563 -1942512 -POINT5517723 -1804000 -POINT5537988 -1737886 -POINT5580963 -1597679 -POINT5598758 -1530855 -POINT5636493 -1389144 -POINT5684231 -1178695 -POINT5724117 -966621 -POINT5756092 -753204 -POINT5780109 -538749 -POINT5785247 -469789 -POINT5796142 -323547 -POINT5798712 -254445 -POINT5804161 -107902 -POINT5804161 107894 -POINT5796142 323547 -POINT5780109 538749 -POINT5772413 607470 -POINT5756092 753204 -POINT5745846 821590 -POINT5724117 966613 -POINT5684231 1178695 -POINT5668934 1246133 -POINT5636493 1389144 -POINT5618699 1455968 -POINT5580963 1597679 -POINT5517723 1804000 -POINT5495013 1869316 -POINT5446853 2007827 -POINT5421732 2072255 -POINT5368458 2208885 -POINT5282646 2406883 -POINT5189533 2601555 -POINT5089245 2792633 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4828970 3220228 -POINT4746792 3341682 -POINT4705938 3397475 -POINT4619301 3515792 -POINT4576402 3570028 -POINT4485428 3685043 -POINT4345356 3849205 -POINT4199276 4008041 -POINT4047397 4161338 -POINT3996935 4208621 -POINT3889923 4308891 -POINT3837739 4354264 -POINT3727073 4450485 -POINT3673239 4493885 -POINT3559074 4585922 -POINT3503663 4627293 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2966856 4988460 -POINT2840313 5062568 -POINT2650173 5164627 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2058864 5427459 -POINT1993762 5450773 -POINT1855701 5500213 -POINT1789777 5521092 -POINT1649974 5565368 -POINT1583321 5583785 -POINT1441970 5622841 -POINT1374679 5638764 -POINT1231975 5672531 -POINT1020275 5714386 -POINT951985 5725268 -POINT807167 5748344 -POINT592941 5774353 -POINT524032 5780130 -POINT377899 5792381 -POINT308822 5795594 -POINT162334 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-338169 5793905 -POINT-484504 5784370 -POINT-553295 5777312 -POINT-699176 5762344 -POINT-912879 5732353 -POINT-980955 5720205 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2021277 5440261 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552715 5212990 -POINT-2744716 5114479 -POINT-2805027 5080648 -POINT-2932926 5008903 -POINT-2991937 4972855 -POINT-3117080 4896408 -POINT-3174710 4858191 -POINT-3296924 4777145 -POINT-3353095 4736811 -POINT-3472213 4651275 -POINT-3526846 4608883 -POINT-3642704 4518982 -POINT-3808155 4380440 -POINT-3859487 4334106 -POINT-3968345 4235847 -POINT-4017920 4187636 -POINT-4123050 4085395 -POINT-4272053 3929306 -POINT-4317909 3877545 -POINT-4415153 3767776 -POINT-4552150 3601043 -POINT-4594035 3546018 -POINT-4682857 3429329 -POINT-4722666 3372788 -POINT-4807087 3252884 -POINT-4924675 3071937 -POINT-5035457 2886741 -POINT-5068725 2826120 -POINT-5139274 2697563 -POINT-5170267 2635746 -POINT-5235992 2504654 -POINT-5325474 2308281 -POINT-5407593 2108719 -POINT-5482235 1906242 -POINT-5503726 1840516 -POINT-5549301 1701133 -POINT-5568334 1634652 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5674382 1216432 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788128 431221 -POINT-5800155 215759 -POINT-5801440 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804165 0 -POINT-5800527 -195760 -POINT-5800155 -215759 -POINT-5789243 -411249 -POINT-5788128 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5707493 -1053122 -POINT-5704162 -1072845 -POINT-5664401 -1264556 -POINT-5660339 -1284141 -POINT-5613483 -1474246 -POINT-5608696 -1493667 -POINT-5549301 -1701133 -POINT-5482235 -1906242 -POINT-5407593 -2108719 -POINT-5325474 -2308281 -POINT-5235992 -2504654 -POINT-5148239 -2679682 -POINT-5139274 -2697563 -POINT-5045080 -2869206 -POINT-5035457 -2886741 -POINT-4924675 -3071937 -POINT-4807087 -3252884 -POINT-4694372 -3412981 -POINT-4682857 -3429336 -POINT-4564266 -3585128 -POINT-4552150 -3601043 -POINT-4427852 -3752321 -POINT-4415153 -3767776 -POINT-4272053 -3929306 -POINT-4123050 -4085403 -POINT-3982685 -4221903 -POINT-3968345 -4235847 -POINT-3808155 -4380447 -POINT-3642704 -4518982 -POINT-3488016 -4639020 -POINT-3472213 -4651283 -POINT-3313172 -4765479 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-2932926 -5008911 -POINT-2762162 -5104694 -POINT-2744716 -5114479 -POINT-2570512 -5203859 -POINT-2552715 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1975322 -5457690 -POINT-1956619 -5464782 -POINT-1752140 -5533752 -POINT-1545242 -5595070 -POINT-1336204 -5648659 -POINT-1125320 -5694443 -POINT-932571 -5728839 -POINT-912879 -5732353 -POINT-699176 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162334 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT787310 -5750755 -POINT807167 -5748344 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1441970 -5622841 -POINT1649974 -5565376 -POINT1855701 -5500213 -POINT2040033 -5434203 -POINT2058864 -5427459 -POINT2240610 -5354638 -POINT2259178 -5347198 -POINT2456375 -5259544 -POINT2650173 -5164627 -POINT2840313 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543046 -4597889 -POINT3559074 -4585922 -POINT3711501 -4463039 -POINT3727073 -4450485 -POINT3874828 -4322016 -POINT3889923 -4308891 -POINT4032801 -4175022 -POINT4047397 -4161346 -POINT4199276 -4008041 -POINT4345356 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515792 -POINT4746792 -3341682 -POINT4867721 -3162956 -POINT4971340 -2996830 -POINT4981926 -2979858 -POINT5089245 -2792633 -POINT5189533 -2601555 -POINT5282646 -2406883 -POINT5368458 -2208885 -POINT5439587 -2026464 -POINT5446853 -2007827 -POINT5511154 -1822893 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5631346 -1408474 -POINT5636493 -1389144 -POINT5684231 -1178695 -POINT5720420 -986278 -POINT5724117 -966621 -POINT5756092 -753204 -POINT5777883 -558627 -POINT5780109 -538749 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5804161 -107902 -POINT5804161 107894 -POINT5796886 303558 -POINT5796142 323547 -POINT5780109 538749 -POINT5756092 753204 -POINT5727081 946832 -POINT5724117 966613 -POINT5684231 1178695 -POINT5640918 1369638 -POINT5636493 1389144 -POINT5580963 1597679 -POINT5523585 1784876 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368458 2208885 -POINT5282646 2406883 -POINT5189533 2601555 -POINT5098541 2774922 -POINT5089245 2792633 -POINT4981926 2979850 -POINT4878307 3145984 -POINT4867721 3162956 -POINT4758001 3325116 -POINT4746792 3341682 -POINT4631118 3499654 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345356 3849205 -POINT4199276 4008041 -POINT4061475 4147129 -POINT4047397 4161338 -POINT3889923 4308891 -POINT3742168 4437361 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2857573 5052460 -POINT2840313 5062568 -POINT2650173 5164627 -POINT2456375 5259544 -POINT2259178 5347198 -POINT2077431 5420020 -POINT2058864 5427459 -POINT1874532 5493470 -POINT1855701 5500213 -POINT1669043 5559329 -POINT1649974 5565368 -POINT1441970 5622841 -POINT1231975 5672531 -POINT1020275 5714386 -POINT826920 5745197 -POINT807167 5748344 -POINT592941 5774353 -POINT377899 5792381 -POINT182315 5801477 -POINT162334 5802406 -POINT-33450 5804227 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-464544 5785671 -POINT-484504 5784370 -POINT-679278 5764386 -POINT-699176 5762344 -POINT-893071 5735133 -POINT-912879 5732353 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1732962 5539436 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2139691 5395353 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552715 5212990 -POINT-2726920 5123610 -POINT-2744716 5114479 -POINT-2932926 5008903 -POINT-3117080 4896408 -POINT-3280254 4788200 -POINT-3296924 4777145 -POINT-3455966 4662942 -POINT-3472213 4651275 -POINT-3642704 4518982 -POINT-3808155 4380440 -POINT-3953497 4249250 -POINT-3968345 4235847 -POINT-4108710 4099341 -POINT-4123050 4085395 -POINT-4272053 3929306 -POINT-4401889 3782749 -POINT-4415153 3767776 -POINT-4539452 3616498 -POINT-4552150 3601043 -POINT-4670742 3445245 -POINT-4682857 3429329 -POINT-4807087 3252884 -POINT-4924675 3071937 -POINT-5025189 2903907 -POINT-5035457 2886741 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325474 2308281 -POINT-5407593 2108719 -POINT-5482235 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788128 431221 -POINT-5799041 235730 -POINT-5800155 215759 -OBJECT_ID144 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804153 0 -POINT-5800155 -215759 -POINT-5788116 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284145 -POINT-5608688 -1493671 -POINT-5549301 -1701133 -POINT-5482223 -1906246 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4924667 -3071937 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4552139 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085399 -POINT-3968338 -4235851 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3296920 -4777145 -POINT-3117080 -4896412 -POINT-2932922 -5008907 -POINT-2744705 -5114483 -POINT-2552703 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545242 -5595073 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732357 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804416 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774353 -POINT807174 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622837 -POINT1649978 -5565372 -POINT1855712 -5500217 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259548 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585926 -POINT3727081 -4450485 -POINT3889923 -4308891 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4746795 -3341686 -POINT4867721 -3162956 -POINT4981933 -2979854 -POINT5089248 -2792637 -POINT5189529 -2601558 -POINT5282654 -2406883 -POINT5368469 -2208881 -POINT5446853 -2007827 -POINT5517730 -1804000 -POINT5580963 -1597679 -POINT5636505 -1389148 -POINT5684234 -1178699 -POINT5724121 -966617 -POINT5756103 -753204 -POINT5780121 -538749 -POINT5796142 -323547 -POINT5804168 -107898 -POINT5804168 107898 -POINT5796142 323543 -POINT5780121 538749 -POINT5756103 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636505 1389144 -POINT5580963 1597679 -POINT5517730 1804000 -POINT5446853 2007827 -POINT5368469 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT4981933 2979850 -POINT4867721 3162956 -POINT4746795 3341682 -POINT4619308 3515792 -POINT4485428 3685043 -POINT4345367 3849205 -POINT4199280 4008041 -POINT4047409 4161338 -POINT3889923 4308891 -POINT3727081 4450485 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026535 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855712 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748344 -POINT592941 5774353 -POINT377899 5792381 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484497 5784370 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2552703 5212990 -POINT-2744705 5114479 -POINT-2932922 5008903 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4415146 3767776 -POINT-4552139 3601043 -POINT-4682846 3429329 -POINT-4807083 3252884 -POINT-4924667 3071937 -POINT-5035446 2886741 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482223 1906242 -POINT-5549301 1701133 -POINT-5608688 1493667 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804153 0 -POINT-5803567 -31655 -POINT-5800155 -215759 -POINT-5798389 -247370 -POINT-5788116 -431221 -POINT-5785179 -462745 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5697733 -1103846 -POINT-5660339 -1284145 -POINT-5652761 -1314886 -POINT-5608688 -1493671 -POINT-5599975 -1524109 -POINT-5549301 -1701133 -POINT-5482223 -1906246 -POINT-5471274 -1935952 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5124035 -2725319 -POINT-5035446 -2886745 -POINT-5019193 -2913916 -POINT-4924667 -3071937 -POINT-4907416 -3098485 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4552139 -3601043 -POINT-4532040 -3625506 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085399 -POINT-3968338 -4235851 -POINT-3944836 -4257065 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3446495 -4669746 -POINT-3296920 -4777145 -POINT-3270535 -4794644 -POINT-3117080 -4896412 -POINT-2932922 -5008907 -POINT-2905307 -5024397 -POINT-2744705 -5114483 -POINT-2552703 -5212990 -POINT-2524017 -5226385 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1721781 -5542749 -POINT-1545242 -5595073 -POINT-1514572 -5602936 -POINT-1336196 -5648662 -POINT-1305257 -5655379 -POINT-1125320 -5694443 -POINT-912872 -5732357 -POINT-881519 -5736757 -POINT-699173 -5762344 -POINT-667676 -5765576 -POINT-484497 -5784370 -POINT-452904 -5786429 -POINT-269165 -5798401 -POINT-53451 -5804416 -POINT-21791 -5804122 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774353 -POINT807174 -5748344 -POINT838440 -5743362 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622837 -POINT1472488 -5614406 -POINT1649978 -5565372 -POINT1680163 -5555813 -POINT1855712 -5500217 -POINT1885519 -5489542 -POINT2058868 -5427459 -POINT2088258 -5415684 -POINT2259185 -5347198 -POINT2456375 -5259548 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2867638 -5046568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585926 -POINT3583730 -4566055 -POINT3727081 -4450485 -POINT3889923 -4308891 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4638013 -3490251 -POINT4746795 -3341686 -POINT4867721 -3162956 -POINT4884478 -3136092 -POINT4981933 -2979854 -POINT4997678 -2952386 -POINT5089248 -2792637 -POINT5189529 -2601558 -POINT5203192 -2572996 -POINT5282654 -2406883 -POINT5368469 -2208881 -POINT5446853 -2007827 -POINT5457252 -1977923 -POINT5517730 -1804000 -POINT5527008 -1773730 -POINT5580963 -1597679 -POINT5589112 -1567084 -POINT5636505 -1389148 -POINT5643508 -1358272 -POINT5684234 -1178699 -POINT5690087 -1147583 -POINT5724121 -966617 -POINT5756103 -753204 -POINT5759627 -721740 -POINT5780121 -538749 -POINT5796142 -323547 -POINT5797320 -291908 -POINT5804168 -107898 -POINT5804168 107898 -POINT5802991 139537 -POINT5796142 323543 -POINT5793792 355117 -POINT5780121 538749 -POINT5756103 753204 -POINT5751411 784514 -POINT5724121 966613 -POINT5718269 997729 -POINT5684234 1178695 -POINT5677232 1209572 -POINT5636505 1389144 -POINT5628356 1419740 -POINT5580963 1597679 -POINT5571686 1627949 -POINT5517730 1804000 -POINT5507332 1833905 -POINT5446853 2007827 -POINT5435353 2037324 -POINT5368469 2208877 -POINT5355879 2237928 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT5073504 2820100 -POINT4981933 2979850 -POINT4965177 3006715 -POINT4867721 3162956 -POINT4849980 3189178 -POINT4746795 3341682 -POINT4728091 3367227 -POINT4619308 3515792 -POINT4599666 3540624 -POINT4485428 3685043 -POINT4345367 3849205 -POINT4199280 4008041 -POINT4047409 4161338 -POINT4024303 4182987 -POINT3889923 4308891 -POINT3727081 4450485 -POINT3702433 4470356 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026535 4953514 -POINT2999214 4969514 -POINT2840316 5062568 -POINT2812420 5077542 -POINT2650177 5164627 -POINT2621743 5178553 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2229796 5358974 -POINT2058868 5427459 -POINT1855712 5500213 -POINT1825528 5509773 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1200919 5678672 -POINT1020278 5714386 -POINT807174 5748344 -POINT775743 5752160 -POINT592941 5774353 -POINT561391 5776998 -POINT377899 5792381 -POINT346272 5793852 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484497 5784370 -POINT-515993 5781139 -POINT-699173 5762344 -POINT-730526 5757944 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533752 -POINT-1782137 5523633 -POINT-1956619 5464782 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2552703 5212990 -POINT-2580873 5198537 -POINT-2744705 5114479 -POINT-2932922 5008903 -POINT-2959941 4992399 -POINT-3117080 4896408 -POINT-3143466 4878910 -POINT-3296920 4777145 -POINT-3322639 4758678 -POINT-3472213 4651275 -POINT-3497227 4631866 -POINT-3642700 4518982 -POINT-3666974 4498656 -POINT-3808151 4380440 -POINT-3831653 4359226 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4415146 3767776 -POINT-4435245 3743314 -POINT-4552139 3601043 -POINT-4571316 3575850 -POINT-4682846 3429329 -POINT-4807083 3252884 -POINT-4924667 3071937 -POINT-4940920 3044766 -POINT-5035446 2886741 -POINT-5050678 2858986 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5249120 2475843 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482223 1906242 -POINT-5492065 1876149 -POINT-5549301 1701133 -POINT-5558014 1670695 -POINT-5608688 1493667 -POINT-5660339 1284141 -POINT-5666769 1253141 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5800155 215759 -POINT-5800742 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804153 0 -POINT-5802872 -69138 -POINT-5800155 -215759 -POINT-5788116 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5728582 -928247 -POINT-5704162 -1072845 -POINT-5690120 -1140555 -POINT-5660339 -1284145 -POINT-5643788 -1351286 -POINT-5608688 -1493671 -POINT-5589658 -1560151 -POINT-5549301 -1701133 -POINT-5482223 -1906246 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4924667 -3071937 -POINT-4886988 -3129921 -POINT-4807083 -3252884 -POINT-4767272 -3309426 -POINT-4682846 -3429332 -POINT-4552139 -3601043 -POINT-4415146 -3767776 -POINT-4369291 -3819538 -POINT-4272049 -3929306 -POINT-4123047 -4085399 -POINT-4073471 -4133611 -POINT-3968338 -4235851 -POINT-3917007 -4282185 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3416042 -4691612 -POINT-3296920 -4777145 -POINT-3239292 -4815364 -POINT-3117080 -4896412 -POINT-2932922 -5008907 -POINT-2744705 -5114483 -POINT-2552703 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1685838 -5553402 -POINT-1545242 -5595073 -POINT-1478254 -5612246 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732357 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804416 -POINT15697 -5803774 -POINT162338 -5802410 -POINT377899 -5792385 -POINT446808 -5786607 -POINT592941 -5774353 -POINT661591 -5766019 -POINT807174 -5748344 -POINT1020278 -5714386 -POINT1088117 -5700974 -POINT1231979 -5672531 -POINT1299270 -5656607 -POINT1441970 -5622837 -POINT1508625 -5604423 -POINT1649978 -5565372 -POINT1855712 -5500217 -POINT1920813 -5476902 -POINT2058868 -5427459 -POINT2123059 -5401740 -POINT2259185 -5347198 -POINT2322374 -5319111 -POINT2456375 -5259548 -POINT2518478 -5229131 -POINT2650177 -5164627 -POINT2711106 -5131923 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585926 -POINT3612916 -4542525 -POINT3727081 -4450485 -POINT3779263 -4405112 -POINT3889923 -4308891 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4660161 -3460003 -POINT4746795 -3341686 -POINT4785546 -3284413 -POINT4867721 -3162956 -POINT4904320 -3104282 -POINT4981933 -2979854 -POINT5016322 -2919861 -POINT5089248 -2792637 -POINT5121383 -2731407 -POINT5189529 -2601558 -POINT5219371 -2539176 -POINT5282654 -2406883 -POINT5368469 -2208881 -POINT5393587 -2144454 -POINT5446853 -2007827 -POINT5469566 -1942512 -POINT5517730 -1804000 -POINT5537993 -1737886 -POINT5580963 -1597679 -POINT5636505 -1389148 -POINT5684234 -1178699 -POINT5697016 -1110739 -POINT5724121 -966617 -POINT5734370 -898230 -POINT5756103 -753204 -POINT5780121 -538749 -POINT5785255 -469789 -POINT5796142 -323547 -POINT5798714 -254443 -POINT5804168 -107898 -POINT5804168 107898 -POINT5796142 323543 -POINT5780121 538749 -POINT5756103 753204 -POINT5745855 821590 -POINT5724121 966613 -POINT5684234 1178695 -POINT5668940 1246133 -POINT5636505 1389144 -POINT5618707 1455968 -POINT5580963 1597679 -POINT5517730 1804000 -POINT5495018 1869316 -POINT5446853 2007827 -POINT5421736 2072253 -POINT5368469 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5157395 2662784 -POINT5089248 2792633 -POINT5054860 2852625 -POINT4981933 2979850 -POINT4945335 3038525 -POINT4867721 3162956 -POINT4828971 3220228 -POINT4746795 3341682 -POINT4705943 3397475 -POINT4619308 3515792 -POINT4576407 3570028 -POINT4485428 3685043 -POINT4345367 3849205 -POINT4199280 4008041 -POINT4047409 4161338 -POINT3996943 4208621 -POINT3889923 4308891 -POINT3727081 4450485 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3150229 4874755 -POINT3026535 4953514 -POINT2966862 4988460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1993768 5450773 -POINT1855712 5500213 -POINT1789786 5521092 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT951990 5725268 -POINT807174 5748344 -POINT592941 5774353 -POINT524032 5780130 -POINT377899 5792381 -POINT308823 5795594 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-338167 5793905 -POINT-484497 5784370 -POINT-553288 5777312 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-980950 5720205 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1611540 5575421 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2021274 5440261 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2419833 5275034 -POINT-2552703 5212990 -POINT-2744705 5114479 -POINT-2805018 5080648 -POINT-2932922 5008903 -POINT-2991935 4972855 -POINT-3117080 4896408 -POINT-3174709 4858191 -POINT-3296920 4777145 -POINT-3353092 4736811 -POINT-3472213 4651275 -POINT-3526845 4608883 -POINT-3642700 4518982 -POINT-3695718 4474587 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4415146 3767776 -POINT-4552139 3601043 -POINT-4682846 3429329 -POINT-4807083 3252884 -POINT-4924667 3071937 -POINT-4960166 3012592 -POINT-5035446 2886741 -POINT-5068715 2826120 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5264665 2441727 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482223 1906242 -POINT-5503718 1840516 -POINT-5549301 1701133 -POINT-5608688 1493667 -POINT-5625240 1426526 -POINT-5660339 1284141 -POINT-5674382 1216432 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5791974 362177 -POINT-5800155 215759 -POINT-5801437 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804153 0 -POINT-5800526 -195760 -POINT-5800155 -215759 -POINT-5789232 -411249 -POINT-5788116 -431221 -POINT-5769953 -626171 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5707493 -1053122 -POINT-5704162 -1072845 -POINT-5660339 -1284145 -POINT-5613476 -1474250 -POINT-5608688 -1493671 -POINT-5554806 -1681903 -POINT-5549301 -1701133 -POINT-5488441 -1887234 -POINT-5482223 -1906246 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4934935 -3054772 -POINT-4924667 -3071937 -POINT-4817982 -3236112 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4564255 -3585127 -POINT-4552139 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4136858 -4070931 -POINT-4123047 -4085399 -POINT-3968338 -4235851 -POINT-3822999 -4367041 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3488016 -4639017 -POINT-3472213 -4651279 -POINT-3313169 -4765478 -POINT-3296920 -4777145 -POINT-3133750 -4885357 -POINT-3117080 -4896412 -POINT-2949992 -4998480 -POINT-2932922 -5008907 -POINT-2744705 -5114483 -POINT-2552703 -5212990 -POINT-2375301 -5295828 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1975321 -5457690 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1564419 -5589390 -POINT-1545242 -5595073 -POINT-1355573 -5643695 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732357 -POINT-718981 -5759565 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-73446 -5803859 -POINT-53451 -5804416 -POINT142336 -5802596 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774353 -POINT787317 -5750755 -POINT807174 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622837 -POINT1630698 -5570699 -POINT1649978 -5565372 -POINT1855712 -5500217 -POINT2058868 -5427459 -POINT2240618 -5354638 -POINT2259185 -5347198 -POINT2456375 -5259548 -POINT2650177 -5164627 -POINT2822692 -5072028 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543053 -4597893 -POINT3559082 -4585926 -POINT3727081 -4450485 -POINT3874829 -4322016 -POINT3889923 -4308891 -POINT4032811 -4175019 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4606899 -3531484 -POINT4619308 -3515796 -POINT4746795 -3341686 -POINT4856513 -3179523 -POINT4867721 -3162956 -POINT4971347 -2996826 -POINT4981933 -2979854 -POINT5089248 -2792637 -POINT5189529 -2601558 -POINT5274022 -2424928 -POINT5282654 -2406883 -POINT5360515 -2227234 -POINT5368469 -2208881 -POINT5439588 -2026463 -POINT5446853 -2007827 -POINT5511161 -1822893 -POINT5517730 -1804000 -POINT5575102 -1616803 -POINT5580963 -1597679 -POINT5636505 -1389148 -POINT5679810 -1198206 -POINT5684234 -1178699 -POINT5720424 -986275 -POINT5724121 -966617 -POINT5753139 -772985 -POINT5756103 -753204 -POINT5780121 -538749 -POINT5796142 -323547 -POINT5803425 -127887 -POINT5804168 -107898 -POINT5804168 107898 -POINT5796886 303555 -POINT5796142 323543 -POINT5780121 538749 -POINT5758330 733326 -POINT5756103 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5640929 1369638 -POINT5636505 1389144 -POINT5580963 1597679 -POINT5523592 1784876 -POINT5517730 1804000 -POINT5453423 1988934 -POINT5446853 2007827 -POINT5375735 2190242 -POINT5368469 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT4991881 2962497 -POINT4981933 2979850 -POINT4878308 3145984 -POINT4867721 3162956 -POINT4758004 3325116 -POINT4746795 3341682 -POINT4631125 3499654 -POINT4619308 3515792 -POINT4485428 3685043 -POINT4358350 3833988 -POINT4345367 3849205 -POINT4199280 4008041 -POINT4061486 4147129 -POINT4047409 4161338 -POINT3889923 4308891 -POINT3742175 4437361 -POINT3727081 4450485 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026535 4953514 -POINT2857577 5052460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2077436 5420020 -POINT2058868 5427459 -POINT1874543 5493470 -POINT1855712 5500213 -POINT1669048 5559329 -POINT1649978 5565368 -POINT1461251 5617507 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT826927 5745197 -POINT807174 5748344 -POINT592941 5774353 -POINT377899 5792381 -POINT182318 5801477 -POINT162338 5802406 -POINT-33449 5804227 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-464537 5785671 -POINT-484497 5784370 -POINT-679274 5764386 -POINT-699173 5762344 -POINT-893064 5735133 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1732959 5539436 -POINT-1752136 5533752 -POINT-1937665 5471175 -POINT-1956619 5464782 -POINT-2139684 5395353 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2552703 5212990 -POINT-2744705 5114479 -POINT-2915476 5018689 -POINT-2932922 5008903 -POINT-3100011 4906835 -POINT-3117080 4896408 -POINT-3280251 4788200 -POINT-3296920 4777145 -POINT-3455965 4662942 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3953490 4249250 -POINT-3968338 4235847 -POINT-4108707 4099341 -POINT-4123047 4085395 -POINT-4258238 3943774 -POINT-4272049 3929306 -POINT-4401882 3782749 -POINT-4415146 3767776 -POINT-4539441 3616498 -POINT-4552139 3601043 -POINT-4682846 3429329 -POINT-4807083 3252884 -POINT-4924667 3071937 -POINT-5025178 2903907 -POINT-5035446 2886741 -POINT-5129644 2715098 -POINT-5139267 2697563 -POINT-5227027 2522534 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5475306 1925010 -POINT-5482223 1906242 -POINT-5549301 1701133 -POINT-5603184 1512897 -POINT-5608688 1493667 -POINT-5655552 1303562 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5799040 235730 -POINT-5800155 215759 -POINT-5803783 19998 -OBJECT_ID155 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431213 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284133 -POINT-5608703 -1493667 -POINT-5549301 -1701126 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139282 -2697555 -POINT-5035461 -2886734 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4682861 -3429321 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3808166 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2744720 -5114471 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1545242 -5595062 -POINT-1336212 -5648651 -POINT-1125320 -5694443 -POINT-912887 -5732345 -POINT-699173 -5762344 -POINT-484512 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855697 -5500213 -POINT2058853 -5427444 -POINT2259170 -5347198 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3026519 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3727066 -4450485 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4199280 -4008041 -POINT4345352 -3849197 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4746795 -3341674 -POINT4867721 -3162948 -POINT4981918 -2979843 -POINT5089248 -2792633 -POINT5189529 -2601547 -POINT5282638 -2406875 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107910 -POINT5796142 323547 -POINT5780105 538757 -POINT5756088 753204 -POINT5724121 966629 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597686 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208892 -POINT5282638 2406891 -POINT5189529 2601562 -POINT5089248 2792648 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4619293 3515792 -POINT4485428 3685058 -POINT4345352 3849212 -POINT4199280 4008041 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953521 -POINT2840316 5062576 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1855697 5500213 -POINT1649978 5565384 -POINT1441970 5622848 -POINT1231964 5672531 -POINT1020278 5714386 -POINT807159 5748352 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-3117080 4896408 -POINT-3296936 4777145 -POINT-3472213 4651291 -POINT-3642700 4518982 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4682861 3429336 -POINT-4807098 3252884 -POINT-4924682 3071945 -POINT-5035461 2886749 -POINT-5139282 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5482239 1906250 -POINT-5549301 1701141 -POINT-5608703 1493682 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431228 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803580 -31655 -POINT-5800155 -215759 -POINT-5798391 -247369 -POINT-5788131 -431213 -POINT-5785192 -462738 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5697733 -1103844 -POINT-5660339 -1284133 -POINT-5608703 -1493667 -POINT-5599988 -1524105 -POINT-5549301 -1701126 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139282 -2697555 -POINT-5124050 -2725311 -POINT-5035461 -2886734 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4788871 -3278770 -POINT-4682861 -3429321 -POINT-4552154 -3601043 -POINT-4532055 -3625506 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4250201 -3952206 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3944851 -4257054 -POINT-3808166 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296936 -4777145 -POINT-3270548 -4794643 -POINT-3117080 -4896408 -POINT-3090061 -4912912 -POINT-2932922 -5008896 -POINT-2744720 -5114471 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2328027 -5316597 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1545242 -5595062 -POINT-1514574 -5602925 -POINT-1336212 -5648651 -POINT-1125320 -5694443 -POINT-912887 -5732345 -POINT-881532 -5736747 -POINT-699173 -5762344 -POINT-667678 -5765575 -POINT-484512 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807159 -5748337 -POINT838427 -5743356 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1262775 -5665240 -POINT1441970 -5622833 -POINT1472488 -5614402 -POINT1649978 -5565368 -POINT1680160 -5555809 -POINT1855697 -5500213 -POINT1885503 -5489537 -POINT2058853 -5427444 -POINT2088243 -5415671 -POINT2259170 -5347198 -POINT2288103 -5334337 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT2867635 -5046561 -POINT3026519 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3583715 -4566051 -POINT3727066 -4450485 -POINT3750960 -4429710 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4199280 -4008041 -POINT4345352 -3849197 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4638000 -3490247 -POINT4746795 -3341674 -POINT4764537 -3315452 -POINT4867721 -3162948 -POINT4884476 -3136084 -POINT4981918 -2979843 -POINT5089248 -2792633 -POINT5189529 -2601547 -POINT5203190 -2572986 -POINT5282638 -2406875 -POINT5295229 -2377826 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5457250 -1977923 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5589110 -1567077 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5690087 -1147579 -POINT5724121 -966613 -POINT5728811 -935303 -POINT5756088 -753204 -POINT5759612 -721739 -POINT5780105 -538742 -POINT5782458 -507169 -POINT5796142 -323547 -POINT5797318 -291907 -POINT5804153 -107894 -POINT5804153 107910 -POINT5802978 139547 -POINT5796142 323547 -POINT5793790 355122 -POINT5780105 538757 -POINT5776582 570220 -POINT5756088 753204 -POINT5751398 784517 -POINT5724121 966629 -POINT5684234 1178695 -POINT5677230 1209572 -POINT5636490 1389144 -POINT5580963 1597686 -POINT5571684 1627956 -POINT5517715 1804000 -POINT5507319 1833905 -POINT5446853 2007827 -POINT5435351 2037327 -POINT5368454 2208892 -POINT5282638 2406891 -POINT5268978 2435452 -POINT5189529 2601562 -POINT5174816 2629598 -POINT5089248 2792648 -POINT5073501 2820115 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4849980 3189185 -POINT4746795 3341690 -POINT4728089 3367233 -POINT4619293 3515792 -POINT4599653 3540626 -POINT4485428 3685058 -POINT4345352 3849212 -POINT4323921 3872515 -POINT4199280 4008041 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3533697 4604864 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953521 -POINT2999200 4969522 -POINT2840316 5062576 -POINT2812420 5077549 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2229780 5358974 -POINT2058853 5427459 -POINT1855697 5500213 -POINT1825515 5509775 -POINT1649978 5565384 -POINT1619460 5573815 -POINT1441970 5622848 -POINT1411159 5630138 -POINT1231964 5672531 -POINT1200906 5678672 -POINT1020278 5714386 -POINT807159 5748352 -POINT775730 5752167 -POINT592941 5774353 -POINT377899 5792389 -POINT346272 5793860 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1366880 5640804 -POINT-1545242 5595077 -POINT-1575599 5586080 -POINT-1752151 5533752 -POINT-1782150 5523633 -POINT-1956619 5464782 -POINT-1986224 5453555 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2744720 5114486 -POINT-2772332 5098997 -POINT-2932922 5008911 -POINT-2959941 4992405 -POINT-3117080 4896408 -POINT-3296936 4777145 -POINT-3472213 4651291 -POINT-3497227 4631879 -POINT-3642700 4518982 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4293059 3905607 -POINT-4415161 3767776 -POINT-4435260 3743314 -POINT-4552154 3601043 -POINT-4571331 3575851 -POINT-4682861 3429336 -POINT-4701089 3403448 -POINT-4807098 3252884 -POINT-4824350 3226337 -POINT-4924682 3071945 -POINT-4940935 3044774 -POINT-5035461 2886749 -POINT-5139282 2697570 -POINT-5153471 2669266 -POINT-5235992 2504654 -POINT-5249120 2475844 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5418545 2079013 -POINT-5482239 1906250 -POINT-5549301 1701141 -POINT-5608703 1493682 -POINT-5616279 1462940 -POINT-5660339 1284149 -POINT-5666769 1253147 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788131 431228 -POINT-5789896 399615 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5796303 -284800 -POINT-5788131 -431213 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5728582 -928247 -POINT-5704162 -1072845 -POINT-5690120 -1140551 -POINT-5660339 -1284133 -POINT-5643793 -1351277 -POINT-5608703 -1493667 -POINT-5589668 -1560146 -POINT-5549301 -1701126 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5205002 -2566468 -POINT-5139282 -2697555 -POINT-5035461 -2886734 -POINT-4999963 -2946079 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4682861 -3429321 -POINT-4640977 -3484348 -POINT-4552154 -3601043 -POINT-4508256 -3654472 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3808166 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3416046 -4691610 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-3058068 -4932454 -POINT-2932922 -5008896 -POINT-2872614 -5042727 -POINT-2744720 -5114471 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1545242 -5595062 -POINT-1336212 -5648651 -POINT-1268633 -5663325 -POINT-1125320 -5694443 -POINT-1057247 -5706589 -POINT-912887 -5732345 -POINT-699173 -5762344 -POINT-630386 -5769400 -POINT-484512 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT231413 -5799186 -POINT377899 -5792373 -POINT446808 -5786599 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020278 -5714386 -POINT1088112 -5700974 -POINT1231964 -5672531 -POINT1441970 -5622833 -POINT1508625 -5604419 -POINT1649978 -5565368 -POINT1715900 -5544490 -POINT1855697 -5500213 -POINT1920797 -5476895 -POINT2058853 -5427444 -POINT2123043 -5401730 -POINT2259170 -5347198 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT2899984 -5027615 -POINT3026519 -4953506 -POINT3084852 -4916370 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3441563 -4673656 -POINT3559066 -4585922 -POINT3612901 -4542522 -POINT3727066 -4450485 -POINT3779252 -4405110 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4096065 -4112210 -POINT4199280 -4008041 -POINT4345352 -3849197 -POINT4390239 -3796595 -POINT4485428 -3685043 -POINT4528324 -3630808 -POINT4619293 -3515792 -POINT4746795 -3341674 -POINT4785546 -3284402 -POINT4867721 -3162948 -POINT4904315 -3104273 -POINT4981918 -2979843 -POINT5089248 -2792633 -POINT5121383 -2731400 -POINT5189529 -2601547 -POINT5282638 -2406875 -POINT5310138 -2343428 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5469561 -1942512 -POINT5517715 -1804000 -POINT5537983 -1737883 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5697016 -1110735 -POINT5724121 -966613 -POINT5734365 -898227 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5785244 -469784 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107910 -POINT5801586 177009 -POINT5796142 323547 -POINT5780105 538757 -POINT5772409 607475 -POINT5756088 753204 -POINT5724121 966629 -POINT5684234 1178695 -POINT5668935 1246133 -POINT5636490 1389144 -POINT5580963 1597686 -POINT5517715 1804000 -POINT5495008 1869316 -POINT5446853 2007827 -POINT5421731 2072258 -POINT5368454 2208892 -POINT5340955 2272340 -POINT5282638 2406891 -POINT5252802 2469272 -POINT5189529 2601562 -POINT5157395 2662794 -POINT5089248 2792648 -POINT5054855 2852638 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4705938 3397480 -POINT4619293 3515792 -POINT4576397 3570033 -POINT4485428 3685058 -POINT4440541 3737661 -POINT4345352 3849212 -POINT4298544 3900108 -POINT4199280 4008041 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953521 -POINT2966852 4988467 -POINT2840316 5062576 -POINT2779387 5095278 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1993753 5450773 -POINT1855697 5500213 -POINT1789776 5521097 -POINT1649978 5565384 -POINT1441970 5622848 -POINT1374675 5638769 -POINT1231964 5672531 -POINT1020278 5714386 -POINT807159 5748352 -POINT738514 5756684 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1403194 5631494 -POINT-1545242 5595077 -POINT-1611545 5575426 -POINT-1752151 5533752 -POINT-1817672 5511651 -POINT-1956619 5464782 -POINT-2021279 5440261 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2614245 5181430 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-2991935 4972860 -POINT-3117080 4896408 -POINT-3174714 4858191 -POINT-3296936 4777145 -POINT-3353103 4736816 -POINT-3472213 4651291 -POINT-3642700 4518982 -POINT-3695723 4474589 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4317919 3877545 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4594039 3546021 -POINT-4682861 3429336 -POINT-4807098 3252884 -POINT-4924682 3071945 -POINT-4960181 3012600 -POINT-5035461 2886749 -POINT-5068730 2826128 -POINT-5139282 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5482239 1906250 -POINT-5549301 1701141 -POINT-5608703 1493682 -POINT-5625250 1426539 -POINT-5660339 1284149 -POINT-5674382 1216438 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5774517 577237 -POINT-5788131 431228 -POINT-5800155 215759 -POINT-5801441 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804168 0 -POINT-5800527 -195760 -POINT-5800155 -215759 -POINT-5789246 -411242 -POINT-5788131 -431213 -POINT-5769954 -626170 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5707493 -1053122 -POINT-5704162 -1072845 -POINT-5664401 -1264549 -POINT-5660339 -1284133 -POINT-5608703 -1493667 -POINT-5549301 -1701126 -POINT-5488455 -1887223 -POINT-5482239 -1906234 -POINT-5407593 -2108719 -POINT-5325470 -2308273 -POINT-5244286 -2486451 -POINT-5235992 -2504654 -POINT-5139282 -2697555 -POINT-5035461 -2886734 -POINT-4934951 -3054763 -POINT-4924682 -3071930 -POINT-4807098 -3252884 -POINT-4694377 -3412967 -POINT-4682861 -3429321 -POINT-4564270 -3585126 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085388 -POINT-3968353 -4235840 -POINT-3808166 -4380432 -POINT-3658037 -4506140 -POINT-3642700 -4518982 -POINT-3488016 -4639013 -POINT-3472213 -4651275 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2762165 -5104685 -POINT-2744720 -5114471 -POINT-2570516 -5203851 -POINT-2552719 -5212982 -POINT-2357193 -5304275 -POINT-2158401 -5388260 -POINT-1975322 -5457690 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1564421 -5589379 -POINT-1545242 -5595062 -POINT-1355587 -5643684 -POINT-1336212 -5648651 -POINT-1125320 -5694443 -POINT-932578 -5728832 -POINT-912887 -5732345 -POINT-718982 -5759564 -POINT-699173 -5762344 -POINT-484512 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT142336 -5802585 -POINT162338 -5802398 -POINT357918 -5793303 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1000524 -5717533 -POINT1020278 -5714386 -POINT1231964 -5672531 -POINT1422505 -5627440 -POINT1441970 -5622833 -POINT1630698 -5570695 -POINT1649978 -5565368 -POINT1836629 -5506253 -POINT1855697 -5500213 -POINT2058853 -5427444 -POINT2240603 -5354636 -POINT2259170 -5347198 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3009260 -4963615 -POINT3026519 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543039 -4597889 -POINT3559066 -4585922 -POINT3711494 -4463039 -POINT3727066 -4450485 -POINT3874827 -4322009 -POINT3889923 -4308883 -POINT4047393 -4161331 -POINT4199280 -4008041 -POINT4331812 -3863921 -POINT4345352 -3849197 -POINT4472444 -3700259 -POINT4485428 -3685043 -POINT4606885 -3531480 -POINT4619293 -3515792 -POINT4734977 -3357814 -POINT4746795 -3341674 -POINT4856513 -3179515 -POINT4867721 -3162948 -POINT4981918 -2979843 -POINT5079300 -2809986 -POINT5089248 -2792633 -POINT5180234 -2619259 -POINT5189529 -2601547 -POINT5274008 -2424919 -POINT5282638 -2406875 -POINT5360500 -2227230 -POINT5368454 -2208877 -POINT5439586 -2026463 -POINT5446853 -2007827 -POINT5511147 -1822893 -POINT5517715 -1804000 -POINT5580963 -1597671 -POINT5636490 -1389144 -POINT5679809 -1198202 -POINT5684234 -1178695 -POINT5720424 -986271 -POINT5724121 -966613 -POINT5753125 -772985 -POINT5756088 -753204 -POINT5777879 -558620 -POINT5780105 -538742 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5803411 -127883 -POINT5804153 -107894 -POINT5804153 107910 -POINT5796885 303559 -POINT5796142 323547 -POINT5781592 518809 -POINT5780105 538757 -POINT5756088 753204 -POINT5724121 966629 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5586110 1578356 -POINT5580963 1597686 -POINT5523578 1784877 -POINT5517715 1804000 -POINT5453422 1988934 -POINT5446853 2007827 -POINT5375721 2190256 -POINT5368454 2208892 -POINT5282638 2406891 -POINT5189529 2601562 -POINT5089248 2792648 -POINT4991867 2962505 -POINT4981918 2979858 -POINT4867721 3162964 -POINT4746795 3341690 -POINT4631111 3499655 -POINT4619293 3515792 -POINT4497836 3669369 -POINT4485428 3685058 -POINT4358336 3833997 -POINT4345352 3849212 -POINT4199280 4008041 -POINT4061472 4147136 -POINT4047393 4161346 -POINT3889923 4308899 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3043393 4942778 -POINT3026519 4953521 -POINT2857576 5052468 -POINT2840316 5062576 -POINT2667801 5155168 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2077420 5420020 -POINT2058853 5427459 -POINT1874528 5493470 -POINT1855697 5500213 -POINT1649978 5565384 -POINT1461251 5617522 -POINT1441970 5622848 -POINT1251429 5667926 -POINT1231964 5672531 -POINT1020278 5714386 -POINT807159 5748352 -POINT612797 5771943 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-464551 5785678 -POINT-484512 5784378 -POINT-699173 5762344 -POINT-912887 5732361 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1732972 5539437 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2139698 5395353 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212997 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-3100011 4906836 -POINT-3117080 4896408 -POINT-3280265 4788200 -POINT-3296936 4777145 -POINT-3472213 4651291 -POINT-3642700 4518982 -POINT-3792829 4393288 -POINT-3808166 4380447 -POINT-3968353 4235855 -POINT-4108708 4099349 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4401897 3782749 -POINT-4415161 3767776 -POINT-4539456 3616498 -POINT-4552154 3601043 -POINT-4670746 3445252 -POINT-4682861 3429336 -POINT-4795583 3269239 -POINT-4807098 3252884 -POINT-4924682 3071945 -POINT-5025193 2903915 -POINT-5035461 2886749 -POINT-5129659 2715106 -POINT-5139282 2697570 -POINT-5235992 2504654 -POINT-5317176 2326490 -POINT-5325470 2308288 -POINT-5407593 2108719 -POINT-5482239 1906250 -POINT-5543085 1720153 -POINT-5549301 1701141 -POINT-5603197 1512912 -POINT-5608703 1493682 -POINT-5655553 1303571 -POINT-5660339 1284149 -POINT-5700100 1092431 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5786274 451144 -POINT-5788131 431228 -POINT-5799041 235731 -POINT-5800155 215759 -POINT-5803797 19998 -OBJECT_ID166 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215766 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608688 -1493675 -POINT-5549301 -1701133 -POINT-5482239 -1906250 -POINT-5407593 -2108726 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035461 -2886749 -POINT-4924667 -3071937 -POINT-4807083 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4415146 -3767784 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3808151 -4380447 -POINT-3642700 -4518989 -POINT-3472213 -4651283 -POINT-3296920 -4777153 -POINT-3117080 -4896415 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545242 -5595077 -POINT-1336196 -5648666 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807174 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672539 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855697 -5500221 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT3026535 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715034 -POINT3559082 -4585930 -POINT3727081 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619308 -3515800 -POINT4746795 -3341690 -POINT4867721 -3162956 -POINT4981933 -2979858 -POINT5089248 -2792640 -POINT5189529 -2601562 -POINT5282654 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007835 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389152 -POINT5684234 -1178703 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5796142 -323547 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796142 323539 -POINT5780105 538742 -POINT5756088 753196 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517715 1803993 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT4981933 2979850 -POINT4867721 3162948 -POINT4746795 3341682 -POINT4619308 3515792 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT3889923 4308883 -POINT3727081 4450477 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837608 -POINT3026535 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347191 -POINT2058868 5427452 -POINT1855697 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT592941 5774353 -POINT377899 5792381 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-484497 5784363 -POINT-699173 5762336 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533745 -POINT-1956619 5464775 -POINT-2158386 5388252 -POINT-2357177 5304283 -POINT-2552719 5212982 -POINT-2744720 5114479 -POINT-2932922 5008903 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929298 -POINT-4415146 3767776 -POINT-4552154 3601043 -POINT-4682861 3429329 -POINT-4807083 3252876 -POINT-4924667 3071930 -POINT-5035461 2886741 -POINT-5139267 2697555 -POINT-5235992 2504646 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701126 -POINT-5608688 1493667 -POINT-5660339 1284141 -POINT-5704162 1072837 -POINT-5740097 860054 -POINT-5768097 646080 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803580 -31656 -POINT-5800155 -215766 -POINT-5798391 -247377 -POINT-5788131 -431221 -POINT-5785192 -462745 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5697733 -1103847 -POINT-5660339 -1284149 -POINT-5652761 -1314890 -POINT-5608688 -1493675 -POINT-5549301 -1701133 -POINT-5539462 -1731227 -POINT-5482239 -1906250 -POINT-5407593 -2108726 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035461 -2886749 -POINT-5019206 -2913919 -POINT-4924667 -3071937 -POINT-4907416 -3098485 -POINT-4807083 -3252884 -POINT-4788858 -3278772 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4532053 -3625507 -POINT-4415146 -3767784 -POINT-4272049 -3929306 -POINT-4250188 -3952208 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3944836 -4257069 -POINT-3808151 -4380447 -POINT-3642700 -4518989 -POINT-3617687 -4538399 -POINT-3472213 -4651283 -POINT-3446495 -4669750 -POINT-3296920 -4777153 -POINT-3117080 -4896415 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1721781 -5542750 -POINT-1545242 -5595077 -POINT-1514572 -5602940 -POINT-1336196 -5648666 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-881519 -5736760 -POINT-699173 -5762344 -POINT-667676 -5765576 -POINT-484497 -5784370 -POINT-452904 -5786429 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT-21791 -5804126 -POINT162338 -5802414 -POINT377899 -5792389 -POINT409449 -5789743 -POINT592941 -5774353 -POINT807174 -5748344 -POINT838440 -5743362 -POINT1020278 -5714386 -POINT1231979 -5672539 -POINT1441970 -5622841 -POINT1472488 -5614410 -POINT1649978 -5565376 -POINT1680160 -5555817 -POINT1855697 -5500221 -POINT1885506 -5489546 -POINT2058868 -5427459 -POINT2088258 -5415684 -POINT2259185 -5347198 -POINT2288116 -5334339 -POINT2456375 -5259552 -POINT2484809 -5245625 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT2867638 -5046576 -POINT3026535 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715034 -POINT3559082 -4585930 -POINT3727081 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619308 -3515800 -POINT4638013 -3490255 -POINT4746795 -3341690 -POINT4764537 -3315467 -POINT4867721 -3162956 -POINT4884478 -3136093 -POINT4981933 -2979858 -POINT4997678 -2952390 -POINT5089248 -2792640 -POINT5103961 -2764606 -POINT5189529 -2601562 -POINT5203192 -2573000 -POINT5282654 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007835 -POINT5457250 -1977929 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5589110 -1567084 -POINT5636490 -1389152 -POINT5684234 -1178703 -POINT5690087 -1147587 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5759612 -721740 -POINT5780105 -538749 -POINT5782458 -507176 -POINT5796142 -323547 -POINT5797320 -291908 -POINT5804168 -107902 -POINT5804168 107894 -POINT5802991 139533 -POINT5796142 323539 -POINT5793790 355113 -POINT5780105 538742 -POINT5776582 570206 -POINT5756088 753196 -POINT5751398 784508 -POINT5724121 966613 -POINT5718269 997729 -POINT5684234 1178695 -POINT5677230 1209572 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5571684 1627942 -POINT5517715 1803993 -POINT5507319 1833899 -POINT5446853 2007827 -POINT5435351 2037324 -POINT5368454 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT5073504 2820100 -POINT4981933 2979850 -POINT4965177 3006714 -POINT4867721 3162948 -POINT4849980 3189171 -POINT4746795 3341682 -POINT4728091 3367227 -POINT4619308 3515792 -POINT4599666 3540624 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT4024290 4182985 -POINT3889923 4308883 -POINT3727081 4450477 -POINT3702433 4470349 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837608 -POINT3181851 4854614 -POINT3026535 4953514 -POINT2999214 4969514 -POINT2840316 5062568 -POINT2812420 5077542 -POINT2650177 5164627 -POINT2621743 5178553 -POINT2456375 5259544 -POINT2259185 5347191 -POINT2058868 5427452 -POINT1855697 5500213 -POINT1825515 5509773 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1200919 5678672 -POINT1020278 5714386 -POINT807174 5748337 -POINT775743 5752154 -POINT592941 5774353 -POINT561391 5776998 -POINT377899 5792381 -POINT346272 5793852 -POINT162338 5802406 -POINT-53451 5804413 -POINT-85100 5803530 -POINT-269165 5798393 -POINT-300757 5796335 -POINT-484497 5784363 -POINT-699173 5762336 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533745 -POINT-1782137 5523626 -POINT-1956619 5464775 -POINT-2158386 5388252 -POINT-2357177 5304283 -POINT-2385867 5290888 -POINT-2552719 5212982 -POINT-2744720 5114479 -POINT-2932922 5008903 -POINT-2959941 4992399 -POINT-3117080 4896408 -POINT-3143466 4878910 -POINT-3296920 4777145 -POINT-3322639 4758678 -POINT-3472213 4651275 -POINT-3497227 4631866 -POINT-3642700 4518982 -POINT-3666974 4498656 -POINT-3808151 4380440 -POINT-3831653 4359226 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929298 -POINT-4415146 3767776 -POINT-4435247 3743314 -POINT-4552154 3601043 -POINT-4571331 3575850 -POINT-4682861 3429329 -POINT-4807083 3252876 -POINT-4924667 3071930 -POINT-5035461 2886741 -POINT-5050691 2858985 -POINT-5139267 2697555 -POINT-5235992 2504646 -POINT-5249120 2475836 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5418545 2079012 -POINT-5482239 1906242 -POINT-5549301 1701126 -POINT-5608688 1493667 -POINT-5660339 1284141 -POINT-5666769 1253139 -POINT-5704162 1072837 -POINT-5709435 1041619 -POINT-5740097 860054 -POINT-5768097 646080 -POINT-5788131 431221 -POINT-5789896 399609 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804168 0 -POINT-5800155 -215766 -POINT-5796303 -284808 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5728582 -928247 -POINT-5704162 -1072845 -POINT-5690120 -1140556 -POINT-5660339 -1284149 -POINT-5643788 -1351290 -POINT-5608688 -1493675 -POINT-5589658 -1560154 -POINT-5549301 -1701133 -POINT-5482239 -1906250 -POINT-5407593 -2108726 -POINT-5381277 -2172675 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035461 -2886749 -POINT-4999958 -2946092 -POINT-4924667 -3071937 -POINT-4886988 -3129921 -POINT-4807083 -3252884 -POINT-4767277 -3309427 -POINT-4682861 -3429336 -POINT-4640977 -3484359 -POINT-4552154 -3601043 -POINT-4415146 -3767784 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-4073471 -4133615 -POINT-3968338 -4235855 -POINT-3917007 -4282189 -POINT-3808151 -4380447 -POINT-3642700 -4518989 -POINT-3472213 -4651283 -POINT-3416042 -4691617 -POINT-3296920 -4777153 -POINT-3239292 -4815370 -POINT-3117080 -4896415 -POINT-3058068 -4932464 -POINT-2932922 -5008911 -POINT-2872614 -5042742 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1685838 -5553404 -POINT-1545242 -5595077 -POINT-1478254 -5612250 -POINT-1336196 -5648666 -POINT-1268622 -5663335 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-844393 -5741969 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT661591 -5766019 -POINT807174 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672539 -POINT1441970 -5622841 -POINT1508625 -5604427 -POINT1649978 -5565376 -POINT1855697 -5500221 -POINT1920802 -5476905 -POINT2058868 -5427459 -POINT2123059 -5401740 -POINT2259185 -5347198 -POINT2322374 -5319113 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT2899989 -5027630 -POINT3026535 -4953521 -POINT3084863 -4916380 -POINT3208557 -4837616 -POINT3386154 -4715034 -POINT3559082 -4585930 -POINT3727081 -4450485 -POINT3779263 -4405112 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4096065 -4112223 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619308 -3515800 -POINT4660161 -3460007 -POINT4746795 -3341690 -POINT4785546 -3284415 -POINT4867721 -3162956 -POINT4904320 -3104283 -POINT4981933 -2979858 -POINT5016322 -2919865 -POINT5089248 -2792640 -POINT5121383 -2731410 -POINT5189529 -2601562 -POINT5219371 -2539178 -POINT5282654 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007835 -POINT5469561 -1942517 -POINT5517715 -1804000 -POINT5537983 -1737886 -POINT5580963 -1597679 -POINT5636490 -1389152 -POINT5684234 -1178703 -POINT5697016 -1110742 -POINT5724121 -966621 -POINT5734365 -898233 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5785244 -469789 -POINT5796142 -323547 -POINT5798714 -254445 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796142 323539 -POINT5780105 538742 -POINT5772409 607462 -POINT5756088 753196 -POINT5724121 966613 -POINT5684234 1178695 -POINT5668935 1246133 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517715 1803993 -POINT5495008 1869310 -POINT5446853 2007827 -POINT5421731 2072253 -POINT5368454 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5157395 2662784 -POINT5089248 2792633 -POINT5054860 2852625 -POINT4981933 2979850 -POINT4945335 3038523 -POINT4867721 3162948 -POINT4828971 3220223 -POINT4746795 3341682 -POINT4705943 3397475 -POINT4619308 3515792 -POINT4576407 3570028 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT3996933 4208618 -POINT3889923 4308883 -POINT3727081 4450477 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837608 -POINT3026535 4953514 -POINT2966862 4988460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347191 -POINT2058868 5427452 -POINT1993763 5450768 -POINT1855697 5500213 -POINT1789776 5521092 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT592941 5774353 -POINT524032 5780130 -POINT377899 5792381 -POINT308823 5795594 -POINT162338 5802406 -POINT-53451 5804413 -POINT-122575 5802484 -POINT-269165 5798393 -POINT-484497 5784363 -POINT-699173 5762336 -POINT-912872 5732353 -POINT-980950 5720205 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533745 -POINT-1956619 5464775 -POINT-2158386 5388252 -POINT-2222087 5361345 -POINT-2357177 5304283 -POINT-2419838 5275026 -POINT-2552719 5212982 -POINT-2744720 5114479 -POINT-2805028 5080648 -POINT-2932922 5008903 -POINT-2991935 4972855 -POINT-3117080 4896408 -POINT-3174709 4858191 -POINT-3296920 4777145 -POINT-3353092 4736811 -POINT-3472213 4651275 -POINT-3526845 4608883 -POINT-3642700 4518982 -POINT-3695718 4474587 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4170794 4035375 -POINT-4272049 3929298 -POINT-4415146 3767776 -POINT-4552154 3601043 -POINT-4594039 3546018 -POINT-4682861 3429329 -POINT-4807083 3252876 -POINT-4924667 3071930 -POINT-4960171 3012587 -POINT-5035461 2886741 -POINT-5068725 2826118 -POINT-5139267 2697555 -POINT-5235992 2504646 -POINT-5264665 2441722 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701126 -POINT-5608688 1493667 -POINT-5625240 1426526 -POINT-5660339 1284141 -POINT-5674382 1216430 -POINT-5704162 1072837 -POINT-5715678 1004652 -POINT-5740097 860054 -POINT-5768097 646080 -POINT-5774517 577229 -POINT-5788131 431221 -POINT-5800155 215759 -POINT-5801441 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804168 0 -POINT-5800527 -195767 -POINT-5800155 -215766 -POINT-5789246 -411250 -POINT-5788131 -431221 -POINT-5769954 -626171 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5707493 -1053122 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5613476 -1474254 -POINT-5608688 -1493675 -POINT-5554806 -1681904 -POINT-5549301 -1701133 -POINT-5482239 -1906250 -POINT-5407593 -2108726 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5045083 -2869213 -POINT-5035461 -2886749 -POINT-4934937 -3054772 -POINT-4924667 -3071937 -POINT-4817982 -3236112 -POINT-4807083 -3252884 -POINT-4694375 -3412981 -POINT-4682861 -3429336 -POINT-4564270 -3585128 -POINT-4552154 -3601043 -POINT-4415146 -3767784 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3822999 -4367045 -POINT-3808151 -4380447 -POINT-3658036 -4506148 -POINT-3642700 -4518989 -POINT-3488016 -4639021 -POINT-3472213 -4651283 -POINT-3313169 -4765486 -POINT-3296920 -4777153 -POINT-3133750 -4885361 -POINT-3117080 -4896415 -POINT-2932922 -5008911 -POINT-2762165 -5104700 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1975321 -5457690 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1564419 -5589393 -POINT-1545242 -5595077 -POINT-1355573 -5643699 -POINT-1336196 -5648666 -POINT-1144866 -5690200 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-718981 -5759565 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT142336 -5802600 -POINT162338 -5802414 -POINT377899 -5792389 -POINT573008 -5776025 -POINT592941 -5774353 -POINT787317 -5750755 -POINT807174 -5748344 -POINT1020278 -5714386 -POINT1212356 -5676418 -POINT1231979 -5672539 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855697 -5500221 -POINT2040036 -5434204 -POINT2058868 -5427459 -POINT2240618 -5354638 -POINT2259185 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT3009274 -4963630 -POINT3026535 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715034 -POINT3559082 -4585930 -POINT3711509 -4463040 -POINT3727081 -4450485 -POINT3874829 -4322016 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4606899 -3531488 -POINT4619308 -3515800 -POINT4746795 -3341690 -POINT4856513 -3179523 -POINT4867721 -3162956 -POINT4971347 -2996830 -POINT4981933 -2979858 -POINT5079301 -2809994 -POINT5089248 -2792640 -POINT5180234 -2619273 -POINT5189529 -2601562 -POINT5282654 -2406883 -POINT5360501 -2227238 -POINT5368454 -2208885 -POINT5446853 -2007835 -POINT5511147 -1822894 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389152 -POINT5679809 -1198210 -POINT5684234 -1178703 -POINT5720424 -986279 -POINT5724121 -966621 -POINT5753125 -772986 -POINT5756088 -753204 -POINT5777879 -558627 -POINT5780105 -538749 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5803425 -127890 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796886 303551 -POINT5796142 323539 -POINT5781592 518794 -POINT5780105 538742 -POINT5756088 753196 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5586110 1578342 -POINT5580963 1597671 -POINT5523578 1784869 -POINT5517715 1803993 -POINT5453422 1988934 -POINT5446853 2007827 -POINT5375721 2190242 -POINT5368454 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT4991881 2962497 -POINT4981933 2979850 -POINT4878308 3145977 -POINT4867721 3162948 -POINT4758004 3325115 -POINT4746795 3341682 -POINT4631125 3499654 -POINT4619308 3515792 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4061472 4147129 -POINT4047393 4161338 -POINT3904519 4295207 -POINT3889923 4308883 -POINT3742175 4437353 -POINT3727081 4450477 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837608 -POINT3026535 4953514 -POINT2857577 5052460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2277463 5339067 -POINT2259185 5347191 -POINT2058868 5427452 -POINT1874529 5493469 -POINT1855697 5500213 -POINT1669047 5559329 -POINT1649978 5565368 -POINT1461251 5617507 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT592941 5774353 -POINT377899 5792381 -POINT182318 5801477 -POINT162338 5802406 -POINT-33449 5804227 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-484497 5784363 -POINT-679274 5764378 -POINT-699173 5762336 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533745 -POINT-1937665 5471168 -POINT-1956619 5464775 -POINT-2139684 5395345 -POINT-2158386 5388252 -POINT-2357177 5304283 -POINT-2534594 5221445 -POINT-2552719 5212982 -POINT-2744720 5114479 -POINT-2932922 5008903 -POINT-3100011 4906835 -POINT-3117080 4896408 -POINT-3280251 4788200 -POINT-3296920 4777145 -POINT-3455965 4662942 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3953490 4249250 -POINT-3968338 4235847 -POINT-4108707 4099341 -POINT-4123047 4085395 -POINT-4258238 3943767 -POINT-4272049 3929298 -POINT-4401882 3782748 -POINT-4415146 3767776 -POINT-4539455 3616498 -POINT-4552154 3601043 -POINT-4670746 3445245 -POINT-4682861 3429329 -POINT-4807083 3252876 -POINT-4924667 3071930 -POINT-5025192 2903907 -POINT-5035461 2886741 -POINT-5139267 2697555 -POINT-5227027 2522527 -POINT-5235992 2504646 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5475320 1925010 -POINT-5482239 1906242 -POINT-5549301 1701126 -POINT-5603184 1512897 -POINT-5608688 1493667 -POINT-5655552 1303562 -POINT-5660339 1284141 -POINT-5700100 1092423 -POINT-5704162 1072837 -POINT-5740097 860054 -POINT-5768097 646080 -POINT-5788131 431221 -POINT-5799041 235730 -POINT-5800155 215759 -POINT-5803797 19998 -OBJECT_ID177 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215761 -POINT-5788116 -431221 -POINT-5768097 -646087 -POINT-5740097 -860059 -POINT-5704162 -1072843 -POINT-5660339 -1284145 -POINT-5608688 -1493671 -POINT-5549301 -1701133 -POINT-5482239 -1906244 -POINT-5407593 -2108720 -POINT-5325470 -2308282 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4924667 -3071937 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4552154 -3601043 -POINT-4415146 -3767778 -POINT-4272049 -3929304 -POINT-4123047 -4085399 -POINT-3968338 -4235849 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3296920 -4777147 -POINT-3117080 -4896412 -POINT-2932922 -5008909 -POINT-2744720 -5114483 -POINT-2552719 -5212988 -POINT-2357177 -5304289 -POINT-2158386 -5388258 -POINT-1956619 -5464781 -POINT-1752136 -5533750 -POINT-1545242 -5595073 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732355 -POINT-699173 -5762344 -POINT-484497 -5784368 -POINT-269165 -5798399 -POINT-53451 -5804416 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774355 -POINT807174 -5748342 -POINT1020278 -5714386 -POINT1231979 -5672533 -POINT1441970 -5622839 -POINT1649978 -5565372 -POINT1855697 -5500217 -POINT2058868 -5427458 -POINT2259185 -5347196 -POINT2456375 -5259546 -POINT2650177 -5164627 -POINT2840316 -5062570 -POINT3026535 -4953516 -POINT3208557 -4837616 -POINT3386154 -4715029 -POINT3559082 -4585924 -POINT3727081 -4450483 -POINT3889923 -4308891 -POINT4047393 -4161344 -POINT4199280 -4008045 -POINT4345352 -3849207 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4746795 -3341686 -POINT4867721 -3162956 -POINT4981933 -2979856 -POINT5089248 -2792637 -POINT5189529 -2601558 -POINT5282654 -2406883 -POINT5368454 -2208883 -POINT5446853 -2007829 -POINT5517730 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389148 -POINT5684234 -1178697 -POINT5724121 -966619 -POINT5756088 -753204 -POINT5780105 -538747 -POINT5796142 -323547 -POINT5804168 -107898 -POINT5804168 107896 -POINT5796142 323545 -POINT5780105 538745 -POINT5756088 753202 -POINT5724121 966617 -POINT5684234 1178697 -POINT5636490 1389146 -POINT5580963 1597677 -POINT5517730 1803999 -POINT5446853 2007827 -POINT5368454 2208881 -POINT5282654 2406881 -POINT5189529 2601556 -POINT5089248 2792635 -POINT4981933 2979852 -POINT4867721 3162954 -POINT4746795 3341684 -POINT4619308 3515794 -POINT4485428 3685045 -POINT4345352 3849203 -POINT4199280 4008043 -POINT4047393 4161340 -POINT3889923 4308889 -POINT3727081 4450483 -POINT3559082 4585924 -POINT3386154 4715025 -POINT3208557 4837614 -POINT3026535 4953512 -POINT2840316 5062567 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2259185 5347196 -POINT2058868 5427458 -POINT1855697 5500215 -POINT1649978 5565370 -POINT1441970 5622835 -POINT1231979 5672529 -POINT1020278 5714384 -POINT807174 5748342 -POINT592941 5774351 -POINT377899 5792383 -POINT162338 5802408 -POINT-53451 5804415 -POINT-269165 5798399 -POINT-484497 5784368 -POINT-699173 5762342 -POINT-912872 5732355 -POINT-1125320 5694441 -POINT-1336196 5648660 -POINT-1545242 5595072 -POINT-1752136 5533750 -POINT-1956619 5464781 -POINT-2158386 5388258 -POINT-2357177 5304289 -POINT-2552719 5212988 -POINT-2744720 5114481 -POINT-2932922 5008905 -POINT-3117080 4896410 -POINT-3296920 4777147 -POINT-3472213 4651277 -POINT-3642700 4518984 -POINT-3808151 4380441 -POINT-3968338 4235849 -POINT-4123047 4085397 -POINT-4272049 3929304 -POINT-4415146 3767778 -POINT-4552154 3601041 -POINT-4682846 3429330 -POINT-4807083 3252882 -POINT-4924667 3071935 -POINT-5035446 2886743 -POINT-5139267 2697561 -POINT-5235992 2504652 -POINT-5325470 2308279 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701131 -POINT-5608688 1493669 -POINT-5660339 1284143 -POINT-5704162 1072841 -POINT-5740097 860057 -POINT-5768097 646085 -POINT-5788116 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803580 -31655 -POINT-5800155 -215761 -POINT-5798389 -247372 -POINT-5788116 -431221 -POINT-5785179 -462745 -POINT-5768097 -646087 -POINT-5763989 -677480 -POINT-5740097 -860059 -POINT-5704162 -1072843 -POINT-5697733 -1103844 -POINT-5660339 -1284145 -POINT-5652761 -1314886 -POINT-5608688 -1493671 -POINT-5599975 -1524109 -POINT-5549301 -1701133 -POINT-5539462 -1731226 -POINT-5482239 -1906244 -POINT-5407593 -2108720 -POINT-5325470 -2308282 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5124035 -2725319 -POINT-5035446 -2886745 -POINT-5019193 -2913916 -POINT-4924667 -3071937 -POINT-4907416 -3098485 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4552154 -3601043 -POINT-4532053 -3625506 -POINT-4415146 -3767778 -POINT-4272049 -3929304 -POINT-4250188 -3952206 -POINT-4123047 -4085399 -POINT-3968338 -4235849 -POINT-3944836 -4257064 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3446495 -4669746 -POINT-3296920 -4777147 -POINT-3270535 -4794645 -POINT-3117080 -4896412 -POINT-2932922 -5008909 -POINT-2905310 -5024399 -POINT-2744720 -5114483 -POINT-2552719 -5212988 -POINT-2357177 -5304289 -POINT-2158386 -5388258 -POINT-1956619 -5464781 -POINT-1926618 -5474900 -POINT-1752136 -5533750 -POINT-1545242 -5595073 -POINT-1514572 -5602936 -POINT-1336196 -5648662 -POINT-1305257 -5655379 -POINT-1125320 -5694443 -POINT-912872 -5732355 -POINT-881519 -5736755 -POINT-699173 -5762344 -POINT-667676 -5765576 -POINT-484497 -5784368 -POINT-452904 -5786427 -POINT-269165 -5798399 -POINT-237516 -5799282 -POINT-53451 -5804416 -POINT-21791 -5804122 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774355 -POINT807174 -5748342 -POINT1020278 -5714386 -POINT1231979 -5672533 -POINT1441970 -5622839 -POINT1649978 -5565372 -POINT1680160 -5555813 -POINT1855697 -5500217 -POINT1885506 -5489542 -POINT2058868 -5427458 -POINT2259185 -5347196 -POINT2288116 -5334337 -POINT2456375 -5259546 -POINT2484809 -5245620 -POINT2650177 -5164627 -POINT2678073 -5149654 -POINT2840316 -5062570 -POINT2867638 -5046570 -POINT3026535 -4953516 -POINT3208557 -4837616 -POINT3386154 -4715029 -POINT3559082 -4585924 -POINT3583730 -4566053 -POINT3727081 -4450483 -POINT3889923 -4308891 -POINT3913026 -4287244 -POINT4047393 -4161344 -POINT4069677 -4138853 -POINT4199280 -4008045 -POINT4345352 -3849207 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4638013 -3490251 -POINT4746795 -3341686 -POINT4867721 -3162956 -POINT4884478 -3136092 -POINT4981933 -2979856 -POINT4997678 -2952388 -POINT5089248 -2792637 -POINT5189529 -2601558 -POINT5203192 -2572996 -POINT5282654 -2406883 -POINT5368454 -2208883 -POINT5446853 -2007829 -POINT5457252 -1977924 -POINT5517730 -1804000 -POINT5527008 -1773730 -POINT5580963 -1597679 -POINT5589110 -1567084 -POINT5636490 -1389148 -POINT5684234 -1178697 -POINT5690087 -1147582 -POINT5724121 -966619 -POINT5756088 -753204 -POINT5759612 -721740 -POINT5780105 -538747 -POINT5782458 -507174 -POINT5796142 -323547 -POINT5797320 -291908 -POINT5804168 -107898 -POINT5804168 107896 -POINT5802991 139535 -POINT5796142 323545 -POINT5793790 355118 -POINT5780105 538745 -POINT5776582 570210 -POINT5756088 753202 -POINT5751398 784513 -POINT5724121 966617 -POINT5718269 997733 -POINT5684234 1178697 -POINT5677230 1209573 -POINT5636490 1389146 -POINT5580963 1597677 -POINT5571686 1627947 -POINT5517730 1803999 -POINT5507332 1833903 -POINT5446853 2007827 -POINT5435351 2037325 -POINT5368454 2208881 -POINT5282654 2406881 -POINT5189529 2601556 -POINT5174816 2629591 -POINT5089248 2792635 -POINT5073504 2820102 -POINT4981933 2979852 -POINT4965177 3006716 -POINT4867721 3162954 -POINT4849980 3189176 -POINT4746795 3341684 -POINT4728091 3367229 -POINT4619308 3515794 -POINT4599666 3540626 -POINT4485428 3685045 -POINT4345352 3849203 -POINT4199280 4008043 -POINT4047393 4161340 -POINT4024290 4182988 -POINT3889923 4308889 -POINT3727081 4450483 -POINT3559082 4585924 -POINT3386154 4715025 -POINT3360098 4733011 -POINT3208557 4837614 -POINT3026535 4953512 -POINT2999214 4969512 -POINT2840316 5062567 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2427444 5272406 -POINT2259185 5347196 -POINT2229796 5358972 -POINT2058868 5427458 -POINT2029059 5438133 -POINT1855697 5500215 -POINT1649978 5565370 -POINT1441970 5622835 -POINT1411161 5630126 -POINT1231979 5672529 -POINT1200919 5678670 -POINT1020278 5714384 -POINT807174 5748342 -POINT775743 5752158 -POINT592941 5774351 -POINT377899 5792383 -POINT346272 5793854 -POINT162338 5802408 -POINT-53451 5804415 -POINT-269165 5798399 -POINT-484497 5784368 -POINT-515993 5781137 -POINT-699173 5762342 -POINT-912872 5732355 -POINT-1125320 5694441 -POINT-1336196 5648660 -POINT-1366867 5640798 -POINT-1545242 5595072 -POINT-1752136 5533750 -POINT-1956619 5464781 -POINT-2158386 5388258 -POINT-2357177 5304289 -POINT-2552719 5212988 -POINT-2744720 5114481 -POINT-2932922 5008905 -POINT-3117080 4896410 -POINT-3143466 4878912 -POINT-3296920 4777147 -POINT-3322639 4758680 -POINT-3472213 4651277 -POINT-3497227 4631868 -POINT-3642700 4518984 -POINT-3808151 4380441 -POINT-3968338 4235849 -POINT-4123047 4085397 -POINT-4144908 4062496 -POINT-4272049 3929304 -POINT-4415146 3767778 -POINT-4552154 3601041 -POINT-4571329 3575849 -POINT-4682846 3429330 -POINT-4807083 3252882 -POINT-4924667 3071935 -POINT-4940920 3044765 -POINT-5035446 2886743 -POINT-5139267 2697561 -POINT-5235992 2504652 -POINT-5249120 2475841 -POINT-5325470 2308279 -POINT-5407593 2108719 -POINT-5418545 2079012 -POINT-5482239 1906242 -POINT-5549301 1701131 -POINT-5608688 1493669 -POINT-5660339 1284143 -POINT-5666769 1253142 -POINT-5704162 1072841 -POINT-5709435 1041622 -POINT-5740097 860057 -POINT-5768097 646085 -POINT-5788116 431221 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804168 0 -POINT-5800155 -215761 -POINT-5788116 -431221 -POINT-5768097 -646087 -POINT-5740097 -860059 -POINT-5728582 -928245 -POINT-5704162 -1072843 -POINT-5690120 -1140554 -POINT-5660339 -1284145 -POINT-5643788 -1351286 -POINT-5608688 -1493671 -POINT-5589658 -1560151 -POINT-5549301 -1701133 -POINT-5482239 -1906244 -POINT-5407593 -2108720 -POINT-5381277 -2172669 -POINT-5325470 -2308282 -POINT-5296797 -2371209 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4924667 -3071937 -POINT-4886988 -3129921 -POINT-4807083 -3252884 -POINT-4767272 -3309426 -POINT-4682846 -3429332 -POINT-4640967 -3484356 -POINT-4552154 -3601043 -POINT-4415146 -3767778 -POINT-4272049 -3929304 -POINT-4224302 -3979324 -POINT-4123047 -4085399 -POINT-3968338 -4235849 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3416042 -4691613 -POINT-3296920 -4777147 -POINT-3239292 -4815365 -POINT-3117080 -4896412 -POINT-3058068 -4932461 -POINT-2932922 -5008909 -POINT-2872614 -5042740 -POINT-2744720 -5114483 -POINT-2552719 -5212988 -POINT-2357177 -5304289 -POINT-2158386 -5388258 -POINT-1956619 -5464781 -POINT-1752136 -5533750 -POINT-1685838 -5553401 -POINT-1545242 -5595073 -POINT-1478254 -5612246 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732355 -POINT-844393 -5741965 -POINT-699173 -5762344 -POINT-630381 -5769402 -POINT-484497 -5784368 -POINT-269165 -5798399 -POINT-53451 -5804416 -POINT15697 -5803774 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774355 -POINT807174 -5748342 -POINT875462 -5737461 -POINT1020278 -5714386 -POINT1231979 -5672533 -POINT1299270 -5656609 -POINT1441970 -5622839 -POINT1649978 -5565372 -POINT1855697 -5500217 -POINT1920802 -5476902 -POINT2058868 -5427458 -POINT2259185 -5347196 -POINT2322374 -5319109 -POINT2456375 -5259546 -POINT2518478 -5229130 -POINT2650177 -5164627 -POINT2840316 -5062570 -POINT3026535 -4953516 -POINT3208557 -4837616 -POINT3386154 -4715029 -POINT3441568 -4673658 -POINT3559082 -4585924 -POINT3612916 -4542523 -POINT3727081 -4450483 -POINT3779263 -4405111 -POINT3889923 -4308891 -POINT4047393 -4161344 -POINT4096065 -4112220 -POINT4199280 -4008045 -POINT4345352 -3849207 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4660161 -3460003 -POINT4746795 -3341686 -POINT4785546 -3284413 -POINT4867721 -3162956 -POINT4904320 -3104282 -POINT4981933 -2979856 -POINT5016322 -2919863 -POINT5089248 -2792637 -POINT5121383 -2731407 -POINT5189529 -2601558 -POINT5219371 -2539176 -POINT5282654 -2406883 -POINT5368454 -2208883 -POINT5446853 -2007829 -POINT5469566 -1942513 -POINT5517730 -1804000 -POINT5537993 -1737886 -POINT5580963 -1597679 -POINT5636490 -1389148 -POINT5684234 -1178697 -POINT5697016 -1110738 -POINT5724121 -966619 -POINT5734365 -898231 -POINT5756088 -753204 -POINT5780105 -538747 -POINT5785244 -469787 -POINT5796142 -323547 -POINT5798714 -254443 -POINT5804168 -107898 -POINT5804168 107896 -POINT5796142 323545 -POINT5780105 538745 -POINT5772409 607467 -POINT5756088 753202 -POINT5724121 966617 -POINT5684234 1178697 -POINT5668935 1246134 -POINT5636490 1389146 -POINT5580963 1597677 -POINT5517730 1803999 -POINT5446853 2007827 -POINT5421731 2072254 -POINT5368454 2208881 -POINT5282654 2406881 -POINT5189529 2601556 -POINT5157395 2662786 -POINT5089248 2792635 -POINT5054860 2852627 -POINT4981933 2979852 -POINT4945335 3038526 -POINT4867721 3162954 -POINT4828971 3220227 -POINT4746795 3341684 -POINT4705943 3397477 -POINT4619308 3515794 -POINT4576407 3570030 -POINT4485428 3685045 -POINT4345352 3849203 -POINT4199280 4008043 -POINT4047393 4161340 -POINT3996933 4208622 -POINT3889923 4308889 -POINT3727081 4450483 -POINT3559082 4585924 -POINT3386154 4715025 -POINT3329244 4754308 -POINT3208557 4837614 -POINT3150229 4874753 -POINT3026535 4953512 -POINT2840316 5062567 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2259185 5347196 -POINT2194995 5372916 -POINT2058868 5427458 -POINT1993763 5450773 -POINT1855697 5500215 -POINT1789776 5521094 -POINT1649978 5565370 -POINT1441970 5622835 -POINT1231979 5672529 -POINT1020278 5714384 -POINT951990 5725266 -POINT807174 5748342 -POINT592941 5774351 -POINT377899 5792383 -POINT162338 5802408 -POINT-53451 5804415 -POINT-269165 5798399 -POINT-338167 5793903 -POINT-484497 5784368 -POINT-553288 5777310 -POINT-699173 5762342 -POINT-767651 5752733 -POINT-912872 5732355 -POINT-980950 5720206 -POINT-1125320 5694441 -POINT-1192894 5679771 -POINT-1336196 5648660 -POINT-1403184 5631488 -POINT-1545242 5595072 -POINT-1611540 5575422 -POINT-1752136 5533750 -POINT-1956619 5464781 -POINT-2158386 5388258 -POINT-2357177 5304289 -POINT-2419838 5275032 -POINT-2552719 5212988 -POINT-2614245 5181422 -POINT-2744720 5114481 -POINT-2805028 5080650 -POINT-2932922 5008905 -POINT-2991935 4972857 -POINT-3117080 4896410 -POINT-3174709 4858193 -POINT-3296920 4777147 -POINT-3353092 4736813 -POINT-3472213 4651277 -POINT-3526845 4608885 -POINT-3642700 4518984 -POINT-3695718 4474589 -POINT-3808151 4380441 -POINT-3859482 4334108 -POINT-3968338 4235849 -POINT-4123047 4085397 -POINT-4170794 4035378 -POINT-4272049 3929304 -POINT-4415146 3767778 -POINT-4552154 3601041 -POINT-4594033 3546018 -POINT-4682846 3429330 -POINT-4807083 3252882 -POINT-4924667 3071935 -POINT-4960166 3012591 -POINT-5035446 2886743 -POINT-5068715 2826121 -POINT-5139267 2697561 -POINT-5235992 2504652 -POINT-5264665 2441725 -POINT-5325470 2308279 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701131 -POINT-5608688 1493669 -POINT-5625240 1426528 -POINT-5660339 1284143 -POINT-5674382 1216432 -POINT-5704162 1072841 -POINT-5715678 1004656 -POINT-5740097 860057 -POINT-5768097 646085 -POINT-5774512 577233 -POINT-5788116 431221 -POINT-5791974 362177 -POINT-5800155 215759 -POINT-5801441 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804168 0 -POINT-5800527 -195762 -POINT-5800155 -215761 -POINT-5789232 -411249 -POINT-5788116 -431221 -POINT-5769953 -626171 -POINT-5768097 -646087 -POINT-5740097 -860059 -POINT-5707493 -1053120 -POINT-5704162 -1072843 -POINT-5660339 -1284145 -POINT-5613476 -1474250 -POINT-5608688 -1493671 -POINT-5554806 -1681903 -POINT-5549301 -1701133 -POINT-5482239 -1906244 -POINT-5407593 -2108720 -POINT-5333082 -2289785 -POINT-5325470 -2308282 -POINT-5244286 -2486452 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4934935 -3054772 -POINT-4924667 -3071937 -POINT-4817982 -3236112 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4564268 -3585127 -POINT-4552154 -3601043 -POINT-4415146 -3767778 -POINT-4272049 -3929304 -POINT-4136858 -4070931 -POINT-4123047 -4085399 -POINT-3982678 -4221904 -POINT-3968338 -4235849 -POINT-3822999 -4367041 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3488016 -4639017 -POINT-3472213 -4651279 -POINT-3313169 -4765480 -POINT-3296920 -4777147 -POINT-3133750 -4885357 -POINT-3117080 -4896412 -POINT-2949992 -4998482 -POINT-2932922 -5008909 -POINT-2744720 -5114483 -POINT-2552719 -5212988 -POINT-2357177 -5304289 -POINT-2158386 -5388258 -POINT-1956619 -5464781 -POINT-1752136 -5533750 -POINT-1564419 -5589390 -POINT-1545242 -5595073 -POINT-1355573 -5643695 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-932564 -5728841 -POINT-912872 -5732355 -POINT-699173 -5762344 -POINT-504395 -5782327 -POINT-484497 -5784368 -POINT-269165 -5798399 -POINT-73446 -5803859 -POINT-53451 -5804416 -POINT142336 -5802596 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774355 -POINT807174 -5748342 -POINT1020278 -5714386 -POINT1231979 -5672533 -POINT1441970 -5622839 -POINT1630698 -5570699 -POINT1649978 -5565372 -POINT1855697 -5500217 -POINT2058868 -5427458 -POINT2240618 -5354636 -POINT2259185 -5347196 -POINT2456375 -5259546 -POINT2650177 -5164627 -POINT2822692 -5072030 -POINT2840316 -5062570 -POINT3026535 -4953516 -POINT3208557 -4837616 -POINT3386154 -4715029 -POINT3543053 -4597891 -POINT3559082 -4585924 -POINT3727081 -4450483 -POINT3874829 -4322016 -POINT3889923 -4308891 -POINT4047393 -4161344 -POINT4199280 -4008045 -POINT4345352 -3849207 -POINT4485428 -3685047 -POINT4606899 -3531484 -POINT4619308 -3515796 -POINT4746795 -3341686 -POINT4856513 -3179523 -POINT4867721 -3162956 -POINT4971347 -2996828 -POINT4981933 -2979856 -POINT5089248 -2792637 -POINT5189529 -2601558 -POINT5274022 -2424928 -POINT5282654 -2406883 -POINT5368454 -2208883 -POINT5446853 -2007829 -POINT5511161 -1822894 -POINT5517730 -1804000 -POINT5575102 -1616803 -POINT5580963 -1597679 -POINT5636490 -1389148 -POINT5679809 -1198204 -POINT5684234 -1178697 -POINT5720424 -986277 -POINT5724121 -966619 -POINT5753125 -772986 -POINT5756088 -753204 -POINT5777879 -558626 -POINT5780105 -538747 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5803425 -127887 -POINT5804168 -107898 -POINT5804168 107896 -POINT5796886 303556 -POINT5796142 323545 -POINT5781592 518798 -POINT5780105 538745 -POINT5756088 753202 -POINT5724121 966617 -POINT5684234 1178697 -POINT5636490 1389146 -POINT5586110 1578348 -POINT5580963 1597677 -POINT5523592 1784874 -POINT5517730 1803999 -POINT5453423 1988934 -POINT5446853 2007827 -POINT5375721 2190245 -POINT5368454 2208881 -POINT5282654 2406881 -POINT5198161 2583512 -POINT5189529 2601556 -POINT5089248 2792635 -POINT4991881 2962499 -POINT4981933 2979852 -POINT4878308 3145982 -POINT4867721 3162954 -POINT4758004 3325117 -POINT4746795 3341684 -POINT4631125 3499656 -POINT4619308 3515794 -POINT4485428 3685045 -POINT4358336 3833987 -POINT4345352 3849203 -POINT4199280 4008043 -POINT4061472 4147131 -POINT4047393 4161340 -POINT3904519 4295213 -POINT3889923 4308889 -POINT3742175 4437359 -POINT3727081 4450483 -POINT3574654 4573370 -POINT3559082 4585924 -POINT3386154 4715025 -POINT3208557 4837614 -POINT3026535 4953512 -POINT2840316 5062567 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2277463 5339072 -POINT2259185 5347196 -POINT2058868 5427458 -POINT1855697 5500215 -POINT1669047 5559331 -POINT1649978 5565370 -POINT1461251 5617509 -POINT1441970 5622835 -POINT1251443 5667923 -POINT1231979 5672529 -POINT1020278 5714384 -POINT826927 5745195 -POINT807174 5748342 -POINT592941 5774351 -POINT397831 5790712 -POINT377899 5792383 -POINT182318 5801479 -POINT162338 5802408 -POINT-33449 5804229 -POINT-53451 5804415 -POINT-269165 5798399 -POINT-464537 5785669 -POINT-484497 5784368 -POINT-679274 5764384 -POINT-699173 5762342 -POINT-912872 5732355 -POINT-1125320 5694441 -POINT-1316650 5652904 -POINT-1336196 5648660 -POINT-1545242 5595072 -POINT-1732959 5539434 -POINT-1752136 5533750 -POINT-1937665 5471174 -POINT-1956619 5464781 -POINT-2139684 5395351 -POINT-2158386 5388258 -POINT-2357177 5304289 -POINT-2534594 5221451 -POINT-2552719 5212988 -POINT-2744720 5114481 -POINT-2932922 5008905 -POINT-3100011 4906837 -POINT-3117080 4896410 -POINT-3280251 4788202 -POINT-3296920 4777147 -POINT-3455965 4662944 -POINT-3472213 4651277 -POINT-3642700 4518984 -POINT-3792815 4393283 -POINT-3808151 4380441 -POINT-3953490 4249252 -POINT-3968338 4235849 -POINT-4108707 4099343 -POINT-4123047 4085397 -POINT-4272049 3929304 -POINT-4415146 3767778 -POINT-4539455 3616496 -POINT-4552154 3601041 -POINT-4670732 3445247 -POINT-4682846 3429330 -POINT-4807083 3252882 -POINT-4924667 3071935 -POINT-5025178 2903909 -POINT-5035446 2886743 -POINT-5129644 2715096 -POINT-5139267 2697561 -POINT-5227027 2522533 -POINT-5235992 2504652 -POINT-5325470 2308279 -POINT-5407593 2108719 -POINT-5475320 1925010 -POINT-5482239 1906242 -POINT-5543085 1720143 -POINT-5549301 1701131 -POINT-5603184 1512899 -POINT-5608688 1493669 -POINT-5655552 1303564 -POINT-5660339 1284143 -POINT-5700100 1092427 -POINT-5704162 1072841 -POINT-5740097 860057 -POINT-5768097 646085 -POINT-5788116 431221 -POINT-5799040 235730 -POINT-5800155 215759 -POINT-5803797 19998 -OBJECT_ID188 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804165 0 -POINT-5800152 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740093 -860059 -POINT-5704159 -1072843 -POINT-5660339 -1284145 -POINT-5608696 -1493671 -POINT-5549301 -1701133 -POINT-5482231 -1906244 -POINT-5407589 -2108720 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035454 -2886745 -POINT-4924675 -3071935 -POINT-4807087 -3252882 -POINT-4682853 -3429332 -POINT-4552150 -3601043 -POINT-4415153 -3767778 -POINT-4272053 -3929304 -POINT-4123047 -4085399 -POINT-3968341 -4235849 -POINT-3808155 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3296924 -4777147 -POINT-3117080 -4896410 -POINT-2932926 -5008907 -POINT-2744716 -5114483 -POINT-2552715 -5212988 -POINT-2357181 -5304289 -POINT-2158393 -5388258 -POINT-1956619 -5464781 -POINT-1752140 -5533750 -POINT-1545238 -5595072 -POINT-1336200 -5648660 -POINT-1125316 -5694443 -POINT-912876 -5732355 -POINT-699173 -5762344 -POINT-484504 -5784368 -POINT-269161 -5798399 -POINT-53451 -5804415 -POINT162338 -5802410 -POINT377903 -5792385 -POINT592945 -5774353 -POINT807167 -5748342 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1441974 -5622839 -POINT1649978 -5565372 -POINT1855701 -5500215 -POINT2058864 -5427458 -POINT2259182 -5347196 -POINT2456375 -5259546 -POINT2650177 -5164627 -POINT2840313 -5062568 -POINT3026527 -4953516 -POINT3208561 -4837614 -POINT3386158 -4715029 -POINT3559074 -4585924 -POINT3727073 -4450483 -POINT3889923 -4308891 -POINT4047397 -4161342 -POINT4199280 -4008045 -POINT4345356 -3849205 -POINT4485428 -3685047 -POINT4619304 -3515796 -POINT4746792 -3341684 -POINT4867725 -3162956 -POINT4981930 -2979854 -POINT5089248 -2792637 -POINT5189533 -2601556 -POINT5282646 -2406883 -POINT5368461 -2208883 -POINT5446857 -2007829 -POINT5517723 -1804000 -POINT5580967 -1597677 -POINT5636493 -1389148 -POINT5684234 -1178697 -POINT5724121 -966619 -POINT5756092 -753204 -POINT5780113 -538747 -POINT5796142 -323547 -POINT5804165 -107898 -POINT5804165 107898 -POINT5796142 323545 -POINT5780113 538745 -POINT5756092 753202 -POINT5724121 966619 -POINT5684234 1178697 -POINT5636493 1389146 -POINT5580967 1597677 -POINT5517723 1803999 -POINT5446857 2007829 -POINT5368461 2208883 -POINT5282646 2406881 -POINT5189533 2601556 -POINT5089248 2792635 -POINT4981930 2979856 -POINT4867725 3162954 -POINT4746792 3341684 -POINT4619304 3515794 -POINT4485428 3685045 -POINT4345356 3849203 -POINT4199280 4008043 -POINT4047397 4161340 -POINT3889923 4308889 -POINT3727073 4450483 -POINT3559074 4585924 -POINT3386158 4715029 -POINT3208561 4837614 -POINT3026527 4953516 -POINT2840313 5062570 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2259182 5347196 -POINT2058864 5427458 -POINT1855701 5500215 -POINT1649978 5565370 -POINT1441974 5622839 -POINT1231975 5672533 -POINT1020275 5714384 -POINT807167 5748342 -POINT592945 5774351 -POINT377903 5792383 -POINT162338 5802408 -POINT-53451 5804415 -POINT-269161 5798399 -POINT-484504 5784368 -POINT-699173 5762342 -POINT-912876 5732355 -POINT-1125316 5694441 -POINT-1336200 5648660 -POINT-1545238 5595072 -POINT-1752140 5533750 -POINT-1956619 5464781 -POINT-2158393 5388258 -POINT-2357181 5304289 -POINT-2552715 5212988 -POINT-2744716 5114481 -POINT-2932926 5008909 -POINT-3117080 4896410 -POINT-3296924 4777147 -POINT-3472213 4651277 -POINT-3642700 4518984 -POINT-3808155 4380441 -POINT-3968341 4235849 -POINT-4123047 4085397 -POINT-4272053 3929304 -POINT-4415153 3767778 -POINT-4552150 3601041 -POINT-4682853 3429330 -POINT-4807087 3252882 -POINT-4924675 3071935 -POINT-5035454 2886743 -POINT-5139274 2697561 -POINT-5235992 2504652 -POINT-5325470 2308282 -POINT-5407589 2108720 -POINT-5482231 1906244 -POINT-5549301 1701131 -POINT-5608696 1493669 -POINT-5660339 1284143 -POINT-5704159 1072843 -POINT-5740093 860059 -POINT-5768097 646085 -POINT-5788124 431221 -POINT-5800152 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804165 0 -POINT-5800152 -215759 -POINT-5788124 -431221 -POINT-5785186 -462745 -POINT-5768097 -646087 -POINT-5740093 -860059 -POINT-5734821 -891278 -POINT-5704159 -1072843 -POINT-5660339 -1284145 -POINT-5608696 -1493671 -POINT-5599982 -1524109 -POINT-5549301 -1701133 -POINT-5539461 -1731226 -POINT-5482231 -1906244 -POINT-5471280 -1935950 -POINT-5407589 -2108720 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5124042 -2725319 -POINT-5035454 -2886745 -POINT-5019201 -2913916 -POINT-4924675 -3071935 -POINT-4907423 -3098483 -POINT-4807087 -3252882 -POINT-4788860 -3278770 -POINT-4682853 -3429332 -POINT-4663677 -3454525 -POINT-4552150 -3601043 -POINT-4532051 -3625506 -POINT-4415153 -3767778 -POINT-4272053 -3929304 -POINT-4123047 -4085399 -POINT-4100349 -4107473 -POINT-3968341 -4235849 -POINT-3944840 -4257064 -POINT-3808155 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3446496 -4669746 -POINT-3296924 -4777147 -POINT-3270538 -4794645 -POINT-3117080 -4896410 -POINT-3090062 -4912915 -POINT-2932926 -5008907 -POINT-2744716 -5114483 -POINT-2716547 -5128935 -POINT-2552715 -5212988 -POINT-2357181 -5304289 -POINT-2158393 -5388258 -POINT-2128790 -5399485 -POINT-1956619 -5464781 -POINT-1752140 -5533750 -POINT-1721784 -5542747 -POINT-1545238 -5595072 -POINT-1336200 -5648660 -POINT-1305260 -5655378 -POINT-1125316 -5694443 -POINT-912876 -5732355 -POINT-881522 -5736755 -POINT-699173 -5762344 -POINT-667677 -5765576 -POINT-484504 -5784368 -POINT-452910 -5786427 -POINT-269161 -5798399 -POINT-53451 -5804415 -POINT162338 -5802410 -POINT377903 -5792385 -POINT592945 -5774353 -POINT624374 -5770537 -POINT807167 -5748342 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1441974 -5622839 -POINT1649978 -5565372 -POINT1680161 -5555813 -POINT1855701 -5500215 -POINT2058864 -5427458 -POINT2259182 -5347196 -POINT2288113 -5334337 -POINT2456375 -5259546 -POINT2484809 -5245620 -POINT2650177 -5164627 -POINT2840313 -5062568 -POINT2867633 -5046569 -POINT3026527 -4953516 -POINT3208561 -4837614 -POINT3386158 -4715029 -POINT3559074 -4585924 -POINT3583722 -4566053 -POINT3727073 -4450483 -POINT3750966 -4429709 -POINT3889923 -4308891 -POINT4047397 -4161342 -POINT4069681 -4138851 -POINT4199280 -4008045 -POINT4345356 -3849205 -POINT4485428 -3685047 -POINT4619304 -3515796 -POINT4638009 -3490251 -POINT4746792 -3341684 -POINT4764535 -3315462 -POINT4867725 -3162956 -POINT4884481 -3136092 -POINT4981930 -2979854 -POINT5089248 -2792637 -POINT5103962 -2764602 -POINT5189533 -2601556 -POINT5203194 -2572995 -POINT5282646 -2406883 -POINT5368461 -2208883 -POINT5446857 -2007829 -POINT5517723 -1804000 -POINT5527002 -1773729 -POINT5580967 -1597677 -POINT5636493 -1389148 -POINT5643498 -1358272 -POINT5684234 -1178697 -POINT5690087 -1147582 -POINT5724121 -966619 -POINT5728812 -935308 -POINT5756092 -753204 -POINT5780113 -538747 -POINT5782465 -507174 -POINT5796142 -323547 -POINT5804165 -107898 -POINT5804165 107898 -POINT5802988 139537 -POINT5796142 323545 -POINT5793791 355118 -POINT5780113 538745 -POINT5776589 570210 -POINT5756092 753202 -POINT5724121 966619 -POINT5718269 997734 -POINT5684234 1178697 -POINT5677230 1209573 -POINT5636493 1389146 -POINT5628347 1419741 -POINT5580967 1597677 -POINT5517723 1803999 -POINT5507326 1833904 -POINT5446857 2007829 -POINT5435355 2037327 -POINT5368461 2208883 -POINT5355871 2237932 -POINT5282646 2406881 -POINT5268985 2435443 -POINT5189533 2601556 -POINT5174820 2629591 -POINT5089248 2792635 -POINT5073503 2820103 -POINT4981930 2979856 -POINT4867725 3162954 -POINT4746792 3341684 -POINT4619304 3515794 -POINT4599663 3540626 -POINT4485428 3685045 -POINT4345356 3849203 -POINT4199280 4008043 -POINT4047397 4161340 -POINT4024293 4182988 -POINT3889923 4308889 -POINT3727073 4450483 -POINT3559074 4585924 -POINT3386158 4715029 -POINT3208561 4837614 -POINT3026527 4953516 -POINT2840313 5062570 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2427443 5272406 -POINT2259182 5347196 -POINT2229792 5358972 -POINT2058864 5427458 -POINT2029057 5438133 -POINT1855701 5500215 -POINT1649978 5565370 -POINT1619461 5573802 -POINT1441974 5622839 -POINT1411164 5630130 -POINT1231975 5672533 -POINT1020275 5714384 -POINT807167 5748342 -POINT775737 5752158 -POINT592945 5774351 -POINT377903 5792383 -POINT346276 5793854 -POINT162338 5802408 -POINT-53451 5804415 -POINT-269161 5798399 -POINT-484504 5784368 -POINT-515999 5781137 -POINT-699173 5762342 -POINT-912876 5732355 -POINT-1125316 5694441 -POINT-1336200 5648660 -POINT-1366869 5640798 -POINT-1545238 5595072 -POINT-1752140 5533750 -POINT-1956619 5464781 -POINT-2158393 5388258 -POINT-2357181 5304289 -POINT-2552715 5212988 -POINT-2744716 5114481 -POINT-2772330 5098992 -POINT-2932926 5008909 -POINT-2959944 4992404 -POINT-3117080 4896410 -POINT-3296924 4777147 -POINT-3322642 4758680 -POINT-3472213 4651277 -POINT-3497227 4631868 -POINT-3642700 4518984 -POINT-3808155 4380441 -POINT-3831657 4359227 -POINT-3968341 4235849 -POINT-4123047 4085397 -POINT-4272053 3929304 -POINT-4415153 3767778 -POINT-4435253 3743315 -POINT-4552150 3601041 -POINT-4571326 3575849 -POINT-4682853 3429330 -POINT-4701081 3403442 -POINT-4807087 3252882 -POINT-4924675 3071935 -POINT-4940928 3044765 -POINT-5035454 2886743 -POINT-5139274 2697561 -POINT-5153465 2669258 -POINT-5235992 2504652 -POINT-5325470 2308282 -POINT-5407589 2108720 -POINT-5482231 1906244 -POINT-5549301 1701131 -POINT-5608696 1493669 -POINT-5616273 1462928 -POINT-5660339 1284143 -POINT-5704159 1072843 -POINT-5740093 860059 -POINT-5768097 646085 -POINT-5788124 431221 -POINT-5789889 399609 -POINT-5800152 215759 -POLYGON_AT_HEIGHT18000000 -POINT-5804165 0 -POINT-5800152 -215759 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5740093 -860059 -POINT-5704159 -1072843 -POINT-5660339 -1284145 -POINT-5608696 -1493671 -POINT-5549301 -1701133 -POINT-5527809 -1766860 -POINT-5482231 -1906244 -POINT-5407589 -2108720 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5205000 -2566470 -POINT-5139274 -2697563 -POINT-5035454 -2886745 -POINT-4924675 -3071935 -POINT-4807087 -3252882 -POINT-4682853 -3429332 -POINT-4640970 -3484356 -POINT-4552150 -3601043 -POINT-4415153 -3767778 -POINT-4272053 -3929304 -POINT-4123047 -4085399 -POINT-3968341 -4235849 -POINT-3808155 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3416043 -4691613 -POINT-3296924 -4777147 -POINT-3117080 -4896410 -POINT-3058069 -4932459 -POINT-2932926 -5008907 -POINT-2744716 -5114483 -POINT-2552715 -5212988 -POINT-2357181 -5304289 -POINT-2158393 -5388258 -POINT-1956619 -5464781 -POINT-1752140 -5533750 -POINT-1545238 -5595072 -POINT-1478253 -5612244 -POINT-1336200 -5648660 -POINT-1268624 -5663331 -POINT-1125316 -5694443 -POINT-912876 -5732355 -POINT-844396 -5741965 -POINT-699173 -5762344 -POINT-630383 -5769402 -POINT-484504 -5784368 -POINT-269161 -5798399 -POINT-200038 -5800327 -POINT-53451 -5804415 -POINT162338 -5802410 -POINT377903 -5792385 -POINT446812 -5786607 -POINT592945 -5774353 -POINT661591 -5766018 -POINT807167 -5748342 -POINT1020275 -5714386 -POINT1088113 -5700974 -POINT1231975 -5672531 -POINT1441974 -5622839 -POINT1508628 -5604424 -POINT1649978 -5565372 -POINT1715901 -5544493 -POINT1855701 -5500215 -POINT2058864 -5427458 -POINT2259182 -5347196 -POINT2456375 -5259546 -POINT2518478 -5229130 -POINT2650177 -5164627 -POINT2711105 -5131923 -POINT2840313 -5062568 -POINT3026527 -4953516 -POINT3208561 -4837614 -POINT3386158 -4715029 -POINT3441568 -4673658 -POINT3559074 -4585924 -POINT3612908 -4542523 -POINT3727073 -4450483 -POINT3779257 -4405111 -POINT3889923 -4308891 -POINT4047397 -4161342 -POINT4096067 -4112219 -POINT4199280 -4008045 -POINT4345356 -3849205 -POINT4485428 -3685047 -POINT4619304 -3515796 -POINT4660157 -3460003 -POINT4746792 -3341684 -POINT4867725 -3162956 -POINT4981930 -2979854 -POINT5016320 -2919861 -POINT5089248 -2792637 -POINT5121384 -2731406 -POINT5189533 -2601556 -POINT5219371 -2539174 -POINT5282646 -2406883 -POINT5310145 -2343435 -POINT5368461 -2208883 -POINT5393583 -2144456 -POINT5446857 -2007829 -POINT5469566 -1942513 -POINT5517723 -1804000 -POINT5580967 -1597677 -POINT5636493 -1389148 -POINT5651792 -1321710 -POINT5684234 -1178697 -POINT5697016 -1110738 -POINT5724121 -966619 -POINT5734366 -898231 -POINT5756092 -753204 -POINT5780113 -538747 -POINT5796142 -323547 -POINT5798713 -254443 -POINT5804165 -107898 -POINT5804165 107898 -POINT5796142 323545 -POINT5791006 392505 -POINT5780113 538745 -POINT5756092 753202 -POINT5724121 966619 -POINT5684234 1178697 -POINT5668936 1246134 -POINT5636493 1389146 -POINT5618700 1455969 -POINT5580967 1597677 -POINT5517723 1803999 -POINT5446857 2007829 -POINT5421736 2072256 -POINT5368461 2208883 -POINT5282646 2406881 -POINT5189533 2601556 -POINT5157398 2662786 -POINT5089248 2792635 -POINT4981930 2979856 -POINT4867725 3162954 -POINT4828973 3220227 -POINT4746792 3341684 -POINT4705939 3397477 -POINT4619304 3515794 -POINT4576404 3570030 -POINT4485428 3685045 -POINT4345356 3849203 -POINT4199280 4008043 -POINT4047397 4161340 -POINT3996935 4208622 -POINT3889923 4308889 -POINT3837739 4354262 -POINT3727073 4450483 -POINT3559074 4585924 -POINT3386158 4715029 -POINT3208561 4837614 -POINT3026527 4953516 -POINT2966856 4988462 -POINT2840313 5062570 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2259182 5347196 -POINT2194991 5372916 -POINT2058864 5427458 -POINT1993762 5450773 -POINT1855701 5500215 -POINT1789778 5521094 -POINT1649978 5565370 -POINT1583324 5583786 -POINT1441974 5622839 -POINT1231975 5672533 -POINT1164137 5685944 -POINT1020275 5714384 -POINT951985 5725266 -POINT807167 5748342 -POINT592945 5774351 -POINT377903 5792383 -POINT162338 5802408 -POINT-53451 5804415 -POINT-269161 5798399 -POINT-338166 5793903 -POINT-484504 5784368 -POINT-553294 5777310 -POINT-699173 5762342 -POINT-767653 5752733 -POINT-912876 5732355 -POINT-980951 5720206 -POINT-1125316 5694441 -POINT-1192893 5679771 -POINT-1336200 5648660 -POINT-1545238 5595072 -POINT-1611539 5575422 -POINT-1752140 5533750 -POINT-1956619 5464781 -POINT-2158393 5388258 -POINT-2357181 5304289 -POINT-2552715 5212988 -POINT-2614241 5181422 -POINT-2744716 5114481 -POINT-2805027 5080651 -POINT-2932926 5008909 -POINT-3117080 4896410 -POINT-3174710 4858193 -POINT-3296924 4777147 -POINT-3353095 4736813 -POINT-3472213 4651277 -POINT-3526845 4608885 -POINT-3642700 4518984 -POINT-3695719 4474589 -POINT-3808155 4380441 -POINT-3859486 4334108 -POINT-3968341 4235849 -POINT-4123047 4085397 -POINT-4272053 3929304 -POINT-4317909 3877544 -POINT-4415153 3767778 -POINT-4459053 3714348 -POINT-4552150 3601041 -POINT-4594033 3546018 -POINT-4682853 3429330 -POINT-4807087 3252882 -POINT-4924675 3071935 -POINT-5035454 2886743 -POINT-5139274 2697561 -POINT-5170267 2635744 -POINT-5235992 2504652 -POINT-5264665 2441726 -POINT-5325470 2308282 -POINT-5407589 2108720 -POINT-5482231 1906244 -POINT-5549301 1701131 -POINT-5568334 1634651 -POINT-5608696 1493669 -POINT-5660339 1284143 -POINT-5674381 1216433 -POINT-5704159 1072843 -POINT-5715674 1004658 -POINT-5740093 860059 -POINT-5749067 791492 -POINT-5768097 646085 -POINT-5788124 431221 -POINT-5800152 215759 -POINT-5801438 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804165 0 -POINT-5800524 -195760 -POINT-5800152 -215759 -POINT-5789239 -411249 -POINT-5788124 -431221 -POINT-5768097 -646087 -POINT-5742689 -840226 -POINT-5740093 -860059 -POINT-5704159 -1072843 -POINT-5664401 -1264559 -POINT-5660339 -1284145 -POINT-5613483 -1474250 -POINT-5608696 -1493671 -POINT-5549301 -1701133 -POINT-5488448 -1887232 -POINT-5482231 -1906244 -POINT-5414508 -2089953 -POINT-5407589 -2108720 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5148239 -2679682 -POINT-5139274 -2697563 -POINT-5045077 -2869210 -POINT-5035454 -2886745 -POINT-4934943 -3054770 -POINT-4924675 -3071935 -POINT-4807087 -3252882 -POINT-4694369 -3412977 -POINT-4682853 -3429332 -POINT-4564265 -3585127 -POINT-4552150 -3601043 -POINT-4427852 -3752323 -POINT-4415153 -3767778 -POINT-4272053 -3929304 -POINT-4136858 -4070931 -POINT-4123047 -4085399 -POINT-3982681 -4221904 -POINT-3968341 -4235849 -POINT-3823003 -4367041 -POINT-3808155 -4380443 -POINT-3642700 -4518986 -POINT-3488016 -4639017 -POINT-3472213 -4651279 -POINT-3313172 -4765480 -POINT-3296924 -4777147 -POINT-3117080 -4896410 -POINT-2949995 -4998480 -POINT-2932926 -5008907 -POINT-2762162 -5104697 -POINT-2744716 -5114483 -POINT-2552715 -5212988 -POINT-2375306 -5295826 -POINT-2357181 -5304289 -POINT-2158393 -5388258 -POINT-1975322 -5457688 -POINT-1956619 -5464781 -POINT-1752140 -5533750 -POINT-1564416 -5589388 -POINT-1545238 -5595072 -POINT-1355576 -5643693 -POINT-1336200 -5648660 -POINT-1125316 -5694443 -POINT-932567 -5728841 -POINT-912876 -5732355 -POINT-699173 -5762344 -POINT-504402 -5782327 -POINT-484504 -5784368 -POINT-269161 -5798399 -POINT-53451 -5804415 -POINT142336 -5802596 -POINT162338 -5802410 -POINT377903 -5792385 -POINT592945 -5774353 -POINT807167 -5748342 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1422509 -5627445 -POINT1441974 -5622839 -POINT1630698 -5570699 -POINT1649978 -5565372 -POINT1836632 -5506255 -POINT1855701 -5500215 -POINT2058864 -5427458 -POINT2240614 -5354636 -POINT2259182 -5347196 -POINT2456375 -5259546 -POINT2650177 -5164627 -POINT2840313 -5062568 -POINT3026527 -4953516 -POINT3208561 -4837614 -POINT3386158 -4715029 -POINT3559074 -4585924 -POINT3727073 -4450483 -POINT3874828 -4322016 -POINT3889923 -4308891 -POINT4032801 -4175019 -POINT4047397 -4161342 -POINT4199280 -4008045 -POINT4345356 -3849205 -POINT4485428 -3685047 -POINT4606895 -3531484 -POINT4619304 -3515796 -POINT4734975 -3357823 -POINT4746792 -3341684 -POINT4856516 -3179522 -POINT4867725 -3162956 -POINT4981930 -2979854 -POINT5079301 -2809990 -POINT5089248 -2792637 -POINT5180238 -2619268 -POINT5189533 -2601556 -POINT5282646 -2406883 -POINT5360507 -2227236 -POINT5368461 -2208883 -POINT5439591 -2026465 -POINT5446857 -2007829 -POINT5517723 -1804000 -POINT5580967 -1597677 -POINT5636493 -1389148 -POINT5679809 -1198204 -POINT5684234 -1178697 -POINT5720424 -986277 -POINT5724121 -966619 -POINT5756092 -753204 -POINT5777887 -558626 -POINT5780113 -538747 -POINT5794657 -343494 -POINT5796142 -323547 -POINT5804165 -107898 -POINT5804165 107898 -POINT5796886 303556 -POINT5796142 323545 -POINT5781599 518798 -POINT5780113 538745 -POINT5756092 753202 -POINT5724121 966619 -POINT5684234 1178697 -POINT5640918 1369640 -POINT5636493 1389146 -POINT5586114 1578348 -POINT5580967 1597677 -POINT5517723 1803999 -POINT5453426 1988936 -POINT5446857 2007829 -POINT5375728 2190247 -POINT5368461 2208883 -POINT5282646 2406881 -POINT5198164 2583512 -POINT5189533 2601556 -POINT5098544 2774923 -POINT5089248 2792635 -POINT4981930 2979856 -POINT4867725 3162954 -POINT4746792 3341684 -POINT4631121 3499656 -POINT4619304 3515794 -POINT4485428 3685045 -POINT4345356 3849203 -POINT4199280 4008043 -POINT4061475 4147131 -POINT4047397 4161340 -POINT3904519 4295213 -POINT3889923 4308889 -POINT3742168 4437359 -POINT3727073 4450483 -POINT3574646 4573370 -POINT3559074 4585924 -POINT3402186 4703062 -POINT3386158 4715029 -POINT3208561 4837614 -POINT3043400 4942773 -POINT3026527 4953516 -POINT2857573 5052462 -POINT2840313 5062570 -POINT2650177 5164625 -POINT2456375 5259546 -POINT2277460 5339072 -POINT2259182 5347196 -POINT2058864 5427458 -POINT1855701 5500215 -POINT1669047 5559331 -POINT1649978 5565370 -POINT1441974 5622839 -POINT1251440 5667927 -POINT1231975 5672533 -POINT1039897 5710505 -POINT1020275 5714384 -POINT826920 5745195 -POINT807167 5748342 -POINT592945 5774351 -POINT397835 5790712 -POINT377903 5792383 -POINT182319 5801479 -POINT162338 5802408 -POINT-33449 5804229 -POINT-53451 5804415 -POINT-269161 5798399 -POINT-464544 5785669 -POINT-484504 5784368 -POINT-679275 5764384 -POINT-699173 5762342 -POINT-912876 5732355 -POINT-1125316 5694441 -POINT-1316653 5652904 -POINT-1336200 5648660 -POINT-1545238 5595072 -POINT-1752140 5533750 -POINT-1956619 5464781 -POINT-2139691 5395351 -POINT-2158393 5388258 -POINT-2357181 5304289 -POINT-2534591 5221451 -POINT-2552715 5212988 -POINT-2744716 5114481 -POINT-2915480 5018695 -POINT-2932926 5008909 -POINT-3117080 4896410 -POINT-3280254 4788202 -POINT-3296924 4777147 -POINT-3455966 4662944 -POINT-3472213 4651277 -POINT-3642700 4518984 -POINT-3808155 4380441 -POINT-3953493 4249252 -POINT-3968341 4235849 -POINT-4108707 4099343 -POINT-4123047 4085397 -POINT-4272053 3929304 -POINT-4401889 3782750 -POINT-4415153 3767778 -POINT-4539452 3616496 -POINT-4552150 3601041 -POINT-4670738 3445247 -POINT-4682853 3429330 -POINT-4795572 3269237 -POINT-4807087 3252882 -POINT-4924675 3071935 -POINT-5035454 2886743 -POINT-5139274 2697561 -POINT-5235992 2504652 -POINT-5325470 2308282 -POINT-5407589 2108720 -POINT-5482231 1906244 -POINT-5549301 1701131 -POINT-5608696 1493669 -POINT-5660339 1284143 -POINT-5704159 1072843 -POINT-5740093 860059 -POINT-5768097 646085 -POINT-5786268 451137 -POINT-5788124 431221 -POINT-5800152 215759 -OBJECT_ID199 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804153 0 -POINT-5800155 -215759 -POINT-5788116 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704147 -1072845 -POINT-5660339 -1284145 -POINT-5608688 -1493671 -POINT-5549301 -1701133 -POINT-5482223 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4924667 -3071937 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4552139 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085399 -POINT-3968338 -4235847 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3296920 -4777145 -POINT-3117080 -4896412 -POINT-2932922 -5008907 -POINT-2744705 -5114483 -POINT-2552703 -5212986 -POINT-2357177 -5304287 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545242 -5595073 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804416 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774353 -POINT807174 -5748340 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622837 -POINT1649978 -5565372 -POINT1855712 -5500217 -POINT2058868 -5427456 -POINT2259185 -5347198 -POINT2456375 -5259548 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585926 -POINT3727081 -4450481 -POINT3889923 -4308891 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4746795 -3341686 -POINT4867721 -3162956 -POINT4981933 -2979854 -POINT5089248 -2792637 -POINT5189544 -2601558 -POINT5282654 -2406883 -POINT5368469 -2208881 -POINT5446853 -2007827 -POINT5517730 -1804000 -POINT5580963 -1597679 -POINT5636505 -1389148 -POINT5684234 -1178699 -POINT5724121 -966617 -POINT5756103 -753204 -POINT5780121 -538745 -POINT5796142 -323547 -POINT5804168 -107898 -POINT5804168 107898 -POINT5796142 323547 -POINT5780121 538745 -POINT5756103 753204 -POINT5724121 966617 -POINT5684234 1178695 -POINT5636505 1389148 -POINT5580963 1597675 -POINT5517730 1804000 -POINT5446853 2007827 -POINT5368469 2208881 -POINT5282654 2406883 -POINT5189544 2601558 -POINT5089248 2792637 -POINT4981933 2979854 -POINT4867721 3162956 -POINT4746795 3341682 -POINT4619308 3515796 -POINT4485428 3685047 -POINT4345367 3849205 -POINT4199280 4008045 -POINT4047409 4161342 -POINT3889923 4308891 -POINT3727081 4450481 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837612 -POINT3026535 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347194 -POINT2058868 5427456 -POINT1855712 5500213 -POINT1649978 5565372 -POINT1441970 5622837 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748340 -POINT592941 5774353 -POINT377899 5792385 -POINT162338 5802410 -POINT-53451 5804413 -POINT-269165 5798397 -POINT-484497 5784366 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533748 -POINT-1956619 5464779 -POINT-2158386 5388256 -POINT-2357177 5304287 -POINT-2552703 5212986 -POINT-2744705 5114483 -POINT-2932922 5008907 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651279 -POINT-3642700 4518986 -POINT-3808151 4380443 -POINT-3968338 4235847 -POINT-4123047 4085399 -POINT-4272049 3929302 -POINT-4415146 3767776 -POINT-4552139 3601043 -POINT-4682846 3429332 -POINT-4807083 3252880 -POINT-4924667 3071937 -POINT-5035446 2886745 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482223 1906242 -POINT-5549301 1701133 -POINT-5608688 1493671 -POINT-5660339 1284145 -POINT-5704147 1072841 -POINT-5740097 860057 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804153 0 -POINT-5803567 -31655 -POINT-5800155 -215759 -POINT-5798389 -247370 -POINT-5788116 -431221 -POINT-5785179 -462745 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5734823 -891280 -POINT-5704147 -1072845 -POINT-5697720 -1103846 -POINT-5660339 -1284145 -POINT-5652761 -1314886 -POINT-5608688 -1493671 -POINT-5599975 -1524109 -POINT-5549301 -1701133 -POINT-5482223 -1906242 -POINT-5471274 -1935949 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5124035 -2725319 -POINT-5035446 -2886745 -POINT-5019193 -2913916 -POINT-4924667 -3071937 -POINT-4907416 -3098485 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4552139 -3601043 -POINT-4532040 -3625506 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085399 -POINT-4100348 -4107473 -POINT-3968338 -4235847 -POINT-3944836 -4257062 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3446495 -4669746 -POINT-3296920 -4777145 -POINT-3270535 -4794644 -POINT-3117080 -4896412 -POINT-2932922 -5008907 -POINT-2905307 -5024397 -POINT-2744705 -5114483 -POINT-2552703 -5212986 -POINT-2524017 -5226381 -POINT-2357177 -5304287 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1721781 -5542749 -POINT-1545242 -5595073 -POINT-1514572 -5602936 -POINT-1336196 -5648662 -POINT-1305257 -5655379 -POINT-1125320 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-667676 -5765576 -POINT-484497 -5784370 -POINT-452904 -5786429 -POINT-269165 -5798401 -POINT-53451 -5804416 -POINT-21791 -5804122 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774353 -POINT807174 -5748340 -POINT838440 -5743359 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622837 -POINT1472488 -5614406 -POINT1649978 -5565372 -POINT1680163 -5555813 -POINT1855712 -5500217 -POINT1885519 -5489542 -POINT2058868 -5427456 -POINT2088258 -5415681 -POINT2259185 -5347198 -POINT2456375 -5259548 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2867638 -5046568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585926 -POINT3727081 -4450481 -POINT3750972 -4429708 -POINT3889923 -4308891 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4638013 -3490251 -POINT4746795 -3341686 -POINT4867721 -3162956 -POINT4884478 -3136092 -POINT4981933 -2979854 -POINT4997678 -2952386 -POINT5089248 -2792637 -POINT5103964 -2764602 -POINT5189544 -2601558 -POINT5203205 -2572996 -POINT5282654 -2406883 -POINT5368469 -2208881 -POINT5446853 -2007827 -POINT5457252 -1977923 -POINT5517730 -1804000 -POINT5527008 -1773730 -POINT5580963 -1597679 -POINT5589112 -1567084 -POINT5636505 -1389148 -POINT5643508 -1358272 -POINT5684234 -1178699 -POINT5690087 -1147583 -POINT5724121 -966617 -POINT5756103 -753204 -POINT5759627 -721739 -POINT5780121 -538745 -POINT5796142 -323547 -POINT5797320 -291908 -POINT5804168 -107898 -POINT5804168 107898 -POINT5802991 139537 -POINT5796142 323547 -POINT5793792 355120 -POINT5780121 538745 -POINT5756103 753204 -POINT5751411 784515 -POINT5724121 966617 -POINT5718269 997732 -POINT5684234 1178695 -POINT5677232 1209572 -POINT5636505 1389148 -POINT5628356 1419743 -POINT5580963 1597675 -POINT5571686 1627946 -POINT5517730 1804000 -POINT5507332 1833905 -POINT5446853 2007827 -POINT5435353 2037325 -POINT5368469 2208881 -POINT5355879 2237931 -POINT5282654 2406883 -POINT5189544 2601558 -POINT5174829 2629593 -POINT5089248 2792637 -POINT5073504 2820104 -POINT4981933 2979854 -POINT4965177 3006718 -POINT4867721 3162956 -POINT4849980 3189178 -POINT4746795 3341682 -POINT4728091 3367227 -POINT4619308 3515796 -POINT4599666 3540628 -POINT4485428 3685047 -POINT4345367 3849205 -POINT4199280 4008045 -POINT4047409 4161342 -POINT3889923 4308891 -POINT3727081 4450481 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3360098 4733012 -POINT3208557 4837612 -POINT3026535 4953514 -POINT2999214 4969514 -POINT2840316 5062568 -POINT2812420 5077542 -POINT2650177 5164627 -POINT2621743 5178553 -POINT2456375 5259544 -POINT2427444 5272404 -POINT2259185 5347194 -POINT2229796 5358970 -POINT2058868 5427456 -POINT2029062 5438131 -POINT1855712 5500213 -POINT1825528 5509773 -POINT1649978 5565372 -POINT1441970 5622837 -POINT1411161 5630128 -POINT1231979 5672531 -POINT1200919 5678672 -POINT1020278 5714386 -POINT807174 5748340 -POINT775743 5752157 -POINT592941 5774353 -POINT377899 5792385 -POINT346272 5793856 -POINT162338 5802410 -POINT130678 5802704 -POINT-53451 5804413 -POINT-269165 5798397 -POINT-484497 5784366 -POINT-699173 5762344 -POINT-730526 5757944 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533748 -POINT-1956619 5464779 -POINT-2158386 5388256 -POINT-2357177 5304287 -POINT-2552703 5212986 -POINT-2580873 5198534 -POINT-2744705 5114483 -POINT-2932922 5008907 -POINT-2959941 4992402 -POINT-3117080 4896408 -POINT-3143466 4878910 -POINT-3296920 4777145 -POINT-3322639 4758679 -POINT-3472213 4651279 -POINT-3497227 4631870 -POINT-3642700 4518986 -POINT-3808151 4380443 -POINT-3831653 4359229 -POINT-3968338 4235847 -POINT-4123047 4085399 -POINT-4272049 3929302 -POINT-4415146 3767776 -POINT-4435245 3743314 -POINT-4552139 3601043 -POINT-4571316 3575851 -POINT-4682846 3429332 -POINT-4807083 3252880 -POINT-4924667 3071937 -POINT-4940920 3044767 -POINT-5035446 2886745 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5249120 2475843 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482223 1906242 -POINT-5492065 1876149 -POINT-5549301 1701133 -POINT-5608688 1493671 -POINT-5660339 1284145 -POINT-5704147 1072841 -POINT-5740097 860057 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5800155 215759 -POINT-5800742 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804153 0 -POINT-5802872 -69138 -POINT-5800155 -215759 -POINT-5788116 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5728577 -928247 -POINT-5704147 -1072845 -POINT-5690109 -1140555 -POINT-5660339 -1284145 -POINT-5643788 -1351286 -POINT-5608688 -1493671 -POINT-5589658 -1560151 -POINT-5549301 -1701133 -POINT-5482223 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4924667 -3071937 -POINT-4886988 -3129921 -POINT-4807083 -3252884 -POINT-4767272 -3309426 -POINT-4682846 -3429332 -POINT-4552139 -3601043 -POINT-4415146 -3767776 -POINT-4369291 -3819538 -POINT-4272049 -3929306 -POINT-4123047 -4085399 -POINT-3968338 -4235847 -POINT-3917007 -4282182 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3472213 -4651279 -POINT-3416042 -4691612 -POINT-3296920 -4777145 -POINT-3239292 -4815364 -POINT-3117080 -4896412 -POINT-2932922 -5008907 -POINT-2744705 -5114483 -POINT-2552703 -5212986 -POINT-2490048 -5242243 -POINT-2357177 -5304287 -POINT-2293476 -5331196 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1685838 -5553402 -POINT-1545242 -5595073 -POINT-1478254 -5612246 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732353 -POINT-844393 -5741964 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804416 -POINT15697 -5803774 -POINT162338 -5802410 -POINT377899 -5792385 -POINT446808 -5786607 -POINT592941 -5774353 -POINT807174 -5748340 -POINT875462 -5737460 -POINT1020278 -5714386 -POINT1088117 -5700974 -POINT1231979 -5672531 -POINT1299270 -5656607 -POINT1441970 -5622837 -POINT1508625 -5604423 -POINT1649978 -5565372 -POINT1855712 -5500217 -POINT1920813 -5476901 -POINT2058868 -5427456 -POINT2259185 -5347198 -POINT2322374 -5319111 -POINT2456375 -5259548 -POINT2518478 -5229131 -POINT2650177 -5164627 -POINT2711106 -5131923 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585926 -POINT3727081 -4450481 -POINT3889923 -4308891 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515796 -POINT4660161 -3460003 -POINT4746795 -3341686 -POINT4785546 -3284413 -POINT4867721 -3162956 -POINT4904320 -3104282 -POINT4981933 -2979854 -POINT5016322 -2919861 -POINT5089248 -2792637 -POINT5121388 -2731407 -POINT5189544 -2601558 -POINT5219381 -2539176 -POINT5282654 -2406883 -POINT5368469 -2208881 -POINT5393587 -2144454 -POINT5446853 -2007827 -POINT5469566 -1942512 -POINT5517730 -1804000 -POINT5537993 -1737886 -POINT5580963 -1597679 -POINT5636505 -1389148 -POINT5684234 -1178699 -POINT5697016 -1110739 -POINT5724121 -966617 -POINT5734370 -898230 -POINT5756103 -753204 -POINT5780121 -538745 -POINT5785255 -469786 -POINT5796142 -323547 -POINT5798714 -254443 -POINT5804168 -107898 -POINT5804168 107898 -POINT5796142 323547 -POINT5780121 538745 -POINT5756103 753204 -POINT5745855 821591 -POINT5724121 966617 -POINT5684234 1178695 -POINT5668940 1246134 -POINT5636505 1389148 -POINT5618707 1455969 -POINT5580963 1597675 -POINT5517730 1804000 -POINT5495018 1869316 -POINT5446853 2007827 -POINT5421736 2072254 -POINT5368469 2208881 -POINT5340970 2272330 -POINT5282654 2406883 -POINT5189544 2601558 -POINT5157405 2662788 -POINT5089248 2792637 -POINT5054860 2852629 -POINT4981933 2979854 -POINT4945335 3038528 -POINT4867721 3162956 -POINT4828971 3220228 -POINT4746795 3341682 -POINT4705943 3397476 -POINT4619308 3515796 -POINT4576407 3570032 -POINT4485428 3685047 -POINT4345367 3849205 -POINT4199280 4008045 -POINT4047409 4161342 -POINT3996943 4208624 -POINT3889923 4308891 -POINT3837741 4354263 -POINT3727081 4450481 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837612 -POINT3026535 4953514 -POINT2966862 4988460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347194 -POINT2194995 5372914 -POINT2058868 5427456 -POINT1993768 5450771 -POINT1855712 5500213 -POINT1789786 5521093 -POINT1649978 5565372 -POINT1441970 5622837 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748340 -POINT738524 5756676 -POINT592941 5774353 -POINT377899 5792385 -POINT162338 5802410 -POINT93189 5803052 -POINT-53451 5804413 -POINT-269165 5798397 -POINT-338167 5793901 -POINT-484497 5784366 -POINT-553288 5777310 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-980950 5720205 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1611540 5575420 -POINT-1752136 5533748 -POINT-1956619 5464779 -POINT-2158386 5388256 -POINT-2357177 5304287 -POINT-2419833 5275030 -POINT-2552703 5212986 -POINT-2744705 5114483 -POINT-2805018 5080652 -POINT-2932922 5008907 -POINT-2991935 4972857 -POINT-3117080 4896408 -POINT-3174709 4858191 -POINT-3296920 4777145 -POINT-3353092 4736812 -POINT-3472213 4651279 -POINT-3642700 4518986 -POINT-3695718 4474591 -POINT-3808151 4380443 -POINT-3968338 4235847 -POINT-4123047 4085399 -POINT-4170794 4035379 -POINT-4272049 3929302 -POINT-4415146 3767776 -POINT-4552139 3601043 -POINT-4682846 3429332 -POINT-4807083 3252880 -POINT-4924667 3071937 -POINT-4960166 3012593 -POINT-5035446 2886745 -POINT-5068715 2826123 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5264665 2441727 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482223 1906242 -POINT-5503718 1840516 -POINT-5549301 1701133 -POINT-5608688 1493671 -POINT-5625240 1426529 -POINT-5660339 1284145 -POINT-5674377 1216434 -POINT-5704147 1072841 -POINT-5715667 1004656 -POINT-5740097 860057 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5791974 362177 -POINT-5800155 215759 -POINT-5801437 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804153 0 -POINT-5800526 -195760 -POINT-5800155 -215759 -POINT-5789232 -411249 -POINT-5788116 -431221 -POINT-5769953 -626171 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704147 -1072845 -POINT-5664400 -1264559 -POINT-5660339 -1284145 -POINT-5613476 -1474250 -POINT-5608688 -1493671 -POINT-5554806 -1681903 -POINT-5549301 -1701133 -POINT-5488441 -1887230 -POINT-5482223 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139267 -2697563 -POINT-5035446 -2886745 -POINT-4934935 -3054772 -POINT-4924667 -3071937 -POINT-4817982 -3236112 -POINT-4807083 -3252884 -POINT-4682846 -3429332 -POINT-4564255 -3585127 -POINT-4552139 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4136858 -4070931 -POINT-4123047 -4085399 -POINT-3982678 -4221902 -POINT-3968338 -4235847 -POINT-3808151 -4380443 -POINT-3642700 -4518986 -POINT-3488016 -4639017 -POINT-3472213 -4651279 -POINT-3313169 -4765478 -POINT-3296920 -4777145 -POINT-3133750 -4885357 -POINT-3117080 -4896412 -POINT-2949992 -4998480 -POINT-2932922 -5008907 -POINT-2744705 -5114483 -POINT-2552703 -5212986 -POINT-2375301 -5295824 -POINT-2357177 -5304287 -POINT-2158386 -5388260 -POINT-1975321 -5457690 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1564419 -5589390 -POINT-1545242 -5595073 -POINT-1355573 -5643695 -POINT-1336196 -5648662 -POINT-1125320 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-73446 -5803859 -POINT-53451 -5804416 -POINT142336 -5802596 -POINT162338 -5802410 -POINT377899 -5792385 -POINT592941 -5774353 -POINT807174 -5748340 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622837 -POINT1630698 -5570699 -POINT1649978 -5565372 -POINT1855712 -5500217 -POINT2058868 -5427456 -POINT2240618 -5354637 -POINT2259185 -5347198 -POINT2456375 -5259548 -POINT2650177 -5164627 -POINT2822692 -5072028 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543053 -4597893 -POINT3559082 -4585926 -POINT3711509 -4463036 -POINT3727081 -4450481 -POINT3889923 -4308891 -POINT4032811 -4175019 -POINT4047409 -4161342 -POINT4199280 -4008045 -POINT4345367 -3849205 -POINT4485428 -3685047 -POINT4606899 -3531484 -POINT4619308 -3515796 -POINT4746795 -3341686 -POINT4856513 -3179523 -POINT4867721 -3162956 -POINT4971347 -2996826 -POINT4981933 -2979854 -POINT5089248 -2792637 -POINT5180248 -2619269 -POINT5189544 -2601558 -POINT5282654 -2406883 -POINT5360515 -2227234 -POINT5368469 -2208881 -POINT5439588 -2026463 -POINT5446853 -2007827 -POINT5511161 -1822893 -POINT5517730 -1804000 -POINT5575102 -1616803 -POINT5580963 -1597679 -POINT5636505 -1389148 -POINT5679810 -1198206 -POINT5684234 -1178699 -POINT5720424 -986275 -POINT5724121 -966617 -POINT5753139 -772985 -POINT5756103 -753204 -POINT5780121 -538745 -POINT5794657 -343494 -POINT5796142 -323547 -POINT5803425 -127887 -POINT5804168 -107898 -POINT5804168 107898 -POINT5796886 303558 -POINT5796142 323547 -POINT5780121 538745 -POINT5758330 733325 -POINT5756103 753204 -POINT5724121 966617 -POINT5684234 1178695 -POINT5636505 1389148 -POINT5580963 1597675 -POINT5523592 1784876 -POINT5517730 1804000 -POINT5453423 1988934 -POINT5446853 2007827 -POINT5375735 2190245 -POINT5368469 2208881 -POINT5282654 2406883 -POINT5198175 2583514 -POINT5189544 2601558 -POINT5098545 2774925 -POINT5089248 2792637 -POINT4991881 2962501 -POINT4981933 2979854 -POINT4878308 3145984 -POINT4867721 3162956 -POINT4758004 3325116 -POINT4746795 3341682 -POINT4631125 3499658 -POINT4619308 3515796 -POINT4485428 3685047 -POINT4358350 3833989 -POINT4345367 3849205 -POINT4212821 3993322 -POINT4199280 4008045 -POINT4061486 4147133 -POINT4047409 4161342 -POINT3889923 4308891 -POINT3742175 4437357 -POINT3727081 4450481 -POINT3574654 4573368 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837612 -POINT3043407 4942771 -POINT3026535 4953514 -POINT2857577 5052460 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2277463 5339070 -POINT2259185 5347194 -POINT2058868 5427456 -POINT1874543 5493469 -POINT1855712 5500213 -POINT1669048 5559333 -POINT1649978 5565372 -POINT1461251 5617511 -POINT1441970 5622837 -POINT1251443 5667925 -POINT1231979 5672531 -POINT1020278 5714386 -POINT826927 5745193 -POINT807174 5748340 -POINT612798 5771942 -POINT592941 5774353 -POINT397831 5790714 -POINT377899 5792385 -POINT182318 5801481 -POINT162338 5802410 -POINT-53451 5804413 -POINT-269165 5798397 -POINT-464537 5785667 -POINT-484497 5784366 -POINT-699173 5762344 -POINT-893064 5735133 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1732959 5539432 -POINT-1752136 5533748 -POINT-1937665 5471172 -POINT-1956619 5464779 -POINT-2139684 5395349 -POINT-2158386 5388256 -POINT-2357177 5304287 -POINT-2534580 5221449 -POINT-2552703 5212986 -POINT-2744705 5114483 -POINT-2915476 5018693 -POINT-2932922 5008907 -POINT-3117080 4896408 -POINT-3280251 4788200 -POINT-3296920 4777145 -POINT-3455965 4662946 -POINT-3472213 4651279 -POINT-3642700 4518986 -POINT-3792815 4393285 -POINT-3808151 4380443 -POINT-3953490 4249250 -POINT-3968338 4235847 -POINT-4123047 4085399 -POINT-4258238 3943771 -POINT-4272049 3929302 -POINT-4415146 3767776 -POINT-4539441 3616498 -POINT-4552139 3601043 -POINT-4682846 3429332 -POINT-4807083 3252880 -POINT-4913768 3088709 -POINT-4924667 3071937 -POINT-5025178 2903911 -POINT-5035446 2886745 -POINT-5129644 2715098 -POINT-5139267 2697563 -POINT-5227027 2522534 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5475306 1925010 -POINT-5482223 1906242 -POINT-5549301 1701133 -POINT-5603184 1512901 -POINT-5608688 1493671 -POINT-5655552 1303566 -POINT-5660339 1284145 -POINT-5704147 1072841 -POINT-5736765 879781 -POINT-5740097 860057 -POINT-5768097 646087 -POINT-5788116 431221 -POINT-5799040 235730 -POINT-5800155 215759 -POINT-5803783 19998 -OBJECT_ID210 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804165 0 -POINT-5800153 -215759 -POINT-5788126 -431228 -POINT-5768097 -646087 -POINT-5740095 -860061 -POINT-5704160 -1072845 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5549301 -1701126 -POINT-5482233 -1906250 -POINT-5407591 -2108719 -POINT-5325472 -2308288 -POINT-5235992 -2504654 -POINT-5139274 -2697570 -POINT-5035455 -2886749 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4682855 -3429336 -POINT-4552150 -3601043 -POINT-4415153 -3767776 -POINT-4272053 -3929306 -POINT-4123048 -4085403 -POINT-3968343 -4235855 -POINT-3808155 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-2932926 -5008911 -POINT-2744716 -5114486 -POINT-2552715 -5212982 -POINT-2357181 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1752140 -5533752 -POINT-1545238 -5595077 -POINT-1336204 -5648666 -POINT-1125316 -5694443 -POINT-912876 -5732361 -POINT-699173 -5762344 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592945 -5774353 -POINT807167 -5748337 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855701 -5500213 -POINT2058864 -5427459 -POINT2259178 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840313 -5062576 -POINT3026527 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308899 -POINT4047397 -4161346 -POINT4199276 -4008041 -POINT4345356 -3849212 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746792 -3341690 -POINT4867725 -3162964 -POINT4981926 -2979858 -POINT5089245 -2792633 -POINT5189533 -2601562 -POINT5282646 -2406891 -POINT5368458 -2208877 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597671 -POINT5636493 -1389144 -POINT5684234 -1178695 -POINT5724117 -966613 -POINT5756092 -753204 -POINT5780109 -538742 -POINT5796142 -323547 -POINT5804165 -107894 -POINT5804165 107894 -POINT5796142 323547 -POINT5780109 538742 -POINT5756092 753204 -POINT5724117 966613 -POINT5684234 1178695 -POINT5636493 1389144 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368458 2208877 -POINT5282646 2406875 -POINT5189533 2601562 -POINT5089245 2792633 -POINT4981926 2979858 -POINT4867725 3162948 -POINT4746792 3341690 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345356 3849197 -POINT4199276 4008041 -POINT4047397 4161346 -POINT3889923 4308883 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953506 -POINT2840313 5062561 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2058864 5427459 -POINT1855701 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231975 5672531 -POINT1020275 5714386 -POINT807167 5748337 -POINT592945 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-912876 5732361 -POINT-1125316 5694443 -POINT-1336204 5648666 -POINT-1545238 5595077 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357181 5304291 -POINT-2552715 5212982 -POINT-2744716 5114486 -POINT-2932926 5008911 -POINT-3117080 4896408 -POINT-3296924 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808155 4380447 -POINT-3968343 4235855 -POINT-4123048 4085403 -POINT-4272053 3929306 -POINT-4415153 3767776 -POINT-4552150 3601043 -POINT-4682855 3429336 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5035455 2886749 -POINT-5139274 2697555 -POINT-5235992 2504654 -POINT-5325472 2308273 -POINT-5407591 2108719 -POINT-5482233 1906250 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5704160 1072845 -POINT-5740095 860061 -POINT-5768097 646087 -POINT-5788126 431213 -POINT-5800153 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804165 0 -POINT-5800153 -215759 -POINT-5798389 -247372 -POINT-5788126 -431228 -POINT-5768097 -646087 -POINT-5740095 -860061 -POINT-5734823 -891280 -POINT-5704160 -1072845 -POINT-5697731 -1103847 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5599982 -1524105 -POINT-5549301 -1701126 -POINT-5482233 -1906250 -POINT-5471282 -1935955 -POINT-5407591 -2108719 -POINT-5325472 -2308288 -POINT-5235992 -2504654 -POINT-5221802 -2532958 -POINT-5139274 -2697570 -POINT-5124042 -2725326 -POINT-5035455 -2886749 -POINT-5019202 -2913918 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4682855 -3429336 -POINT-4663679 -3454528 -POINT-4552150 -3601043 -POINT-4532051 -3625506 -POINT-4415153 -3767776 -POINT-4394158 -3791475 -POINT-4272053 -3929306 -POINT-4123048 -4085403 -POINT-3968343 -4235855 -POINT-3944841 -4257069 -POINT-3808155 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3446496 -4669742 -POINT-3296924 -4777145 -POINT-3270538 -4794643 -POINT-3117080 -4896408 -POINT-3090062 -4912914 -POINT-2932926 -5008911 -POINT-2744716 -5114486 -POINT-2716547 -5128937 -POINT-2552715 -5212982 -POINT-2357181 -5304291 -POINT-2158393 -5388260 -POINT-2128790 -5399487 -POINT-1956619 -5464782 -POINT-1752140 -5533752 -POINT-1721784 -5542750 -POINT-1545238 -5595077 -POINT-1514569 -5602940 -POINT-1336204 -5648666 -POINT-1125316 -5694443 -POINT-912876 -5732361 -POINT-699173 -5762344 -POINT-667677 -5765575 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT409449 -5789743 -POINT592945 -5774353 -POINT807167 -5748337 -POINT838433 -5743356 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1262785 -5665240 -POINT1441970 -5622833 -POINT1472488 -5614402 -POINT1649978 -5565368 -POINT1680161 -5555809 -POINT1855701 -5500213 -POINT1885508 -5489539 -POINT2058864 -5427459 -POINT2088253 -5415684 -POINT2259178 -5347198 -POINT2288110 -5334339 -POINT2456375 -5259552 -POINT2484809 -5245625 -POINT2650177 -5164627 -POINT2840313 -5062576 -POINT3026527 -4953521 -POINT3053234 -4936516 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3750966 -4429712 -POINT3889923 -4308899 -POINT4047397 -4161346 -POINT4069680 -4138854 -POINT4199276 -4008041 -POINT4345356 -3849212 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746792 -3341690 -POINT4764535 -3315468 -POINT4867725 -3162964 -POINT4981926 -2979858 -POINT5089245 -2792633 -POINT5189533 -2601562 -POINT5203194 -2573001 -POINT5282646 -2406891 -POINT5368458 -2208877 -POINT5446853 -2007827 -POINT5457251 -1977923 -POINT5517723 -1804000 -POINT5580963 -1597671 -POINT5636493 -1389144 -POINT5643498 -1358268 -POINT5684234 -1178695 -POINT5690086 -1147579 -POINT5724117 -966613 -POINT5756092 -753204 -POINT5759616 -721739 -POINT5780109 -538742 -POINT5796142 -323547 -POINT5804165 -107894 -POINT5804165 107894 -POINT5802988 139534 -POINT5796142 323547 -POINT5793790 355119 -POINT5780109 538742 -POINT5756092 753204 -POINT5751401 784514 -POINT5724117 966613 -POINT5718266 997729 -POINT5684234 1178695 -POINT5677230 1209572 -POINT5636493 1389144 -POINT5628346 1419739 -POINT5580963 1597671 -POINT5571685 1627943 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5435352 2037324 -POINT5368458 2208877 -POINT5355868 2237927 -POINT5282646 2406875 -POINT5268985 2435439 -POINT5189533 2601562 -POINT5089245 2792633 -POINT4981926 2979858 -POINT4867725 3162948 -POINT4746792 3341690 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345356 3849197 -POINT4199276 4008041 -POINT4047397 4161346 -POINT3889923 4308883 -POINT3866030 4329659 -POINT3727073 4450485 -POINT3702425 4470356 -POINT3559074 4585922 -POINT3533704 4604864 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953506 -POINT2999206 4969507 -POINT2840313 5062561 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2229789 5358974 -POINT2058864 5427459 -POINT1855701 5500213 -POINT1825518 5509773 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231975 5672531 -POINT1200915 5678672 -POINT1020275 5714386 -POINT807167 5748337 -POINT775737 5752154 -POINT592945 5774353 -POINT377899 5792389 -POINT346272 5793860 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-912876 5732361 -POINT-1125316 5694443 -POINT-1336204 5648666 -POINT-1366873 5640804 -POINT-1545238 5595077 -POINT-1575594 5586080 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357181 5304291 -POINT-2552715 5212982 -POINT-2580885 5198531 -POINT-2744716 5114486 -POINT-2772330 5098997 -POINT-2932926 5008911 -POINT-3117080 4896408 -POINT-3296924 4777145 -POINT-3322642 4758678 -POINT-3472213 4651275 -POINT-3497227 4631866 -POINT-3642700 4518982 -POINT-3666975 4498657 -POINT-3808155 4380447 -POINT-3968343 4235855 -POINT-3991041 4213781 -POINT-4123048 4085403 -POINT-4272053 3929306 -POINT-4415153 3767776 -POINT-4435253 3743314 -POINT-4552150 3601043 -POINT-4571327 3575851 -POINT-4682855 3429336 -POINT-4701082 3403448 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5035455 2886749 -POINT-5050688 2858991 -POINT-5139274 2697555 -POINT-5153465 2669253 -POINT-5235992 2504654 -POINT-5325472 2308273 -POINT-5407591 2108719 -POINT-5482233 1906250 -POINT-5492073 1876155 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5616273 1462928 -POINT-5660339 1284149 -POINT-5704160 1072845 -POINT-5709433 1041626 -POINT-5740095 860061 -POINT-5768097 646087 -POINT-5788126 431213 -POINT-5789891 399602 -POINT-5800153 215759 -POINT-5800742 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804165 0 -POINT-5800153 -215759 -POINT-5788126 -431228 -POINT-5781708 -500079 -POINT-5768097 -646087 -POINT-5759124 -714654 -POINT-5740095 -860061 -POINT-5728580 -928247 -POINT-5704160 -1072845 -POINT-5690118 -1140556 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5549301 -1701126 -POINT-5482233 -1906250 -POINT-5407591 -2108719 -POINT-5325472 -2308288 -POINT-5235992 -2504654 -POINT-5205000 -2566473 -POINT-5139274 -2697570 -POINT-5106006 -2758192 -POINT-5035455 -2886749 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4682855 -3429336 -POINT-4640972 -3484359 -POINT-4552150 -3601043 -POINT-4508250 -3654472 -POINT-4415153 -3767776 -POINT-4369297 -3819538 -POINT-4272053 -3929306 -POINT-4123048 -4085403 -POINT-4073474 -4133615 -POINT-3968343 -4235855 -POINT-3917012 -4282189 -POINT-3808155 -4380447 -POINT-3755136 -4424840 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3416043 -4691610 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-3058069 -4932459 -POINT-2932926 -5008911 -POINT-2744716 -5114486 -POINT-2683190 -5146049 -POINT-2552715 -5212982 -POINT-2357181 -5304291 -POINT-2158393 -5388260 -POINT-2093736 -5412781 -POINT-1956619 -5464782 -POINT-1891095 -5486883 -POINT-1752140 -5533752 -POINT-1685839 -5553404 -POINT-1545238 -5595077 -POINT-1478254 -5612250 -POINT-1336204 -5648666 -POINT-1125316 -5694443 -POINT-912876 -5732361 -POINT-844396 -5741969 -POINT-699173 -5762344 -POINT-630383 -5769400 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592945 -5774353 -POINT807167 -5748337 -POINT1020275 -5714386 -POINT1088113 -5700974 -POINT1231975 -5672531 -POINT1441970 -5622833 -POINT1508625 -5604419 -POINT1649978 -5565368 -POINT1715901 -5544490 -POINT1855701 -5500213 -POINT1920804 -5476900 -POINT2058864 -5427459 -POINT2123054 -5401740 -POINT2259178 -5347198 -POINT2322368 -5319113 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840313 -5062576 -POINT3026527 -4953521 -POINT3084858 -4916380 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308899 -POINT4047397 -4161346 -POINT4199276 -4008041 -POINT4345356 -3849212 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4660155 -3460002 -POINT4746792 -3341690 -POINT4867725 -3162964 -POINT4981926 -2979858 -POINT5016316 -2919863 -POINT5089245 -2792633 -POINT5121382 -2731405 -POINT5189533 -2601562 -POINT5219371 -2539181 -POINT5282646 -2406891 -POINT5368458 -2208877 -POINT5446853 -2007827 -POINT5469563 -1942512 -POINT5517723 -1804000 -POINT5537988 -1737883 -POINT5580963 -1597671 -POINT5598758 -1530850 -POINT5636493 -1389144 -POINT5651792 -1321707 -POINT5684234 -1178695 -POINT5697015 -1110735 -POINT5724117 -966613 -POINT5756092 -753204 -POINT5780109 -538742 -POINT5785247 -469784 -POINT5796142 -323547 -POINT5798713 -254442 -POINT5804165 -107894 -POINT5804165 107894 -POINT5796142 323547 -POINT5780109 538742 -POINT5772413 607465 -POINT5756092 753204 -POINT5745846 821590 -POINT5724117 966613 -POINT5711337 1034574 -POINT5684234 1178695 -POINT5668936 1246133 -POINT5636493 1389144 -POINT5618699 1455966 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5495013 1869316 -POINT5446853 2007827 -POINT5421732 2072253 -POINT5368458 2208877 -POINT5340960 2272325 -POINT5282646 2406875 -POINT5189533 2601562 -POINT5089245 2792633 -POINT4981926 2979858 -POINT4867725 3162948 -POINT4828973 3220225 -POINT4746792 3341690 -POINT4619301 3515792 -POINT4576402 3570028 -POINT4485428 3685043 -POINT4345356 3849197 -POINT4199276 4008041 -POINT4150607 4057167 -POINT4047397 4161346 -POINT3996935 4208624 -POINT3889923 4308883 -POINT3837739 4354259 -POINT3727073 4450485 -POINT3673239 4493885 -POINT3559074 4585922 -POINT3503663 4627293 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953506 -POINT2966856 4988452 -POINT2840313 5062561 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2058864 5427459 -POINT1993762 5450773 -POINT1855701 5500213 -POINT1789778 5521092 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231975 5672531 -POINT1020275 5714386 -POINT807167 5748337 -POINT592945 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-912876 5732361 -POINT-1125316 5694443 -POINT-1192894 5679774 -POINT-1336204 5648666 -POINT-1403188 5631494 -POINT-1545238 5595077 -POINT-1611539 5575426 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2021277 5440261 -POINT-2158393 5388260 -POINT-2357181 5304291 -POINT-2552715 5212982 -POINT-2614241 5181420 -POINT-2744716 5114486 -POINT-2805027 5080655 -POINT-2932926 5008911 -POINT-3117080 4896408 -POINT-3174710 4858191 -POINT-3296924 4777145 -POINT-3353095 4736811 -POINT-3472213 4651275 -POINT-3526845 4608883 -POINT-3642700 4518982 -POINT-3808155 4380447 -POINT-3968343 4235855 -POINT-4017918 4187643 -POINT-4123048 4085403 -POINT-4272053 3929306 -POINT-4317909 3877545 -POINT-4415153 3767776 -POINT-4552150 3601043 -POINT-4594034 3546021 -POINT-4682855 3429336 -POINT-4722665 3372793 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5035455 2886749 -POINT-5139274 2697555 -POINT-5170267 2635741 -POINT-5235992 2504654 -POINT-5325472 2308273 -POINT-5407591 2108719 -POINT-5482233 1906250 -POINT-5549301 1701126 -POINT-5568334 1634647 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5704160 1072845 -POINT-5715676 1004660 -POINT-5740095 860061 -POINT-5768097 646087 -POINT-5788126 431213 -POINT-5791980 362172 -POINT-5800153 215759 -POINT-5801439 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804165 0 -POINT-5800525 -195760 -POINT-5800153 -215759 -POINT-5789241 -411256 -POINT-5788126 -431228 -POINT-5768097 -646087 -POINT-5740095 -860061 -POINT-5707491 -1053122 -POINT-5704160 -1072845 -POINT-5664401 -1264563 -POINT-5660339 -1284149 -POINT-5613483 -1474247 -POINT-5608696 -1493667 -POINT-5549301 -1701126 -POINT-5482233 -1906250 -POINT-5414510 -2089951 -POINT-5407591 -2108719 -POINT-5325472 -2308288 -POINT-5235992 -2504654 -POINT-5148239 -2679689 -POINT-5139274 -2697570 -POINT-5045079 -2869214 -POINT-5035455 -2886749 -POINT-4924675 -3071930 -POINT-4807087 -3252884 -POINT-4694371 -3412981 -POINT-4682855 -3429336 -POINT-4564265 -3585128 -POINT-4552150 -3601043 -POINT-4427852 -3752321 -POINT-4415153 -3767776 -POINT-4272053 -3929306 -POINT-4136860 -4070934 -POINT-4123048 -4085403 -POINT-3968343 -4235855 -POINT-3823003 -4367045 -POINT-3808155 -4380447 -POINT-3642700 -4518982 -POINT-3488016 -4639013 -POINT-3472213 -4651275 -POINT-3313172 -4765478 -POINT-3296924 -4777145 -POINT-3117080 -4896408 -POINT-2932926 -5008911 -POINT-2762162 -5104700 -POINT-2744716 -5114486 -POINT-2552715 -5212982 -POINT-2357181 -5304291 -POINT-2158393 -5388260 -POINT-1975322 -5457690 -POINT-1956619 -5464782 -POINT-1752140 -5533752 -POINT-1564416 -5589393 -POINT-1545238 -5595077 -POINT-1355580 -5643699 -POINT-1336204 -5648666 -POINT-1144864 -5690200 -POINT-1125316 -5694443 -POINT-912876 -5732361 -POINT-718981 -5759565 -POINT-699173 -5762344 -POINT-484504 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT573012 -5776025 -POINT592945 -5774353 -POINT807167 -5748337 -POINT1020275 -5714386 -POINT1231975 -5672531 -POINT1422506 -5627440 -POINT1441970 -5622833 -POINT1630698 -5570695 -POINT1649978 -5565368 -POINT1836632 -5506253 -POINT1855701 -5500213 -POINT2040033 -5434203 -POINT2058864 -5427459 -POINT2240610 -5354638 -POINT2259178 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840313 -5062576 -POINT3009266 -4963630 -POINT3026527 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543046 -4597889 -POINT3559074 -4585922 -POINT3711501 -4463039 -POINT3727073 -4450485 -POINT3874828 -4322023 -POINT3889923 -4308899 -POINT4032801 -4175023 -POINT4047397 -4161346 -POINT4199276 -4008041 -POINT4345356 -3849212 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746792 -3341690 -POINT4856516 -3179530 -POINT4867725 -3162964 -POINT4981926 -2979858 -POINT5089245 -2792633 -POINT5180237 -2619273 -POINT5189533 -2601562 -POINT5282646 -2406891 -POINT5368458 -2208877 -POINT5439587 -2026463 -POINT5446853 -2007827 -POINT5511154 -1822893 -POINT5517723 -1804000 -POINT5580963 -1597671 -POINT5631346 -1408473 -POINT5636493 -1389144 -POINT5679809 -1198202 -POINT5684234 -1178695 -POINT5724117 -966613 -POINT5756092 -753204 -POINT5777883 -558620 -POINT5780109 -538742 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5804165 -107894 -POINT5804165 107894 -POINT5796886 303558 -POINT5796142 323547 -POINT5780109 538742 -POINT5756092 753204 -POINT5727081 946832 -POINT5724117 966613 -POINT5687931 1159037 -POINT5684234 1178695 -POINT5640918 1369638 -POINT5636493 1389144 -POINT5580963 1597671 -POINT5523585 1784876 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368458 2208877 -POINT5282646 2406875 -POINT5198164 2583516 -POINT5189533 2601562 -POINT5089245 2792633 -POINT4981926 2979858 -POINT4867725 3162948 -POINT4746792 3341690 -POINT4631118 3499655 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345356 3849197 -POINT4199276 4008041 -POINT4061475 4147136 -POINT4047397 4161346 -POINT3889923 4308883 -POINT3742168 4437360 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3043400 4942764 -POINT3026527 4953506 -POINT2840313 5062561 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2077431 5420020 -POINT2058864 5427459 -POINT1874532 5493470 -POINT1855701 5500213 -POINT1669047 5559329 -POINT1649978 5565368 -POINT1461251 5617507 -POINT1441970 5622833 -POINT1231975 5672531 -POINT1020275 5714386 -POINT807167 5748337 -POINT592945 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-679275 5764385 -POINT-699173 5762344 -POINT-912876 5732361 -POINT-1125316 5694443 -POINT-1336204 5648666 -POINT-1545238 5595077 -POINT-1732962 5539437 -POINT-1752140 5533752 -POINT-1956619 5464782 -POINT-2139691 5395353 -POINT-2158393 5388260 -POINT-2357181 5304291 -POINT-2552715 5212982 -POINT-2726920 5123616 -POINT-2744716 5114486 -POINT-2932926 5008911 -POINT-3100011 4906836 -POINT-3117080 4896408 -POINT-3280254 4788200 -POINT-3296924 4777145 -POINT-3455966 4662942 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808155 4380447 -POINT-3968343 4235855 -POINT-4108708 4099349 -POINT-4123048 4085403 -POINT-4272053 3929306 -POINT-4401889 3782749 -POINT-4415153 3767776 -POINT-4539452 3616498 -POINT-4552150 3601043 -POINT-4670740 3445252 -POINT-4682855 3429336 -POINT-4807087 3252884 -POINT-4924675 3071930 -POINT-5025187 2903914 -POINT-5035455 2886749 -POINT-5129651 2715092 -POINT-5139274 2697555 -POINT-5235992 2504654 -POINT-5317178 2326476 -POINT-5325472 2308273 -POINT-5407591 2108719 -POINT-5482233 1906250 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5700099 1092431 -POINT-5704160 1072845 -POINT-5740095 860061 -POINT-5768097 646087 -POINT-5788126 431213 -POINT-5799039 235729 -POINT-5800153 215759 -OBJECT_ID221 -TOTAL_HEIGHT40895317 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431228 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608703 -1493675 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-4924682 -3071937 -POINT-4807098 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085403 -POINT-3968353 -4235847 -POINT-3808166 -4380447 -POINT-3642700 -4518989 -POINT-3472213 -4651283 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-2932937 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357193 -5304291 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807159 -5748344 -POINT1020263 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855697 -5500213 -POINT2058853 -5427459 -POINT2259170 -5347198 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3727066 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619293 -3515800 -POINT4746795 -3341682 -POINT4867721 -3162956 -POINT4981918 -2979858 -POINT5089248 -2792640 -POINT5189529 -2601562 -POINT5282638 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107894 -POINT5796142 323547 -POINT5780105 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282638 2406875 -POINT5189529 2601562 -POINT5089248 2792633 -POINT4981918 2979858 -POINT4867721 3162948 -POINT4746795 3341690 -POINT4619293 3515792 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4199280 4008041 -POINT4047393 4161346 -POINT3889923 4308883 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953506 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1855697 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231964 5672531 -POINT1020263 5714386 -POINT807159 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784363 -POINT-699173 5762344 -POINT-912887 5732345 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212982 -POINT-2744720 5114486 -POINT-2932937 5008911 -POINT-3117080 4896408 -POINT-3296936 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808166 4380447 -POINT-3968353 4235840 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4682861 3429336 -POINT-4807098 3252884 -POINT-4924682 3071930 -POINT-5035461 2886749 -POINT-5139282 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5482239 1906234 -POINT-5549301 1701126 -POINT-5608703 1493667 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431213 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803580 -31655 -POINT-5800155 -215759 -POINT-5798391 -247372 -POINT-5788131 -431228 -POINT-5785192 -462751 -POINT-5768097 -646087 -POINT-5763989 -677481 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5697733 -1103847 -POINT-5660339 -1284149 -POINT-5608703 -1493675 -POINT-5599988 -1524112 -POINT-5549301 -1701133 -POINT-5539462 -1731226 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-5019208 -2913919 -POINT-4924682 -3071937 -POINT-4907431 -3098485 -POINT-4807098 -3252884 -POINT-4788871 -3278772 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4532055 -3625506 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4250201 -3952208 -POINT-4123047 -4085403 -POINT-3968353 -4235847 -POINT-3808166 -4380447 -POINT-3783890 -4400773 -POINT-3642700 -4518989 -POINT-3617687 -4538399 -POINT-3472213 -4651283 -POINT-3296936 -4777145 -POINT-3270548 -4794643 -POINT-3117080 -4896408 -POINT-3090064 -4912914 -POINT-2932937 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357193 -5304291 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1721794 -5542749 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-1094153 -5700005 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-667678 -5765576 -POINT-484512 -5784370 -POINT-452917 -5786429 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT409449 -5789743 -POINT592941 -5774353 -POINT807159 -5748344 -POINT838425 -5743362 -POINT1020263 -5714386 -POINT1231964 -5672531 -POINT1262775 -5665241 -POINT1441970 -5622841 -POINT1472488 -5614410 -POINT1649978 -5565376 -POINT1855697 -5500213 -POINT1885503 -5489539 -POINT2058853 -5427459 -POINT2088243 -5415684 -POINT2259170 -5347198 -POINT2288103 -5334338 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3053227 -4936510 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3583715 -4566051 -POINT3727066 -4450485 -POINT3750960 -4429711 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619293 -3515800 -POINT4638000 -3490254 -POINT4746795 -3341682 -POINT4764537 -3315460 -POINT4867721 -3162956 -POINT4884476 -3136093 -POINT4981918 -2979858 -POINT5089248 -2792640 -POINT5103961 -2764606 -POINT5189529 -2601562 -POINT5203190 -2573000 -POINT5282638 -2406883 -POINT5295229 -2377833 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5457250 -1977923 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5589110 -1567083 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5690087 -1147579 -POINT5724121 -966613 -POINT5728811 -935303 -POINT5756088 -753204 -POINT5759612 -721739 -POINT5780105 -538742 -POINT5782458 -507169 -POINT5796142 -323547 -POINT5797318 -291907 -POINT5804153 -107894 -POINT5804153 107894 -POINT5802978 139534 -POINT5796142 323547 -POINT5793790 355119 -POINT5780105 538742 -POINT5776582 570207 -POINT5756088 753204 -POINT5724121 966613 -POINT5718269 997729 -POINT5684234 1178695 -POINT5677230 1209572 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5571684 1627943 -POINT5517715 1804000 -POINT5507319 1833905 -POINT5446853 2007827 -POINT5435351 2037324 -POINT5368454 2208877 -POINT5282638 2406875 -POINT5268978 2435439 -POINT5189529 2601562 -POINT5089248 2792633 -POINT5073501 2820102 -POINT4981918 2979858 -POINT4867721 3162948 -POINT4849980 3189172 -POINT4746795 3341690 -POINT4728089 3367233 -POINT4619293 3515792 -POINT4599653 3540624 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4323921 3872502 -POINT4199280 4008041 -POINT4047393 4161346 -POINT4024290 4182992 -POINT3889923 4308883 -POINT3866029 4329659 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3533697 4604864 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3181849 4854619 -POINT3026519 4953506 -POINT2999200 4969507 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2229780 5358974 -POINT2058853 5427459 -POINT1855697 5500213 -POINT1825515 5509773 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231964 5672531 -POINT1200904 5678672 -POINT1020263 5714386 -POINT807159 5748337 -POINT775730 5752154 -POINT592941 5774353 -POINT377899 5792389 -POINT346272 5793860 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784363 -POINT-699173 5762344 -POINT-730528 5757943 -POINT-912887 5732345 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1366880 5640804 -POINT-1545242 5595077 -POINT-1575599 5586080 -POINT-1752151 5533752 -POINT-1782150 5523633 -POINT-1956619 5464782 -POINT-1986224 5453555 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212982 -POINT-2744720 5114486 -POINT-2772335 5098997 -POINT-2932937 5008911 -POINT-2959954 4992405 -POINT-3117080 4896408 -POINT-3296936 4777145 -POINT-3322652 4758678 -POINT-3472213 4651275 -POINT-3497227 4631866 -POINT-3642700 4518982 -POINT-3808166 4380447 -POINT-3831668 4359231 -POINT-3968353 4235840 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4293059 3905607 -POINT-4415161 3767776 -POINT-4435260 3743314 -POINT-4552154 3601043 -POINT-4571331 3575851 -POINT-4682861 3429336 -POINT-4701089 3403448 -POINT-4807098 3252884 -POINT-4824350 3226335 -POINT-4924682 3071930 -POINT-5035461 2886749 -POINT-5139282 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5418545 2079011 -POINT-5482239 1906234 -POINT-5492078 1876142 -POINT-5549301 1701126 -POINT-5608703 1493667 -POINT-5616279 1462928 -POINT-5660339 1284149 -POINT-5666769 1253147 -POINT-5704162 1072845 -POINT-5709435 1041626 -POINT-5740097 860061 -POINT-5744205 828668 -POINT-5768097 646087 -POINT-5788131 431213 -POINT-5789896 399602 -POINT-5800155 215759 -POINT-5800744 184103 -POLYGON_AT_HEIGHT18000000 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5796303 -284805 -POINT-5788131 -431228 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5728582 -928247 -POINT-5704162 -1072845 -POINT-5690120 -1140556 -POINT-5660339 -1284149 -POINT-5643793 -1351290 -POINT-5608703 -1493675 -POINT-5589668 -1560154 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-4999963 -2946092 -POINT-4924682 -3071937 -POINT-4887003 -3129921 -POINT-4807098 -3252884 -POINT-4767287 -3309427 -POINT-4682861 -3429336 -POINT-4640977 -3484359 -POINT-4552154 -3601043 -POINT-4508256 -3654472 -POINT-4415161 -3767776 -POINT-4369306 -3819538 -POINT-4272064 -3929306 -POINT-4123047 -4085403 -POINT-3968353 -4235847 -POINT-3808166 -4380447 -POINT-3642700 -4518989 -POINT-3472213 -4651283 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-3058073 -4932459 -POINT-2932937 -5008911 -POINT-2872624 -5042742 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357193 -5304291 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-844403 -5741964 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT661586 -5766019 -POINT807159 -5748344 -POINT1020263 -5714386 -POINT1088102 -5700974 -POINT1231964 -5672531 -POINT1441970 -5622841 -POINT1508625 -5604427 -POINT1649978 -5565376 -POINT1715900 -5544495 -POINT1855697 -5500213 -POINT1920797 -5476900 -POINT2058853 -5427459 -POINT2123043 -5401740 -POINT2259170 -5347198 -POINT2322363 -5319110 -POINT2456375 -5259544 -POINT2518478 -5229129 -POINT2650177 -5164627 -POINT2711106 -5131923 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3441563 -4673656 -POINT3559066 -4585922 -POINT3612901 -4542522 -POINT3727066 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4096065 -4112223 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619293 -3515800 -POINT4746795 -3341682 -POINT4785546 -3284410 -POINT4867721 -3162956 -POINT4904315 -3104283 -POINT4981918 -2979858 -POINT5089248 -2792640 -POINT5121383 -2731410 -POINT5189529 -2601562 -POINT5282638 -2406883 -POINT5310138 -2343435 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5469561 -1942512 -POINT5517715 -1804000 -POINT5537983 -1737886 -POINT5580963 -1597679 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5697016 -1110735 -POINT5724121 -966613 -POINT5734365 -898227 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5785244 -469784 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107894 -POINT5801586 176999 -POINT5796142 323547 -POINT5780105 538742 -POINT5772409 607465 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5668935 1246133 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517715 1804000 -POINT5495008 1869316 -POINT5446853 2007827 -POINT5421731 2072253 -POINT5368454 2208877 -POINT5340955 2272325 -POINT5282638 2406875 -POINT5252802 2469262 -POINT5189529 2601562 -POINT5157395 2662790 -POINT5089248 2792633 -POINT5054855 2852628 -POINT4981918 2979858 -POINT4867721 3162948 -POINT4828971 3220225 -POINT4746795 3341690 -POINT4705938 3397480 -POINT4619293 3515792 -POINT4576397 3570028 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4298544 3900098 -POINT4199280 4008041 -POINT4047393 4161346 -POINT3996933 4208624 -POINT3889923 4308883 -POINT3837736 4354259 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953506 -POINT2966852 4988452 -POINT2840316 5062561 -POINT2779387 5095268 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1993753 5450773 -POINT1855697 5500213 -POINT1789776 5521092 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231964 5672531 -POINT1020263 5714386 -POINT807159 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784363 -POINT-699173 5762344 -POINT-912887 5732345 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1403194 5631494 -POINT-1545242 5595077 -POINT-1611545 5575426 -POINT-1752151 5533752 -POINT-1817672 5511651 -POINT-1956619 5464782 -POINT-2021279 5440261 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212982 -POINT-2614245 5181420 -POINT-2744720 5114486 -POINT-2932937 5008911 -POINT-2991945 4972860 -POINT-3117080 4896408 -POINT-3174714 4858191 -POINT-3296936 4777145 -POINT-3353103 4736811 -POINT-3472213 4651275 -POINT-3526845 4608883 -POINT-3642700 4518982 -POINT-3695723 4474589 -POINT-3808166 4380447 -POINT-3859497 4334109 -POINT-3968353 4235840 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4317919 3877545 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4594039 3546021 -POINT-4682861 3429336 -POINT-4807098 3252884 -POINT-4924682 3071930 -POINT-4960181 3012589 -POINT-5035461 2886749 -POINT-5068730 2826123 -POINT-5139282 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5431513 2043834 -POINT-5482239 1906234 -POINT-5549301 1701126 -POINT-5608703 1493667 -POINT-5625250 1426528 -POINT-5660339 1284149 -POINT-5674382 1216438 -POINT-5704162 1072845 -POINT-5715678 1004660 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5774517 577232 -POINT-5788131 431213 -POINT-5800155 215759 -POINT-5801441 146620 -POLYGON_AT_HEIGHT26000000 -POINT-5804168 0 -POINT-5800527 -195760 -POINT-5800155 -215759 -POINT-5789246 -411256 -POINT-5788131 -431228 -POINT-5769954 -626172 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5707493 -1053122 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608703 -1493675 -POINT-5554807 -1681904 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-4934951 -3054772 -POINT-4924682 -3071937 -POINT-4817997 -3236112 -POINT-4807098 -3252884 -POINT-4694377 -3412981 -POINT-4682861 -3429336 -POINT-4564270 -3585128 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085403 -POINT-3982692 -4221903 -POINT-3968353 -4235847 -POINT-3823014 -4367044 -POINT-3808166 -4380447 -POINT-3658037 -4506148 -POINT-3642700 -4518989 -POINT-3488016 -4639021 -POINT-3472213 -4651283 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-2950006 -4998483 -POINT-2932937 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357193 -5304291 -POINT-2158401 -5388260 -POINT-1975322 -5457690 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT573008 -5776025 -POINT592941 -5774353 -POINT787303 -5750755 -POINT807159 -5748344 -POINT1020263 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1836629 -5506253 -POINT1855697 -5500213 -POINT2040022 -5434203 -POINT2058853 -5427459 -POINT2240603 -5354638 -POINT2259170 -5347198 -POINT2438096 -5267669 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2822692 -5072028 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3543039 -4597889 -POINT3559066 -4585922 -POINT3711494 -4463039 -POINT3727066 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4606885 -3531488 -POINT4619293 -3515800 -POINT4734977 -3357821 -POINT4746795 -3341682 -POINT4856513 -3179522 -POINT4867721 -3162956 -POINT4971333 -2996830 -POINT4981918 -2979858 -POINT5079300 -2809994 -POINT5089248 -2792640 -POINT5180234 -2619273 -POINT5189529 -2601562 -POINT5274008 -2424928 -POINT5282638 -2406883 -POINT5360500 -2227238 -POINT5368454 -2208885 -POINT5439586 -2026464 -POINT5446853 -2007827 -POINT5511147 -1822893 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5631343 -1408474 -POINT5636490 -1389144 -POINT5679809 -1198202 -POINT5684234 -1178695 -POINT5720424 -986271 -POINT5724121 -966613 -POINT5753125 -772985 -POINT5756088 -753204 -POINT5777879 -558620 -POINT5780105 -538742 -POINT5794656 -343494 -POINT5796142 -323547 -POINT5803411 -127883 -POINT5804153 -107894 -POINT5804153 107894 -POINT5796885 303558 -POINT5796142 323547 -POINT5781592 518795 -POINT5780105 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5586110 1578342 -POINT5580963 1597671 -POINT5523578 1784876 -POINT5517715 1804000 -POINT5453422 1988934 -POINT5446853 2007827 -POINT5375721 2190242 -POINT5368454 2208877 -POINT5282638 2406875 -POINT5189529 2601562 -POINT5089248 2792633 -POINT4991867 2962504 -POINT4981918 2979858 -POINT4867721 3162948 -POINT4758004 3325122 -POINT4746795 3341690 -POINT4631111 3499655 -POINT4619293 3515792 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4199280 4008041 -POINT4061472 4147136 -POINT4047393 4161346 -POINT3904519 4295208 -POINT3889923 4308883 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3043393 4942764 -POINT3026519 4953506 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259170 5347198 -POINT2077420 5420020 -POINT2058853 5427459 -POINT1874528 5493470 -POINT1855697 5500213 -POINT1669047 5559329 -POINT1649978 5565368 -POINT1461251 5617507 -POINT1441970 5622833 -POINT1231964 5672531 -POINT1020263 5714386 -POINT807159 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784363 -POINT-699173 5762344 -POINT-893078 5735126 -POINT-912887 5732345 -POINT-1125320 5694443 -POINT-1336212 5648666 -POINT-1545242 5595077 -POINT-1732972 5539437 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2139698 5395353 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212982 -POINT-2726923 5123616 -POINT-2744720 5114486 -POINT-2915491 5018697 -POINT-2932937 5008911 -POINT-3100012 4906836 -POINT-3117080 4896408 -POINT-3280265 4788200 -POINT-3296936 4777145 -POINT-3455967 4662942 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3792829 4393288 -POINT-3808166 4380447 -POINT-3968353 4235840 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4401897 3782749 -POINT-4415161 3767776 -POINT-4539456 3616498 -POINT-4552154 3601043 -POINT-4670746 3445252 -POINT-4682861 3429336 -POINT-4795583 3269239 -POINT-4807098 3252884 -POINT-4924682 3071930 -POINT-5025193 2903914 -POINT-5035461 2886749 -POINT-5129659 2715092 -POINT-5139282 2697555 -POINT-5227028 2522534 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5475320 1925003 -POINT-5482239 1906234 -POINT-5549301 1701126 -POINT-5603197 1512897 -POINT-5608703 1493667 -POINT-5655553 1303569 -POINT-5660339 1284149 -POINT-5700100 1092431 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431213 -POINT-5799041 235729 -POINT-5800155 215759 -POINT-5803797 19998 -OBJECT_ID232 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804161 0 -POINT-5800148 -215759 -POINT-5788124 -431228 -POINT-5768097 -646087 -POINT-5740089 -860061 -POINT-5704155 -1072845 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5549293 -1701141 -POINT-5482231 -1906250 -POINT-5407585 -2108719 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139274 -2697570 -POINT-5035454 -2886749 -POINT-4924667 -3071945 -POINT-4807083 -3252884 -POINT-4682853 -3429336 -POINT-4552147 -3601043 -POINT-4415153 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472206 -4651275 -POINT-3296920 -4777145 -POINT-3117073 -4896408 -POINT-2932922 -5008911 -POINT-2744712 -5114486 -POINT-2552711 -5212982 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545234 -5595077 -POINT-1336196 -5648666 -POINT-1125312 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-484497 -5784363 -POINT-269157 -5798401 -POINT-53443 -5804413 -POINT162338 -5802414 -POINT377906 -5792389 -POINT592948 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441978 -5622833 -POINT1649978 -5565368 -POINT1855705 -5500213 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT3026527 -4953521 -POINT3208564 -4837616 -POINT3386161 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308899 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849212 -POINT4485435 -3685043 -POINT4619308 -3515792 -POINT4746795 -3341690 -POINT4867721 -3162964 -POINT4981933 -2979858 -POINT5089248 -2792633 -POINT5189529 -2601562 -POINT5282654 -2406891 -POINT5368469 -2208877 -POINT5446853 -2007827 -POINT5517730 -1804000 -POINT5580963 -1597686 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756088 -753204 -POINT5780121 -538742 -POINT5796142 -323547 -POINT5804168 -107894 -POINT5804168 107894 -POINT5796142 323547 -POINT5780121 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517730 1804000 -POINT5446853 2007827 -POINT5368469 2208877 -POINT5282654 2406875 -POINT5189529 2601562 -POINT5089248 2792633 -POINT4981933 2979858 -POINT4867721 3162948 -POINT4746795 3341690 -POINT4619308 3515792 -POINT4485435 3685043 -POINT4345360 3849197 -POINT4199280 4008041 -POINT4047401 4161346 -POINT3889923 4308883 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386161 4715027 -POINT3208564 4837616 -POINT3026527 4953506 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259537 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855705 5500213 -POINT1649978 5565368 -POINT1441978 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748337 -POINT592948 5774353 -POINT377906 5792389 -POINT162338 5802414 -POINT-53443 5804413 -POINT-269157 5798401 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-912872 5732345 -POINT-1125312 5694443 -POINT-1336196 5648666 -POINT-1545234 5595077 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2552711 5212982 -POINT-2744712 5114486 -POINT-2932922 5008911 -POINT-3117073 4896408 -POINT-3296920 4777145 -POINT-3472206 4651275 -POINT-3642700 4518982 -POINT-3808151 4380447 -POINT-3968338 4235840 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4682853 3429336 -POINT-4807083 3252884 -POINT-4924667 3071930 -POINT-5035454 2886749 -POINT-5139274 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407585 2108719 -POINT-5482231 1906234 -POINT-5549293 1701126 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5704155 1072845 -POINT-5740089 860061 -POINT-5768097 646087 -POINT-5788124 431213 -POINT-5800148 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804161 0 -POINT-5800148 -215759 -POINT-5788124 -431228 -POINT-5768097 -646087 -POINT-5763088 -684355 -POINT-5740089 -860061 -POINT-5733663 -898116 -POINT-5704155 -1072845 -POINT-5696319 -1110635 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5549293 -1701141 -POINT-5537300 -1737823 -POINT-5482231 -1906250 -POINT-5407585 -2108719 -POINT-5325470 -2308288 -POINT-5309468 -2343406 -POINT-5235992 -2504654 -POINT-5139274 -2697570 -POINT-5120707 -2731403 -POINT-5035454 -2886749 -POINT-4924667 -3071945 -POINT-4807083 -3252884 -POINT-4784866 -3284441 -POINT-4682853 -3429336 -POINT-4552147 -3601043 -POINT-4527647 -3630862 -POINT-4415153 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3939690 -4261714 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472206 -4651275 -POINT-3440858 -4673786 -POINT-3296920 -4777145 -POINT-3117073 -4896408 -POINT-2932922 -5008911 -POINT-2744712 -5114486 -POINT-2710375 -5132101 -POINT-2552711 -5212982 -POINT-2517742 -5229312 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1920049 -5477117 -POINT-1752136 -5533752 -POINT-1545234 -5595077 -POINT-1507850 -5604661 -POINT-1336196 -5648666 -POINT-1298482 -5656853 -POINT-1125312 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-660780 -5766282 -POINT-484497 -5784363 -POINT-269157 -5798401 -POINT-53443 -5804413 -POINT162338 -5802414 -POINT377906 -5792389 -POINT592948 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441978 -5622833 -POINT1479177 -5612556 -POINT1649978 -5565368 -POINT1686771 -5553716 -POINT1855705 -5500213 -POINT1892039 -5487202 -POINT2058868 -5427459 -POINT2094693 -5413105 -POINT2259185 -5347198 -POINT2294451 -5331524 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2684182 -5146376 -POINT2840316 -5062576 -POINT3026527 -4953521 -POINT3059083 -4932793 -POINT3208564 -4837616 -POINT3240326 -4815692 -POINT3386161 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3756198 -4425164 -POINT3889923 -4308899 -POINT4047401 -4161346 -POINT4074563 -4133929 -POINT4199280 -4008041 -POINT4225405 -3979636 -POINT4345360 -3849212 -POINT4485435 -3685043 -POINT4509377 -3654774 -POINT4619308 -3515792 -POINT4642108 -3484656 -POINT4746795 -3341690 -POINT4768422 -3309726 -POINT4867721 -3162964 -POINT4888147 -3130217 -POINT4981933 -2979858 -POINT5001126 -2946375 -POINT5089248 -2792633 -POINT5107183 -2758461 -POINT5189529 -2601562 -POINT5206184 -2566747 -POINT5282654 -2406891 -POINT5368469 -2208877 -POINT5382488 -2172921 -POINT5446853 -2007827 -POINT5459529 -1971375 -POINT5517730 -1804000 -POINT5529039 -1767103 -POINT5580963 -1597686 -POINT5590894 -1560390 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5691368 -1140766 -POINT5724121 -966613 -POINT5729838 -928447 -POINT5756088 -753204 -POINT5780121 -538742 -POINT5796142 -323547 -POINT5797578 -284979 -POINT5804168 -107894 -POINT5804168 107894 -POINT5802733 146462 -POINT5796142 323547 -POINT5793277 362033 -POINT5780121 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5675696 1216332 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517730 1804000 -POINT5505055 1840453 -POINT5446853 2007827 -POINT5432835 2043783 -POINT5368469 2208877 -POINT5353122 2244287 -POINT5282654 2406875 -POINT5189529 2601562 -POINT5171595 2635733 -POINT5089248 2792633 -POINT5070056 2826116 -POINT4981933 2979858 -POINT4961508 3012602 -POINT4867721 3162948 -POINT4846095 3194915 -POINT4746795 3341690 -POINT4619308 3515792 -POINT4485435 3685043 -POINT4345360 3849197 -POINT4319235 3877605 -POINT4199280 4008041 -POINT4047401 4161346 -POINT4019238 4187732 -POINT3889923 4308883 -POINT3860798 4334208 -POINT3727073 4450485 -POINT3697028 4474707 -POINT3559074 4585922 -POINT3386161 4715027 -POINT3354400 4736951 -POINT3208564 4837616 -POINT3176009 4858342 -POINT3026527 4953506 -POINT2993225 4973010 -POINT2840316 5062561 -POINT2806311 5080815 -POINT2650177 5164627 -POINT2615517 5181601 -POINT2456375 5259537 -POINT2259185 5347198 -POINT2058868 5427459 -POINT2022534 5440471 -POINT1855705 5500213 -POINT1818912 5511866 -POINT1649978 5565368 -POINT1612779 5575646 -POINT1441978 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748337 -POINT768856 5752990 -POINT592948 5774353 -POINT377906 5792389 -POINT339354 5794182 -POINT162338 5802414 -POINT-53443 5804413 -POINT-269157 5798401 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-737391 5756979 -POINT-912872 5732345 -POINT-950865 5725567 -POINT-1125312 5694443 -POINT-1336196 5648666 -POINT-1373581 5639082 -POINT-1545234 5595077 -POINT-1582237 5584110 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-1992703 5451097 -POINT-2158386 5388260 -POINT-2193938 5373243 -POINT-2357177 5304291 -POINT-2392147 5287961 -POINT-2552711 5212982 -POINT-2587049 5195367 -POINT-2744712 5114486 -POINT-2778372 5095605 -POINT-2932922 5008911 -POINT-2965856 4988791 -POINT-3117073 4896408 -POINT-3149237 4875079 -POINT-3296920 4777145 -POINT-3328269 4754635 -POINT-3472206 4651275 -POINT-3502697 4627616 -POINT-3642700 4518982 -POINT-3808151 4380447 -POINT-3968338 4235840 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4575523 3570335 -POINT-4682853 3429336 -POINT-4705071 3397779 -POINT-4807083 3252884 -POINT-4828112 3220522 -POINT-4924667 3071930 -POINT-5035454 2886749 -POINT-5139274 2697555 -POINT-5156572 2663056 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407585 2108719 -POINT-5420935 2072506 -POINT-5482231 1906234 -POINT-5549293 1701126 -POINT-5559917 1664024 -POINT-5608696 1493667 -POINT-5617932 1456197 -POINT-5660339 1284149 -POINT-5704155 1072845 -POINT-5740089 860061 -POINT-5745098 821794 -POINT-5768097 646087 -POINT-5788124 431213 -POINT-5800148 215759 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID253 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804153 0 -POINT-5800140 -215759 -POINT-5788116 -431213 -POINT-5768097 -646087 -POINT-5740097 -860046 -POINT-5704147 -1072845 -POINT-5660339 -1284133 -POINT-5608688 -1493667 -POINT-5549301 -1701126 -POINT-5482223 -1906234 -POINT-5407577 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139267 -2697555 -POINT-5035446 -2886734 -POINT-4924667 -3071930 -POINT-4807083 -3252884 -POINT-4682846 -3429321 -POINT-4552139 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085388 -POINT-3968338 -4235840 -POINT-3808151 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2744705 -5114471 -POINT-2552703 -5212982 -POINT-2357177 -5304275 -POINT-2158386 -5388260 -POINT-1956619 -5464767 -POINT-1752136 -5533752 -POINT-1545227 -5595062 -POINT-1336196 -5648651 -POINT-1125305 -5694443 -POINT-912872 -5732345 -POINT-699173 -5762344 -POINT-484497 -5784363 -POINT-269165 -5798385 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT377914 -5792373 -POINT592956 -5774353 -POINT807174 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855712 -5500213 -POINT2058868 -5427444 -POINT2259185 -5347198 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3026535 -4953506 -POINT3208557 -4837616 -POINT3386169 -4715027 -POINT3559082 -4585922 -POINT3727081 -4450470 -POINT3889923 -4308883 -POINT4047409 -4161331 -POINT4199280 -4008041 -POINT4345367 -3849197 -POINT4485428 -3685043 -POINT4619308 -3515792 -POINT4746795 -3341674 -POINT4867737 -3162948 -POINT4981933 -2979843 -POINT5089248 -2792633 -POINT5189544 -2601547 -POINT5282654 -2406875 -POINT5368469 -2208877 -POINT5446853 -2007827 -POINT5517730 -1804000 -POINT5580978 -1597671 -POINT5636505 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756103 -753204 -POINT5780121 -538742 -POINT5796142 -323547 -POINT5804168 -107894 -POINT5804168 107910 -POINT5796142 323547 -POINT5780121 538757 -POINT5756103 753204 -POINT5724121 966629 -POINT5684234 1178695 -POINT5636505 1389160 -POINT5580978 1597686 -POINT5517730 1804000 -POINT5446853 2007827 -POINT5368469 2208892 -POINT5282654 2406891 -POINT5189544 2601562 -POINT5089248 2792648 -POINT4981933 2979858 -POINT4867737 3162964 -POINT4746795 3341690 -POINT4619308 3515808 -POINT4485428 3685058 -POINT4345367 3849212 -POINT4199280 4008056 -POINT4047409 4161346 -POINT3889923 4308899 -POINT3727081 4450485 -POINT3559082 4585922 -POINT3386169 4715027 -POINT3208557 4837616 -POINT3026535 4953521 -POINT2840316 5062576 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855712 5500213 -POINT1649978 5565384 -POINT1441970 5622848 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748352 -POINT592956 5774353 -POINT377914 5792389 -POINT162338 5802414 -POINT-53451 5804428 -POINT-269165 5798401 -POINT-484497 5784378 -POINT-699173 5762344 -POINT-912872 5732361 -POINT-1125305 5694443 -POINT-1336196 5648666 -POINT-1545227 5595077 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2552703 5212997 -POINT-2744705 5114486 -POINT-2932922 5008911 -POINT-3117080 4896423 -POINT-3296920 4777145 -POINT-3472213 4651291 -POINT-3642700 4518997 -POINT-3808151 4380447 -POINT-3968338 4235855 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415146 3767776 -POINT-4552139 3601043 -POINT-4682846 3429336 -POINT-4807083 3252884 -POINT-4924667 3071945 -POINT-5035446 2886749 -POINT-5139267 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407577 2108719 -POINT-5482223 1906250 -POINT-5549301 1701141 -POINT-5608688 1493682 -POINT-5660339 1284149 -POINT-5704147 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788116 431228 -POINT-5800140 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804153 0 -POINT-5803436 -38586 -POINT-5800140 -215759 -POINT-5797990 -254291 -POINT-5788116 -431213 -POINT-5784536 -469641 -POINT-5768097 -646087 -POINT-5740097 -860046 -POINT-5733668 -898103 -POINT-5704147 -1072845 -POINT-5696313 -1110632 -POINT-5660339 -1284133 -POINT-5651102 -1321607 -POINT-5608688 -1493667 -POINT-5549301 -1701126 -POINT-5537305 -1737808 -POINT-5482223 -1906234 -POINT-5407577 -2108719 -POINT-5325470 -2308273 -POINT-5309468 -2343394 -POINT-5235992 -2504654 -POINT-5139267 -2697555 -POINT-5035446 -2886734 -POINT-4924667 -3071930 -POINT-4807083 -3252884 -POINT-4682846 -3429321 -POINT-4552139 -3601043 -POINT-4527639 -3630862 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085388 -POINT-3968338 -4235840 -POINT-3808151 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3440864 -4673786 -POINT-3296920 -4777145 -POINT-3264758 -4798474 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2744705 -5114471 -POINT-2710367 -5132089 -POINT-2552703 -5212982 -POINT-2517735 -5229309 -POINT-2357177 -5304275 -POINT-2321625 -5319295 -POINT-2158386 -5388260 -POINT-1956619 -5464767 -POINT-1752136 -5533752 -POINT-1715132 -5544717 -POINT-1545227 -5595062 -POINT-1336196 -5648651 -POINT-1125305 -5694443 -POINT-912872 -5732345 -POINT-699173 -5762344 -POINT-660780 -5766282 -POINT-484497 -5784363 -POINT-269165 -5798385 -POINT-230586 -5799464 -POINT-53451 -5804413 -POINT-14859 -5804053 -POINT162338 -5802398 -POINT200892 -5800606 -POINT377914 -5792373 -POINT592956 -5774353 -POINT807174 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1269534 -5663643 -POINT1441970 -5622833 -POINT1479171 -5612556 -POINT1649978 -5565368 -POINT1686772 -5553716 -POINT1855712 -5500213 -POINT1892045 -5487199 -POINT2058868 -5427444 -POINT2094693 -5413093 -POINT2259185 -5347198 -POINT2294451 -5331521 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3026535 -4953506 -POINT3208557 -4837616 -POINT3386169 -4715027 -POINT3559082 -4585922 -POINT3589127 -4561698 -POINT3727081 -4450470 -POINT3889923 -4308883 -POINT3918088 -4282495 -POINT4047409 -4161331 -POINT4199280 -4008041 -POINT4345367 -3849197 -POINT4370416 -3819840 -POINT4485428 -3685043 -POINT4619308 -3515792 -POINT4642108 -3484653 -POINT4746795 -3341674 -POINT4768425 -3309711 -POINT4867737 -3162948 -POINT4981933 -2979843 -POINT5001126 -2946362 -POINT5089248 -2792633 -POINT5107186 -2758459 -POINT5189544 -2601547 -POINT5206196 -2566732 -POINT5282654 -2406875 -POINT5368469 -2208877 -POINT5382488 -2172921 -POINT5446853 -2007827 -POINT5459529 -1971375 -POINT5517730 -1804000 -POINT5529042 -1767100 -POINT5580978 -1597671 -POINT5590909 -1560378 -POINT5636505 -1389144 -POINT5645041 -1351507 -POINT5684234 -1178695 -POINT5691368 -1140766 -POINT5724121 -966613 -POINT5729841 -928447 -POINT5756103 -753204 -POINT5760399 -714849 -POINT5780121 -538742 -POINT5796142 -323547 -POINT5797578 -284979 -POINT5804168 -107894 -POINT5804168 107910 -POINT5802733 146474 -POINT5796142 323547 -POINT5793277 362035 -POINT5780121 538757 -POINT5756103 753204 -POINT5750384 791373 -POINT5724121 966629 -POINT5684234 1178695 -POINT5675699 1216335 -POINT5636505 1389160 -POINT5580978 1597686 -POINT5569667 1634584 -POINT5517730 1804000 -POINT5505055 1840453 -POINT5446853 2007827 -POINT5432835 2043786 -POINT5368469 2208892 -POINT5353122 2244303 -POINT5282654 2406891 -POINT5189544 2601562 -POINT5171607 2635736 -POINT5089248 2792648 -POINT5070056 2826129 -POINT4981933 2979858 -POINT4961510 3012605 -POINT4867737 3162964 -POINT4746795 3341690 -POINT4619308 3515808 -POINT4595365 3546077 -POINT4485428 3685058 -POINT4460379 3714416 -POINT4345367 3849212 -POINT4319241 3877620 -POINT4199280 4008056 -POINT4172119 4035471 -POINT4047409 4161346 -POINT4019244 4187735 -POINT3889923 4308899 -POINT3727081 4450485 -POINT3697036 4474707 -POINT3559082 4585922 -POINT3386169 4715027 -POINT3354405 4736951 -POINT3208557 4837616 -POINT3026535 4953521 -POINT2993231 4973025 -POINT2840316 5062576 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259185 5347198 -POINT2058868 5427459 -POINT2022535 5440471 -POINT1855712 5500213 -POINT1818919 5511869 -POINT1649978 5565384 -POINT1612778 5575661 -POINT1441970 5622848 -POINT1404415 5631734 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748352 -POINT592956 5774353 -POINT377914 5792389 -POINT339360 5794182 -POINT162338 5802414 -POINT-53451 5804428 -POINT-269165 5798401 -POINT-484497 5784378 -POINT-699173 5762344 -POINT-737391 5756982 -POINT-912872 5732361 -POINT-950864 5725580 -POINT-1125305 5694443 -POINT-1336196 5648666 -POINT-1373580 5639082 -POINT-1545227 5595077 -POINT-1582230 5584110 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-1992703 5451097 -POINT-2158386 5388260 -POINT-2193938 5373243 -POINT-2357177 5304291 -POINT-2392146 5287964 -POINT-2552703 5212997 -POINT-2744705 5114486 -POINT-2778366 5095605 -POINT-2932922 5008911 -POINT-2965857 4988794 -POINT-3117080 4896423 -POINT-3296920 4777145 -POINT-3328270 4754637 -POINT-3472213 4651291 -POINT-3642700 4518997 -POINT-3672289 4494219 -POINT-3808151 4380447 -POINT-3968338 4235855 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415146 3767776 -POINT-4552139 3601043 -POINT-4575515 3570335 -POINT-4682846 3429336 -POINT-4705065 3397779 -POINT-4807083 3252884 -POINT-4924667 3071945 -POINT-5035446 2886749 -POINT-5139267 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407577 2108719 -POINT-5420927 2072509 -POINT-5482223 1906250 -POINT-5494220 1869568 -POINT-5549301 1701141 -POINT-5559922 1664039 -POINT-5608688 1493682 -POINT-5660339 1284149 -POINT-5668174 1246359 -POINT-5704147 1072845 -POINT-5740097 860061 -POINT-5745105 821794 -POINT-5768097 646087 -POINT-5788116 431228 -POINT-5790267 392693 -POINT-5800140 215759 -POINT-5800858 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID264 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804161 0 -POINT-5800155 -215759 -POINT-5788124 -431228 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704155 -1072845 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5549301 -1701141 -POINT-5482231 -1906250 -POINT-5407585 -2108719 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139274 -2697570 -POINT-5035454 -2886749 -POINT-4924675 -3071945 -POINT-4807083 -3252884 -POINT-4682853 -3429336 -POINT-4552147 -3601043 -POINT-4415153 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968345 -4235855 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2744712 -5114486 -POINT-2552711 -5212982 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545234 -5595077 -POINT-1336204 -5648666 -POINT-1125312 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-484504 -5784378 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855705 -5500213 -POINT2058868 -5427459 -POINT2259178 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT3026527 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3889923 -4308899 -POINT4047401 -4161346 -POINT4199280 -4008041 -POINT4345360 -3849212 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746795 -3341690 -POINT4867729 -3162964 -POINT4981926 -2979858 -POINT5089248 -2792633 -POINT5189537 -2601562 -POINT5282646 -2406891 -POINT5368461 -2208877 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597686 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5796142 -323547 -POINT5804168 -107894 -POINT5804168 107894 -POINT5796142 323547 -POINT5780113 538742 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636497 1389144 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208877 -POINT5282646 2406875 -POINT5189537 2601562 -POINT5089248 2792633 -POINT4981926 2979858 -POINT4867729 3162948 -POINT4746795 3341690 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849197 -POINT4199280 4008041 -POINT4047401 4161346 -POINT3889923 4308883 -POINT3727073 4450485 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953506 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259537 -POINT2259178 5347198 -POINT2058868 5427459 -POINT1855705 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-912872 5732345 -POINT-1125312 5694443 -POINT-1336204 5648651 -POINT-1545234 5595062 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357185 5304291 -POINT-2552711 5212982 -POINT-2744712 5114486 -POINT-2932922 5008911 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380447 -POINT-3968345 4235840 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4682853 3429336 -POINT-4807083 3252884 -POINT-4924675 3071930 -POINT-5035454 2886749 -POINT-5139274 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407585 2108719 -POINT-5482231 1906234 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5660339 1284149 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431213 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804161 0 -POINT-5803445 -38586 -POINT-5800155 -215759 -POINT-5788124 -431228 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704155 -1072845 -POINT-5696319 -1110635 -POINT-5660339 -1284149 -POINT-5608696 -1493667 -POINT-5598074 -1530772 -POINT-5549301 -1701141 -POINT-5482231 -1906250 -POINT-5407585 -2108719 -POINT-5325470 -2308288 -POINT-5309468 -2343406 -POINT-5235992 -2504654 -POINT-5139274 -2697570 -POINT-5120707 -2731403 -POINT-5035454 -2886749 -POINT-5015642 -2919870 -POINT-4924675 -3071945 -POINT-4807083 -3252884 -POINT-4784866 -3284441 -POINT-4682853 -3429336 -POINT-4552147 -3601043 -POINT-4527647 -3630862 -POINT-4415153 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968345 -4235855 -POINT-3939696 -4261714 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3440864 -4673786 -POINT-3296920 -4777145 -POINT-3264758 -4798474 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2744712 -5114486 -POINT-2710375 -5132101 -POINT-2552711 -5212982 -POINT-2517743 -5229312 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1920049 -5477117 -POINT-1752136 -5533752 -POINT-1545234 -5595077 -POINT-1507851 -5604661 -POINT-1336204 -5648666 -POINT-1298488 -5656853 -POINT-1125312 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-660781 -5766285 -POINT-484504 -5784378 -POINT-445993 -5786886 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1269534 -5663643 -POINT1441970 -5622833 -POINT1479171 -5612556 -POINT1649978 -5565368 -POINT1686771 -5553716 -POINT1855705 -5500213 -POINT1892039 -5487202 -POINT2058868 -5427459 -POINT2094692 -5413105 -POINT2259178 -5347198 -POINT2294445 -5331524 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2684182 -5146376 -POINT2840316 -5062576 -POINT3026527 -4953521 -POINT3059081 -4932793 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450485 -POINT3756198 -4425164 -POINT3889923 -4308899 -POINT4047401 -4161346 -POINT4074563 -4133929 -POINT4199280 -4008041 -POINT4225405 -3979636 -POINT4345360 -3849212 -POINT4370410 -3819852 -POINT4485428 -3685043 -POINT4509370 -3654774 -POINT4619301 -3515792 -POINT4642102 -3484656 -POINT4746795 -3341690 -POINT4867729 -3162964 -POINT4981926 -2979858 -POINT5089248 -2792633 -POINT5189537 -2601562 -POINT5282646 -2406891 -POINT5368461 -2208877 -POINT5382481 -2172921 -POINT5446853 -2007827 -POINT5459528 -1971375 -POINT5517723 -1804000 -POINT5529033 -1767103 -POINT5580963 -1597686 -POINT5590895 -1560390 -POINT5636497 -1389144 -POINT5645035 -1351507 -POINT5684234 -1178695 -POINT5691368 -1140766 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5782980 -500256 -POINT5796142 -323547 -POINT5797578 -284979 -POINT5804168 -107894 -POINT5804168 107894 -POINT5802733 146462 -POINT5796142 323547 -POINT5793276 362033 -POINT5780113 538742 -POINT5775818 577096 -POINT5756096 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5675697 1216332 -POINT5636497 1389144 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5505049 1840453 -POINT5446853 2007827 -POINT5432834 2043783 -POINT5368461 2208877 -POINT5353114 2244287 -POINT5282646 2406875 -POINT5189537 2601562 -POINT5089248 2792633 -POINT5070055 2826116 -POINT4981926 2979858 -POINT4961503 3012602 -POINT4867729 3162948 -POINT4846101 3194915 -POINT4746795 3341690 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345360 3849197 -POINT4319235 3877605 -POINT4199280 4008041 -POINT4047401 4161346 -POINT4019238 4187732 -POINT3889923 4308883 -POINT3860798 4334208 -POINT3727073 4450485 -POINT3697028 4474707 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953506 -POINT2993225 4973010 -POINT2840316 5062561 -POINT2806311 5080815 -POINT2650177 5164627 -POINT2615517 5181601 -POINT2456375 5259537 -POINT2259178 5347198 -POINT2058868 5427459 -POINT2022534 5440471 -POINT1855705 5500213 -POINT1818912 5511866 -POINT1649978 5565368 -POINT1612778 5575646 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748337 -POINT768854 5752990 -POINT592941 5774353 -POINT377899 5792389 -POINT339348 5794182 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484504 5784363 -POINT-699173 5762344 -POINT-737391 5756979 -POINT-912872 5732345 -POINT-950865 5725567 -POINT-1125312 5694443 -POINT-1336204 5648651 -POINT-1545234 5595062 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-1992704 5451097 -POINT-2158393 5388260 -POINT-2193946 5373243 -POINT-2357185 5304291 -POINT-2552711 5212982 -POINT-2587049 5195367 -POINT-2744712 5114486 -POINT-2778372 5095605 -POINT-2932922 5008911 -POINT-2965857 4988791 -POINT-3117080 4896408 -POINT-3149243 4875079 -POINT-3296920 4777145 -POINT-3328270 4754635 -POINT-3472213 4651275 -POINT-3502703 4627616 -POINT-3642700 4518982 -POINT-3808151 4380447 -POINT-3968345 4235840 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4575523 3570335 -POINT-4682853 3429336 -POINT-4705071 3397779 -POINT-4807083 3252884 -POINT-4924675 3071930 -POINT-5035454 2886749 -POINT-5139274 2697555 -POINT-5156572 2663056 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407585 2108719 -POINT-5420935 2072506 -POINT-5482231 1906234 -POINT-5494226 1869552 -POINT-5549301 1701126 -POINT-5608696 1493667 -POINT-5617932 1456197 -POINT-5660339 1284149 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5745105 821794 -POINT-5768097 646087 -POINT-5788124 431213 -POINT-5790276 392681 -POINT-5800155 215759 -POINT-5800872 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID275 -TOTAL_HEIGHT4017085 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788116 -431228 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608688 -1493682 -POINT-5549301 -1701141 -POINT-5482223 -1906250 -POINT-5407593 -2108719 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139267 -2697570 -POINT-5035446 -2886749 -POINT-4924667 -3071945 -POINT-4807083 -3252884 -POINT-4682846 -3429336 -POINT-4552154 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3808151 -4380447 -POINT-3642700 -4518997 -POINT-3472213 -4651291 -POINT-3296920 -4777145 -POINT-3117080 -4896423 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212997 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545242 -5595077 -POINT-1336196 -5648666 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-484497 -5784378 -POINT-269165 -5798401 -POINT-53451 -5804428 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807174 -5748352 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622848 -POINT1649978 -5565384 -POINT1855712 -5500229 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT3026535 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585937 -POINT3727081 -4450485 -POINT3889923 -4308899 -POINT4047393 -4161346 -POINT4199280 -4008056 -POINT4345352 -3849212 -POINT4485428 -3685058 -POINT4619308 -3515808 -POINT4746795 -3341690 -POINT4867721 -3162964 -POINT4981933 -2979858 -POINT5089248 -2792648 -POINT5189529 -2601562 -POINT5282654 -2406891 -POINT5368469 -2208892 -POINT5446853 -2007827 -POINT5517730 -1804000 -POINT5580963 -1597686 -POINT5636490 -1389160 -POINT5684234 -1178711 -POINT5724121 -966629 -POINT5756088 -753204 -POINT5780121 -538757 -POINT5796142 -323547 -POINT5804168 -107910 -POINT5804168 107894 -POINT5796142 323547 -POINT5780121 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517730 1804000 -POINT5446853 2007827 -POINT5368469 2208877 -POINT5282654 2406875 -POINT5189529 2601547 -POINT5089248 2792633 -POINT4981933 2979843 -POINT4867721 3162948 -POINT4746795 3341674 -POINT4619308 3515792 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4199280 4008041 -POINT4047393 4161331 -POINT3889923 4308883 -POINT3727081 4450470 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837600 -POINT3026535 4953506 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259537 -POINT2259185 5347183 -POINT2058868 5427444 -POINT1855712 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT592941 5774353 -POINT377899 5792373 -POINT162338 5802398 -POINT-53451 5804413 -POINT-269165 5798385 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-912872 5732345 -POINT-1125320 5694443 -POINT-1336196 5648651 -POINT-1545242 5595062 -POINT-1752136 5533737 -POINT-1956619 5464767 -POINT-2158386 5388244 -POINT-2357177 5304275 -POINT-2552719 5212982 -POINT-2744720 5114471 -POINT-2932922 5008896 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380432 -POINT-3968338 4235840 -POINT-4123047 4085388 -POINT-4272049 3929290 -POINT-4415146 3767776 -POINT-4552154 3601043 -POINT-4682846 3429321 -POINT-4807083 3252868 -POINT-4924667 3071930 -POINT-5035446 2886734 -POINT-5139267 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5482223 1906234 -POINT-5549301 1701126 -POINT-5608688 1493667 -POINT-5660339 1284133 -POINT-5704162 1072830 -POINT-5740097 860046 -POINT-5768097 646087 -POINT-5788116 431213 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5802188 -106503 -POINT-5800155 -215759 -POINT-5794213 -322119 -POINT-5788116 -431228 -POINT-5768097 -646087 -POINT-5754276 -751709 -POINT-5740097 -860061 -POINT-5722359 -965096 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5634843 -1387579 -POINT-5608688 -1493682 -POINT-5579374 -1596088 -POINT-5549301 -1701141 -POINT-5516190 -1802387 -POINT-5482223 -1906250 -POINT-5407593 -2108719 -POINT-5325470 -2308288 -POINT-5281302 -2405218 -POINT-5235992 -2504654 -POINT-5139267 -2697570 -POINT-5088019 -2790953 -POINT-5035446 -2886749 -POINT-4924667 -3071945 -POINT-4807083 -3252884 -POINT-4682846 -3429336 -POINT-4618334 -3514094 -POINT-4552154 -3601043 -POINT-4484524 -3683346 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3808151 -4380447 -POINT-3642700 -4518997 -POINT-3472213 -4651291 -POINT-3385685 -4713415 -POINT-3296920 -4777145 -POINT-3208148 -4836023 -POINT-3117080 -4896423 -POINT-2932922 -5008911 -POINT-2840022 -5061025 -POINT-2744720 -5114486 -POINT-2552719 -5212997 -POINT-2456195 -5258062 -POINT-2357177 -5304291 -POINT-2259050 -5345740 -POINT-2158386 -5388260 -POINT-2058790 -5426033 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1650009 -5564024 -POINT-1545242 -5595077 -POINT-1442053 -5621530 -POINT-1336196 -5648666 -POINT-1232104 -5671263 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-484497 -5784378 -POINT-269165 -5798401 -POINT-53451 -5804428 -POINT53066 -5803434 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807174 -5748352 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1335635 -5648007 -POINT1441970 -5622848 -POINT1544647 -5594483 -POINT1649978 -5565384 -POINT1855712 -5500229 -POINT1955994 -5464309 -POINT2058868 -5427459 -POINT2157749 -5387841 -POINT2259185 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT3026535 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585937 -POINT3642010 -4519075 -POINT3727081 -4450485 -POINT3889923 -4308899 -POINT4047393 -4161346 -POINT4199280 -4008056 -POINT4271384 -3929648 -POINT4345352 -3849212 -POINT4414496 -3768183 -POINT4485428 -3685058 -POINT4551514 -3601513 -POINT4619308 -3515808 -POINT4746795 -3341690 -POINT4806487 -3253467 -POINT4867721 -3162964 -POINT4924099 -3072579 -POINT4981933 -2979858 -POINT5089248 -2792648 -POINT5138749 -2698324 -POINT5189529 -2601562 -POINT5282654 -2406891 -POINT5325014 -2309155 -POINT5368469 -2208892 -POINT5407161 -2109643 -POINT5446853 -2007827 -POINT5481840 -1907214 -POINT5517730 -1804000 -POINT5548943 -1702160 -POINT5580963 -1597686 -POINT5636490 -1389160 -POINT5684234 -1178711 -POINT5724121 -966629 -POINT5756088 -753204 -POINT5780121 -538757 -POINT5796142 -323547 -POINT5800104 -217104 -POINT5804168 -107910 -POINT5804168 107894 -POINT5796142 323547 -POINT5788234 429771 -POINT5780121 538742 -POINT5768258 644605 -POINT5756088 753204 -POINT5740309 858547 -POINT5724121 966613 -POINT5704432 1071301 -POINT5684234 1178695 -POINT5660667 1282577 -POINT5636490 1389144 -POINT5609081 1492077 -POINT5580963 1597671 -POINT5549750 1699519 -POINT5517730 1804000 -POINT5482744 1904614 -POINT5446853 2007827 -POINT5408161 2107070 -POINT5368469 2208877 -POINT5326109 2306613 -POINT5282654 2406875 -POINT5236686 2502969 -POINT5189529 2601547 -POINT5140029 2695871 -POINT5089248 2792633 -POINT5036276 2885043 -POINT4981933 2979843 -POINT4925556 3070227 -POINT4867721 3162948 -POINT4808030 3251171 -POINT4746795 3341674 -POINT4683865 3427623 -POINT4619308 3515792 -POINT4553222 3599338 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4199280 4008041 -POINT4047393 4161331 -POINT3969663 4234166 -POINT3889923 4308883 -POINT3727081 4450470 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3298488 4775532 -POINT3208557 4837600 -POINT3118707 4894814 -POINT3026535 4953506 -POINT2934614 5007338 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259537 -POINT2259185 5347183 -POINT2058868 5427444 -POINT1855712 5500213 -POINT1754158 5532375 -POINT1649978 5565368 -POINT1547301 5593734 -POINT1441970 5622833 -POINT1338314 5647365 -POINT1231979 5672531 -POINT1020278 5714386 -POINT915086 5731145 -POINT807174 5748337 -POINT592941 5774353 -POINT377899 5792373 -POINT271493 5797322 -POINT162338 5802398 -POINT55820 5803393 -POINT-53451 5804413 -POINT-159932 5801438 -POINT-269165 5798385 -POINT-375457 5791464 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-804659 5747536 -POINT-912872 5732345 -POINT-1017740 5713636 -POINT-1125320 5694443 -POINT-1336196 5648651 -POINT-1545242 5595062 -POINT-1752136 5533737 -POINT-1853073 5499692 -POINT-1956619 5464767 -POINT-2056215 5426994 -POINT-2158386 5388244 -POINT-2357177 5304275 -POINT-2453701 5259211 -POINT-2552719 5212982 -POINT-2744720 5114471 -POINT-2932922 5008896 -POINT-3117080 4896408 -POINT-3205853 4837538 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3556369 4585973 -POINT-3642700 4518982 -POINT-3724370 4450591 -POINT-3808151 4380432 -POINT-3968338 4235840 -POINT-4123047 4085388 -POINT-4272049 3929290 -POINT-4415146 3767776 -POINT-4482776 3685474 -POINT-4552154 3601043 -POINT-4616666 3516278 -POINT-4682846 3429321 -POINT-4807083 3252868 -POINT-4924667 3071930 -POINT-5035446 2886734 -POINT-5139267 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5444432 2008768 -POINT-5482223 1906234 -POINT-5515334 1804989 -POINT-5549301 1701126 -POINT-5608688 1493667 -POINT-5634184 1390237 -POINT-5660339 1284133 -POINT-5681971 1179830 -POINT-5704162 1072830 -POINT-5740097 860046 -POINT-5768097 646087 -POINT-5777979 540021 -POINT-5788116 431213 -POINT-5794059 324860 -POINT-5800155 215759 -POINT-5802136 109256 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID288 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5704162 -1072837 -POINT-5660339 -1284141 -POINT-5608703 -1493667 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-4924682 -3071937 -POINT-4807098 -3252884 -POINT-4682861 -3429329 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085395 -POINT-3968353 -4235847 -POINT-3808166 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-2932937 -5008903 -POINT-2744720 -5114479 -POINT-2552719 -5212982 -POINT-2357193 -5304283 -POINT-2158401 -5388260 -POINT-1956619 -5464775 -POINT-1752151 -5533745 -POINT-1545242 -5595070 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798393 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020263 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855697 -5500213 -POINT2058853 -5427452 -POINT2259170 -5347198 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3727066 -4450477 -POINT3889923 -4308891 -POINT4047393 -4161338 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4746795 -3341682 -POINT4867721 -3162956 -POINT4981918 -2979850 -POINT5089248 -2792633 -POINT5189529 -2601555 -POINT5282638 -2406883 -POINT5368454 -2208877 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5796142 -323547 -POINT5804153 -107894 -POINT5804153 107902 -POINT5796142 323547 -POINT5780105 538749 -POINT5756088 753204 -POINT5724121 966621 -POINT5684234 1178695 -POINT5636490 1389152 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208885 -POINT5282638 2406883 -POINT5189529 2601562 -POINT5089248 2792640 -POINT4981918 2979858 -POINT4867721 3162956 -POINT4746795 3341690 -POINT4619293 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4047393 4161346 -POINT3889923 4308891 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259170 5347198 -POINT2058853 5427459 -POINT1855697 5500213 -POINT1649978 5565376 -POINT1441970 5622841 -POINT1231964 5672531 -POINT1020263 5714386 -POINT807159 5748344 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804420 -POINT-269165 5798401 -POINT-484512 5784370 -POINT-699173 5762344 -POINT-912887 5732353 -POINT-1125320 5694443 -POINT-1336212 5648659 -POINT-1545242 5595077 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-2158401 5388260 -POINT-2357193 5304291 -POINT-2552719 5212990 -POINT-2744720 5114486 -POINT-2932937 5008911 -POINT-3117080 4896415 -POINT-3296936 4777145 -POINT-3472213 4651283 -POINT-3642700 4518989 -POINT-3808166 4380447 -POINT-3968353 4235847 -POINT-4123047 4085403 -POINT-4272064 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4682861 3429336 -POINT-4807098 3252884 -POINT-4924682 3071937 -POINT-5035461 2886749 -POINT-5139282 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493675 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803451 -38586 -POINT-5800155 -215759 -POINT-5798005 -254292 -POINT-5788131 -431221 -POINT-5784549 -469648 -POINT-5768097 -646087 -POINT-5740097 -860054 -POINT-5704162 -1072837 -POINT-5696325 -1110627 -POINT-5660339 -1284141 -POINT-5651105 -1321613 -POINT-5608703 -1493667 -POINT-5598080 -1530771 -POINT-5549301 -1701133 -POINT-5537308 -1737815 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5309468 -2343400 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-5015650 -2919862 -POINT-4924682 -3071937 -POINT-4903653 -3104298 -POINT-4807098 -3252884 -POINT-4682861 -3429329 -POINT-4552154 -3601043 -POINT-4527654 -3630862 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4245414 -3957221 -POINT-4123047 -4085395 -POINT-3968353 -4235847 -POINT-3808166 -4380440 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3440867 -4673786 -POINT-3296936 -4777145 -POINT-3117080 -4896408 -POINT-3084148 -4916527 -POINT-2932937 -5008903 -POINT-2899276 -5027785 -POINT-2744720 -5114479 -POINT-2552719 -5212982 -POINT-2357193 -5304283 -POINT-2158401 -5388260 -POINT-1956619 -5464775 -POINT-1920052 -5477110 -POINT-1752151 -5533745 -POINT-1545242 -5595070 -POINT-1507859 -5604654 -POINT-1336212 -5648659 -POINT-1125320 -5694443 -POINT-1087328 -5701223 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-445999 -5786878 -POINT-269165 -5798393 -POINT-230586 -5799470 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT416357 -5789157 -POINT592941 -5774353 -POINT807159 -5748337 -POINT1020263 -5714386 -POINT1231964 -5672531 -POINT1269522 -5663643 -POINT1441970 -5622833 -POINT1479171 -5612556 -POINT1649978 -5565368 -POINT1686769 -5553716 -POINT1855697 -5500213 -POINT1892030 -5487201 -POINT2058853 -5427452 -POINT2259170 -5347198 -POINT2456375 -5259544 -POINT2491035 -5242569 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2873617 -5043065 -POINT3026519 -4953514 -POINT3059075 -4932787 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3589112 -4561699 -POINT3727066 -4450477 -POINT3889923 -4308891 -POINT4047393 -4161338 -POINT4074557 -4133923 -POINT4199280 -4008041 -POINT4225404 -3979635 -POINT4345352 -3849205 -POINT4485428 -3685043 -POINT4619293 -3515792 -POINT4642096 -3484654 -POINT4746795 -3341682 -POINT4768422 -3309718 -POINT4867721 -3162956 -POINT4981918 -2979850 -POINT5001113 -2946368 -POINT5089248 -2792633 -POINT5107183 -2758460 -POINT5189529 -2601555 -POINT5282638 -2406883 -POINT5297986 -2371471 -POINT5368454 -2208877 -POINT5382475 -2172921 -POINT5446853 -2007827 -POINT5459526 -1971375 -POINT5517715 -1804000 -POINT5529027 -1767102 -POINT5580963 -1597679 -POINT5590894 -1560384 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5691368 -1140766 -POINT5724121 -966613 -POINT5729838 -928447 -POINT5756088 -753204 -POINT5780105 -538742 -POINT5782974 -500256 -POINT5796142 -323547 -POINT5797575 -284979 -POINT5804153 -107894 -POINT5804153 107902 -POINT5796142 323547 -POINT5793274 362034 -POINT5780105 538749 -POINT5775810 577103 -POINT5756088 753204 -POINT5750371 791372 -POINT5724121 966621 -POINT5684234 1178695 -POINT5675696 1216334 -POINT5636490 1389152 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5505042 1840453 -POINT5446853 2007827 -POINT5432832 2043785 -POINT5368454 2208885 -POINT5282638 2406883 -POINT5265987 2441700 -POINT5189529 2601562 -POINT5171595 2635735 -POINT5089248 2792640 -POINT5070053 2826123 -POINT4981918 2979858 -POINT4867721 3162956 -POINT4846095 3194921 -POINT4746795 3341690 -POINT4723993 3372828 -POINT4619293 3515800 -POINT4485428 3685051 -POINT4345352 3849205 -POINT4199280 4008049 -POINT4047393 4161346 -POINT3889923 4308891 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3528143 4609011 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2993219 4973017 -POINT2840316 5062568 -POINT2806311 5080821 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259170 5347198 -POINT2058853 5427459 -POINT2022520 5440471 -POINT1855697 5500213 -POINT1818906 5511867 -POINT1649978 5565376 -POINT1612778 5575653 -POINT1441970 5622841 -POINT1231964 5672531 -POINT1020263 5714386 -POINT807159 5748344 -POINT768848 5752996 -POINT592941 5774353 -POINT377899 5792389 -POINT339348 5794182 -POINT162338 5802414 -POINT123746 5802773 -POINT-53451 5804420 -POINT-92030 5803344 -POINT-269165 5798401 -POINT-307678 5795892 -POINT-484512 5784370 -POINT-522902 5780431 -POINT-699173 5762344 -POINT-737394 5756981 -POINT-912887 5732353 -POINT-1125320 5694443 -POINT-1336212 5648659 -POINT-1545242 5595077 -POINT-1582246 5584110 -POINT-1752151 5533752 -POINT-1956619 5464782 -POINT-1992706 5451097 -POINT-2158401 5388260 -POINT-2193953 5373243 -POINT-2357193 5304291 -POINT-2552719 5212990 -POINT-2744720 5114486 -POINT-2778381 5095605 -POINT-2932937 5008911 -POINT-2965870 4988792 -POINT-3117080 4896415 -POINT-3149246 4875085 -POINT-3296936 4777145 -POINT-3472213 4651283 -POINT-3642700 4518989 -POINT-3808166 4380447 -POINT-3836814 4354587 -POINT-3968353 4235847 -POINT-3996019 4208942 -POINT-4123047 4085403 -POINT-4149697 4057487 -POINT-4272064 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4575530 3570335 -POINT-4682861 3429336 -POINT-4705080 3397779 -POINT-4807098 3252884 -POINT-4924682 3071937 -POINT-4944494 3038818 -POINT-5035461 2886749 -POINT-5054029 2852915 -POINT-5139282 2697563 -POINT-5156578 2663063 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493675 -POINT-5617938 1456203 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5710589 1034791 -POINT-5740097 860061 -POINT-5745105 821794 -POINT-5768097 646087 -POINT-5771680 607660 -POINT-5788131 431221 -POINT-5790282 392687 -POINT-5800155 215759 -POINT-5800873 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID299 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284141 -POINT-5608703 -1493675 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-4924682 -3071937 -POINT-4807083 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235847 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651283 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2744720 -5114479 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545242 -5595070 -POINT-1336196 -5648659 -POINT-1125320 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807159 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855697 -5500213 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3727066 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619293 -3515792 -POINT4746795 -3341682 -POINT4867721 -3162956 -POINT4981918 -2979858 -POINT5089248 -2792640 -POINT5189529 -2601555 -POINT5282638 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5796142 -323547 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796142 323547 -POINT5780105 538749 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282638 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT4981918 2979850 -POINT4867721 3162956 -POINT4746795 3341682 -POINT4619293 3515792 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT3889923 4308891 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855697 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807159 5748344 -POINT592941 5774353 -POINT377899 5792381 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484512 5784370 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158401 5388260 -POINT-2357177 5304291 -POINT-2552719 5212990 -POINT-2744720 5114479 -POINT-2932922 5008903 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4682861 3429329 -POINT-4807083 3252884 -POINT-4924682 3071937 -POINT-5035461 2886741 -POINT-5139282 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493667 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803451 -38586 -POINT-5800155 -215759 -POINT-5798005 -254292 -POINT-5788131 -431221 -POINT-5784549 -469648 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5696325 -1110633 -POINT-5660339 -1284141 -POINT-5651105 -1321614 -POINT-5608703 -1493675 -POINT-5598080 -1530777 -POINT-5549301 -1701133 -POINT-5537308 -1737815 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5309468 -2343400 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886741 -POINT-5015650 -2919862 -POINT-4924682 -3071937 -POINT-4903651 -3104298 -POINT-4807083 -3252884 -POINT-4784867 -3284441 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4527654 -3630862 -POINT-4415161 -3767776 -POINT-4389567 -3796664 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235847 -POINT-3939690 -4261708 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3612210 -4542643 -POINT-3472213 -4651283 -POINT-3440864 -4673792 -POINT-3296920 -4777145 -POINT-3264758 -4798474 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2899264 -5027791 -POINT-2744720 -5114479 -POINT-2710382 -5132097 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2321628 -5319308 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1920049 -5477117 -POINT-1752136 -5533752 -POINT-1715135 -5544719 -POINT-1545242 -5595070 -POINT-1507856 -5604654 -POINT-1336196 -5648659 -POINT-1298483 -5656847 -POINT-1125320 -5694443 -POINT-1087325 -5701223 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792381 -POINT416357 -5789157 -POINT592941 -5774353 -POINT807159 -5748344 -POINT845274 -5742271 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855697 -5500213 -POINT1892033 -5487202 -POINT2058868 -5427459 -POINT2094693 -5413105 -POINT2259185 -5347198 -POINT2294451 -5331522 -POINT2456375 -5259544 -POINT2491035 -5242569 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2873617 -5043065 -POINT3026519 -4953514 -POINT3059075 -4932787 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585922 -POINT3589112 -4561700 -POINT3727066 -4450485 -POINT3889923 -4308891 -POINT3918085 -4282504 -POINT4047393 -4161346 -POINT4074557 -4133929 -POINT4199280 -4008041 -POINT4225404 -3979635 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619293 -3515792 -POINT4642096 -3484654 -POINT4746795 -3341682 -POINT4768422 -3309718 -POINT4867721 -3162956 -POINT4888144 -3130211 -POINT4981918 -2979858 -POINT5001113 -2946376 -POINT5089248 -2792640 -POINT5107183 -2758466 -POINT5189529 -2601555 -POINT5282638 -2406883 -POINT5297986 -2371473 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5459526 -1971375 -POINT5517715 -1804000 -POINT5529027 -1767102 -POINT5580963 -1597679 -POINT5590894 -1560384 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5691368 -1140768 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5782974 -500262 -POINT5796142 -323547 -POINT5797578 -284981 -POINT5804168 -107902 -POINT5804168 107894 -POINT5802733 146462 -POINT5796142 323547 -POINT5793274 362034 -POINT5780105 538749 -POINT5775810 577103 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5675696 1216332 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5505042 1840453 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282638 2406883 -POINT5265987 2441698 -POINT5189529 2601555 -POINT5171595 2635727 -POINT5089248 2792633 -POINT4981918 2979850 -POINT4961495 3012597 -POINT4867721 3162956 -POINT4846095 3194919 -POINT4746795 3341682 -POINT4723993 3372820 -POINT4619293 3515792 -POINT4485428 3685043 -POINT4460377 3714402 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT4019231 4187727 -POINT3889923 4308891 -POINT3727066 4450485 -POINT3559066 4585922 -POINT3528143 4609011 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2993219 4973017 -POINT2840316 5062568 -POINT2806311 5080821 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347198 -POINT2058868 5427459 -POINT2022533 5440471 -POINT1855697 5500213 -POINT1818906 5511866 -POINT1649978 5565368 -POINT1612778 5575646 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807159 5748344 -POINT768848 5752996 -POINT592941 5774353 -POINT377899 5792381 -POINT339348 5794174 -POINT162338 5802406 -POINT123746 5802765 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-307678 5795892 -POINT-484512 5784370 -POINT-522902 5780431 -POINT-699173 5762344 -POINT-737391 5756981 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-1992706 5451097 -POINT-2158401 5388260 -POINT-2193951 5373243 -POINT-2357177 5304291 -POINT-2552719 5212990 -POINT-2744720 5114479 -POINT-2778378 5095598 -POINT-2932922 5008903 -POINT-2965857 4988785 -POINT-3117080 4896408 -POINT-3149243 4875079 -POINT-3296920 4777145 -POINT-3328270 4754635 -POINT-3472213 4651275 -POINT-3502703 4627616 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3836799 4354581 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929306 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4575530 3570334 -POINT-4682861 3429329 -POINT-4807083 3252884 -POINT-4828115 3220523 -POINT-4924682 3071937 -POINT-4944494 3038817 -POINT-5035461 2886741 -POINT-5054029 2852908 -POINT-5139282 2697563 -POINT-5156578 2663063 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493667 -POINT-5617938 1456195 -POINT-5660339 1284141 -POINT-5704162 1072845 -POINT-5710589 1034791 -POINT-5740097 860061 -POINT-5745105 821794 -POINT-5768097 646087 -POINT-5771680 607660 -POINT-5788131 431221 -POINT-5790282 392687 -POINT-5800155 215759 -POINT-5800873 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID310 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804161 0 -POINT-5800155 -215759 -POINT-5788124 -431213 -POINT-5768097 -646087 -POINT-5740097 -860046 -POINT-5704155 -1072830 -POINT-5660339 -1284133 -POINT-5608696 -1493667 -POINT-5549301 -1701126 -POINT-5482231 -1906234 -POINT-5407585 -2108719 -POINT-5325470 -2308273 -POINT-5235992 -2504654 -POINT-5139274 -2697555 -POINT-5035454 -2886734 -POINT-4924675 -3071930 -POINT-4807083 -3252868 -POINT-4682853 -3429321 -POINT-4552147 -3601043 -POINT-4415153 -3767776 -POINT-4272049 -3929290 -POINT-4123047 -4085388 -POINT-3968345 -4235840 -POINT-3808151 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2744712 -5114471 -POINT-2552711 -5212982 -POINT-2357177 -5304275 -POINT-2158393 -5388244 -POINT-1956619 -5464767 -POINT-1752136 -5533737 -POINT-1545234 -5595062 -POINT-1336204 -5648651 -POINT-1125312 -5694443 -POINT-912872 -5732345 -POINT-699173 -5762344 -POINT-484504 -5784363 -POINT-269165 -5798385 -POINT-53451 -5804413 -POINT162338 -5802398 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855705 -5500213 -POINT2058868 -5427444 -POINT2259178 -5347183 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3026527 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3727073 -4450470 -POINT3889923 -4308883 -POINT4047401 -4161331 -POINT4199280 -4008041 -POINT4345360 -3849197 -POINT4485428 -3685043 -POINT4619301 -3515792 -POINT4746795 -3341674 -POINT4867729 -3162948 -POINT4981926 -2979843 -POINT5089248 -2792633 -POINT5189537 -2601547 -POINT5282646 -2406875 -POINT5368461 -2208877 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597671 -POINT5636497 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5796142 -323547 -POINT5804168 -107894 -POINT5804168 107910 -POINT5796142 323547 -POINT5780113 538757 -POINT5756096 753204 -POINT5724121 966629 -POINT5684234 1178711 -POINT5636497 1389160 -POINT5580963 1597686 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368461 2208892 -POINT5282646 2406891 -POINT5189537 2601562 -POINT5089248 2792648 -POINT4981926 2979858 -POINT4867729 3162964 -POINT4746795 3341690 -POINT4619301 3515808 -POINT4485428 3685058 -POINT4345360 3849212 -POINT4199280 4008056 -POINT4047401 4161346 -POINT3889923 4308899 -POINT3727073 4450485 -POINT3559074 4585937 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953521 -POINT2840316 5062576 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2058868 5427459 -POINT1855705 5500229 -POINT1649978 5565384 -POINT1441970 5622848 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748352 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804428 -POINT-269165 5798401 -POINT-484504 5784378 -POINT-699173 5762344 -POINT-912872 5732361 -POINT-1125312 5694443 -POINT-1336204 5648666 -POINT-1545234 5595077 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158393 5388260 -POINT-2357177 5304291 -POINT-2552711 5212997 -POINT-2744712 5114486 -POINT-2932922 5008911 -POINT-3117080 4896423 -POINT-3296920 4777145 -POINT-3472213 4651291 -POINT-3642700 4518997 -POINT-3808151 4380447 -POINT-3968345 4235855 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4682853 3429336 -POINT-4807083 3252884 -POINT-4924675 3071945 -POINT-5035454 2886749 -POINT-5139274 2697570 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407585 2108719 -POINT-5482231 1906250 -POINT-5549301 1701141 -POINT-5608696 1493682 -POINT-5660339 1284149 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788124 431228 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804161 0 -POINT-5803445 -38586 -POINT-5800155 -215759 -POINT-5788124 -431213 -POINT-5768097 -646087 -POINT-5740097 -860046 -POINT-5704155 -1072830 -POINT-5696319 -1110620 -POINT-5660339 -1284133 -POINT-5651103 -1321607 -POINT-5608696 -1493667 -POINT-5598074 -1530769 -POINT-5549301 -1701126 -POINT-5482231 -1906234 -POINT-5407585 -2108719 -POINT-5325470 -2308273 -POINT-5309468 -2343394 -POINT-5235992 -2504654 -POINT-5139274 -2697555 -POINT-5120707 -2731388 -POINT-5035454 -2886734 -POINT-4924675 -3071930 -POINT-4807083 -3252868 -POINT-4784866 -3284425 -POINT-4682853 -3429321 -POINT-4552147 -3601043 -POINT-4527647 -3630862 -POINT-4415153 -3767776 -POINT-4272049 -3929290 -POINT-4123047 -4085388 -POINT-3968345 -4235840 -POINT-3808151 -4380432 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3440864 -4673786 -POINT-3296920 -4777145 -POINT-3264758 -4798474 -POINT-3117080 -4896408 -POINT-2932922 -5008896 -POINT-2744712 -5114471 -POINT-2710375 -5132089 -POINT-2552711 -5212982 -POINT-2517742 -5229309 -POINT-2357177 -5304275 -POINT-2321627 -5319292 -POINT-2158393 -5388244 -POINT-2122308 -5401930 -POINT-1956619 -5464767 -POINT-1920049 -5477102 -POINT-1752136 -5533737 -POINT-1545234 -5595062 -POINT-1507851 -5604646 -POINT-1336204 -5648651 -POINT-1125312 -5694443 -POINT-912872 -5732345 -POINT-699173 -5762344 -POINT-660781 -5766282 -POINT-484504 -5784363 -POINT-269165 -5798385 -POINT-230586 -5799464 -POINT-53451 -5804413 -POINT-14859 -5804053 -POINT162338 -5802398 -POINT200889 -5800606 -POINT377899 -5792373 -POINT592941 -5774353 -POINT807167 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1269534 -5663643 -POINT1441970 -5622833 -POINT1479171 -5612556 -POINT1649978 -5565368 -POINT1686771 -5553716 -POINT1855705 -5500213 -POINT1892039 -5487199 -POINT2058868 -5427444 -POINT2094692 -5413090 -POINT2259178 -5347183 -POINT2456375 -5259537 -POINT2650177 -5164627 -POINT2840316 -5062561 -POINT3026527 -4953506 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585922 -POINT3589119 -4561698 -POINT3727073 -4450470 -POINT3756198 -4425148 -POINT3889923 -4308883 -POINT4047401 -4161331 -POINT4199280 -4008041 -POINT4345360 -3849197 -POINT4370410 -3819840 -POINT4485428 -3685043 -POINT4509370 -3654774 -POINT4619301 -3515792 -POINT4642102 -3484653 -POINT4746795 -3341674 -POINT4768423 -3309711 -POINT4867729 -3162948 -POINT4981926 -2979843 -POINT5089248 -2792633 -POINT5107184 -2758459 -POINT5189537 -2601547 -POINT5282646 -2406875 -POINT5368461 -2208877 -POINT5382481 -2172921 -POINT5446853 -2007827 -POINT5459528 -1971375 -POINT5517723 -1804000 -POINT5529033 -1767100 -POINT5580963 -1597671 -POINT5590895 -1560378 -POINT5636497 -1389144 -POINT5645035 -1351507 -POINT5684234 -1178695 -POINT5691368 -1140766 -POINT5724121 -966613 -POINT5756096 -753204 -POINT5780113 -538742 -POINT5782980 -500256 -POINT5796142 -323547 -POINT5797578 -284979 -POINT5804168 -107894 -POINT5804168 107910 -POINT5802733 146474 -POINT5796142 323547 -POINT5793276 362035 -POINT5780113 538757 -POINT5775818 577109 -POINT5756096 753204 -POINT5724121 966629 -POINT5684234 1178711 -POINT5675697 1216347 -POINT5636497 1389160 -POINT5580963 1597686 -POINT5569653 1634584 -POINT5517723 1804000 -POINT5505049 1840453 -POINT5446853 2007827 -POINT5432834 2043786 -POINT5368461 2208892 -POINT5353114 2244303 -POINT5282646 2406891 -POINT5189537 2601562 -POINT5089248 2792648 -POINT5070055 2826129 -POINT4981926 2979858 -POINT4961503 3012605 -POINT4867729 3162964 -POINT4746795 3341690 -POINT4619301 3515808 -POINT4595359 3546077 -POINT4485428 3685058 -POINT4345360 3849212 -POINT4319235 3877620 -POINT4199280 4008056 -POINT4047401 4161346 -POINT4019238 4187735 -POINT3889923 4308899 -POINT3727073 4450485 -POINT3559074 4585937 -POINT3528149 4609024 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953521 -POINT2993225 4973025 -POINT2840316 5062576 -POINT2650177 5164627 -POINT2456375 5259552 -POINT2259178 5347198 -POINT2058868 5427459 -POINT2022534 5440474 -POINT1855705 5500229 -POINT1649978 5565384 -POINT1612778 5575661 -POINT1441970 5622848 -POINT1404415 5631734 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807167 5748352 -POINT592941 5774353 -POINT377899 5792389 -POINT339348 5794182 -POINT162338 5802414 -POINT-53451 5804428 -POINT-269165 5798401 -POINT-484504 5784378 -POINT-699173 5762344 -POINT-737391 5756982 -POINT-912872 5732361 -POINT-950865 5725580 -POINT-1125312 5694443 -POINT-1336204 5648666 -POINT-1545234 5595077 -POINT-1582237 5584110 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-1992704 5451097 -POINT-2158393 5388260 -POINT-2193944 5373243 -POINT-2357177 5304291 -POINT-2392147 5287964 -POINT-2552711 5212997 -POINT-2744712 5114486 -POINT-2778372 5095605 -POINT-2932922 5008911 -POINT-2965857 4988794 -POINT-3117080 4896423 -POINT-3296920 4777145 -POINT-3328270 4754637 -POINT-3472213 4651291 -POINT-3642700 4518997 -POINT-3672289 4494219 -POINT-3808151 4380447 -POINT-3968345 4235855 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415153 3767776 -POINT-4552147 3601043 -POINT-4575523 3570335 -POINT-4682853 3429336 -POINT-4705071 3397779 -POINT-4807083 3252884 -POINT-4924675 3071945 -POINT-5035454 2886749 -POINT-5139274 2697570 -POINT-5156572 2663069 -POINT-5235992 2504654 -POINT-5325470 2308288 -POINT-5407585 2108719 -POINT-5420935 2072509 -POINT-5482231 1906250 -POINT-5494226 1869568 -POINT-5549301 1701141 -POINT-5608696 1493682 -POINT-5617932 1456209 -POINT-5660339 1284149 -POINT-5704155 1072845 -POINT-5740097 860061 -POINT-5745105 821794 -POINT-5768097 646087 -POINT-5788124 431228 -POINT-5790276 392693 -POINT-5800155 215759 -POINT-5800872 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID321 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608696 -1493675 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325477 -2308281 -POINT-5235992 -2504654 -POINT-5139274 -2697563 -POINT-5035461 -2886749 -POINT-4924675 -3071937 -POINT-4807091 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4415153 -3767776 -POINT-4272056 -3929306 -POINT-4123054 -4085403 -POINT-3968345 -4235847 -POINT-3808159 -4380447 -POINT-3642707 -4518989 -POINT-3472213 -4651283 -POINT-3296928 -4777145 -POINT-3117080 -4896415 -POINT-2932930 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1752143 -5533752 -POINT-1545242 -5595077 -POINT-1336204 -5648666 -POINT-1125320 -5694443 -POINT-912879 -5732353 -POINT-699180 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162330 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807167 -5748344 -POINT1020271 -5714386 -POINT1231971 -5672531 -POINT1441970 -5622841 -POINT1649971 -5565376 -POINT1855697 -5500221 -POINT2058860 -5427459 -POINT2259178 -5347198 -POINT2456375 -5259552 -POINT2650169 -5164627 -POINT2840309 -5062568 -POINT3026527 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585930 -POINT3727073 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199272 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619301 -3515800 -POINT4746788 -3341690 -POINT4867721 -3162956 -POINT4981926 -2979858 -POINT5089241 -2792640 -POINT5189529 -2601562 -POINT5282646 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5517723 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389152 -POINT5684234 -1178703 -POINT5724113 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5796142 -323547 -POINT5804161 -107902 -POINT5804161 107894 -POINT5796142 323547 -POINT5780105 538742 -POINT5756088 753204 -POINT5724113 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282646 2406883 -POINT5189529 2601555 -POINT5089241 2792633 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4746788 3341682 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199272 4008041 -POINT4047393 4161338 -POINT3889923 4308891 -POINT3727073 4450477 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2840309 5062568 -POINT2650169 5164627 -POINT2456375 5259544 -POINT2259178 5347191 -POINT2058860 5427452 -POINT1855697 5500213 -POINT1649971 5565368 -POINT1441970 5622833 -POINT1231971 5672531 -POINT1020271 5714386 -POINT807167 5748337 -POINT592941 5774353 -POINT377899 5792381 -POINT162330 5802406 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-484504 5784363 -POINT-699180 5762344 -POINT-912879 5732353 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1545242 5595070 -POINT-1752143 5533745 -POINT-1956619 5464775 -POINT-2158393 5388252 -POINT-2357185 5304283 -POINT-2552719 5212982 -POINT-2744720 5114479 -POINT-2932930 5008903 -POINT-3117080 4896408 -POINT-3296928 4777145 -POINT-3472213 4651275 -POINT-3642707 4518982 -POINT-3808159 4380440 -POINT-3968345 4235847 -POINT-4123054 4085395 -POINT-4272056 3929298 -POINT-4415153 3767776 -POINT-4552154 3601043 -POINT-4682861 3429329 -POINT-4807091 3252876 -POINT-4924675 3071937 -POINT-5035461 2886741 -POINT-5139274 2697563 -POINT-5235992 2504654 -POINT-5325477 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5660339 1284141 -POINT-5704162 1072837 -POINT-5740097 860054 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803451 -38586 -POINT-5800155 -215759 -POINT-5798005 -254292 -POINT-5788131 -431221 -POINT-5784549 -469648 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5696325 -1110635 -POINT-5660339 -1284149 -POINT-5608696 -1493675 -POINT-5598074 -1530777 -POINT-5549301 -1701133 -POINT-5537308 -1737815 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325477 -2308281 -POINT-5309474 -2343400 -POINT-5235992 -2504654 -POINT-5218695 -2539154 -POINT-5139274 -2697563 -POINT-5035461 -2886749 -POINT-4924675 -3071937 -POINT-4903646 -3104298 -POINT-4807091 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4527653 -3630862 -POINT-4415153 -3767776 -POINT-4272056 -3929306 -POINT-4245409 -3957222 -POINT-4123054 -4085403 -POINT-4095386 -4112309 -POINT-3968345 -4235847 -POINT-3939697 -4261708 -POINT-3808159 -4380447 -POINT-3642707 -4518989 -POINT-3612216 -4542649 -POINT-3472213 -4651283 -POINT-3296928 -4777145 -POINT-3264764 -4798476 -POINT-3117080 -4896415 -POINT-3084147 -4916534 -POINT-2932930 -5008911 -POINT-2744720 -5114486 -POINT-2710382 -5132103 -POINT-2552719 -5212990 -POINT-2357185 -5304291 -POINT-2158393 -5388260 -POINT-1956619 -5464782 -POINT-1920050 -5477117 -POINT-1752143 -5533752 -POINT-1545242 -5595077 -POINT-1336204 -5648666 -POINT-1298489 -5656853 -POINT-1125320 -5694443 -POINT-1087327 -5701223 -POINT-912879 -5732353 -POINT-699180 -5762344 -POINT-484504 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162330 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807167 -5748344 -POINT1020271 -5714386 -POINT1231971 -5672531 -POINT1441970 -5622841 -POINT1649971 -5565376 -POINT1686763 -5553724 -POINT1855697 -5500221 -POINT2058860 -5427459 -POINT2259178 -5347198 -POINT2294445 -5331524 -POINT2456375 -5259552 -POINT2650169 -5164627 -POINT2840309 -5062568 -POINT2873612 -5043065 -POINT3026527 -4953514 -POINT3059081 -4932787 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559074 -4585930 -POINT3589119 -4561707 -POINT3727073 -4450485 -POINT3756198 -4425162 -POINT3889923 -4308891 -POINT3918085 -4282504 -POINT4047393 -4161346 -POINT4074556 -4133930 -POINT4199272 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4509370 -3654782 -POINT4619301 -3515800 -POINT4642101 -3484662 -POINT4746788 -3341690 -POINT4768416 -3309725 -POINT4867721 -3162956 -POINT4888146 -3130211 -POINT4981926 -2979858 -POINT5089241 -2792640 -POINT5107177 -2758468 -POINT5189529 -2601562 -POINT5282646 -2406883 -POINT5297992 -2371473 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5459528 -1971375 -POINT5517723 -1804000 -POINT5529033 -1767102 -POINT5580963 -1597679 -POINT5590894 -1560386 -POINT5636490 -1389152 -POINT5684234 -1178703 -POINT5724113 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5782974 -500262 -POINT5796142 -323547 -POINT5804161 -107902 -POINT5804161 107894 -POINT5802727 146462 -POINT5796142 323547 -POINT5793274 362033 -POINT5780105 538742 -POINT5775810 577096 -POINT5756088 753204 -POINT5750370 791370 -POINT5724113 966613 -POINT5716981 1004542 -POINT5684234 1178695 -POINT5675696 1216332 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517723 1804000 -POINT5505049 1840453 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5353108 2244289 -POINT5282646 2406883 -POINT5189529 2601555 -POINT5089241 2792633 -POINT5070049 2826115 -POINT4981926 2979850 -POINT4867721 3162956 -POINT4746788 3341682 -POINT4619301 3515792 -POINT4485428 3685043 -POINT4460377 3714402 -POINT4345352 3849205 -POINT4199272 4008041 -POINT4172110 4035457 -POINT4047393 4161338 -POINT4019231 4187727 -POINT3889923 4308891 -POINT3727073 4450477 -POINT3697028 4474701 -POINT3559074 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026527 4953514 -POINT2840309 5062568 -POINT2806304 5080821 -POINT2650169 5164627 -POINT2615511 5181602 -POINT2456375 5259544 -POINT2421108 5275219 -POINT2259178 5347191 -POINT2223353 5361545 -POINT2058860 5427452 -POINT2022526 5440465 -POINT1855697 5500213 -POINT1818905 5511866 -POINT1649971 5565368 -POINT1612772 5575646 -POINT1441970 5622833 -POINT1404414 5631721 -POINT1231971 5672531 -POINT1020271 5714386 -POINT807167 5748337 -POINT768854 5752990 -POINT592941 5774353 -POINT377899 5792381 -POINT339346 5794174 -POINT162330 5802406 -POINT123739 5802765 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-307676 5795884 -POINT-484504 5784363 -POINT-699180 5762344 -POINT-737398 5756981 -POINT-912879 5732353 -POINT-950873 5725573 -POINT-1125320 5694443 -POINT-1336204 5648659 -POINT-1373589 5639075 -POINT-1545242 5595070 -POINT-1752143 5533745 -POINT-1956619 5464775 -POINT-1992704 5451090 -POINT-2158393 5388252 -POINT-2193946 5373235 -POINT-2357185 5304283 -POINT-2392155 5287955 -POINT-2552719 5212982 -POINT-2587057 5195366 -POINT-2744720 5114479 -POINT-2778380 5095598 -POINT-2932930 5008903 -POINT-2965863 4988785 -POINT-3117080 4896408 -POINT-3296928 4777145 -POINT-3328276 4754635 -POINT-3472213 4651275 -POINT-3502705 4627616 -POINT-3642707 4518982 -POINT-3672297 4494205 -POINT-3808159 4380440 -POINT-3968345 4235847 -POINT-3996014 4208940 -POINT-4123054 4085395 -POINT-4149702 4057479 -POINT-4272056 3929298 -POINT-4297648 3900411 -POINT-4415153 3767776 -POINT-4439655 3737957 -POINT-4552154 3601043 -POINT-4575530 3570334 -POINT-4682861 3429329 -POINT-4807091 3252876 -POINT-4828120 3220517 -POINT-4924675 3071937 -POINT-4944488 3038817 -POINT-5035461 2886741 -POINT-5139274 2697563 -POINT-5156572 2663063 -POINT-5235992 2504654 -POINT-5251996 2469534 -POINT-5325477 2308281 -POINT-5340163 2272591 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608696 1493667 -POINT-5617932 1456195 -POINT-5660339 1284141 -POINT-5704162 1072837 -POINT-5710589 1034783 -POINT-5740097 860054 -POINT-5745105 821788 -POINT-5768097 646087 -POINT-5771680 607660 -POINT-5788131 431221 -POINT-5790282 392687 -POINT-5800155 215759 -POINT-5800873 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID332 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608703 -1493675 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-4924682 -3071937 -POINT-4807098 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085403 -POINT-3968353 -4235847 -POINT-3808166 -4380447 -POINT-3642700 -4518989 -POINT-3472213 -4651283 -POINT-3296936 -4777145 -POINT-3117080 -4896415 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357193 -5304291 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1752151 -5533752 -POINT-1545242 -5595077 -POINT-1336212 -5648666 -POINT-1125320 -5694443 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807159 -5748344 -POINT1020263 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855697 -5500221 -POINT2058853 -5427459 -POINT2259170 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026519 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559066 -4585930 -POINT3727066 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619293 -3515800 -POINT4746795 -3341690 -POINT4867721 -3162956 -POINT4981918 -2979858 -POINT5089248 -2792640 -POINT5189529 -2601562 -POINT5282638 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389152 -POINT5684234 -1178695 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5796142 -323547 -POINT5804153 -107902 -POINT5804153 107894 -POINT5796142 323547 -POINT5780105 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282638 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT4981918 2979850 -POINT4867721 3162956 -POINT4746795 3341682 -POINT4619293 3515792 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT3889923 4308891 -POINT3727066 4450477 -POINT3559066 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259170 5347198 -POINT2058853 5427452 -POINT1855697 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231964 5672531 -POINT1020263 5714386 -POINT807159 5748337 -POINT592941 5774353 -POINT377899 5792381 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-484512 5784363 -POINT-699173 5762344 -POINT-912887 5732353 -POINT-1125320 5694443 -POINT-1336212 5648659 -POINT-1545242 5595070 -POINT-1752151 5533745 -POINT-1956619 5464775 -POINT-2158401 5388252 -POINT-2357193 5304283 -POINT-2552719 5212982 -POINT-2744720 5114479 -POINT-2932922 5008903 -POINT-3117080 4896408 -POINT-3296936 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808166 4380440 -POINT-3968353 4235847 -POINT-4123047 4085395 -POINT-4272064 3929298 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4682861 3429329 -POINT-4807098 3252884 -POINT-4924682 3071937 -POINT-5035461 2886741 -POINT-5139282 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493667 -POINT-5660339 1284141 -POINT-5704162 1072837 -POINT-5740097 860054 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803451 -38586 -POINT-5800155 -215759 -POINT-5798005 -254292 -POINT-5788131 -431221 -POINT-5784549 -469648 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5696325 -1110635 -POINT-5660339 -1284149 -POINT-5651105 -1321621 -POINT-5608703 -1493675 -POINT-5598080 -1530777 -POINT-5549301 -1701133 -POINT-5537308 -1737815 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5309468 -2343400 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-5015650 -2919868 -POINT-4924682 -3071937 -POINT-4903653 -3104298 -POINT-4807098 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4527654 -3630862 -POINT-4415161 -3767776 -POINT-4272064 -3929306 -POINT-4123047 -4085403 -POINT-4095381 -4112309 -POINT-3968353 -4235847 -POINT-3939705 -4261708 -POINT-3808166 -4380447 -POINT-3778574 -4405224 -POINT-3642700 -4518989 -POINT-3612210 -4542649 -POINT-3472213 -4651283 -POINT-3440867 -4673792 -POINT-3296936 -4777145 -POINT-3264770 -4798476 -POINT-3117080 -4896415 -POINT-3084145 -4916534 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2710382 -5132103 -POINT-2552719 -5212990 -POINT-2357193 -5304291 -POINT-2158401 -5388260 -POINT-1956619 -5464782 -POINT-1920052 -5477117 -POINT-1752151 -5533752 -POINT-1545242 -5595077 -POINT-1507859 -5604661 -POINT-1336212 -5648666 -POINT-1298496 -5656853 -POINT-1125320 -5694443 -POINT-1087328 -5701223 -POINT-912887 -5732353 -POINT-699173 -5762344 -POINT-484512 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807159 -5748344 -POINT845271 -5742271 -POINT1020263 -5714386 -POINT1231964 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1686769 -5553724 -POINT1855697 -5500221 -POINT2058853 -5427459 -POINT2094678 -5413105 -POINT2259170 -5347198 -POINT2294438 -5331524 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2873617 -5043065 -POINT3026519 -4953514 -POINT3059075 -4932787 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3417078 -4691939 -POINT3559066 -4585930 -POINT3589112 -4561707 -POINT3727066 -4450485 -POINT3889923 -4308891 -POINT3918085 -4282504 -POINT4047393 -4161346 -POINT4074557 -4133930 -POINT4199280 -4008049 -POINT4225404 -3979641 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619293 -3515800 -POINT4642096 -3484662 -POINT4746795 -3341690 -POINT4768422 -3309725 -POINT4867721 -3162956 -POINT4888144 -3130211 -POINT4981918 -2979858 -POINT5001113 -2946376 -POINT5089248 -2792640 -POINT5107183 -2758468 -POINT5189529 -2601562 -POINT5206181 -2566745 -POINT5282638 -2406883 -POINT5297986 -2371473 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5459526 -1971375 -POINT5517715 -1804000 -POINT5529027 -1767102 -POINT5580963 -1597679 -POINT5590894 -1560386 -POINT5636490 -1389152 -POINT5684234 -1178695 -POINT5691368 -1140768 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5782974 -500262 -POINT5796142 -323547 -POINT5797575 -284981 -POINT5804153 -107902 -POINT5804153 107894 -POINT5796142 323547 -POINT5793274 362033 -POINT5780105 538742 -POINT5775810 577096 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5675696 1216332 -POINT5636490 1389144 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5505042 1840453 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282638 2406883 -POINT5265987 2441698 -POINT5189529 2601555 -POINT5171595 2635727 -POINT5089248 2792633 -POINT4981918 2979850 -POINT4961495 3012597 -POINT4867721 3162956 -POINT4846095 3194919 -POINT4746795 3341682 -POINT4723993 3372820 -POINT4619293 3515792 -POINT4485428 3685043 -POINT4460377 3714402 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT4019231 4187727 -POINT3889923 4308891 -POINT3860797 4334213 -POINT3727066 4450477 -POINT3559066 4585922 -POINT3528143 4609011 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026519 4953514 -POINT2993219 4973017 -POINT2840316 5062568 -POINT2806311 5080821 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259170 5347198 -POINT2223345 5361551 -POINT2058853 5427452 -POINT2022520 5440465 -POINT1855697 5500213 -POINT1818906 5511866 -POINT1649978 5565368 -POINT1612778 5575646 -POINT1441970 5622833 -POINT1404413 5631721 -POINT1231964 5672531 -POINT1020263 5714386 -POINT807159 5748337 -POINT768848 5752990 -POINT592941 5774353 -POINT377899 5792381 -POINT339348 5794174 -POINT162338 5802406 -POINT123746 5802765 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-307678 5795884 -POINT-484512 5784363 -POINT-699173 5762344 -POINT-737394 5756981 -POINT-912887 5732353 -POINT-1125320 5694443 -POINT-1336212 5648659 -POINT-1545242 5595070 -POINT-1752151 5533745 -POINT-1956619 5464775 -POINT-1992706 5451090 -POINT-2158401 5388252 -POINT-2193953 5373235 -POINT-2357193 5304283 -POINT-2392161 5287955 -POINT-2552719 5212982 -POINT-2587057 5195366 -POINT-2744720 5114479 -POINT-2778378 5095598 -POINT-2932922 5008903 -POINT-2965857 4988785 -POINT-3117080 4896408 -POINT-3149246 4875079 -POINT-3296936 4777145 -POINT-3328282 4754635 -POINT-3472213 4651275 -POINT-3502703 4627616 -POINT-3642700 4518982 -POINT-3808166 4380440 -POINT-3836814 4354581 -POINT-3968353 4235847 -POINT-3996019 4208940 -POINT-4123047 4085395 -POINT-4149697 4057479 -POINT-4272064 3929298 -POINT-4297656 3900411 -POINT-4415161 3767776 -POINT-4552154 3601043 -POINT-4575530 3570334 -POINT-4682861 3429329 -POINT-4705080 3397773 -POINT-4807098 3252884 -POINT-4924682 3071937 -POINT-4944494 3038817 -POINT-5035461 2886741 -POINT-5054029 2852908 -POINT-5139282 2697563 -POINT-5156578 2663063 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608703 1493667 -POINT-5617938 1456195 -POINT-5660339 1284141 -POINT-5704162 1072837 -POINT-5710589 1034783 -POINT-5740097 860054 -POINT-5745105 821788 -POINT-5768097 646087 -POINT-5771680 607660 -POINT-5788131 431221 -POINT-5790282 392687 -POINT-5800155 215759 -POINT-5800873 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID343 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431221 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608688 -1493675 -POINT-5549301 -1701133 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-4924667 -3071937 -POINT-4807083 -3252884 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235847 -POINT-3808151 -4380447 -POINT-3642700 -4518989 -POINT-3472213 -4651283 -POINT-3296920 -4777145 -POINT-3117080 -4896415 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545242 -5595077 -POINT-1336196 -5648666 -POINT-1125320 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807174 -5748344 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1855697 -5500221 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585930 -POINT3727081 -4450485 -POINT3889923 -4308891 -POINT4047393 -4161346 -POINT4199280 -4008049 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619308 -3515800 -POINT4746795 -3341690 -POINT4867721 -3162956 -POINT4981933 -2979858 -POINT5089248 -2792640 -POINT5189529 -2601562 -POINT5282654 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5517715 -1804000 -POINT5580963 -1597679 -POINT5636490 -1389152 -POINT5684234 -1178703 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5796142 -323547 -POINT5804168 -107902 -POINT5804168 107894 -POINT5796142 323547 -POINT5780105 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517715 1804000 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5089248 2792633 -POINT4981933 2979850 -POINT4867721 3162956 -POINT4746795 3341682 -POINT4619308 3515792 -POINT4485428 3685043 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT3889923 4308891 -POINT3727081 4450477 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837608 -POINT3026535 4953514 -POINT2840316 5062568 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347191 -POINT2058868 5427452 -POINT1855697 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT592941 5774353 -POINT377899 5792381 -POINT162338 5802406 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533745 -POINT-1956619 5464775 -POINT-2158386 5388252 -POINT-2357177 5304283 -POINT-2552719 5212982 -POINT-2744720 5114479 -POINT-2932922 5008903 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929298 -POINT-4415146 3767776 -POINT-4552154 3601043 -POINT-4682861 3429329 -POINT-4807083 3252876 -POINT-4924667 3071930 -POINT-5035461 2886741 -POINT-5139282 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5608688 1493667 -POINT-5660339 1284141 -POINT-5704162 1072837 -POINT-5740097 860054 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803451 -38586 -POINT-5800155 -215759 -POINT-5798005 -254292 -POINT-5788131 -431221 -POINT-5784549 -469648 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5696325 -1110635 -POINT-5660339 -1284149 -POINT-5651102 -1321621 -POINT-5608688 -1493675 -POINT-5549301 -1701133 -POINT-5537308 -1737815 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5309468 -2343400 -POINT-5235992 -2504654 -POINT-5139282 -2697563 -POINT-5035461 -2886749 -POINT-5015647 -2919868 -POINT-4924667 -3071937 -POINT-4903638 -3104298 -POINT-4807083 -3252884 -POINT-4784867 -3284441 -POINT-4682861 -3429336 -POINT-4552154 -3601043 -POINT-4527652 -3630862 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235847 -POINT-3939690 -4261708 -POINT-3808151 -4380447 -POINT-3642700 -4518989 -POINT-3612210 -4542649 -POINT-3472213 -4651283 -POINT-3440864 -4673792 -POINT-3296920 -4777145 -POINT-3264758 -4798476 -POINT-3117080 -4896415 -POINT-3084145 -4916534 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2710382 -5132103 -POINT-2552719 -5212990 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1920049 -5477117 -POINT-1752136 -5533752 -POINT-1545242 -5595077 -POINT-1507856 -5604661 -POINT-1336196 -5648666 -POINT-1298483 -5656853 -POINT-1125320 -5694443 -POINT-1087325 -5701223 -POINT-912872 -5732353 -POINT-699173 -5762344 -POINT-484497 -5784370 -POINT-269165 -5798401 -POINT-53451 -5804420 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807174 -5748344 -POINT845286 -5742271 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622841 -POINT1649978 -5565376 -POINT1686769 -5553724 -POINT1855697 -5500221 -POINT1892033 -5487208 -POINT2058868 -5427459 -POINT2094693 -5413105 -POINT2259185 -5347198 -POINT2294451 -5331524 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2873620 -5043065 -POINT3026535 -4953514 -POINT3059088 -4932787 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3417081 -4691939 -POINT3559082 -4585930 -POINT3589127 -4561707 -POINT3727081 -4450485 -POINT3889923 -4308891 -POINT3918085 -4282504 -POINT4047393 -4161346 -POINT4074557 -4133930 -POINT4199280 -4008049 -POINT4225404 -3979641 -POINT4345352 -3849205 -POINT4485428 -3685051 -POINT4619308 -3515800 -POINT4642108 -3484662 -POINT4746795 -3341690 -POINT4768422 -3309725 -POINT4867721 -3162956 -POINT4888147 -3130211 -POINT4981933 -2979858 -POINT5001126 -2946376 -POINT5089248 -2792640 -POINT5107183 -2758468 -POINT5189529 -2601562 -POINT5206184 -2566745 -POINT5282654 -2406883 -POINT5368454 -2208885 -POINT5446853 -2007827 -POINT5459526 -1971375 -POINT5517715 -1804000 -POINT5529027 -1767102 -POINT5580963 -1597679 -POINT5590894 -1560386 -POINT5636490 -1389152 -POINT5684234 -1178703 -POINT5691368 -1140774 -POINT5724121 -966621 -POINT5756088 -753204 -POINT5780105 -538749 -POINT5782974 -500262 -POINT5796142 -323547 -POINT5797578 -284981 -POINT5804168 -107902 -POINT5804168 107894 -POINT5802733 146462 -POINT5796142 323547 -POINT5793274 362033 -POINT5780105 538742 -POINT5775810 577096 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5675696 1216332 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517715 1804000 -POINT5505042 1840453 -POINT5446853 2007827 -POINT5368454 2208877 -POINT5282654 2406883 -POINT5189529 2601555 -POINT5171595 2635727 -POINT5089248 2792633 -POINT5070056 2826115 -POINT4981933 2979850 -POINT4961508 3012597 -POINT4867721 3162956 -POINT4846095 3194919 -POINT4746795 3341682 -POINT4619308 3515792 -POINT4595365 3546061 -POINT4485428 3685043 -POINT4460377 3714402 -POINT4345352 3849205 -POINT4199280 4008041 -POINT4047393 4161338 -POINT4019231 4187727 -POINT3889923 4308891 -POINT3860800 4334213 -POINT3727081 4450477 -POINT3697036 4474701 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837608 -POINT3176004 4858337 -POINT3026535 4953514 -POINT2840316 5062568 -POINT2806311 5080821 -POINT2650177 5164627 -POINT2456375 5259544 -POINT2259185 5347191 -POINT2058868 5427452 -POINT2022533 5440465 -POINT1855697 5500213 -POINT1818906 5511866 -POINT1649978 5565368 -POINT1612778 5575646 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT768860 5752990 -POINT592941 5774353 -POINT377899 5792381 -POINT339348 5794174 -POINT162338 5802406 -POINT123746 5802765 -POINT-53451 5804413 -POINT-269165 5798393 -POINT-307675 5795884 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-737391 5756981 -POINT-912872 5732353 -POINT-1125320 5694443 -POINT-1336196 5648659 -POINT-1545242 5595070 -POINT-1752136 5533745 -POINT-1956619 5464775 -POINT-1992703 5451090 -POINT-2158386 5388252 -POINT-2193938 5373235 -POINT-2357177 5304283 -POINT-2392148 5287955 -POINT-2552719 5212982 -POINT-2587057 5195366 -POINT-2744720 5114479 -POINT-2778378 5095598 -POINT-2932922 5008903 -POINT-2965857 4988785 -POINT-3117080 4896408 -POINT-3149243 4875079 -POINT-3296920 4777145 -POINT-3328270 4754635 -POINT-3472213 4651275 -POINT-3502703 4627616 -POINT-3642700 4518982 -POINT-3808151 4380440 -POINT-3836799 4354581 -POINT-3968338 4235847 -POINT-4123047 4085395 -POINT-4272049 3929298 -POINT-4297641 3900411 -POINT-4415146 3767776 -POINT-4552154 3601043 -POINT-4575530 3570334 -POINT-4682861 3429329 -POINT-4807083 3252876 -POINT-4924667 3071930 -POINT-4944482 3038810 -POINT-5035461 2886741 -POINT-5054029 2852908 -POINT-5139282 2697563 -POINT-5156578 2663063 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108719 -POINT-5482239 1906242 -POINT-5549301 1701133 -POINT-5559922 1664030 -POINT-5608688 1493667 -POINT-5660339 1284141 -POINT-5704162 1072837 -POINT-5710589 1034783 -POINT-5740097 860054 -POINT-5745105 821788 -POINT-5768097 646087 -POINT-5771680 607660 -POINT-5788131 431221 -POINT-5790282 392687 -POINT-5800155 215759 -POINT-5800873 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID354 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788131 -431221 -POINT-5768097 -646083 -POINT-5740097 -860057 -POINT-5704162 -1072841 -POINT-5660339 -1284141 -POINT-5608688 -1493667 -POINT-5549301 -1701129 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504650 -POINT-5139267 -2697563 -POINT-5035461 -2886741 -POINT-4924667 -3071933 -POINT-4807083 -3252880 -POINT-4682861 -3429332 -POINT-4552154 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929302 -POINT-4123047 -4085399 -POINT-3968338 -4235847 -POINT-3808151 -4380443 -POINT-3642700 -4518982 -POINT-3472213 -4651279 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008907 -POINT-2744720 -5114479 -POINT-2552719 -5212986 -POINT-2357177 -5304287 -POINT-2158386 -5388256 -POINT-1956619 -5464779 -POINT-1752136 -5533748 -POINT-1545242 -5595070 -POINT-1336196 -5648659 -POINT-1125320 -5694443 -POINT-912872 -5732353 -POINT-699173 -5762340 -POINT-484497 -5784366 -POINT-269165 -5798397 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT592941 -5774353 -POINT807174 -5748340 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622837 -POINT1649978 -5565372 -POINT1855697 -5500213 -POINT2058868 -5427456 -POINT2259185 -5347194 -POINT2456375 -5259544 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT3026535 -4953514 -POINT3208557 -4837612 -POINT3386154 -4715027 -POINT3559082 -4585922 -POINT3727081 -4450481 -POINT3889923 -4308887 -POINT4047393 -4161342 -POINT4199280 -4008041 -POINT4345352 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515792 -POINT4746795 -3341682 -POINT4867721 -3162952 -POINT4981933 -2979854 -POINT5089248 -2792633 -POINT5189529 -2601555 -POINT5282654 -2406883 -POINT5368454 -2208881 -POINT5446853 -2007827 -POINT5517715 -1803997 -POINT5580963 -1597675 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966617 -POINT5756088 -753200 -POINT5780105 -538745 -POINT5796142 -323543 -POINT5804168 -107898 -POINT5804168 107898 -POINT5796142 323547 -POINT5780105 538749 -POINT5756088 753204 -POINT5724121 966621 -POINT5684234 1178699 -POINT5636490 1389148 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5446853 2007831 -POINT5368454 2208885 -POINT5282654 2406883 -POINT5189529 2601558 -POINT5089248 2792637 -POINT4981933 2979854 -POINT4867721 3162956 -POINT4746795 3341686 -POINT4619308 3515796 -POINT4485428 3685047 -POINT4345352 3849205 -POINT4199280 4008045 -POINT4047393 4161342 -POINT3889923 4308891 -POINT3727081 4450485 -POINT3559082 4585926 -POINT3386154 4715030 -POINT3208557 4837616 -POINT3026535 4953518 -POINT2840316 5062572 -POINT2650177 5164627 -POINT2456375 5259548 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855697 5500217 -POINT1649978 5565372 -POINT1441970 5622841 -POINT1231979 5672535 -POINT1020278 5714386 -POINT807174 5748344 -POINT592941 5774353 -POINT377899 5792385 -POINT162338 5802410 -POINT-53451 5804416 -POINT-269165 5798401 -POINT-484497 5784370 -POINT-699173 5762344 -POINT-912872 5732357 -POINT-1125320 5694443 -POINT-1336196 5648662 -POINT-1545242 5595073 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2552719 5212990 -POINT-2744720 5114483 -POINT-2932922 5008907 -POINT-3117080 4896412 -POINT-3296920 4777149 -POINT-3472213 4651279 -POINT-3642700 4518986 -POINT-3808151 4380443 -POINT-3968338 4235851 -POINT-4123047 4085399 -POINT-4272049 3929306 -POINT-4415146 3767780 -POINT-4552154 3601043 -POINT-4682861 3429332 -POINT-4807083 3252884 -POINT-4924667 3071937 -POINT-5035461 2886745 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108722 -POINT-5482239 1906246 -POINT-5549301 1701133 -POINT-5608688 1493671 -POINT-5660339 1284145 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788131 431221 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803451 -38586 -POINT-5800155 -215759 -POINT-5798005 -254292 -POINT-5788131 -431221 -POINT-5784549 -469647 -POINT-5768097 -646083 -POINT-5740097 -860057 -POINT-5704162 -1072841 -POINT-5696325 -1110630 -POINT-5660339 -1284141 -POINT-5651102 -1321613 -POINT-5608688 -1493667 -POINT-5549301 -1701129 -POINT-5537308 -1737812 -POINT-5482239 -1906242 -POINT-5407593 -2108719 -POINT-5325470 -2308281 -POINT-5235992 -2504650 -POINT-5139267 -2697563 -POINT-5035461 -2886741 -POINT-5015647 -2919861 -POINT-4924667 -3071933 -POINT-4903638 -3104294 -POINT-4807083 -3252880 -POINT-4784867 -3284437 -POINT-4682861 -3429332 -POINT-4552154 -3601043 -POINT-4527652 -3630862 -POINT-4415146 -3767776 -POINT-4389554 -3796664 -POINT-4272049 -3929302 -POINT-4245401 -3957219 -POINT-4123047 -4085399 -POINT-4095378 -4112306 -POINT-3968338 -4235847 -POINT-3939690 -4261707 -POINT-3808151 -4380443 -POINT-3778561 -4405220 -POINT-3642700 -4518982 -POINT-3472213 -4651279 -POINT-3440864 -4673789 -POINT-3296920 -4777145 -POINT-3264758 -4798474 -POINT-3117080 -4896408 -POINT-3084145 -4916528 -POINT-2932922 -5008907 -POINT-2744720 -5114479 -POINT-2552719 -5212986 -POINT-2357177 -5304287 -POINT-2158386 -5388256 -POINT-1956619 -5464779 -POINT-1752136 -5533748 -POINT-1715135 -5544715 -POINT-1545242 -5595070 -POINT-1507856 -5604654 -POINT-1336196 -5648659 -POINT-1298483 -5656847 -POINT-1125320 -5694443 -POINT-1087325 -5701223 -POINT-912872 -5732353 -POINT-874654 -5737716 -POINT-699173 -5762340 -POINT-484497 -5784366 -POINT-269165 -5798397 -POINT-230586 -5799473 -POINT-53451 -5804413 -POINT162338 -5802406 -POINT377899 -5792381 -POINT416357 -5789157 -POINT592941 -5774353 -POINT631255 -5769701 -POINT807174 -5748340 -POINT845286 -5742268 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1269534 -5663644 -POINT1441970 -5622837 -POINT1479171 -5612560 -POINT1649978 -5565372 -POINT1686769 -5553719 -POINT1855697 -5500213 -POINT1892033 -5487201 -POINT2058868 -5427456 -POINT2259185 -5347194 -POINT2294451 -5331519 -POINT2456375 -5259544 -POINT2491035 -5242569 -POINT2650177 -5164627 -POINT2840316 -5062568 -POINT2873620 -5043065 -POINT3026535 -4953514 -POINT3059088 -4932786 -POINT3208557 -4837612 -POINT3386154 -4715027 -POINT3559082 -4585922 -POINT3589127 -4561700 -POINT3727081 -4450481 -POINT3889923 -4308887 -POINT3918085 -4282500 -POINT4047393 -4161342 -POINT4074557 -4133926 -POINT4199280 -4008041 -POINT4225404 -3979635 -POINT4345352 -3849205 -POINT4485428 -3685047 -POINT4619308 -3515792 -POINT4642108 -3484654 -POINT4746795 -3341682 -POINT4768422 -3309718 -POINT4867721 -3162952 -POINT4888147 -3130207 -POINT4981933 -2979854 -POINT5001126 -2946371 -POINT5089248 -2792633 -POINT5107183 -2758460 -POINT5189529 -2601555 -POINT5206184 -2566739 -POINT5282654 -2406883 -POINT5368454 -2208881 -POINT5446853 -2007827 -POINT5459526 -1971374 -POINT5517715 -1803997 -POINT5529027 -1767098 -POINT5580963 -1597675 -POINT5590894 -1560381 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5691368 -1140767 -POINT5724121 -966617 -POINT5756088 -753200 -POINT5780105 -538745 -POINT5782974 -500258 -POINT5796142 -323543 -POINT5797578 -284977 -POINT5804168 -107898 -POINT5804168 107898 -POINT5802733 146465 -POINT5796142 323547 -POINT5793274 362034 -POINT5780105 538749 -POINT5775810 577103 -POINT5756088 753204 -POINT5750371 791372 -POINT5724121 966621 -POINT5684234 1178699 -POINT5675696 1216336 -POINT5636490 1389148 -POINT5580963 1597679 -POINT5517715 1804000 -POINT5505042 1840454 -POINT5446853 2007831 -POINT5432832 2043788 -POINT5368454 2208885 -POINT5282654 2406883 -POINT5189529 2601558 -POINT5171595 2635731 -POINT5089248 2792637 -POINT5070056 2826119 -POINT4981933 2979854 -POINT4961508 3012600 -POINT4867721 3162956 -POINT4846095 3194920 -POINT4746795 3341686 -POINT4619308 3515796 -POINT4595365 3546065 -POINT4485428 3685047 -POINT4460377 3714405 -POINT4345352 3849205 -POINT4199280 4008045 -POINT4047393 4161342 -POINT4019231 4187730 -POINT3889923 4308891 -POINT3860800 4334214 -POINT3727081 4450485 -POINT3559082 4585926 -POINT3386154 4715030 -POINT3208557 4837616 -POINT3026535 4953518 -POINT2840316 5062572 -POINT2806311 5080824 -POINT2650177 5164627 -POINT2615517 5181603 -POINT2456375 5259548 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855697 5500217 -POINT1818906 5511870 -POINT1649978 5565372 -POINT1612778 5575650 -POINT1441970 5622841 -POINT1231979 5672535 -POINT1194118 5680020 -POINT1020278 5714386 -POINT982167 5720459 -POINT807174 5748344 -POINT768860 5752996 -POINT592941 5774353 -POINT554482 5777578 -POINT377899 5792385 -POINT339348 5794178 -POINT162338 5802410 -POINT123746 5802769 -POINT-53451 5804416 -POINT-92030 5803341 -POINT-269165 5798401 -POINT-307675 5795892 -POINT-484497 5784370 -POINT-522889 5780431 -POINT-699173 5762344 -POINT-912872 5732357 -POINT-1125320 5694443 -POINT-1336196 5648662 -POINT-1545242 5595073 -POINT-1582243 5584107 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-1992703 5451097 -POINT-2158386 5388260 -POINT-2193938 5373243 -POINT-2357177 5304291 -POINT-2552719 5212990 -POINT-2744720 5114483 -POINT-2932922 5008907 -POINT-3117080 4896412 -POINT-3149243 4875083 -POINT-3296920 4777149 -POINT-3328270 4754638 -POINT-3472213 4651279 -POINT-3502703 4627620 -POINT-3642700 4518986 -POINT-3808151 4380443 -POINT-3968338 4235851 -POINT-4123047 4085399 -POINT-4272049 3929306 -POINT-4415146 3767780 -POINT-4552154 3601043 -POINT-4575530 3570334 -POINT-4682861 3429332 -POINT-4705077 3397776 -POINT-4807083 3252884 -POINT-4924667 3071937 -POINT-4944482 3038817 -POINT-5035461 2886745 -POINT-5054026 2852912 -POINT-5139267 2697563 -POINT-5235992 2504654 -POINT-5325470 2308281 -POINT-5407593 2108722 -POINT-5420943 2072511 -POINT-5482239 1906246 -POINT-5549301 1701133 -POINT-5559922 1664030 -POINT-5608688 1493671 -POINT-5660339 1284145 -POINT-5704162 1072845 -POINT-5710589 1034791 -POINT-5740097 860061 -POINT-5745105 821794 -POINT-5768097 646087 -POINT-5771680 607660 -POINT-5788131 431221 -POINT-5790282 392687 -POINT-5800155 215759 -POINT-5800873 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID365 -TOTAL_HEIGHT2753757 -POLYGON_AT_HEIGHT0 -POINT-5804168 0 -POINT-5800155 -215759 -POINT-5788116 -431228 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5660339 -1284149 -POINT-5608688 -1493667 -POINT-5549301 -1701141 -POINT-5482223 -1906250 -POINT-5407593 -2108719 -POINT-5325470 -2308288 -POINT-5235992 -2504654 -POINT-5139267 -2697570 -POINT-5035446 -2886749 -POINT-4924667 -3071945 -POINT-4807083 -3252884 -POINT-4682846 -3429336 -POINT-4552154 -3601043 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3296920 -4777145 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2552703 -5212982 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1752136 -5533752 -POINT-1545242 -5595077 -POINT-1336196 -5648666 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-484497 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807174 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1441970 -5622833 -POINT1649978 -5565368 -POINT1855712 -5500213 -POINT2058868 -5427459 -POINT2259185 -5347198 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2840316 -5062576 -POINT3026535 -4953521 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585922 -POINT3727081 -4450485 -POINT3889923 -4308899 -POINT4047393 -4161346 -POINT4199280 -4008041 -POINT4345352 -3849212 -POINT4485428 -3685043 -POINT4619308 -3515792 -POINT4746795 -3341690 -POINT4867721 -3162964 -POINT4981933 -2979858 -POINT5089248 -2792633 -POINT5189529 -2601562 -POINT5282654 -2406891 -POINT5368469 -2208877 -POINT5446853 -2007827 -POINT5517730 -1804000 -POINT5580963 -1597686 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5724121 -966613 -POINT5756088 -753204 -POINT5780121 -538742 -POINT5796142 -323547 -POINT5804168 -107894 -POINT5804168 107894 -POINT5796142 323547 -POINT5780121 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517730 1804000 -POINT5446853 2007827 -POINT5368469 2208877 -POINT5282654 2406875 -POINT5189529 2601562 -POINT5089248 2792633 -POINT4981933 2979858 -POINT4867721 3162948 -POINT4746795 3341690 -POINT4619308 3515792 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4199280 4008041 -POINT4047393 4161346 -POINT3889923 4308883 -POINT3727081 4450485 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3026535 4953506 -POINT2840316 5062561 -POINT2650177 5164627 -POINT2456375 5259537 -POINT2259185 5347198 -POINT2058868 5427459 -POINT1855712 5500213 -POINT1649978 5565368 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT592941 5774353 -POINT377899 5792389 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-912872 5732345 -POINT-1125320 5694443 -POINT-1336196 5648666 -POINT-1545242 5595077 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-2158386 5388260 -POINT-2357177 5304291 -POINT-2552703 5212982 -POINT-2744720 5114486 -POINT-2932922 5008911 -POINT-3117080 4896408 -POINT-3296920 4777145 -POINT-3472213 4651275 -POINT-3642700 4518982 -POINT-3808151 4380447 -POINT-3968338 4235840 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415146 3767776 -POINT-4552154 3601043 -POINT-4682846 3429336 -POINT-4807083 3252884 -POINT-4924667 3071930 -POINT-5035446 2886749 -POINT-5139267 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5482223 1906234 -POINT-5549301 1701126 -POINT-5608688 1493667 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5740097 860061 -POINT-5768097 646087 -POINT-5788116 431213 -POINT-5800155 215759 -POLYGON_AT_HEIGHT2000000 -POINT-5804168 0 -POINT-5803451 -38586 -POINT-5800155 -215759 -POINT-5798002 -254294 -POINT-5788116 -431228 -POINT-5784536 -469654 -POINT-5768097 -646087 -POINT-5740097 -860061 -POINT-5704162 -1072845 -POINT-5696325 -1110635 -POINT-5660339 -1284149 -POINT-5651102 -1321619 -POINT-5608688 -1493667 -POINT-5549301 -1701141 -POINT-5537305 -1737823 -POINT-5482223 -1906250 -POINT-5407593 -2108719 -POINT-5325470 -2308288 -POINT-5309468 -2343406 -POINT-5235992 -2504654 -POINT-5139267 -2697570 -POINT-5035446 -2886749 -POINT-5015634 -2919870 -POINT-4924667 -3071945 -POINT-4807083 -3252884 -POINT-4682846 -3429336 -POINT-4552154 -3601043 -POINT-4527652 -3630862 -POINT-4415146 -3767776 -POINT-4272049 -3929306 -POINT-4123047 -4085403 -POINT-3968338 -4235855 -POINT-3939690 -4261714 -POINT-3808151 -4380447 -POINT-3642700 -4518982 -POINT-3472213 -4651275 -POINT-3440864 -4673786 -POINT-3296920 -4777145 -POINT-3264758 -4798474 -POINT-3117080 -4896408 -POINT-2932922 -5008911 -POINT-2744720 -5114486 -POINT-2710380 -5132101 -POINT-2552703 -5212982 -POINT-2517735 -5229312 -POINT-2357177 -5304291 -POINT-2158386 -5388260 -POINT-1956619 -5464782 -POINT-1920049 -5477117 -POINT-1752136 -5533752 -POINT-1545242 -5595077 -POINT-1507856 -5604661 -POINT-1336196 -5648666 -POINT-1298483 -5656853 -POINT-1125320 -5694443 -POINT-912872 -5732361 -POINT-699173 -5762344 -POINT-660780 -5766282 -POINT-484497 -5784363 -POINT-269165 -5798401 -POINT-53451 -5804413 -POINT162338 -5802414 -POINT377899 -5792389 -POINT592941 -5774353 -POINT807174 -5748337 -POINT1020278 -5714386 -POINT1231979 -5672531 -POINT1269534 -5663643 -POINT1441970 -5622833 -POINT1479171 -5612556 -POINT1649978 -5565368 -POINT1686772 -5553716 -POINT1855712 -5500213 -POINT1892045 -5487202 -POINT2058868 -5427459 -POINT2094693 -5413105 -POINT2259185 -5347198 -POINT2294451 -5331524 -POINT2456375 -5259552 -POINT2650177 -5164627 -POINT2684182 -5146376 -POINT2840316 -5062576 -POINT3026535 -4953521 -POINT3059088 -4932793 -POINT3208557 -4837616 -POINT3386154 -4715027 -POINT3559082 -4585922 -POINT3727081 -4450485 -POINT3756204 -4425164 -POINT3889923 -4308899 -POINT4047393 -4161346 -POINT4074557 -4133929 -POINT4199280 -4008041 -POINT4225404 -3979636 -POINT4345352 -3849212 -POINT4485428 -3685043 -POINT4619308 -3515792 -POINT4642108 -3484656 -POINT4746795 -3341690 -POINT4768422 -3309726 -POINT4867721 -3162964 -POINT4888147 -3130217 -POINT4981933 -2979858 -POINT5001126 -2946375 -POINT5089248 -2792633 -POINT5107183 -2758461 -POINT5189529 -2601562 -POINT5206184 -2566747 -POINT5282654 -2406891 -POINT5368469 -2208877 -POINT5382488 -2172921 -POINT5446853 -2007827 -POINT5459529 -1971375 -POINT5517730 -1804000 -POINT5529039 -1767103 -POINT5580963 -1597686 -POINT5590894 -1560390 -POINT5636490 -1389144 -POINT5684234 -1178695 -POINT5691368 -1140766 -POINT5724121 -966613 -POINT5729838 -928447 -POINT5756088 -753204 -POINT5780121 -538742 -POINT5796142 -323547 -POINT5797578 -284979 -POINT5804168 -107894 -POINT5804168 107894 -POINT5802733 146462 -POINT5796142 323547 -POINT5793277 362033 -POINT5780121 538742 -POINT5756088 753204 -POINT5724121 966613 -POINT5684234 1178695 -POINT5675696 1216332 -POINT5636490 1389144 -POINT5580963 1597671 -POINT5517730 1804000 -POINT5505055 1840453 -POINT5446853 2007827 -POINT5432835 2043783 -POINT5368469 2208877 -POINT5353122 2244287 -POINT5282654 2406875 -POINT5189529 2601562 -POINT5171595 2635733 -POINT5089248 2792633 -POINT5070056 2826116 -POINT4981933 2979858 -POINT4961508 3012602 -POINT4867721 3162948 -POINT4846095 3194915 -POINT4746795 3341690 -POINT4619308 3515792 -POINT4595365 3546061 -POINT4485428 3685043 -POINT4345352 3849197 -POINT4199280 4008041 -POINT4047393 4161346 -POINT4019231 4187732 -POINT3889923 4308883 -POINT3860800 4334208 -POINT3727081 4450485 -POINT3697036 4474707 -POINT3559082 4585922 -POINT3386154 4715027 -POINT3208557 4837616 -POINT3176004 4858342 -POINT3026535 4953506 -POINT2993231 4973010 -POINT2840316 5062561 -POINT2806311 5080815 -POINT2650177 5164627 -POINT2615517 5181601 -POINT2456375 5259537 -POINT2259185 5347198 -POINT2058868 5427459 -POINT2022535 5440471 -POINT1855712 5500213 -POINT1818919 5511866 -POINT1649978 5565368 -POINT1612778 5575646 -POINT1441970 5622833 -POINT1231979 5672531 -POINT1020278 5714386 -POINT807174 5748337 -POINT768860 5752990 -POINT592941 5774353 -POINT377899 5792389 -POINT339348 5794182 -POINT162338 5802414 -POINT-53451 5804413 -POINT-269165 5798401 -POINT-484497 5784363 -POINT-699173 5762344 -POINT-737391 5756979 -POINT-912872 5732345 -POINT-950866 5725567 -POINT-1125320 5694443 -POINT-1336196 5648666 -POINT-1545242 5595077 -POINT-1582243 5584110 -POINT-1752136 5533752 -POINT-1956619 5464782 -POINT-1992703 5451097 -POINT-2158386 5388260 -POINT-2193938 5373243 -POINT-2357177 5304291 -POINT-2392146 5287961 -POINT-2552703 5212982 -POINT-2587044 5195367 -POINT-2744720 5114486 -POINT-2778378 5095605 -POINT-2932922 5008911 -POINT-2965857 4988791 -POINT-3117080 4896408 -POINT-3149243 4875079 -POINT-3296920 4777145 -POINT-3328270 4754635 -POINT-3472213 4651275 -POINT-3502703 4627616 -POINT-3642700 4518982 -POINT-3808151 4380447 -POINT-3968338 4235840 -POINT-4123047 4085403 -POINT-4272049 3929306 -POINT-4415146 3767776 -POINT-4552154 3601043 -POINT-4575527 3570335 -POINT-4682846 3429336 -POINT-4705065 3397779 -POINT-4807083 3252884 -POINT-4828112 3220522 -POINT-4924667 3071930 -POINT-4944479 3038812 -POINT-5035446 2886749 -POINT-5139267 2697555 -POINT-5235992 2504654 -POINT-5325470 2308273 -POINT-5407593 2108719 -POINT-5482223 1906234 -POINT-5494220 1869552 -POINT-5549301 1701126 -POINT-5559922 1664024 -POINT-5608688 1493667 -POINT-5660339 1284149 -POINT-5704162 1072845 -POINT-5710589 1034791 -POINT-5740097 860061 -POINT-5745105 821794 -POINT-5768097 646087 -POINT-5788116 431213 -POINT-5800155 215759 -POINT-5800873 177172 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.6 b/src/libseqarrange/data/arrange_data_export.txt.6 deleted file mode 100644 index 3df8886cb3..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.6 +++ /dev/null @@ -1,300 +0,0 @@ -OBJECT_ID131 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID66 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID44 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 11999992 -POINT17000000 15999992 -POINT-17000000 15999992 -POINT-21000000 11999992 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 3999992 -POINT-21000000 3999992 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID88 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID77 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000008 -POINT17000000 16000008 -POINT-17000000 16000008 -POINT-21000000 12000008 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID120 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -15999992 -POINT21000000 -15999992 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID99 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID151 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID162 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 12000000 -POINT24439178 16000000 -POINT-24439194 16000000 -POINT-30189590 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 12000000 -POINT26286238 14715178 -POINT24439178 16000000 -POINT-24439194 16000000 -POINT-28342532 13284822 -POINT-30189590 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 4000000 -POINT-30189590 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-30189590 -16000000 -POINT30189576 -16000000 -POINT30189576 4000000 -POINT-30189590 4000000 -OBJECT_ID192 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID203 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 12000002 -POINT17000000 16000002 -POINT-17000000 16000002 -POINT-21000000 12000002 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 12000002 -POINT17000000 16000002 -POINT-17000000 16000002 -POINT-21000000 12000002 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -15999999 -POINT21000000 -15999999 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID223 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 12000000 -POINT17000004 16000000 -POINT-16999998 16000000 -POINT-20999998 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 12000000 -POINT17000004 16000000 -POINT-16999998 16000000 -POINT-20999998 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 4000000 -POINT-20999998 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-20999998 -16000000 -POINT21000004 -16000000 -POINT21000004 4000000 -POINT-20999998 4000000 -OBJECT_ID234 -TOTAL_HEIGHT62265434 -POLYGON_AT_HEIGHT0 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000002 16000000 -POINT-21000002 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000002 16000000 -POINT-21000002 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000002 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000002 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000002 4000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.7 b/src/libseqarrange/data/arrange_data_export.txt.7 deleted file mode 100644 index 05022fe1bf..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.7 +++ /dev/null @@ -1,995 +0,0 @@ -OBJECT_ID86 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID66 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID193 -TOTAL_HEIGHT12500000 -POLYGON_AT_HEIGHT0 -POINT-26999998 0 -POINT-26995364 -500228 -POINT-26981462 -1000286 -POINT-26975326 -1153968 -POINT-26974998 -1161602 -POINT-26958300 -1500000 -POINT-26778226 -3453476 -POINT-26775286 -3476200 -POINT-26385466 -5727745 -POINT-26377336 -5765064 -POINT-25799916 -7960167 -POINT-25784100 -8011245 -POINT-25025852 -10134426 -POINT-24999968 -10198116 -POINT-24068934 -12234638 -POINT-24030742 -12309479 -POINT-22936150 -14245453 -POINT-22883602 -14329712 -POINT-21635780 -16152184 -POINT-21567044 -16243851 -POINT-20177326 -17940888 -POINT-20123058 -18001740 -POINT-20090806 -18037724 -POINT-19786084 -18371468 -POINT-19442322 -18734890 -POINT-19091880 -19091882 -POINT-18734890 -19442322 -POINT-18571438 -19598510 -POINT-18465824 -19698054 -POINT-18371468 -19786086 -POINT-18001736 -20123058 -POINT-16829856 -21112930 -POINT-16704128 -21212546 -POINT-14965305 -22473086 -POINT-14818760 -22569988 -POINT-12991406 -23669036 -POINT-12823677 -23760330 -POINT-10922585 -24692046 -POINT-10733654 -24774758 -POINT-8773953 -25534638 -POINT-8564163 -25605762 -POINT-6561214 -26190656 -POINT-6331264 -26247190 -POINT-4300533 -26655308 -POINT-4051494 -26694296 -POINT-2008430 -26925196 -POINT-1741725 -26943764 -POINT-1500000 -26958302 -POINT-1000286 -26981464 -POINT-500228 -26995366 -POINT0 -27000000 -POINT23000000 -27000000 -POINT26639062 -4400032 -POINT26900054 -2321048 -POINT26909614 -2207405 -POINT26958306 -1500000 -POINT26981468 -1000286 -POINT26995370 -500228 -POINT27000000 0 -POINT26995370 500228 -POINT26981468 1000286 -POINT26958306 1500000 -POINT26909614 2207405 -POINT26900054 2321048 -POINT26639062 4400032 -POINT23000000 27000000 -POINT0 27000000 -POINT-500228 26995362 -POINT-1000286 26981460 -POINT-1500000 26958298 -POINT-1741725 26943764 -POINT-2008430 26925194 -POINT-4051494 26694298 -POINT-4300533 26655304 -POINT-6331264 26247192 -POINT-6561214 26190658 -POINT-8564163 25605758 -POINT-8773953 25534638 -POINT-10733654 24774758 -POINT-10922585 24692048 -POINT-12823677 23760330 -POINT-12991406 23669036 -POINT-14818760 22569992 -POINT-14965305 22473084 -POINT-16704128 21212548 -POINT-16829856 21112930 -POINT-18001736 20123062 -POINT-18371468 19786088 -POINT-18465824 19698052 -POINT-18571438 19598510 -POINT-18734890 19442322 -POINT-19091880 19091880 -POINT-19442322 18734894 -POINT-19786084 18371468 -POINT-20090806 18037720 -POINT-20123058 18001740 -POINT-20177326 17940888 -POINT-21567044 16243851 -POINT-21635780 16152184 -POINT-22883602 14329712 -POINT-22936150 14245453 -POINT-24030742 12309479 -POINT-24068934 12234638 -POINT-24999968 10198116 -POINT-25025852 10134426 -POINT-25784100 8011245 -POINT-25799916 7960167 -POINT-26377336 5765064 -POINT-26385466 5727745 -POINT-26775286 3476200 -POINT-26778226 3453476 -POINT-26958300 1500000 -POINT-26974998 1161602 -POINT-26975326 1153968 -POINT-26981462 1000286 -POINT-26995364 500228 -POLYGON_AT_HEIGHT2000000 -POINT-26999998 0 -POINT-26995364 -500228 -POINT-26981462 -1000286 -POINT-26975326 -1153968 -POINT-26958300 -1500000 -POINT-26778226 -3453476 -POINT-26775756 -3472564 -POINT-26712916 -3836447 -POINT-26385466 -5727745 -POINT-26378638 -5759093 -POINT-26284948 -6116280 -POINT-25799916 -7960167 -POINT-25786630 -8003073 -POINT-25662780 -8350955 -POINT-25025852 -10134426 -POINT-25004108 -10187926 -POINT-24851002 -10523960 -POINT-24068934 -12234638 -POINT-24036854 -12297504 -POINT-23855608 -12619235 -POINT-22936150 -14245453 -POINT-22892010 -14316231 -POINT-22683950 -14621307 -POINT-21635780 -16152184 -POINT-21578042 -16229183 -POINT-20177326 -17940888 -POINT-20123058 -18001740 -POINT-19786084 -18371468 -POINT-19442322 -18734890 -POINT-19091880 -19091882 -POINT-18734890 -19442322 -POINT-18571438 -19598510 -POINT-18371468 -19786086 -POINT-18001736 -20123058 -POINT-16829856 -21112930 -POINT-16724245 -21196608 -POINT-16425917 -21414232 -POINT-14965305 -22473086 -POINT-14842207 -22554484 -POINT-14526383 -22745836 -POINT-12991406 -23669036 -POINT-12850513 -23745724 -POINT-12519503 -23909404 -POINT-10922585 -24692046 -POINT-10763883 -24761524 -POINT-10420102 -24896338 -POINT-8773953 -25534638 -POINT-8597730 -25594384 -POINT-8243691 -25699344 -POINT-6561214 -26190656 -POINT-6368056 -26238146 -POINT-6006347 -26312488 -POINT-4300533 -26655308 -POINT-4091341 -26688058 -POINT-2008430 -26925196 -POINT-1580575 -26953456 -POINT-1500000 -26958302 -POINT-1000286 -26981464 -POINT-500228 -26995366 -POINT0 -27000000 -POINT23000000 -27000000 -POINT26639062 -4400032 -POINT26858296 -2653686 -POINT26901584 -2302865 -POINT26909614 -2207405 -POINT26958306 -1500000 -POINT26981468 -1000286 -POINT26995370 -500228 -POINT27000000 0 -POINT26995370 500228 -POINT26981468 1000286 -POINT26958306 1500000 -POINT26909614 2207405 -POINT26901584 2302865 -POINT26858296 2653686 -POINT26639062 4400032 -POINT23000000 27000000 -POINT0 27000000 -POINT-500228 26995362 -POINT-1000286 26981460 -POINT-1500000 26958298 -POINT-1580575 26953454 -POINT-2008430 26925194 -POINT-4091341 26688058 -POINT-4300533 26655304 -POINT-6006347 26312490 -POINT-6368056 26238148 -POINT-6561214 26190658 -POINT-8243691 25699342 -POINT-8597730 25594380 -POINT-8773953 25534638 -POINT-10420102 24896338 -POINT-10763883 24761524 -POINT-10922585 24692048 -POINT-12519503 23909404 -POINT-12850513 23745724 -POINT-12991406 23669036 -POINT-14526383 22745840 -POINT-14842207 22554488 -POINT-14965305 22473084 -POINT-16425917 21414232 -POINT-16724245 21196610 -POINT-16829856 21112930 -POINT-18001736 20123062 -POINT-18371468 19786088 -POINT-18571438 19598510 -POINT-18734890 19442322 -POINT-19091880 19091880 -POINT-19442322 18734894 -POINT-19786084 18371468 -POINT-20123058 18001740 -POINT-20177326 17940888 -POINT-21578042 16229183 -POINT-21635780 16152184 -POINT-22683950 14621307 -POINT-22892010 14316231 -POINT-22936150 14245453 -POINT-23855608 12619235 -POINT-24036854 12297504 -POINT-24068934 12234638 -POINT-24851002 10523960 -POINT-25004108 10187926 -POINT-25025852 10134426 -POINT-25662780 8350955 -POINT-25786630 8003073 -POINT-25799916 7960167 -POINT-26284948 6116280 -POINT-26378638 5759093 -POINT-26385466 5727745 -POINT-26712916 3836447 -POINT-26775756 3472564 -POINT-26778226 3453476 -POINT-26958300 1500000 -POINT-26975326 1153968 -POINT-26981462 1000286 -POINT-26995364 500228 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID170 -TOTAL_HEIGHT97534781 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID138 -TOTAL_HEIGHT41580278 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 11999998 -POINT17000000 15999998 -POINT-17000000 15999998 -POINT-21000000 11999998 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 11999998 -POINT17000000 15999998 -POINT-17000000 15999998 -POINT-19076012 13923987 -POINT-21000000 11999998 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 3999998 -POINT-21000000 3999998 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 3999998 -POINT-21000000 3999998 -OBJECT_ID44 -TOTAL_HEIGHT10000000 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT20999992 -16000000 -POINT20999992 12000000 -POINT16999992 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT20999992 -16000000 -POINT20999992 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -OBJECT_ID149 -TOTAL_HEIGHT97534781 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID118 -TOTAL_HEIGHT41580278 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-19076012 13923989 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID97 -TOTAL_HEIGHT41580278 -POLYGON_AT_HEIGHT0 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT2000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 12000000 -POINT17000000 16000000 -POINT-17000000 16000000 -POINT-19076012 13923989 -POINT-21000000 12000000 -POLYGON_AT_HEIGHT18000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -POLYGON_AT_HEIGHT26000000 -POINT-21000000 -16000000 -POINT21000000 -16000000 -POINT21000000 4000000 -POINT-21000000 4000000 -OBJECT_ID216 -TOTAL_HEIGHT49742861 -POLYGON_AT_HEIGHT0 -POINT-27000000 0 -POINT-26995362 -500228 -POINT-26981446 -1000289 -POINT-26975312 -1153968 -POINT-26975006 -1161598 -POINT-26958282 -1500000 -POINT-26778228 -3453476 -POINT-26775268 -3476204 -POINT-26385468 -5727745 -POINT-26377320 -5765068 -POINT-25799896 -7960167 -POINT-25784088 -8011245 -POINT-25025848 -10134430 -POINT-24999970 -10198113 -POINT-24068940 -12234634 -POINT-24030732 -12309479 -POINT-22936158 -14245453 -POINT-22883606 -14329712 -POINT-21635772 -16152184 -POINT-21567048 -16243851 -POINT-20177308 -17940888 -POINT-20123046 -18001740 -POINT-20090790 -18037720 -POINT-19786072 -18371468 -POINT-19442322 -18734894 -POINT-19091888 -19091880 -POINT-18734894 -19442322 -POINT-18571442 -19598510 -POINT-18465820 -19698052 -POINT-18371460 -19786088 -POINT-18001740 -20123062 -POINT-16829864 -21112930 -POINT-16704132 -21212548 -POINT-14965302 -22473084 -POINT-14818756 -22569992 -POINT-12991394 -23669036 -POINT-12823669 -23760330 -POINT-10922577 -24692048 -POINT-10733643 -24774758 -POINT-8773956 -25534638 -POINT-8564148 -25605758 -POINT-6561218 -26190658 -POINT-6331268 -26247192 -POINT-4300537 -26655304 -POINT-4051483 -26694298 -POINT-2008422 -26925194 -POINT-1741729 -26943764 -POINT-1500000 -26958298 -POINT-1000274 -26981460 -POINT-500213 -26995362 -POINT0 -27000000 -POINT23000000 -27000000 -POINT26639068 -4400032 -POINT26900054 -2321052 -POINT26909608 -2207405 -POINT26958314 -1500000 -POINT26981476 -1000289 -POINT26995362 -500228 -POINT27000000 0 -POINT26995362 500228 -POINT26981476 1000289 -POINT26958314 1500000 -POINT26909608 2207405 -POINT26900054 2321052 -POINT26639068 4400032 -POINT23000000 27000000 -POINT0 27000000 -POINT-500213 26995362 -POINT-1000274 26981460 -POINT-1500000 26958298 -POINT-1741729 26943756 -POINT-2008422 26925202 -POINT-4051483 26694290 -POINT-4300537 26655304 -POINT-6331268 26247192 -POINT-6561218 26190658 -POINT-8564148 25605758 -POINT-8773956 25534638 -POINT-10733643 24774750 -POINT-10922577 24692048 -POINT-12823669 23760330 -POINT-12991394 23669036 -POINT-14818756 22569992 -POINT-14965302 22473084 -POINT-16704132 21212548 -POINT-16829864 21112930 -POINT-18001740 20123062 -POINT-18371460 19786088 -POINT-18465820 19698052 -POINT-18571442 19598510 -POINT-18734894 19442322 -POINT-19091888 19091880 -POINT-19442322 18734894 -POINT-19786072 18371468 -POINT-20090790 18037720 -POINT-20123046 18001740 -POINT-20177308 17940888 -POINT-21567048 16243851 -POINT-21635772 16152184 -POINT-22883606 14329712 -POINT-22936158 14245453 -POINT-24030732 12309479 -POINT-24068940 12234634 -POINT-24999970 10198113 -POINT-25025848 10134430 -POINT-25784088 8011245 -POINT-25799896 7960167 -POINT-26377320 5765068 -POINT-26385468 5727745 -POINT-26775268 3476204 -POINT-26778228 3453476 -POINT-26958282 1500000 -POINT-26975006 1161598 -POINT-26975312 1153968 -POINT-26981446 1000289 -POINT-26995362 500228 -POLYGON_AT_HEIGHT2000000 -POINT-27000000 0 -POINT-26995362 -500228 -POINT-26981446 -1000289 -POINT-26975312 -1153968 -POINT-26970804 -1246636 -POINT-26958282 -1500000 -POINT-26778228 -3453476 -POINT-26775386 -3475290 -POINT-26759596 -3566731 -POINT-26385468 -5727745 -POINT-26377648 -5763567 -POINT-26354104 -5853326 -POINT-25799896 -7960167 -POINT-25784724 -8009192 -POINT-25753602 -8096612 -POINT-25025848 -10134430 -POINT-25001010 -10195552 -POINT-24962536 -10279995 -POINT-24068940 -12234634 -POINT-24032266 -12306470 -POINT-23986722 -12387318 -POINT-22936158 -14245453 -POINT-22885720 -14326324 -POINT-22833436 -14402988 -POINT-21635772 -16152184 -POINT-21569810 -16240166 -POINT-20177308 -17940888 -POINT-20123046 -18001740 -POINT-20098896 -18028678 -POINT-20014218 -18121588 -POINT-19786072 -18371468 -POINT-19442322 -18734894 -POINT-19091888 -19091880 -POINT-18734894 -19442322 -POINT-18571442 -19598510 -POINT-18442108 -19720174 -POINT-18371460 -19786088 -POINT-18001740 -20123062 -POINT-16829864 -21112930 -POINT-16709187 -21208542 -POINT-16634220 -21263230 -POINT-14965302 -22473084 -POINT-14824648 -22566096 -POINT-14745284 -22614182 -POINT-12991394 -23669036 -POINT-12830413 -23756660 -POINT-12747232 -23797792 -POINT-10922577 -24692048 -POINT-10741239 -24771432 -POINT-10654850 -24805310 -POINT-8773956 -25534638 -POINT-8572584 -25602900 -POINT-8483617 -25629276 -POINT-6561218 -26190658 -POINT-6340513 -26244918 -POINT-6249619 -26263602 -POINT-4300537 -26655304 -POINT-4061496 -26692730 -POINT-2008422 -26925194 -POINT-1701233 -26946200 -POINT-1500000 -26958298 -POINT-1000274 -26981460 -POINT-500213 -26995362 -POINT0 -27000000 -POINT23000000 -27000000 -POINT26639068 -4400032 -POINT26889560 -2404641 -POINT26900438 -2316483 -POINT26909608 -2207405 -POINT26958314 -1500000 -POINT26981476 -1000289 -POINT26995362 -500228 -POINT27000000 0 -POINT26995362 500228 -POINT26981476 1000289 -POINT26958314 1500000 -POINT26909608 2207405 -POINT26900438 2316483 -POINT26889560 2404641 -POINT26639068 4400032 -POINT23000000 27000000 -POINT0 27000000 -POINT-500213 26995362 -POINT-1000274 26981460 -POINT-1500000 26958298 -POINT-1701233 26946192 -POINT-2008422 26925202 -POINT-4061496 26692722 -POINT-4300537 26655304 -POINT-6249619 26263602 -POINT-6340513 26244918 -POINT-6561218 26190658 -POINT-8483617 25629276 -POINT-8572584 25602900 -POINT-8773956 25534638 -POINT-10654850 24805302 -POINT-10741239 24771426 -POINT-10922577 24692048 -POINT-12747232 23797792 -POINT-12830413 23756660 -POINT-12991394 23669036 -POINT-14745284 22614182 -POINT-14824648 22566096 -POINT-14965302 22473084 -POINT-16634220 21263230 -POINT-16709187 21208542 -POINT-16829864 21112930 -POINT-18001740 20123062 -POINT-18371460 19786088 -POINT-18442108 19720174 -POINT-18571442 19598510 -POINT-18734894 19442322 -POINT-19091888 19091880 -POINT-19442322 18734894 -POINT-19786072 18371468 -POINT-20014218 18121588 -POINT-20098896 18028678 -POINT-20123046 18001740 -POINT-20177308 17940888 -POINT-21569810 16240166 -POINT-21635772 16152184 -POINT-22833436 14402988 -POINT-22885720 14326324 -POINT-22936158 14245453 -POINT-23986722 12387318 -POINT-24032266 12306470 -POINT-24068940 12234634 -POINT-24962536 10279995 -POINT-25001010 10195552 -POINT-25025848 10134430 -POINT-25753602 8096612 -POINT-25784724 8009192 -POINT-25799896 7960167 -POINT-26354104 5853326 -POINT-26377648 5763567 -POINT-26385468 5727745 -POINT-26759596 3566731 -POINT-26775386 3475290 -POINT-26778228 3453476 -POINT-26958282 1500000 -POINT-26970804 1246636 -POINT-26975312 1153968 -POINT-26981446 1000289 -POINT-26995362 500228 -POLYGON_AT_HEIGHT18000000 -POINT-26996042 -185031 -POINT-26992146 -605051 -POINT-26980462 -1024931 -POINT-26975312 -1153968 -POINT-26961014 -1444516 -POINT-26929412 -1813227 -POINT-26778228 -3453476 -POINT-26776340 -3467979 -POINT-26634214 -4290949 -POINT-26385468 -5727745 -POINT-26380268 -5751562 -POINT-26168374 -6559388 -POINT-25799896 -7960167 -POINT-25789808 -7992762 -POINT-25509710 -8779543 -POINT-25025848 -10134430 -POINT-25009334 -10175068 -POINT-24663066 -10935050 -POINT-24068940 -12234634 -POINT-24044558 -12282395 -POINT-23634648 -13010033 -POINT-22936158 -14245453 -POINT-22902622 -14299222 -POINT-22432064 -14989193 -POINT-21635772 -16152184 -POINT-21591918 -16210680 -POINT-20177308 -17940888 -POINT-20131746 -17991982 -POINT-19848804 -18302428 -POINT-19560172 -18607580 -POINT-19302682 -18873370 -POINT-19008438 -19173114 -POINT-18708684 -19467366 -POINT-18571442 -19598510 -POINT-18403526 -19756010 -POINT-18093088 -20038954 -POINT-17813838 -20281780 -POINT-16829864 -21112930 -POINT-16749630 -21176500 -POINT-16074917 -21668686 -POINT-14965302 -22473084 -POINT-14871785 -22534926 -POINT-14157505 -22967694 -POINT-12991394 -23669036 -POINT-12884362 -23727294 -POINT-12135738 -24097482 -POINT-10922577 -24692048 -POINT-10802011 -24744828 -POINT-10024509 -25049728 -POINT-8773956 -25534638 -POINT-8640069 -25580022 -POINT-7839366 -25817412 -POINT-6561218 -26190658 -POINT-6414478 -26226734 -POINT-5596426 -26394872 -POINT-4300537 -26655304 -POINT-4141605 -26680188 -POINT-2008422 -26925194 -POINT-1581522 -26952990 -POINT-1161924 -26972438 -POINT-792050 -26984170 -POINT-372170 -26995840 -POINT0 -27000000 -POINT23000000 -27000000 -POINT26639068 -4400032 -POINT26805614 -3073354 -POINT26903512 -2279928 -POINT26909608 -2207405 -POINT26950502 -1613427 -POINT26969952 -1193842 -POINT26984446 -839900 -POINT26996106 -420020 -POINT27000000 0 -POINT26996106 420020 -POINT26984446 839900 -POINT26969952 1193842 -POINT26950502 1613427 -POINT26909608 2207405 -POINT26903512 2279928 -POINT26805614 3073354 -POINT26639068 4400032 -POINT23000000 27000000 -POINT0 27000000 -POINT-372170 26995840 -POINT-792050 26984170 -POINT-1161924 26972440 -POINT-1581522 26952992 -POINT-2008422 26925202 -POINT-4141605 26680184 -POINT-4300537 26655304 -POINT-5596426 26394872 -POINT-6414478 26226734 -POINT-6561218 26190658 -POINT-7839366 25817412 -POINT-8640069 25580022 -POINT-8773956 25534638 -POINT-10024509 25049722 -POINT-10802011 24744824 -POINT-10922577 24692048 -POINT-12135738 24097482 -POINT-12884362 23727294 -POINT-12991394 23669036 -POINT-14157505 22967694 -POINT-14871785 22534926 -POINT-14965302 22473084 -POINT-16074917 21668686 -POINT-16749630 21176500 -POINT-16829864 21112930 -POINT-17813838 20281780 -POINT-18093088 20038954 -POINT-18403526 19756010 -POINT-18571442 19598510 -POINT-18708684 19467366 -POINT-19008438 19173114 -POINT-19302682 18873370 -POINT-19560172 18607580 -POINT-19848804 18302428 -POINT-20131746 17991982 -POINT-20177308 17940888 -POINT-21591918 16210680 -POINT-21635772 16152184 -POINT-22432064 14989193 -POINT-22902622 14299222 -POINT-22936158 14245453 -POINT-23634648 13010033 -POINT-24044558 12282395 -POINT-24068940 12234634 -POINT-24663066 10935050 -POINT-25009334 10175068 -POINT-25025848 10134430 -POINT-25509710 8779543 -POINT-25789808 7992762 -POINT-25799896 7960167 -POINT-26168374 6559388 -POINT-26380268 5751562 -POINT-26385468 5727745 -POINT-26634214 4290949 -POINT-26776340 3467979 -POINT-26778228 3453476 -POINT-26929412 1813227 -POINT-26961014 1444516 -POINT-26975312 1153968 -POINT-26980462 1024931 -POINT-26992146 605051 -POINT-26996042 185031 -POLYGON_AT_HEIGHT26000000 -POINT-26990816 -429227 -POINT-26987904 -743392 -POINT-26979164 -1057452 -POINT-26975312 -1153968 -POINT-26964616 -1371290 -POINT-26891310 -2226611 -POINT-26778228 -3453476 -POINT-26776816 -3464324 -POINT-26571524 -4653057 -POINT-26385468 -5727745 -POINT-26381578 -5745559 -POINT-26075508 -6912420 -POINT-25799896 -7960167 -POINT-25792350 -7984547 -POINT-25387766 -9121009 -POINT-25025848 -10134430 -POINT-25013496 -10164826 -POINT-24513330 -11262578 -POINT-24068940 -12234634 -POINT-24050702 -12270358 -POINT-23458610 -13321389 -POINT-22936158 -14245453 -POINT-22911074 -14285670 -POINT-22231378 -15282296 -POINT-21635772 -16152184 -POINT-21602968 -16195938 -POINT-20177308 -17940888 -POINT-20143228 -17979106 -POINT-19931594 -18211310 -POINT-19715706 -18439556 -POINT-19118392 -19056124 -POINT-18898304 -19280324 -POINT-18674098 -19500418 -POINT-18571442 -19598510 -POINT-18445844 -19716316 -POINT-18213644 -19927952 -POINT-17565852 -20491252 -POINT-16829864 -21112930 -POINT-16769852 -21160478 -POINT-15795266 -21871414 -POINT-14965302 -22473084 -POINT-14895353 -22519338 -POINT-13863616 -23144450 -POINT-12991394 -23669036 -POINT-12911337 -23712612 -POINT-11829991 -24247328 -POINT-10922577 -24692048 -POINT-10832397 -24731526 -POINT-9709338 -25171938 -POINT-8773956 -25534638 -POINT-8673812 -25568584 -POINT-7517240 -25911478 -POINT-6561218 -26190658 -POINT-6451460 -26217644 -POINT-5269829 -26460508 -POINT-4300537 -26655304 -POINT-4181660 -26673916 -POINT-2008422 -26925194 -POINT-1689112 -26945984 -POINT-1375263 -26960532 -POINT-517244 -26987744 -POINT-203185 -26996474 -POINT0 -27000000 -POINT23000000 -27000000 -POINT26639068 -4400032 -POINT26763642 -3407710 -POINT26905048 -2261650 -POINT26909608 -2207405 -POINT26940198 -1763125 -POINT26954744 -1449286 -POINT26988366 -628224 -POINT26997088 -314164 -POINT27000000 0 -POINT26997088 314164 -POINT26988366 628224 -POINT26954744 1449286 -POINT26940198 1763125 -POINT26909608 2207405 -POINT26905048 2261650 -POINT26763642 3407710 -POINT26639068 4400032 -POINT23000000 27000000 -POINT0 27000000 -POINT-203185 26996474 -POINT-517244 26987744 -POINT-1375263 26960536 -POINT-1689112 26945988 -POINT-2008422 26925202 -POINT-4181660 26673912 -POINT-4300537 26655304 -POINT-5269829 26460508 -POINT-6451460 26217644 -POINT-6561218 26190658 -POINT-7517240 25911478 -POINT-8673812 25568584 -POINT-8773956 25534638 -POINT-9709338 25171934 -POINT-10832397 24731522 -POINT-10922577 24692048 -POINT-11829991 24247328 -POINT-12911337 23712612 -POINT-12991394 23669036 -POINT-13863616 23144450 -POINT-14895353 22519338 -POINT-14965302 22473084 -POINT-15795266 21871414 -POINT-16769852 21160478 -POINT-16829864 21112930 -POINT-17565852 20491252 -POINT-18213644 19927952 -POINT-18445844 19716316 -POINT-18571442 19598510 -POINT-18674098 19500418 -POINT-18898304 19280324 -POINT-19118392 19056124 -POINT-19715706 18439556 -POINT-19931594 18211310 -POINT-20143228 17979106 -POINT-20177308 17940888 -POINT-21602968 16195938 -POINT-21635772 16152184 -POINT-22231378 15282296 -POINT-22911074 14285670 -POINT-22936158 14245453 -POINT-23458610 13321389 -POINT-24050702 12270358 -POINT-24068940 12234634 -POINT-24513330 11262578 -POINT-25013496 10164826 -POINT-25025848 10134430 -POINT-25387766 9121009 -POINT-25792350 7984547 -POINT-25799896 7960167 -POINT-26075508 6912420 -POINT-26381578 5745559 -POINT-26385468 5727745 -POINT-26571524 4653057 -POINT-26776816 3464324 -POINT-26778228 3453476 -POINT-26891310 2226611 -POINT-26964616 1371290 -POINT-26975312 1153968 -POINT-26979164 1057452 -POINT-26987904 743392 -POINT-26990816 429227 diff --git a/src/libseqarrange/data/arrange_data_export.txt.8 b/src/libseqarrange/data/arrange_data_export.txt.8 deleted file mode 100644 index 872390fd60..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.8 +++ /dev/null @@ -1,203 +0,0 @@ -OBJECT_ID59718 -TOTAL_HEIGHT116368285 -POLYGON_AT_HEIGHT0 -POINT-7710861 -2930458 -POINT-7707222 -3083679 -POINT-7699829 -3209861 -POINT-7685402 -3363395 -POINT-2260902 -55237504 -POINT-1260887 -58487504 -POINT6989113 -62487504 -POINT7486778 -62487504 -POINT61788988 -38312500 -POINT62038988 -38062500 -POINT66539124 -16912506 -POINT67539120 9062737 -POINT67539120 13962257 -POINT67531600 14029007 -POINT67509416 14092415 -POINT67473664 14149292 -POINT62544312 19337638 -POINT61544252 20337502 -POINT54889100 21987496 -POINT40431564 22095054 -POINT20646660 22095054 -POINT6189102 21987496 -POINT-460884 20337502 -POINT-1460884 19337502 -POINT-2610908 16437492 -POINT-7560394 -1825576 -POINT-7598305 -1970169 -POINT-7626922 -2097168 -POINT-7654808 -2244987 -POINT-7674316 -2372749 -POINT-7691887 -2523094 -POINT-7702331 -2650962 -POINT-7709389 -2803115 -POLYGON_AT_HEIGHT2000000 -POINT-7710861 -2930458 -POINT-7707222 -3083679 -POINT-7699829 -3209861 -POINT-7685402 -3363395 -POINT-2260902 -55237504 -POINT-1260887 -58487504 -POINT6989113 -62487504 -POINT7486778 -62487504 -POINT61788988 -38312500 -POINT62038988 -38062500 -POINT66539124 -16912506 -POINT67539120 9062737 -POINT67539120 13962257 -POINT67531600 14029007 -POINT67509416 14092415 -POINT67473664 14149292 -POINT62544312 19337638 -POINT61544252 20337502 -POINT54889100 21987496 -POINT40431564 22095054 -POINT20646660 22095054 -POINT6189102 21987496 -POINT-460884 20337502 -POINT-1460884 19337502 -POINT-2610908 16437492 -POINT-7560394 -1825576 -POINT-7598305 -1970169 -POINT-7626922 -2097168 -POINT-7654808 -2244987 -POINT-7674316 -2372749 -POINT-7691887 -2523094 -POINT-7702331 -2650962 -POINT-7709389 -2803115 -POLYGON_AT_HEIGHT18000000 -POINT-7710861 -2930458 -POINT-7707222 -3083679 -POINT-7699829 -3209861 -POINT-7685402 -3363395 -POINT-2260902 -55237504 -POINT-1260887 -58487504 -POINT6989113 -62487504 -POINT7486778 -62487504 -POINT61788988 -38312500 -POINT62038988 -38062500 -POINT66539124 -16912506 -POINT67539120 9062737 -POINT67539120 13962257 -POINT67531600 14029007 -POINT67509416 14092415 -POINT67473664 14149292 -POINT62544312 19337638 -POINT61544252 20337502 -POINT54889100 21987496 -POINT40431564 22095054 -POINT20646660 22095054 -POINT6189102 21987496 -POINT-460884 20337502 -POINT-1460884 19337502 -POINT-2610908 16437492 -POINT-7560394 -1825576 -POINT-7598305 -1970169 -POINT-7626922 -2097168 -POINT-7654808 -2244987 -POINT-7674316 -2372749 -POINT-7691887 -2523094 -POINT-7702331 -2650962 -POINT-7709389 -2803115 -POLYGON_AT_HEIGHT26000000 -POINT-7710861 -2930458 -POINT-7707222 -3083679 -POINT-7699829 -3209861 -POINT-7685402 -3363395 -POINT-1260887 -58487504 -POINT6989113 -62487504 -POINT7486778 -62487504 -POINT61788988 -38312500 -POINT62038988 -38062500 -POINT66539124 -16912506 -POINT67539120 9062737 -POINT67539120 13962257 -POINT67531600 14029007 -POINT67509416 14092415 -POINT67473664 14149292 -POINT62544312 19337638 -POINT61544252 20337502 -POINT40289108 22095054 -POINT20789108 22095054 -POINT-460884 20337502 -POINT-1460884 19337502 -POINT-2610908 16437492 -POINT-7560394 -1825576 -POINT-7598305 -1970169 -POINT-7626922 -2097168 -POINT-7654808 -2244987 -POINT-7674316 -2372749 -POINT-7691887 -2523094 -POINT-7702331 -2650962 -POINT-7709389 -2803115 -OBJECT_ID60283 -TOTAL_HEIGHT4881713 -POLYGON_AT_HEIGHT0 -POINT25329362 -20516270 -POINT25485672 -20632454 -POINT26588958 -21452420 -POINT28265686 -22698566 -POINT28573074 -22927010 -POINT29412644 -22564042 -POINT30698128 -22008292 -POINT31931172 -21475212 -POINT32282688 -21323238 -POINT32305150 -21129768 -POINT32477166 -19647592 -POINT32714222 -17604950 -POINT32731174 -17458848 -POINT32748584 -17308732 -POINT32592274 -17192550 -POINT31747394 -16564632 -POINT29898408 -15190464 -POINT29639892 -14998341 -POINT29504868 -14897995 -POINT29099488 -15073250 -POINT28970840 -15128868 -POINT28122376 -15495682 -POINT26507690 -16193756 -POINT25974030 -16424473 -POINT25795258 -16501766 -POINT25777832 -16651882 -POINT25709610 -17239712 -POINT25632752 -17901958 -POINT25559860 -18530036 -POINT25394532 -19954612 -POINT25346772 -20366154 -POLYGON_AT_HEIGHT2000000 -POINT25329362 -20516270 -POINT25485672 -20632454 -POINT26588958 -21452420 -POINT28265686 -22698566 -POINT28573074 -22927010 -POINT29412644 -22564042 -POINT30698128 -22008292 -POINT31931172 -21475212 -POINT32282688 -21323238 -POINT32305150 -21129768 -POINT32477166 -19647592 -POINT32714222 -17604950 -POINT32731174 -17458848 -POINT32748584 -17308732 -POINT32592274 -17192550 -POINT31747394 -16564632 -POINT29898408 -15190464 -POINT29639892 -14998341 -POINT29504868 -14897995 -POINT29099488 -15073250 -POINT28970840 -15128868 -POINT28122376 -15495682 -POINT26507690 -16193756 -POINT25974030 -16424473 -POINT25795258 -16501766 -POINT25777832 -16651882 -POINT25709610 -17239712 -POINT25632752 -17901958 -POINT25559860 -18530036 -POINT25394532 -19954612 -POINT25346772 -20366154 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.9 b/src/libseqarrange/data/arrange_data_export.txt.9 deleted file mode 100644 index 1ef0c7f003..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.9 +++ /dev/null @@ -1,209 +0,0 @@ -OBJECT_ID59718 -TOTAL_HEIGHT116368285 -POLYGON_AT_HEIGHT0 -POINT-7710865 -2930461 -POINT-7707222 -3083680 -POINT-7699833 -3209864 -POINT-7685402 -3363396 -POINT-2260904 -55237504 -POINT-1260889 -58487504 -POINT6989111 -62487504 -POINT7486776 -62487504 -POINT61788980 -38312500 -POINT62038984 -38062500 -POINT66539116 -16912502 -POINT67539120 9062737 -POINT67539120 13962261 -POINT67531592 14029011 -POINT67509408 14092415 -POINT67473656 14149292 -POINT62544304 19337636 -POINT61544256 20337498 -POINT54889104 21987500 -POINT40431556 22095054 -POINT20646656 22095054 -POINT6189096 21987500 -POINT-460887 20337498 -POINT-1460887 19337498 -POINT-2610914 16437496 -POINT-7560398 -1825574 -POINT-7598305 -1970165 -POINT-7626926 -2097170 -POINT-7654808 -2244987 -POINT-7674320 -2372747 -POINT-7691887 -2523094 -POINT-7702335 -2650964 -POINT-7709389 -2803115 -POLYGON_AT_HEIGHT2000000 -POINT-7710865 -2930461 -POINT-7707222 -3083680 -POINT-7699833 -3209864 -POINT-7685402 -3363396 -POINT-2260904 -55237504 -POINT-1260889 -58487504 -POINT6989111 -62487504 -POINT7486776 -62487504 -POINT61788980 -38312500 -POINT62038984 -38062500 -POINT66539116 -16912502 -POINT67539120 9062737 -POINT67539120 13962261 -POINT67531592 14029011 -POINT67509408 14092415 -POINT67473656 14149292 -POINT62544304 19337636 -POINT61544256 20337498 -POINT54889104 21987500 -POINT40431556 22095054 -POINT20646656 22095054 -POINT6189096 21987500 -POINT-460887 20337498 -POINT-1460887 19337498 -POINT-2610914 16437496 -POINT-7560398 -1825574 -POINT-7598305 -1970165 -POINT-7626926 -2097170 -POINT-7654808 -2244987 -POINT-7674320 -2372747 -POINT-7691887 -2523094 -POINT-7702335 -2650964 -POINT-7709389 -2803115 -POLYGON_AT_HEIGHT18000000 -POINT-7710865 -2930461 -POINT-7707222 -3083680 -POINT-7699833 -3209864 -POINT-7685402 -3363396 -POINT-2260904 -55237504 -POINT-1260889 -58487504 -POINT6989111 -62487504 -POINT7486776 -62487504 -POINT61788980 -38312500 -POINT62038984 -38062500 -POINT66539116 -16912502 -POINT67539120 9062737 -POINT67539120 13962261 -POINT67531592 14029011 -POINT67509408 14092415 -POINT67473656 14149292 -POINT62544304 19337636 -POINT61544256 20337498 -POINT54889104 21987500 -POINT40431556 22095054 -POINT20646656 22095054 -POINT6189096 21987500 -POINT-460887 20337498 -POINT-1460887 19337498 -POINT-2610914 16437496 -POINT-7560398 -1825574 -POINT-7598305 -1970165 -POINT-7626926 -2097170 -POINT-7654808 -2244987 -POINT-7674320 -2372747 -POINT-7691887 -2523094 -POINT-7702335 -2650964 -POINT-7709389 -2803115 -POLYGON_AT_HEIGHT26000000 -POINT-7710865 -2930461 -POINT-7707222 -3083680 -POINT-7699833 -3209864 -POINT-7685402 -3363396 -POINT-1260889 -58487504 -POINT6989111 -62487504 -POINT7486776 -62487504 -POINT61788980 -38312500 -POINT62038984 -38062500 -POINT66539116 -16912502 -POINT67539120 9062737 -POINT67539120 13962261 -POINT67531592 14029011 -POINT67509408 14092415 -POINT67473656 14149292 -POINT62544304 19337636 -POINT61544256 20337498 -POINT40289112 22095054 -POINT20789108 22095054 -POINT-460887 20337498 -POINT-1460887 19337498 -POINT-2610914 16437496 -POINT-7560398 -1825574 -POINT-7598305 -1970165 -POINT-7626926 -2097170 -POINT-7654808 -2244987 -POINT-7674320 -2372747 -POINT-7691887 -2523094 -POINT-7702335 -2650964 -POINT-7709389 -2803115 -OBJECT_ID60283 -TOTAL_HEIGHT4881713 -POLYGON_AT_HEIGHT0 -POINT25329362 -20516266 -POINT25485672 -20632454 -POINT27703170 -22280502 -POINT28119248 -22589730 -POINT28265686 -22698562 -POINT28416748 -22810830 -POINT28573074 -22927010 -POINT29412644 -22564042 -POINT31931172 -21475212 -POINT32103916 -21400528 -POINT32282688 -21323234 -POINT32305150 -21129768 -POINT32393956 -20364570 -POINT32477166 -19647590 -POINT32714222 -17604950 -POINT32731174 -17458848 -POINT32748584 -17308732 -POINT32592274 -17192550 -POINT32076130 -16808944 -POINT31670582 -16507538 -POINT30390914 -15556488 -POINT29898408 -15190460 -POINT29639892 -14998337 -POINT29504868 -14897995 -POINT29099488 -15073242 -POINT27817310 -15627564 -POINT25974030 -16424469 -POINT25933976 -16441788 -POINT25795258 -16501770 -POINT25777832 -16651886 -POINT25744340 -16940460 -POINT25559860 -18530030 -POINT25394532 -19954612 -POINT25346772 -20366150 -POLYGON_AT_HEIGHT2000000 -POINT25329362 -20516266 -POINT25485672 -20632454 -POINT27703170 -22280502 -POINT28119248 -22589730 -POINT28265686 -22698562 -POINT28416748 -22810830 -POINT28573074 -22927010 -POINT29412644 -22564042 -POINT31931172 -21475212 -POINT32103916 -21400528 -POINT32282688 -21323234 -POINT32305150 -21129768 -POINT32393956 -20364570 -POINT32477166 -19647590 -POINT32714222 -17604950 -POINT32731174 -17458848 -POINT32748584 -17308732 -POINT32592274 -17192550 -POINT32076130 -16808944 -POINT31670582 -16507538 -POINT30390914 -15556488 -POINT29898408 -15190460 -POINT29639892 -14998337 -POINT29504868 -14897995 -POINT29099488 -15073242 -POINT27817310 -15627564 -POINT25974030 -16424469 -POINT25933976 -16441788 -POINT25795258 -16501770 -POINT25777832 -16651886 -POINT25744340 -16940460 -POINT25559860 -18530030 -POINT25394532 -19954612 -POINT25346772 -20366150 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 diff --git a/src/libseqarrange/data/arrange_data_export.txt.body.mk4 b/src/libseqarrange/data/arrange_data_export.txt.body.mk4 deleted file mode 100644 index 397360516e..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.body.mk4 +++ /dev/null @@ -1,116 +0,0 @@ -OBJECT_ID844 -TOTAL_HEIGHT100535185 -POLYGON_AT_HEIGHT0 -POINT-67539112 -13962263 -POINT-67531584 -14029013 -POINT-67509400 -14092413 -POINT-67473648 -14149290 -POINT-62544304 -19337634 -POINT-61544260 -20337500 -POINT-54889104 -21987498 -POINT-37039112 -25487498 -POINT-24039110 -25487498 -POINT-6189104 -21987498 -POINT460889 -20337500 -POINT1460889 -19337500 -POINT2610906 -16437498 -POINT7598310 1970165 -POINT7654814 2244987 -POINT7691892 2523094 -POINT7709394 2803115 -POINT7707227 3083678 -POINT7685407 3363394 -POINT7644010 3640895 -POINT7583280 3914813 -POINT7503492 4183798 -POINT-574258 26112630 -POINT-1574243 27112630 -POINT-20288972 38312500 -POINT-23090548 38312504 -POINT-58986944 38312504 -POINT-61788980 38312500 -POINT-62038980 38062500 -POINT-66539108 16912500 -POINT-67539112 -9062737 -POLYGON_AT_HEIGHT2000000 -POINT-29076068 18896464 -POINT-29072996 18894178 -POINT-29063468 18887096 -POINT-29046294 18874332 -POINT-29043632 18872356 -POINT-29038292 18874664 -POINT-29030694 18877948 -POINT-29023838 18880912 -POINT-29010590 18886640 -POINT-29008324 18887620 -POINT-29006536 18888394 -POINT-29006094 18892198 -POINT-29005422 18897984 -POINT-29002050 18927038 -POINT-29001876 18928540 -POINT-29018264 18940720 -POINT-29028350 18948216 -POINT-29031240 18950362 -POINT-29034316 18952646 -POINT-29035702 18952048 -POINT-29039506 18950404 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-29074128 18913206 -POINT-29075846 18898398 -POINT-29075896 18897964 -POLYGON_AT_HEIGHT18000000 -POINT-29076068 18896464 -POINT-29072996 18894178 -POINT-29063468 18887096 -POINT-29046294 18874332 -POINT-29043632 18872356 -POINT-29038292 18874664 -POINT-29030694 18877948 -POINT-29023838 18880912 -POINT-29010590 18886640 -POINT-29008324 18887620 -POINT-29006536 18888394 -POINT-29006094 18892198 -POINT-29005422 18897984 -POINT-29002050 18927038 -POINT-29001876 18928540 -POINT-29018264 18940720 -POINT-29028350 18948216 -POINT-29031240 18950362 -POINT-29034316 18952646 -POINT-29035702 18952048 -POINT-29039506 18950404 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-29074128 18913206 -POINT-29075846 18898398 -POINT-29075896 18897964 -POLYGON_AT_HEIGHT26000000 -POINT-29076068 18896464 -POINT-29074718 18895460 -POINT-29068944 18891166 -POINT-29065226 18888402 -POINT-29052324 18878814 -POINT-29043632 18872356 -POINT-29043144 18872566 -POINT-29020034 18882556 -POINT-29010390 18886726 -POINT-29008324 18887620 -POINT-29006536 18888394 -POINT-29006130 18891884 -POINT-29005338 18898702 -POINT-29004310 18907558 -POINT-29002830 18920314 -POINT-29001876 18928540 -POINT-29028350 18948216 -POINT-29033550 18952078 -POINT-29034316 18952646 -POINT-29034804 18952436 -POINT-29035702 18952048 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-29072198 18929840 -POINT-29075408 18902182 -POINT-29075846 18898398 -POINT-29075960 18897410 diff --git a/src/libseqarrange/data/arrange_data_export.txt.composed.mk4 b/src/libseqarrange/data/arrange_data_export.txt.composed.mk4 deleted file mode 100644 index 409083015d..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.composed.mk4 +++ /dev/null @@ -1,88 +0,0 @@ -OBJECT_ID635 -TOTAL_HEIGHT68920356 -POLYGON_AT_HEIGHT0 -POLYGON_AT_HEIGHT1 -POINT-40000000 -45000000 -POINT38000000 -45000000 -POINT38000000 20000000 -POINT-40000000 20000000 -POLYGON_AT_HEIGHT2 -POINT-1000000 -21000000 -POINT37000000 -21000000 -POINT37000000 44000000 -POINT-1000000 44000000 -POLYGON_AT_HEIGHT3 -POINT-12000000 -350000000 -POINT9000000 -350000000 -POINT9000000 -39000000 -POINT-12000000 -39000000 -POLYGON_AT_HEIGHT4 -POINT-350000000 -4000000 -POINT350000000 -4000000 -POINT350000000 -14000000 -POINT-350000000 -14000000 -POLYGON_AT_HEIGHT10000 -POINT-39105202 -33269412 -POINT-33019977 -39740757 -POINT-8145411 -44968391 -POINT5050568 -44968391 -POINT29919905 -39740757 -POINT32102334 -35781961 -POINT37275483 -15966504 -POINT28869155 7409612 -POINT8857241 19793397 -POINT-33268386 19793397 -POINT-38090122 -1929211 -POLYGON_AT_HEIGHT200000 -POINT-242277 -223805 -POINT16952801 -15334520 -POINT32166346 -20375028 -POINT34384145 -20136906 -POINT36137556 -18758219 -POINT36889619 -16094705 -POINT31396166 36454515 -POINT30386126 39737097 -POINT22053422 43777197 -POINT16447788 40999636 -POINT-217030 9440457 -POLYGON_AT_HEIGHT18000000 -POINT-206972968 -12664471 -POINT-206470468 -13167301 -POINT164374531 -13167301 -POINT164877031 -12664471 -POINT164877031 -5630724 -POINT164374531 -5128674 -POINT-206470468 -5128674 -POINT-206972968 -5630724 -POLYGON_AT_HEIGHT26000000 -POINT-11485580 -41756934 -POINT-8680166 -81797949 -POINT-8170091 -82308024 -POINT5091868 -82308024 -POINT5601944 -81797949 -POINT8407358 -39461522 -POINT-3994 773174 -POINT-11485580 -39461522 -POLYGON_AT_HEIGHT27000000 -POINT -5000000 -5000000 -POINT 5000000 -5000000 -POINT5000000 5000000 -POINT-5000000 5000000 -POLYGON_AT_HEIGHT28000000 -POINT-3728158 -1611789 -POINT-468223 -4034578 -POINT2543938 -2732339 -POINT3259933 -2422789 -POINT3728160 1611785 -POINT468227 4034579 -POINT-1666062 3111867 -POINT-3259931 2422789 -POLYGON_AT_HEIGHT30000000 -POINT-12000000 -350000000 -POINT250000000 -350000000 -POINT250000000 -82000000 -POINT-12000000 -82000000 - - - - diff --git a/src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 b/src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 deleted file mode 100644 index 06e647aef2..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.composed_hose.mk4 +++ /dev/null @@ -1,24 +0,0 @@ -OBJECT_ID635 -TOTAL_HEIGHT68920356 -POLYGON_AT_HEIGHT0 -POLYGON_AT_HEIGHT1 -POLYGON_AT_HEIGHT2 -POLYGON_AT_HEIGHT3 -POINT-12000000 -350000000 -POINT9000000 -350000000 -POINT9000000 -39000000 -POINT-12000000 -39000000 -POLYGON_AT_HEIGHT4 -POLYGON_AT_HEIGHT10000 -POLYGON_AT_HEIGHT200000 -POLYGON_AT_HEIGHT18000000 -POLYGON_AT_HEIGHT26000000 -POINT-11485580 -41756934 -POINT-8680166 -81797949 -POINT-8170091 -82308024 -POINT5091868 -82308024 -POINT5601944 -81797949 -POINT8407358 -39461522 -POINT-3994 773174 -POINT-11485580 -39461522 - diff --git a/src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 b/src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 deleted file mode 100644 index 46def95c30..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.extruder.mk4 +++ /dev/null @@ -1,135 +0,0 @@ -OBJECT_ID635 -TOTAL_HEIGHT121250000 -POLYGON_AT_HEIGHT0 -POINT-67539112 -13962261 -POINT-67531584 -14029011 -POINT-67509400 -14092415 -POINT-67473648 -14149292 -POINT-62544296 -19337636 -POINT-61544252 -20337498 -POINT-54889104 -21987500 -POINT-37039112 -25487500 -POINT-24039108 -25487500 -POINT-6189102 -21987500 -POINT460891 -20337498 -POINT1460891 -19337498 -POINT2610908 -16437496 -POINT7598310 1970165 -POINT7654814 2244987 -POINT7691892 2523094 -POINT7709394 2803115 -POINT7707227 3083679 -POINT7685407 3363395 -POINT7644010 3640895 -POINT7583280 3914814 -POINT7503492 4183799 -POINT-574258 26112630 -POINT-1574243 27112630 -POINT-20288970 38312500 -POINT-23090546 38312504 -POINT-58986944 38312504 -POINT-61788972 38312500 -POINT-62038972 38062500 -POINT-66539108 16912502 -POINT-67539112 -9062737 -POLYGON_AT_HEIGHT2000000 -POINT-67539112 -13962261 -POINT-67531584 -14029011 -POINT-67509400 -14092415 -POINT-67473648 -14149292 -POINT-62544296 -19337636 -POINT-61544252 -20337498 -POINT-54889104 -21987500 -POINT-37039112 -25487500 -POINT-24039108 -25487500 -POINT-6189102 -21987500 -POINT460891 -20337498 -POINT1460891 -19337498 -POINT2610908 -16437496 -POINT7598310 1970165 -POINT7654814 2244987 -POINT7691892 2523094 -POINT7709394 2803115 -POINT7707227 3083679 -POINT7685407 3363395 -POINT7644010 3640895 -POINT7583280 3914814 -POINT7503492 4183799 -POINT-574258 26112630 -POINT-1574243 27112630 -POINT-20288970 38312500 -POINT-23090546 38312504 -POINT-58986944 38312504 -POINT-61788972 38312500 -POINT-62038972 38062500 -POINT-66539108 16912502 -POINT-67539112 -9062737 -POLYGON_AT_HEIGHT18000000 -POINT-67539112 -13962261 -POINT-67531584 -14029011 -POINT-67509400 -14092415 -POINT-67473648 -14149292 -POINT-62544296 -19337636 -POINT-61544252 -20337498 -POINT-54889104 -21987500 -POINT-37039112 -25487500 -POINT-24039108 -25487500 -POINT-6189102 -21987500 -POINT460891 -20337498 -POINT1460891 -19337498 -POINT2610908 -16437496 -POINT7598310 1970165 -POINT7654814 2244987 -POINT7691892 2523094 -POINT7693351 2546429 -POINT7709394 2803115 -POINT7707408 3060298 -POINT7707227 3083679 -POINT7687226 3340085 -POINT7685407 3363395 -POINT7644010 3640895 -POINT7588341 3891987 -POINT7583280 3914814 -POINT7576631 3937230 -POINT7503492 4183799 -POINT-574258 26112630 -POINT-1574243 27112630 -POINT-20288970 38312500 -POINT-23090546 38312504 -POINT-58986944 38312504 -POINT-61788972 38312500 -POINT-62038972 38062500 -POINT-66539108 16912502 -POINT-67539112 -9062737 -POLYGON_AT_HEIGHT26000000 -POINT-67539112 -13962261 -POINT-67531584 -14029011 -POINT-67509400 -14092415 -POINT-67473648 -14149292 -POINT-62544296 -19337636 -POINT-61544252 -20337498 -POINT-54889104 -21987500 -POINT-37039112 -25487500 -POINT-24039108 -25487500 -POINT-6189102 -21987500 -POINT460891 -20337498 -POINT1460891 -19337498 -POINT2610908 -16437496 -POINT7598310 1970165 -POINT7654814 2244987 -POINT7691892 2523094 -POINT7709394 2803115 -POINT7707227 3083679 -POINT7685407 3363395 -POINT7644010 3640895 -POINT7583280 3914814 -POINT7503492 4183799 -POINT-574258 26112630 -POINT-1574243 27112630 -POINT-20288970 38312500 -POINT-23090546 38312504 -POINT-58986944 38312504 -POINT-61788972 38312500 -POINT-62038972 38062500 -POINT-66539108 16912502 -POINT-67539112 -9062737 diff --git a/src/libseqarrange/data/arrange_data_export.txt.fan.mk4 b/src/libseqarrange/data/arrange_data_export.txt.fan.mk4 deleted file mode 100644 index 488347917c..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.fan.mk4 +++ /dev/null @@ -1,139 +0,0 @@ -OBJECT_ID844 -TOTAL_HEIGHT104183003 -POLYGON_AT_HEIGHT0 -POINT-29063518 18923234 -POINT-12039110 3962501 -POINT2480909 -893693 -POINT2749830 -970325 -POINT3023435 -1027980 -POINT3300413 -1066381 -POINT3579404 -1085336 -POINT3859022 -1084755 -POINT4137922 -1064638 -POINT4414732 -1025087 -POINT4688108 -966293 -POINT4956709 -888546 -POINT5219221 -792221 -POINT5474348 -677793 -POINT5720869 -545820 -POINT5957578 -396945 -POINT6183286 -231899 -POINT6396925 -51486 -POINT6597440 143409 -POINT6783842 351839 -POINT6955229 572784 -POINT7110761 805160 -POINT7249677 1047836 -POINT7371305 1299621 -POINT7475050 1559291 -POINT7560392 1825573 -POINT7626920 2097168 -POINT7674314 2372745 -POINT7702329 2650962 -POINT7710859 2930458 -POINT7699827 3209861 -POINT2260900 55237504 -POINT1260885 58487504 -POINT-6989115 62487504 -POINT-7486780 62487504 -POINT-12039110 60237512 -POINT-12539110 59737512 -POINT-28116342 30356946 -POINT-28304102 29998840 -POINT-28436518 29739158 -POINT-28679972 29249420 -POINT-28745004 29115146 -POINT-29038522 28491574 -POLYGON_AT_HEIGHT2000000 -POINT-29063518 18923234 -POINT-29058982 18919862 -POINT-29056178 18917778 -POINT-29042088 18907306 -POINT-29035018 18902052 -POINT-29033742 18901104 -POINT-29031082 18899128 -POINT-29029694 18899726 -POINT-29027028 18900878 -POINT-29023956 18902206 -POINT-29009454 18908476 -POINT-29000804 18912216 -POINT-28993986 18915164 -POINT-28993810 18916666 -POINT-28993640 18918128 -POINT-28992658 18926588 -POINT-28991134 18939720 -POINT-28990438 18945718 -POINT-28989326 18955310 -POINT-28990888 18956472 -POINT-28993864 18958684 -POINT-29000010 18963252 -POINT-29021762 18979418 -POINT-29023552 18978646 -POINT-29040118 18971484 -POINT-29057072 18964154 -POINT-29058858 18963378 -POINT-29059034 18961878 -POINT-29059302 18959576 -POINT-29063346 18924736 -POLYGON_AT_HEIGHT18000000 -POINT-29063518 18923234 -POINT-29058982 18919862 -POINT-29056178 18917778 -POINT-29042088 18907306 -POINT-29035018 18902052 -POINT-29033742 18901104 -POINT-29031082 18899128 -POINT-29029694 18899726 -POINT-29027028 18900878 -POINT-29023956 18902206 -POINT-29009454 18908476 -POINT-29000804 18912216 -POINT-28993986 18915164 -POINT-28993810 18916666 -POINT-28993640 18918128 -POINT-28992658 18926588 -POINT-28991134 18939720 -POINT-28990438 18945718 -POINT-28989326 18955310 -POINT-28990888 18956472 -POINT-28993864 18958684 -POINT-29000010 18963252 -POINT-29021762 18979418 -POINT-29023552 18978646 -POINT-29040118 18971484 -POINT-29057072 18964154 -POINT-29058858 18963378 -POINT-29059034 18961878 -POINT-29059302 18959576 -POINT-29063346 18924736 -POLYGON_AT_HEIGHT26000000 -POINT-29063518 18923234 -POINT-29058982 18919862 -POINT-29056178 18917778 -POINT-29042088 18907306 -POINT-29035018 18902052 -POINT-29033742 18901104 -POINT-29031082 18899128 -POINT-29029694 18899726 -POINT-29027028 18900878 -POINT-29023956 18902206 -POINT-29009454 18908476 -POINT-29000804 18912216 -POINT-28993986 18915164 -POINT-28993810 18916666 -POINT-28993640 18918128 -POINT-28992658 18926588 -POINT-28991134 18939720 -POINT-28990438 18945718 -POINT-28989326 18955310 -POINT-28990888 18956472 -POINT-28993864 18958684 -POINT-29000010 18963252 -POINT-29021762 18979418 -POINT-29023552 18978646 -POINT-29040118 18971484 -POINT-29057072 18964154 -POINT-29058858 18963378 -POINT-29059034 18961878 -POINT-29059302 18959576 -POINT-29063346 18924736 diff --git a/src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 b/src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 deleted file mode 100644 index c5061931ad..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.gantry.mk4 +++ /dev/null @@ -1,416 +0,0 @@ -OBJECT_ID844 -TOTAL_HEIGHT90415563 -POLYGON_AT_HEIGHT0 -POINT-206047968 -12586874 -POINT-205547968 -13087202 -POINT163452032 -13087202 -POINT163952032 -12586874 -POINT163952032 -5588121 -POINT163452032 -5088569 -POINT-29034316 18952646 -POINT-205547968 -5088569 -POINT-206047968 -5588121 -POLYGON_AT_HEIGHT2000000 -POINT-29076068 18896464 -POINT-29072996 18894178 -POINT-29063468 18887096 -POINT-29046294 18874332 -POINT-29043632 18872356 -POINT-29038292 18874664 -POINT-29030694 18877948 -POINT-29023838 18880912 -POINT-29010590 18886640 -POINT-29008324 18887620 -POINT-29006536 18888394 -POINT-29006094 18892198 -POINT-29005422 18897984 -POINT-29002050 18927038 -POINT-29001876 18928540 -POINT-29018264 18940720 -POINT-29028350 18948216 -POINT-29031240 18950362 -POINT-29034316 18952646 -POINT-29035702 18952048 -POINT-29039506 18950404 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-29074128 18913206 -POINT-29075846 18898398 -POINT-29075896 18897964 -POLYGON_AT_HEIGHT18000000 -POINT-29068974 18912342 -POINT-29068930 18910868 -POINT-29068862 18909930 -POINT-29068698 18908432 -POINT-29068560 18907532 -POINT-29068266 18906024 -POINT-29068064 18905166 -POINT-29067640 18903656 -POINT-29067380 18902852 -POINT-29066824 18901350 -POINT-29066510 18900596 -POINT-29065822 18899116 -POINT-29065462 18898418 -POINT-29064642 18896972 -POINT-29064244 18896334 -POINT-29063292 18894932 -POINT-29062860 18894352 -POINT-29061778 18893010 -POINT-29061324 18892488 -POINT-29060114 18891214 -POINT-29059640 18890754 -POINT-29058308 18889562 -POINT-29057824 18889162 -POINT-29056374 18888064 -POINT-29055884 18887722 -POINT-29054324 18886726 -POINT-29053834 18886442 -POINT-29052172 18885562 -POINT-29051692 18885330 -POINT-29049932 18884574 -POINT-29049464 18884396 -POINT-29047618 18883774 -POINT-29047166 18883642 -POINT-29045248 18883166 -POINT-29044818 18883076 -POINT-29042838 18882752 -POINT-29042430 18882702 -POINT-29040400 18882534 -POINT-29040022 18882518 -POINT-29037952 18882518 -POINT-29037608 18882532 -POINT-29035512 18882702 -POINT-29035200 18882740 -POINT-29033094 18883084 -POINT-29032818 18883138 -POINT-29030716 18883660 -POINT-29030474 18883730 -POINT-29028392 18884430 -POINT-29028186 18884508 -POINT-29026140 18885386 -POINT-29025968 18885466 -POINT-29023972 18886520 -POINT-29023836 18886600 -POINT-29021904 18887830 -POINT-29021802 18887902 -POINT-29019950 18889304 -POINT-29019876 18889364 -POINT-29018122 18890932 -POINT-29018078 18890976 -POINT-29016434 18892702 -POINT-29016412 18892726 -POINT-29014894 18894606 -POINT-29013532 18896600 -POINT-29012336 18898700 -POINT-29012308 18898756 -POINT-29011312 18900888 -POINT-29011276 18900974 -POINT-29010468 18903152 -POINT-29010430 18903270 -POINT-29009808 18905476 -POINT-29009772 18905628 -POINT-29009336 18907846 -POINT-29009308 18908032 -POINT-29009058 18910246 -POINT-29009042 18910466 -POINT-29008974 18912660 -POINT-29008976 18912910 -POINT-29009084 18915074 -POINT-29009110 18915354 -POINT-29009388 18917470 -POINT-29009442 18917780 -POINT-29009884 18919834 -POINT-29009970 18920170 -POINT-29010568 18922152 -POINT-29010690 18922508 -POINT-29011436 18924406 -POINT-29011600 18924780 -POINT-29012484 18926582 -POINT-29012694 18926970 -POINT-29013702 18928670 -POINT-29013960 18929064 -POINT-29015086 18930650 -POINT-29015392 18931048 -POINT-29016624 18932514 -POINT-29016984 18932908 -POINT-29018306 18934246 -POINT-29018718 18934632 -POINT-29020122 18935838 -POINT-29020590 18936208 -POINT-29022062 18937280 -POINT-29022584 18937630 -POINT-29024110 18938560 -POINT-29024686 18938880 -POINT-29026256 18939672 -POINT-29026884 18939958 -POINT-29028484 18940608 -POINT-29029164 18940852 -POINT-29030778 18941360 -POINT-29031508 18941556 -POINT-29033128 18941928 -POINT-29033900 18942068 -POINT-29035514 18942300 -POINT-29036328 18942384 -POINT-29037924 18942482 -POINT-29038770 18942502 -POINT-29040340 18942470 -POINT-29041218 18942418 -POINT-29042748 18942262 -POINT-29043648 18942134 -POINT-29045130 18941862 -POINT-29046048 18941654 -POINT-29047472 18941272 -POINT-29048400 18940980 -POINT-29049758 18940494 -POINT-29050692 18940118 -POINT-29051978 18939538 -POINT-29052902 18939072 -POINT-29054112 18938402 -POINT-29055022 18937848 -POINT-29056146 18937100 -POINT-29057036 18936454 -POINT-29058070 18935638 -POINT-29058928 18934902 -POINT-29059870 18934026 -POINT-29060686 18933202 -POINT-29061534 18932276 -POINT-29062302 18931364 -POINT-29063052 18930398 -POINT-29063760 18929400 -POINT-29064414 18928400 -POINT-29065056 18927322 -POINT-29065610 18926302 -POINT-29066178 18925148 -POINT-29066636 18924114 -POINT-29067118 18922888 -POINT-29067480 18921850 -POINT-29067872 18920558 -POINT-29068140 18919528 -POINT-29068432 18918176 -POINT-29068610 18917156 -POINT-29068796 18915756 -POINT-29068888 18914756 -POINT-29068962 18913314 -POLYGON_AT_HEIGHT26000000 -POINT-29068966 18912996 -POINT-29068946 18911352 -POINT-29068930 18910868 -POINT-29068908 18910560 -POINT-29068752 18908924 -POINT-29068698 18908432 -POINT-29068652 18908136 -POINT-29068364 18906518 -POINT-29068266 18906024 -POINT-29068200 18905742 -POINT-29067780 18904152 -POINT-29067640 18903656 -POINT-29067554 18903392 -POINT-29067006 18901842 -POINT-29066824 18901350 -POINT-29066722 18901102 -POINT-29066048 18899602 -POINT-29065822 18899116 -POINT-29065704 18898888 -POINT-29064910 18897448 -POINT-29064642 18896972 -POINT-29064510 18896762 -POINT-29063604 18895392 -POINT-29063292 18894932 -POINT-29063150 18894742 -POINT-29062132 18893450 -POINT-29061778 18893010 -POINT-29061628 18892838 -POINT-29060510 18891632 -POINT-29060114 18891214 -POINT-29059960 18891064 -POINT-29058744 18889954 -POINT-29058308 18889562 -POINT-29058150 18889432 -POINT-29056848 18888424 -POINT-29056374 18888064 -POINT-29056214 18887950 -POINT-29054834 18887052 -POINT-29054324 18886726 -POINT-29054164 18886632 -POINT-29052718 18885850 -POINT-29052172 18885562 -POINT-29052014 18885484 -POINT-29050508 18884822 -POINT-29049932 18884574 -POINT-29049778 18884516 -POINT-29048224 18883978 -POINT-29047618 18883774 -POINT-29047470 18883730 -POINT-29045878 18883322 -POINT-29045248 18883166 -POINT-29045106 18883136 -POINT-29043488 18882858 -POINT-29042838 18882752 -POINT-29042704 18882734 -POINT-29041066 18882590 -POINT-29040400 18882534 -POINT-29040276 18882528 -POINT-29038632 18882518 -POINT-29037952 18882518 -POINT-29037840 18882522 -POINT-29036200 18882646 -POINT-29035512 18882702 -POINT-29035410 18882716 -POINT-29033784 18882970 -POINT-29033094 18883084 -POINT-29033002 18883102 -POINT-29031404 18883488 -POINT-29030716 18883660 -POINT-29030636 18883682 -POINT-29028392 18884430 -POINT-29028326 18884454 -POINT-29026812 18885098 -POINT-29026140 18885386 -POINT-29026084 18885412 -POINT-29024626 18886176 -POINT-29023972 18886520 -POINT-29022538 18887426 -POINT-29021904 18887830 -POINT-29021870 18887854 -POINT-29020558 18888844 -POINT-29019926 18889322 -POINT-29018122 18890932 -POINT-29018106 18890948 -POINT-29016426 18892710 -POINT-29014894 18894606 -POINT-29014448 18895260 -POINT-29013524 18896618 -POINT-29013518 18896628 -POINT-29013130 18897308 -POINT-29012318 18898738 -POINT-29012308 18898756 -POINT-29011288 18900946 -POINT-29011276 18900974 -POINT-29010442 18903232 -POINT-29010430 18903270 -POINT-29010226 18903994 -POINT-29009782 18905578 -POINT-29009772 18905628 -POINT-29009628 18906356 -POINT-29009318 18907970 -POINT-29009308 18908032 -POINT-29009226 18908758 -POINT-29009048 18910392 -POINT-29009042 18910466 -POINT-29009020 18911186 -POINT-29008976 18912828 -POINT-29008976 18912910 -POINT-29009012 18913620 -POINT-29009102 18915262 -POINT-29009110 18915354 -POINT-29009202 18916048 -POINT-29009424 18917678 -POINT-29009442 18917780 -POINT-29009586 18918454 -POINT-29009942 18920060 -POINT-29009970 18920170 -POINT-29010166 18920820 -POINT-29010650 18922392 -POINT-29010690 18922508 -POINT-29010934 18923130 -POINT-29011548 18924658 -POINT-29011600 18924780 -POINT-29011890 18925372 -POINT-29012624 18926842 -POINT-29012694 18926970 -POINT-29013026 18927526 -POINT-29013876 18928934 -POINT-29013960 18929064 -POINT-29014330 18929584 -POINT-29015292 18930918 -POINT-29015392 18931048 -POINT-29015796 18931528 -POINT-29016864 18932778 -POINT-29016984 18932908 -POINT-29017418 18933346 -POINT-29018584 18934506 -POINT-29018718 18934632 -POINT-29019178 18935028 -POINT-29020438 18936086 -POINT-29020590 18936208 -POINT-29021072 18936560 -POINT-29022414 18937516 -POINT-29022584 18937630 -POINT-29023084 18937934 -POINT-29024498 18938776 -POINT-29024686 18938880 -POINT-29025202 18939140 -POINT-29026678 18939866 -POINT-29026884 18939958 -POINT-29027408 18940172 -POINT-29028940 18940772 -POINT-29029164 18940852 -POINT-29029694 18941020 -POINT-29031270 18941492 -POINT-29031508 18941556 -POINT-29032040 18941680 -POINT-29033646 18942022 -POINT-29033900 18942068 -POINT-29034430 18942144 -POINT-29036060 18942358 -POINT-29036328 18942384 -POINT-29036852 18942418 -POINT-29038492 18942496 -POINT-29038770 18942502 -POINT-29039286 18942492 -POINT-29040930 18942434 -POINT-29041218 18942418 -POINT-29041720 18942366 -POINT-29043352 18942176 -POINT-29043648 18942134 -POINT-29044134 18942046 -POINT-29045746 18941722 -POINT-29046048 18941654 -POINT-29046514 18941528 -POINT-29048096 18941076 -POINT-29048400 18940980 -POINT-29048848 18940820 -POINT-29050386 18940242 -POINT-29050692 18940118 -POINT-29051114 18939928 -POINT-29052600 18939224 -POINT-29052902 18939072 -POINT-29053300 18938852 -POINT-29054724 18938028 -POINT-29055022 18937848 -POINT-29055392 18937602 -POINT-29056744 18936666 -POINT-29057036 18936454 -POINT-29057376 18936188 -POINT-29058646 18935144 -POINT-29058928 18934902 -POINT-29059236 18934614 -POINT-29060420 18933474 -POINT-29060686 18933202 -POINT-29060964 18932900 -POINT-29062050 18931664 -POINT-29062302 18931364 -POINT-29062548 18931048 -POINT-29063528 18929728 -POINT-29063760 18929400 -POINT-29063974 18929072 -POINT-29064844 18927676 -POINT-29065056 18927322 -POINT-29065238 18926986 -POINT-29065992 18925526 -POINT-29066178 18925148 -POINT-29066328 18924808 -POINT-29066960 18923290 -POINT-29067118 18922888 -POINT-29067236 18922548 -POINT-29067744 18920982 -POINT-29067872 18920558 -POINT-29067958 18920222 -POINT-29068336 18918620 -POINT-29068432 18918176 -POINT-29068492 18917842 -POINT-29068736 18916216 -POINT-29068796 18915756 -POINT-29068826 18915428 -POINT-29068938 18913788 -POINT-29068962 18913314 diff --git a/src/libseqarrange/data/arrange_data_export.txt.hose.mk4 b/src/libseqarrange/data/arrange_data_export.txt.hose.mk4 deleted file mode 100644 index 86f0cc0a03..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.hose.mk4 +++ /dev/null @@ -1,102 +0,0 @@ -OBJECT_ID844 -TOTAL_HEIGHT106960644 -POLYGON_AT_HEIGHT0 -POINT-40289112 -22737390 -POINT-37539112 -61987496 -POINT-37039112 -62487496 -POINT-24039110 -62487496 -POINT-23541246 -61989640 -POINT-23539110 -61987496 -POINT-20789110 -22737390 -POINT-20789110 -20487318 -POINT-29001876 18928540 -POINT-29018264 18940720 -POINT-29028350 18948216 -POINT-29031240 18950362 -POINT-29034316 18952646 -POINT-29035702 18952048 -POINT-29039506 18950404 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-40289112 -20487318 -POLYGON_AT_HEIGHT2000000 -POINT-29076068 18896464 -POINT-29072996 18894178 -POINT-29063468 18887096 -POINT-29046294 18874332 -POINT-29043632 18872356 -POINT-29038292 18874664 -POINT-29030694 18877948 -POINT-29023838 18880912 -POINT-29010590 18886640 -POINT-29008324 18887620 -POINT-29006536 18888394 -POINT-29006094 18892198 -POINT-29005422 18897984 -POINT-29002050 18927038 -POINT-29001876 18928540 -POINT-29018264 18940720 -POINT-29028350 18948216 -POINT-29031240 18950362 -POINT-29034316 18952646 -POINT-29035702 18952048 -POINT-29039506 18950404 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-29074128 18913206 -POINT-29075846 18898398 -POINT-29075896 18897964 -POLYGON_AT_HEIGHT18000000 -POINT-29076068 18896464 -POINT-29072996 18894178 -POINT-29063468 18887096 -POINT-29046294 18874332 -POINT-29043632 18872356 -POINT-29038292 18874664 -POINT-29030694 18877948 -POINT-29023838 18880912 -POINT-29010590 18886640 -POINT-29008324 18887620 -POINT-29006536 18888394 -POINT-29006094 18892198 -POINT-29005422 18897984 -POINT-29002050 18927038 -POINT-29001876 18928540 -POINT-29018264 18940720 -POINT-29028350 18948216 -POINT-29031240 18950362 -POINT-29034316 18952646 -POINT-29035702 18952048 -POINT-29039506 18950404 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-29074128 18913206 -POINT-29075846 18898398 -POINT-29075896 18897964 -POLYGON_AT_HEIGHT26000000 -POINT-29076068 18896464 -POINT-29072996 18894178 -POINT-29063468 18887096 -POINT-29046294 18874332 -POINT-29043632 18872356 -POINT-29038292 18874664 -POINT-29030694 18877948 -POINT-29023838 18880912 -POINT-29010590 18886640 -POINT-29008324 18887620 -POINT-29006536 18888394 -POINT-29006094 18892198 -POINT-29005422 18897984 -POINT-29002050 18927038 -POINT-29001876 18928540 -POINT-29018264 18940720 -POINT-29028350 18948216 -POINT-29031240 18950362 -POINT-29034316 18952646 -POINT-29035702 18952048 -POINT-29039506 18950404 -POINT-29063016 18940240 -POINT-29071412 18936610 -POINT-29074128 18913206 -POINT-29075846 18898398 -POINT-29075896 18897964 diff --git a/src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 b/src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 deleted file mode 100644 index a524b449d2..0000000000 --- a/src/libseqarrange/data/arrange_data_export.txt.nozzle.mk4 +++ /dev/null @@ -1,385 +0,0 @@ -OBJECT_ID635 -TOTAL_HEIGHT77699996 -POLYGON_AT_HEIGHT0 -POINT-3709610 -1603771 -POINT-3553299 -1719951 -POINT-2708418 -2347870 -POINT-859434 -3722037 -POINT-773283 -3786063 -POINT-600919 -3914160 -POINT-465894 -4014506 -POINT-60514 -3839251 -POINT2531282 -2718746 -POINT3064943 -2488029 -POINT3243715 -2410736 -POINT3261140 -2260620 -POINT3294633 -1972038 -POINT3329363 -1672790 -POINT3406221 -1010543 -POINT3644441 1042110 -POINT3692201 1453651 -POINT3709612 1603767 -POINT3553300 1719951 -POINT2450014 2539917 -POINT773286 3786064 -POINT465898 4014507 -POINT-1657774 3096386 -POINT-2098707 2905758 -POINT-2724714 2635116 -POINT-3064941 2488025 -POINT-3243713 2410736 -POINT-3266174 2217266 -POINT-3387527 1171619 -POINT-3556167 -281486 -POINT-3675247 -1307552 -POINT-3692199 -1453655 -POLYGON_AT_HEIGHT2000000 -POINT-3709610 -1603771 -POINT-3553299 -1719951 -POINT-2708418 -2347870 -POINT-859434 -3722037 -POINT-773283 -3786063 -POINT-600919 -3914160 -POINT-465894 -4014506 -POINT-60514 -3839251 -POINT2531282 -2718746 -POINT3064943 -2488029 -POINT3243715 -2410736 -POINT3261140 -2260620 -POINT3294633 -1972038 -POINT3329363 -1672790 -POINT3406221 -1010543 -POINT3644441 1042110 -POINT3692201 1453651 -POINT3709612 1603767 -POINT3553300 1719951 -POINT2450014 2539917 -POINT773286 3786064 -POINT465898 4014507 -POINT-1657774 3096386 -POINT-2098707 2905758 -POINT-2724714 2635116 -POINT-3064941 2488025 -POINT-3243713 2410736 -POINT-3266174 2217266 -POINT-3387527 1171619 -POINT-3556167 -281486 -POINT-3675247 -1307552 -POINT-3692199 -1453655 -POLYGON_AT_HEIGHT18000000 -POINT-2449483 -44880 -POINT-2448576 -83435 -POINT-2440202 -206542 -POINT-2435758 -262735 -POINT-2431242 -302589 -POINT-2412157 -422933 -POINT-2402693 -478502 -POINT-2394331 -519306 -POINT-2364967 -635971 -POINT-2350561 -690467 -POINT-2338148 -731842 -POINT-2298992 -843966 -POINT-2279754 -896951 -POINT-2263120 -938484 -POINT-2214762 -1045267 -POINT-2190857 -1096314 -POINT-2169889 -1137569 -POINT-2112953 -1238270 -POINT-2084568 -1286970 -POINT-2059187 -1327499 -POINT-1994365 -1421446 -POINT-1961727 -1467405 -POINT-1931898 -1506740 -POINT-1859940 -1593344 -POINT-1823315 -1636191 -POINT-1789060 -1673847 -POINT-1710748 -1752593 -POINT-1670430 -1791986 -POINT-1631818 -1827480 -POINT-1547969 -1897932 -POINT-1504278 -1933551 -POINT-1461423 -1966396 -POINT-1372900 -2028205 -POINT-1326196 -2059765 -POINT-1279279 -2089481 -POINT-1186932 -2142380 -POINT-1137587 -2169627 -POINT-1086835 -2195743 -POINT-991527 -2239548 -POINT-939936 -2262262 -POINT-885633 -2284328 -POINT-788248 -2318937 -POINT-734830 -2336935 -POINT-677305 -2354519 -POINT-578717 -2379917 -POINT-523899 -2393054 -POINT-463514 -2405754 -POINT-364574 -2422007 -POINT-308802 -2430178 -POINT-246000 -2437618 -POINT-147548 -2444865 -POINT-91267 -2448003 -POINT-26502 -2449855 -POINT70667 -2448315 -POINT127003 -2446396 -POINT193208 -2442371 -POINT288313 -2432330 -POINT344250 -2425367 -POINT411363 -2415218 -POINT503677 -2397030 -POINT558765 -2385082 -POINT626207 -2368621 -POINT715048 -2342701 -POINT768841 -2325863 -POINT836000 -2302955 -POINT920745 -2269773 -POINT972817 -2248181 -POINT1039079 -2218746 -POINT1119139 -2178824 -POINT1169062 -2152651 -POINT1233781 -2116672 -POINT1308656 -2070572 -POINT1356032 -2040029 -POINT1418550 -1997554 -POINT1487774 -1945883 -POINT1532220 -1911217 -POINT1591890 -1862354 -POINT1655089 -1805744 -POINT1696252 -1767234 -POINT1752428 -1712162 -POINT1809261 -1651266 -POINT1846805 -1609220 -POINT1898851 -1548183 -POINT1949081 -1483676 -POINT1982705 -1438434 -POINT2029985 -1371738 -POINT2071853 -1306860 -POINT2101287 -1258786 -POINT2144777 -1184249 -POINT2178623 -1119942 -POINT2203628 -1069423 -POINT2242296 -987228 -POINT2268574 -924369 -POINT2288950 -871812 -POINT2321764 -782253 -POINT2341007 -721647 -POINT2356590 -667475 -POINT2382539 -570983 -POINT2395361 -513347 -POINT2406026 -457997 -POINT2424135 -355117 -POINT2431226 -301075 -POINT2436884 -244991 -POINT2446199 -136390 -POINT2448298 -86469 -POINT2448908 -30104 -POINT2448579 83435 -POINT2446469 128808 -POINT2442024 185002 -POINT2431245 302589 -POINT2425742 343095 -POINT2416278 398663 -POINT2394334 519306 -POINT2386278 554737 -POINT2371869 609234 -POINT2338136 731842 -POINT2328379 762099 -POINT2309145 815084 -POINT2263124 938484 -POINT2252504 963579 -POINT2228599 1014626 -POINT2169893 1137569 -POINT2159227 1157618 -POINT2130842 1206318 -POINT2059190 1327499 -POINT2049262 1342720 -POINT2016624 1388678 -POINT1931901 1506736 -POINT1923483 1517453 -POINT1886858 1560302 -POINT1789064 1673847 -POINT1782835 1680464 -POINT1742517 1719857 -POINT1631822 1827480 -POINT1628430 1830501 -POINT1584739 1866120 -POINT1461427 1966396 -POINT1327303 2057115 -POINT1280599 2088675 -POINT1279283 2089481 -POINT1138941 2167127 -POINT1089596 2194373 -POINT1086839 2195743 -POINT941539 2259935 -POINT889948 2282649 -POINT885637 2284328 -POINT736649 2334805 -POINT683231 2352802 -POINT677309 2354519 -POINT525904 2391142 -POINT471086 2404279 -POINT463518 2405754 -POINT310978 2428495 -POINT255205 2436665 -POINT246004 2437618 -POINT93589 2446570 -POINT37308 2449708 -POINT26506 2449855 -POINT-124558 2445221 -POINT-180894 2443301 -POINT-193204 2442371 -POINT-341727 2424458 -POINT-397664 2417496 -POINT-411359 2415218 -POINT-556183 2384450 -POINT-611271 2372502 -POINT-626203 2368621 -POINT-766228 2325508 -POINT-820021 2308671 -POINT-835996 2302955 -POINT-970200 2248102 -POINT-1022272 2226508 -POINT-1039075 2218742 -POINT-1166472 2152845 -POINT-1216395 2126673 -POINT-1233778 2116668 -POINT-1353492 2040495 -POINT-1400869 2009953 -POINT-1418546 1997554 -POINT-1529763 1911944 -POINT-1574212 1877277 -POINT-1591901 1862354 -POINT-1693893 1768208 -POINT-1735053 1729697 -POINT-1752424 1712162 -POINT-1844590 1610434 -POINT-1882134 1568388 -POINT-1898847 1548183 -POINT-1980631 1439868 -POINT-2014255 1394626 -POINT-2029981 1371738 -POINT-2100964 1257867 -POINT-2130397 1209793 -POINT-2144773 1184249 -POINT-2204614 1065876 -POINT-2229618 1015357 -POINT-2242292 987224 -POINT-2290763 865416 -POINT-2311140 812859 -POINT-2321760 782253 -POINT-2358737 658085 -POINT-2374321 603913 -POINT-2382536 570983 -POINT-2407974 445522 -POINT-2418640 390172 -POINT-2424131 355117 -POINT-2438110 229417 -POINT-2443767 173334 -POINT-2446195 136390 -POINT-2448873 11485 -POLYGON_AT_HEIGHT26000000 -POINT-1982709 -95417 -POINT-1976094 -163262 -POINT-1963804 -289295 -POINT-1925993 -480388 -POINT-1869627 -666854 -POINT-1843607 -729860 -POINT-1795270 -846900 -POINT-1763195 -907052 -POINT-1703611 -1018791 -POINT-1665796 -1075507 -POINT-1595548 -1180866 -POINT-1472120 -1331573 -POINT-1423967 -1379822 -POINT-1334516 -1469451 -POINT-1184049 -1593181 -POINT-1127412 -1631110 -POINT-1022199 -1701568 -POINT-850492 -1793567 -POINT-787538 -1819717 -POINT-670591 -1868293 -POINT-605378 -1888148 -POINT-484235 -1925029 -POINT-293226 -1963222 -POINT-99378 -1982509 -POINT95415 -1982704 -POINT163260 -1976091 -POINT289293 -1963806 -POINT480394 -1925994 -POINT545644 -1906271 -POINT666856 -1869632 -POINT846895 -1795269 -POINT907046 -1763195 -POINT1018785 -1703613 -POINT1075503 -1665798 -POINT1180864 -1595550 -POINT1233604 -1552358 -POINT1331575 -1472122 -POINT1379824 -1423968 -POINT1469453 -1334514 -POINT1512753 -1281864 -POINT1593187 -1184059 -POINT1663643 -1078839 -POINT1701570 -1022197 -POINT1761373 -910577 -POINT1793565 -850490 -POINT1868303 -670597 -POINT1925035 -484241 -POINT1949863 -360068 -POINT1963228 -293224 -POINT1982515 -99384 -POINT1982644 27245 -POINT1982713 95414 -POINT1982713 95417 -POINT1970424 221449 -POINT1963808 289295 -POINT1925996 480388 -POINT1889355 601603 -POINT1869630 666854 -POINT1843610 729860 -POINT1795274 846900 -POINT1735690 958640 -POINT1703615 1018791 -POINT1595552 1180866 -POINT1552360 1233604 -POINT1472124 1331573 -POINT1423971 1379822 -POINT1334520 1469451 -POINT1281866 1512749 -POINT1184053 1593181 -POINT1022203 1701568 -POINT850496 1793567 -POINT733549 1842144 -POINT670595 1868293 -POINT605382 1888148 -POINT484239 1925029 -POINT360071 1949857 -POINT293230 1963222 -POINT167217 1975760 -POINT99382 1982509 -POINT-27245 1982636 -POINT-95411 1982704 -POINT-289289 1963806 -POINT-480390 1925994 -POINT-601602 1889356 -POINT-666852 1869632 -POINT-846906 1795265 -POINT-1018781 1703613 -POINT-1180860 1595550 -POINT-1233600 1552358 -POINT-1331571 1472122 -POINT-1379820 1423968 -POINT-1469450 1334514 -POINT-1512749 1281864 -POINT-1593183 1184059 -POINT-1631111 1127417 -POINT-1701566 1022197 -POINT-1761369 910577 -POINT-1793562 850490 -POINT-1868299 670597 -POINT-1888152 605384 -POINT-1925031 484241 -POINT-1963224 293224 -POINT-1975762 167216 -POINT-1982511 99384 -POINT-1982640 -27248 diff --git a/src/libseqarrange/data/arrange_data_import.txt b/src/libseqarrange/data/arrange_data_import.txt deleted file mode 100644 index 1cafb49efc..0000000000 --- a/src/libseqarrange/data/arrange_data_import.txt +++ /dev/null @@ -1,103 +0,0 @@ -[0] -{ - { 59805001, 104837501}, - { 138194999, 104837501}, - { 138194999, 170162499}, - { 59805001, 170162499}, -} -[1] -{ - { 98905001, 128837501}, - { 137094999, 128837501}, - { 137094999, 194162499}, - { 98905001, 194162499}, -} -[2] -{ - { 87947501, -200777500}, - { 109052499, -200777500}, - { 109052499, 111777500}, - { 87947501, 111777500}, -} -[3] -{ - { -251749999, 135975000}, - { 451749999, 135975000}, - { 451749999, 146025000}, - { -251749999, 146025000}, -} -[4] -{ - { 60703847, 116627178}, - { 66819499, 110123477}, - { 91818437, 104869705}, - { 105080395, 104869705}, - { 130074079, 110123477}, - { 132267420, 114102067}, - { 137466435, 134016601}, - { 129018075, 157509597}, - { 108906102, 169955300}, - { 66569848, 169955300}, - { 61724003, 148124080}, -} -[5] -{ - { 99664894, 149716571}, - { 116945947, 134530303}, - { 132235559, 129464592}, - { 134464447, 129703905}, - { 136226625, 131089485}, - { 136982449, 133766317}, - { 131461528, 186578282}, - { 130446438, 189877277}, - { 122072071, 193937577}, - { 116438408, 191146129}, - { 99690267, 159429154}, -} -[6] -{ - { -107902592, 137317947}, - { -107397580, 136812603}, - { 265301643, 136812603}, - { 265806656, 137317947}, - { 265806656, 144386863}, - { 265301643, 144891423}, - { -107397580, 144891423}, - { -107902592, 144386863}, -} -[7] -{ - { 88464688, 108238119}, - { 91284129, 67996899}, - { 91796754, 67484273}, - { 105125022, 67484273}, - { 105637648, 67996899}, - { 108457089, 110545008}, - { 100003682, 150980876}, - { 88464688, 110545008}, -} -[8] -{ - { 94975001, 144975001}, - { 105024999, 144975001}, - { 105024999, 155024999}, - { 94975001, 155024999}, -} -[9] -{ - { 96253202, 148380153}, - { 99529436, 145945250}, - { 102556657, 147254000}, - { 103276232, 147565098}, - { 103746800, 151619843}, - { 100470568, 154054751}, - { 98325608, 153127426}, - { 96723770, 152434902}, -} -[10] -{ - { 87345001, -200670000}, - { 350654999, -200670000}, - { 350654999, 68670000}, - { 87345001, 68670000}, -} diff --git a/src/libseqarrange/data/arrange_data_import.txt.1 b/src/libseqarrange/data/arrange_data_import.txt.1 deleted file mode 100644 index 8389034b28..0000000000 --- a/src/libseqarrange/data/arrange_data_import.txt.1 +++ /dev/null @@ -1,3 +0,0 @@ -1 80300000 67400000 -0 80200000 67400000 -2 115400000 88200000 diff --git a/src/libseqarrange/data/arrange_data_import.txt.2 b/src/libseqarrange/data/arrange_data_import.txt.2 deleted file mode 100644 index d88abffb18..0000000000 --- a/src/libseqarrange/data/arrange_data_import.txt.2 +++ /dev/null @@ -1,5 +0,0 @@ -2 76700000 64400000 -3 76800000 64400000 -1 118900000 73978723 -0 76800000 113508353 -4 159800000 125700000 diff --git a/src/libseqarrange/data/arrange_data_import.txt.3 b/src/libseqarrange/data/arrange_data_import.txt.3 deleted file mode 100644 index ce7befdc13..0000000000 --- a/src/libseqarrange/data/arrange_data_import.txt.3 +++ /dev/null @@ -1,4 +0,0 @@ -1 81800000 68600000 -2 81999642 109400000 -3 126200000 68600000 -0 126200000 109400000 diff --git a/src/libseqarrange/data/arrange_data_import_000.txt b/src/libseqarrange/data/arrange_data_import_000.txt deleted file mode 100644 index 19dc369735..0000000000 --- a/src/libseqarrange/data/arrange_data_import_000.txt +++ /dev/null @@ -1,6 +0,0 @@ -88 84900000 76299800 -99 213000000 17600000 -66 84900000 140300000 -44 165100000 69700000 -131 164900100 133600100 -151 41800000 180400000 diff --git a/src/libseqarrange/data/arrange_data_import_001.txt b/src/libseqarrange/data/arrange_data_import_001.txt deleted file mode 100644 index 83acd50da1..0000000000 --- a/src/libseqarrange/data/arrange_data_import_001.txt +++ /dev/null @@ -1,5 +0,0 @@ -77 75800000 67999800 -162 165100000 62100000 -120 75800000 131899900 -192 174200000 147900000 -234 32700000 183999900 diff --git a/src/libseqarrange/data/arrange_data_import_002.txt b/src/libseqarrange/data/arrange_data_import_002.txt deleted file mode 100644 index db932d2145..0000000000 --- a/src/libseqarrange/data/arrange_data_import_002.txt +++ /dev/null @@ -1,2 +0,0 @@ -203 154100000 78999900 -223 95800000 131000000 diff --git a/src/libseqarrange/data/combo_body.txt b/src/libseqarrange/data/combo_body.txt deleted file mode 100644 index fe2994f0b5..0000000000 --- a/src/libseqarrange/data/combo_body.txt +++ /dev/null @@ -1,38 +0,0 @@ ----------------------------------------------------------------- -Polygon decimation utility - build 173 -(C) 2024 Prusa Research -================================================================ -Decimation ... - Decimating objects (polygons) ... - Decimating objects (polygons) ... finished - [0] - -39105202 -33269412 - -33019977 -39740757 - -8145411 -44968391 - 5050568 -44968391 - 29919905 -39740757 - 32102334 -35781961 - 37275483 -15966504 - 28869155 7409612 - 8857241 19793397 - -33268386 19793397 - -38090122 -1929211 - [1] - -76068 -127644 - -1876 -127644 - -1876 -47354 - -76068 -47354 - [2] - -76068 -127644 - -1876 -127644 - -1876 -47354 - -76068 -47354 - [3] - -76068 -127644 - -1876 -127644 - -1876 -47354 - -76068 -47354 - Displaying ... finised -Decimation ... finished -Total CPU time: 0.002 ----------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_fac.txt b/src/libseqarrange/data/combo_fac.txt deleted file mode 100644 index 9c97373ccb..0000000000 --- a/src/libseqarrange/data/combo_fac.txt +++ /dev/null @@ -1,38 +0,0 @@ ----------------------------------------------------------------- -Polygon decimation utility - build 173 -(C) 2024 Prusa Research -================================================================ -Decimation ... - Decimating objects (polygons) ... - Decimating objects (polygons) ... finished - [0] - 70757723 18776195 - 87952801 3665480 - 103166346 -1375028 - 105384145 -1136906 - 107137556 241781 - 107889619 2905295 - 102396166 55454515 - 101386126 58737097 - 93053422 62777197 - 87447788 59999636 - 70782970 28440457 - [1] - 70936482 18899128 - 71010674 18899128 - 71010674 18979418 - 70936482 18979418 - [2] - 70936482 18899128 - 71010674 18899128 - 71010674 18979418 - 70936482 18979418 - [3] - 70936482 18899128 - 71010674 18899128 - 71010674 18979418 - 70936482 18979418 - Displaying ... finised -Decimation ... finished -Total CPU time: 0.002 ----------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_fan.txt b/src/libseqarrange/data/combo_fan.txt deleted file mode 100644 index 343b7e0abf..0000000000 --- a/src/libseqarrange/data/combo_fan.txt +++ /dev/null @@ -1,38 +0,0 @@ ----------------------------------------------------------------- -Polygon decimation utility - build 173 -(C) 2024 Prusa Research -================================================================ -Decimation ... - Decimating objects (polygons) ... - Decimating objects (polygons) ... finished - [0] - -242277 -223805 - 16952801 -15334520 - 32166346 -20375028 - 34384145 -20136906 - 36137556 -18758219 - 36889619 -16094705 - 31396166 36454515 - 30386126 39737097 - 22053422 43777197 - 16447788 40999636 - -217030 9440457 - [1] - -63518 -100872 - 10674 -100872 - 10674 -20582 - -63518 -20582 - [2] - -63518 -100872 - 10674 -100872 - 10674 -20582 - -63518 -20582 - [3] - -63518 -100872 - 10674 -100872 - 10674 -20582 - -63518 -20582 - Displaying ... finised -Decimation ... finished -Total CPU time: 0.002 ----------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_gantry.txt b/src/libseqarrange/data/combo_gantry.txt deleted file mode 100644 index a2531d436d..0000000000 --- a/src/libseqarrange/data/combo_gantry.txt +++ /dev/null @@ -1,36 +0,0 @@ ----------------------------------------------------------------- -Polygon decimation utility - build 173 -(C) 2024 Prusa Research -================================================================ -Decimation ... - Decimating objects (polygons) ... - Decimating objects (polygons) ... finished - [0] - -206972968 -12664471 - -206470468 -13167301 - 164374531 -13167301 - 164877031 -12664471 - 164877031 -5630724 - 164374531 -5128674 - -29074248 19032746 - -206470468 -5128674 - -206972968 -5630724 - [1] - -29076068 18872356 - -29001876 18872356 - -29001876 18952646 - -29076068 18952646 - [2] - -29068974 18882518 - -29008974 18882518 - -29008974 18942502 - -29068974 18942502 - [3] - -29068966 18882518 - -29008976 18882518 - -29008976 18942502 - -29068966 18942502 - Displaying ... finised -Decimation ... finished -Total CPU time: 0.003 ----------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_hose.txt b/src/libseqarrange/data/combo_hose.txt deleted file mode 100644 index f371e218e6..0000000000 --- a/src/libseqarrange/data/combo_hose.txt +++ /dev/null @@ -1,32 +0,0 @@ ----------------------------------------------------------------- -Polygon decimation utility - build 173 -(C) 2024 Prusa Research -================================================================ -Decimation ... - Decimating objects (polygons) ... - Decimating objects (polygons) ... finished - [0] - -11942228 -3802359 - -9008017 -45681679 - 5396300 -46215173 - 8864005 -1401563 - 66483 40680323 - [1] - -76068 37872356 - -1876 37872356 - -1876 37952646 - -76068 37952646 - [2] - -76068 37872356 - -1876 37872356 - -1876 37952646 - -76068 37952646 - [3] - -76068 37872356 - -1876 37872356 - -1876 37952646 - -76068 37952646 - Displaying ... finised -Decimation ... finished -Total CPU time: 0.002 ----------------------------------------------------------------- diff --git a/src/libseqarrange/data/combo_nozzle.txt b/src/libseqarrange/data/combo_nozzle.txt deleted file mode 100644 index a53a3446ca..0000000000 --- a/src/libseqarrange/data/combo_nozzle.txt +++ /dev/null @@ -1,47 +0,0 @@ ----------------------------------------------------------------- -Polygon decimation utility - build 173 -(C) 2024 Prusa Research -================================================================ -Decimation ... - Decimating objects (polygons) ... - Decimating objects (polygons) ... finished - [0] - -3728158 -1611789 - -468223 -4034578 - 2543938 -2732339 - 3259933 -2422789 - 3728160 1611785 - 468227 4034579 - -1666062 3111867 - -3259931 2422789 - [1] - -3728158 -1611789 - -468223 -4034578 - 2543938 -2732339 - 3259933 -2422789 - 3728160 1611785 - 468227 4034579 - -1666062 3111867 - -3259931 2422789 - [2] - -2666014 -49680 - -1818027 -1951384 - 77116 -2665786 - 1907693 -1864493 - 2665439 89970 - 1896904 1871196 - 29049 2665786 - -1888367 1881903 - [3] - -2147405 -103336 - -1445368 -1591511 - 103333 -2147400 - 1591513 -1445366 - 2147410 103336 - 1445372 1591511 - -103328 2147400 - -1591509 1445366 - Displaying ... finised -Decimation ... finished -Total CPU time: 0.004 ----------------------------------------------------------------- diff --git a/src/libseqarrange/data/export.body.mk4 b/src/libseqarrange/data/export.body.mk4 deleted file mode 100644 index c7fc21ea8b..0000000000 --- a/src/libseqarrange/data/export.body.mk4 +++ /dev/null @@ -1,35 +0,0 @@ -[0] -{ - { -68105202, -14269412}, - { -62019977, -20740757}, - { -37145411, -25968391}, - { -23949432, -25968391}, - { 919905, -20740757}, - { 3102334, -16781961}, - { 8275483, 3033496}, - { -130845, 26409612}, - { -20142759, 38793397}, - { -62268386, 38793397}, - { -67090122, 17070789}, -} -[1] -{ - { -29076068, 18872356}, - { -29001876, 18872356}, - { -29001876, 18952646}, - { -29076068, 18952646}, -} -[2] -{ - { -29076068, 18872356}, - { -29001876, 18872356}, - { -29001876, 18952646}, - { -29076068, 18952646}, -} -[3] -{ - { -29076068, 18872356}, - { -29001876, 18872356}, - { -29001876, 18952646}, - { -29076068, 18952646}, -} diff --git a/src/libseqarrange/data/export.composed.mk4 b/src/libseqarrange/data/export.composed.mk4 deleted file mode 100644 index 17d813ceed..0000000000 --- a/src/libseqarrange/data/export.composed.mk4 +++ /dev/null @@ -1,90 +0,0 @@ -[0] -{ - { 92965001, -18561998}, - { 93467501, -19064498}, - { 106532499, -19064498}, - { 107032853, -18564152}, - { 107034999, -18561998}, - { 107034999, 19064502}, - { 92965001, 19064502}, -} -[1] -{ - { 32272767, -14064134}, - { 32280333, -14131218}, - { 32302627, -14194939}, - { 32338558, -14252100}, - { 37292553, -19466386}, - { 38297597, -20471247}, - { 44986025, -22129499}, - { 62925267, -25646999}, - { 75990267, -25646999}, - { 93929527, -22129499}, - { 100612767, -20471247}, - { 101617767, -19466247}, - { 102773534, -16551745}, - { 107785873, 1947953}, - { 107842660, 2224149}, - { 107879923, 2503647}, - { 107897512, 2785068}, - { 107895336, 3067036}, - { 107873407, 3348150}, - { 107831802, 3627038}, - { 107770768, 3902327}, - { 107690581, 4172657}, - { 99572443, 26211131}, - { 98567458, 27216131}, - { 79759156, 38472000}, - { 76943572, 38472004}, - { 40867696, 38472004}, - { 38051650, 38472000}, - { 37800400, 38220750}, - { 33277771, 16965000}, - { 32272767, -9140112}, -} -[2] -{ - { -85924999, -3516481}, - { -85422499, -4019311}, - { 285422499, -4019311}, - { 285924999, -3516481}, - { 285924999, 3517263}, - { 285422499, 4019313}, - { -85422499, 4019313}, - { -85924999, 3517263}, -} -[3] -{ - { 96271842, -1611789}, - { 96428935, -1728550}, - { 97278040, -2359609}, - { 99136269, -3740647}, - { 99222851, -3804993}, - { 99396077, -3933730}, - { 99531777, -4034578}, - { 99939184, -3858447}, - { 102543938, -2732339}, - { 103080267, -2500469}, - { 103259933, -2422789}, - { 103277445, -2271923}, - { 103311106, -1981898}, - { 103346009, -1681153}, - { 103423252, -1015595}, - { 103662663, 1047320}, - { 103710662, 1460919}, - { 103728160, 1611785}, - { 103571066, 1728550}, - { 102462264, 2552616}, - { 100777152, 3804994}, - { 100468227, 4034579}, - { 98333938, 3111867}, - { 97890800, 2920286}, - { 97261663, 2648291}, - { 96919735, 2500465}, - { 96740069, 2422789}, - { 96717496, 2228352}, - { 96595536, 1177477}, - { 96426053, -282893}, - { 96306377, -1314089}, - { 96289341, -1460923}, -} diff --git a/src/libseqarrange/data/export.fan.mk4 b/src/libseqarrange/data/export.fan.mk4 deleted file mode 100644 index 2a22b9aa68..0000000000 --- a/src/libseqarrange/data/export.fan.mk4 +++ /dev/null @@ -1,35 +0,0 @@ -[0] -{ - { -29242277, 18776195}, - { -12047199, 3665480}, - { 3166346, -1375028}, - { 5384145, -1136906}, - { 7137556, 241781}, - { 7889619, 2905295}, - { 2396166, 55454515}, - { 1386126, 58737097}, - { -6946578, 62777197}, - { -12552212, 59999636}, - { -29217030, 28440457}, -} -[1] -{ - { -29063518, 18899128}, - { -28989326, 18899128}, - { -28989326, 18979418}, - { -29063518, 18979418}, -} -[2] -{ - { -29063518, 18899128}, - { -28989326, 18899128}, - { -28989326, 18979418}, - { -29063518, 18979418}, -} -[3] -{ - { -29063518, 18899128}, - { -28989326, 18899128}, - { -28989326, 18979418}, - { -29063518, 18979418}, -} diff --git a/src/libseqarrange/data/export.gantry.mk4 b/src/libseqarrange/data/export.gantry.mk4 deleted file mode 100644 index 458e9f49b4..0000000000 --- a/src/libseqarrange/data/export.gantry.mk4 +++ /dev/null @@ -1,33 +0,0 @@ -[0] -{ - { -206972968, -12664471}, - { -206470468, -13167301}, - { 164374531, -13167301}, - { 164877031, -12664471}, - { 164877031, -5630724}, - { 164374531, -5128674}, - { -29074248, 19032746}, - { -206470468, -5128674}, - { -206972968, -5630724}, -} -[1] -{ - { -29111351, 18877954}, - { -29022835, 18841825}, - { -28966594, 18940523}, - { -29040014, 18983178}, -} -[2] -{ - { -29082150, 18912265}, - { -29037501, 18869349}, - { -28995798, 18912729}, - { -29038668, 18955671}, -} -[3] -{ - { -29082142, 18913210}, - { -29038481, 18869349}, - { -28995801, 18912970}, - { -29038668, 18955671}, -} diff --git a/src/libseqarrange/data/export.hose.mk4 b/src/libseqarrange/data/export.hose.mk4 deleted file mode 100644 index 2988c87b0f..0000000000 --- a/src/libseqarrange/data/export.hose.mk4 +++ /dev/null @@ -1,29 +0,0 @@ -[0] -{ - { -40942228, -22802359}, - { -38008017, -64681679}, - { -23603700, -65215173}, - { -20135995, -20401563}, - { -28933517, 21680323}, -} -[1] -{ - { -29076068, 18872356}, - { -29001876, 18872356}, - { -29001876, 18952646}, - { -29076068, 18952646}, -} -[2] -{ - { -29076068, 18872356}, - { -29001876, 18872356}, - { -29001876, 18952646}, - { -29076068, 18952646}, -} -[3] -{ - { -29076068, 18872356}, - { -29001876, 18872356}, - { -29001876, 18952646}, - { -29076068, 18952646}, -} diff --git a/src/libseqarrange/data/export.nozzle.mk4 b/src/libseqarrange/data/export.nozzle.mk4 deleted file mode 100644 index c142366be6..0000000000 --- a/src/libseqarrange/data/export.nozzle.mk4 +++ /dev/null @@ -1,44 +0,0 @@ -[0] -{ - { -3728158, -1611789}, - { -468223, -4034578}, - { 2543938, -2732339}, - { 3259933, -2422789}, - { 3728160, 1611785}, - { 468227, 4034579}, - { -1666062, 3111867}, - { -3259931, 2422789}, -} -[1] -{ - { -3728158, -1611789}, - { -468223, -4034578}, - { 2543938, -2732339}, - { 3259933, -2422789}, - { 3728160, 1611785}, - { 468227, 4034579}, - { -1666062, 3111867}, - { -3259931, 2422789}, -} -[2] -{ - { -2666014, -49680}, - { -1818027, -1951384}, - { 77116, -2665786}, - { 1907693, -1864493}, - { 2665439, 89970}, - { 1896904, 1871196}, - { 29049, 2665786}, - { -1888367, 1881903}, -} -[3] -{ - { -2147405, -103336}, - { -1445368, -1591511}, - { 103333, -2147400}, - { 1591513, -1445366}, - { 2147410, 103336}, - { 1445372, 1591511}, - { -103328, 2147400}, - { -1591509, 1445366}, -} diff --git a/src/libseqarrange/data/extruder_bounding_boxes.mk4.svg b/src/libseqarrange/data/extruder_bounding_boxes.mk4.svg deleted file mode 100644 index 5510bd66a7..0000000000 --- a/src/libseqarrange/data/extruder_bounding_boxes.mk4.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_10.svg b/src/libseqarrange/data/polygon_test_10.svg deleted file mode 100644 index 066965be10..0000000000 --- a/src/libseqarrange/data/polygon_test_10.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_11.svg b/src/libseqarrange/data/polygon_test_11.svg deleted file mode 100644 index bf86bf1797..0000000000 --- a/src/libseqarrange/data/polygon_test_11.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_12.svg b/src/libseqarrange/data/polygon_test_12.svg deleted file mode 100644 index 31fae7c9b6..0000000000 --- a/src/libseqarrange/data/polygon_test_12.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_13.svg b/src/libseqarrange/data/polygon_test_13.svg deleted file mode 100644 index fe37996b40..0000000000 --- a/src/libseqarrange/data/polygon_test_13.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_14.svg b/src/libseqarrange/data/polygon_test_14.svg deleted file mode 100644 index 261d7b5043..0000000000 --- a/src/libseqarrange/data/polygon_test_14.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_15.svg b/src/libseqarrange/data/polygon_test_15.svg deleted file mode 100644 index 2235605166..0000000000 --- a/src/libseqarrange/data/polygon_test_15.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_7.svg b/src/libseqarrange/data/polygon_test_7.svg deleted file mode 100644 index b644da6297..0000000000 --- a/src/libseqarrange/data/polygon_test_7.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_8.svg b/src/libseqarrange/data/polygon_test_8.svg deleted file mode 100644 index c4c291a960..0000000000 --- a/src/libseqarrange/data/polygon_test_8.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/libseqarrange/data/polygon_test_9.svg b/src/libseqarrange/data/polygon_test_9.svg deleted file mode 100644 index b3103e86f5..0000000000 --- a/src/libseqarrange/data/polygon_test_9.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/libseqarrange/data/preprocess_test_1.svg b/src/libseqarrange/data/preprocess_test_1.svg deleted file mode 100644 index 3aa6f039ce..0000000000 --- a/src/libseqarrange/data/preprocess_test_1.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/libseqarrange/data/preprocess_test_2.svg b/src/libseqarrange/data/preprocess_test_2.svg deleted file mode 100644 index ce04d17394..0000000000 --- a/src/libseqarrange/data/preprocess_test_2.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/preprocess_test_3.svg b/src/libseqarrange/data/preprocess_test_3.svg deleted file mode 100644 index 1d47c3627a..0000000000 --- a/src/libseqarrange/data/preprocess_test_3.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/libseqarrange/data/preprocess_test_4.svg b/src/libseqarrange/data/preprocess_test_4.svg deleted file mode 100644 index 12b66e42f8..0000000000 --- a/src/libseqarrange/data/preprocess_test_4.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/preprocess_test_5.svg b/src/libseqarrange/data/preprocess_test_5.svg deleted file mode 100644 index 1d9cc83d87..0000000000 --- a/src/libseqarrange/data/preprocess_test_5.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/libseqarrange/data/preprocess_test_6.svg b/src/libseqarrange/data/preprocess_test_6.svg deleted file mode 100644 index f998b9397e..0000000000 --- a/src/libseqarrange/data/preprocess_test_6.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/sequential_decimator.svg b/src/libseqarrange/data/sequential_decimator.svg deleted file mode 100644 index 5510bd66a7..0000000000 --- a/src/libseqarrange/data/sequential_decimator.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/sequential_prusa.svg b/src/libseqarrange/data/sequential_prusa.svg deleted file mode 100644 index 43d2b9b719..0000000000 --- a/src/libseqarrange/data/sequential_prusa.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/sequential_prusa_000.svg b/src/libseqarrange/data/sequential_prusa_000.svg deleted file mode 100644 index 692747af00..0000000000 --- a/src/libseqarrange/data/sequential_prusa_000.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ID:88 T:32ID:44 T:416ID:66 T:288ID:131 T:544ID:151 T:672ID:99 T:160 - diff --git a/src/libseqarrange/data/sequential_prusa_001.svg b/src/libseqarrange/data/sequential_prusa_001.svg deleted file mode 100644 index b36a255499..0000000000 --- a/src/libseqarrange/data/sequential_prusa_001.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ID:192 T:416ID:162 T:160ID:120 T:288ID:77 T:32ID:234 T:544 - diff --git a/src/libseqarrange/data/sequential_prusa_002.svg b/src/libseqarrange/data/sequential_prusa_002.svg deleted file mode 100644 index eb2d3d95ac..0000000000 --- a/src/libseqarrange/data/sequential_prusa_002.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -ID:223 T:160ID:203 T:32 - diff --git a/src/libseqarrange/data/sequential_test_4.svg b/src/libseqarrange/data/sequential_test_4.svg deleted file mode 100644 index f48d4b82c6..0000000000 --- a/src/libseqarrange/data/sequential_test_4.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/sequential_test_5.svg b/src/libseqarrange/data/sequential_test_5.svg deleted file mode 100644 index 57806281ba..0000000000 --- a/src/libseqarrange/data/sequential_test_5.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/sequential_test_6.svg b/src/libseqarrange/data/sequential_test_6.svg deleted file mode 100644 index a2639cc07d..0000000000 --- a/src/libseqarrange/data/sequential_test_6.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/data/sequential_test_7.svg b/src/libseqarrange/data/sequential_test_7.svg deleted file mode 100644 index a544539b56..0000000000 --- a/src/libseqarrange/data/sequential_test_7.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/libseqarrange/include/seq_interface.hpp b/src/libseqarrange/include/seq_interface.hpp index a9e41d2a9c..b1cdf0fa20 100644 --- a/src/libseqarrange/include/seq_interface.hpp +++ b/src/libseqarrange/include/seq_interface.hpp @@ -16,11 +16,9 @@ /*----------------------------------------------------------------*/ #include "libslic3r/Polygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include "seq_defs.hpp" -#include "seq_sequential.hpp" -#include "seq_preprocess.hpp" /*----------------------------------------------------------------*/ @@ -33,14 +31,82 @@ using namespace Slic3r; namespace Sequential { + + +/*----------------------------------------------------------------*/ + +struct PrinterGeometry +{ + coord_t x_size; + coord_t y_size; + + std::set convex_heights; + std::set box_heights; + + std::map > extruder_slices; +}; + /*----------------------------------------------------------------*/ +// Setting printer type is obsolete, will be removed +enum PrinterType +{ + SEQ_PRINTER_TYPE_UNDEFINED, + SEQ_PRINTER_TYPE_PRUSA_MINI, + SEQ_PRINTER_TYPE_PRUSA_MK3S, + SEQ_PRINTER_TYPE_PRUSA_MK4, + SEQ_PRINTER_TYPE_PRUSA_XL, +}; + + +enum DecimationPrecision +{ + SEQ_DECIMATION_PRECISION_UNDEFINED, + SEQ_DECIMATION_PRECISION_LOW, + SEQ_DECIMATION_PRECISION_HIGH +}; + + +/*----------------------------------------------------------------*/ + +struct SolverConfiguration +{ + SolverConfiguration(); + SolverConfiguration(const PrinterGeometry &printer_geometry); + + static double convert_DecimationPrecision2Tolerance(DecimationPrecision decimation_precision); + void setup(const PrinterGeometry &printer_geometry); + + void set_DecimationPrecision(DecimationPrecision decimation_precision); + void set_ObjectGroupSize(int object_group_size); + + int bounding_box_size_optimization_step; + int minimum_X_bounding_box_size; + int minimum_Y_bounding_box_size; + int maximum_X_bounding_box_size; + int maximum_Y_bounding_box_size; + int minimum_bounding_box_size; + int maximum_bounding_box_size; + int object_group_size; + int temporal_spread; + + DecimationPrecision decimation_precision; + + // Setting printer type is obsolete, will be removed + PrinterType printer_type; + + string optimization_timeout; +}; + + +/*----------------------------------------------------------------*/ + struct ObjectToPrint { int id = 0; coord_t total_height = 0; - std::vector> pgns_at_height; + std::vector> pgns_at_height; }; @@ -62,7 +128,12 @@ struct ScheduledPlate { /*----------------------------------------------------------------*/ /* - This is the recommended interface for testing sequential printability. + This is the recommended interface for checking sequential printability. + + Returns true if objects are sequentially printable according to their + ordering in the input vector and the arrangement on the plate specified + by the schedule. Printable means that the extruder never hits printed + objects during printing. Otherwise returns false. Please see the corresponding example of usage (seq_test_interface.cpp) @@ -99,7 +170,10 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver /*----------------------------------------------------------------*/ - +/* + The following interface is for more internal use. + */ + int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, const std::vector &objects_to_print, std::vector &scheduled_plates); @@ -113,11 +187,13 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration const std::vector > &convex_unreachable_zones, const std::vector > &box_unreachable_zones, std::vector &scheduled_plates); + /*----------------------------------------------------------------*/ } // namespace Sequential + /*----------------------------------------------------------------*/ #endif /* __SEQ_INTERFACE_HPP__ */ diff --git a/src/libseqarrange/include/seq_preprocess.hpp b/src/libseqarrange/include/seq_preprocess.hpp index b1f76cee40..0396ef414b 100644 --- a/src/libseqarrange/include/seq_preprocess.hpp +++ b/src/libseqarrange/include/seq_preprocess.hpp @@ -26,6 +26,7 @@ namespace Sequential /*----------------------------------------------------------------*/ +const coord_t SEQ_SLICER_SCALE_FACTOR = 100000; const double SEQ_POLYGON_DECIMATION_GROW_FACTOR = 1.005; diff --git a/src/libseqarrange/include/seq_sequential.hpp b/src/libseqarrange/include/seq_sequential.hpp index b0cfa51036..6a1f1a518a 100644 --- a/src/libseqarrange/include/seq_sequential.hpp +++ b/src/libseqarrange/include/seq_sequential.hpp @@ -25,12 +25,14 @@ #include "libslic3r/Geometry.hpp" #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include #include "seq_defs.hpp" +#include "seq_interface.hpp" + /*----------------------------------------------------------------*/ @@ -46,9 +48,7 @@ namespace Sequential /*----------------------------------------------------------------*/ -const coord_t SEQ_SLICER_SCALE_FACTOR = 100000; const coord_t SEQ_SVG_SCALE_FACTOR = 50000; - #define SEQ_INTERSECTION_REPULSION_MIN "-0.01" #define SEQ_INTERSECTION_REPULSION_MAX "1.01" @@ -73,7 +73,7 @@ typedef std::unordered_map string_map; /*----------------------------------------------------------------*/ - +/* struct PrinterGeometry { coord_t x_size; @@ -82,148 +82,10 @@ struct PrinterGeometry std::set convex_heights; std::set box_heights; - std::map > extruder_slices; + std::map > extruder_slices; }; - - -/*----------------------------------------------------------------*/ +*/ -enum PrinterType -{ - SEQ_PRINTER_TYPE_UNDEFINED, - SEQ_PRINTER_TYPE_PRUSA_MK3S, - SEQ_PRINTER_TYPE_PRUSA_MK4, - SEQ_PRINTER_TYPE_PRUSA_XL, -}; - - -enum DecimationPrecision -{ - SEQ_DECIMATION_PRECISION_UNDEFINED, - SEQ_DECIMATION_PRECISION_LOW, - SEQ_DECIMATION_PRECISION_HIGH -}; - - -/*----------------------------------------------------------------*/ - -const int SEQ_PRUSA_MK3S_X_SIZE = 2500; -const int SEQ_PRUSA_MK3S_Y_SIZE = 2100; - -const coord_t SEQ_PRUSA_MK3S_NOZZLE_LEVEL = 0; -const coord_t SEQ_PRUSA_MK3S_EXTRUDER_LEVEL = 2000000; -const coord_t SEQ_PRUSA_MK3S_HOSE_LEVEL = 18000000; -const coord_t SEQ_PRUSA_MK3S_GANTRY_LEVEL = 26000000; - - -const int SEQ_PRUSA_MK4_X_SIZE = 2500; -const int SEQ_PRUSA_MK4_Y_SIZE = 2100; - -// TODO: measure for true values -const coord_t SEQ_PRUSA_MK4_NOZZLE_LEVEL = 0; -const coord_t SEQ_PRUSA_MK4_EXTRUDER_LEVEL = 2000000; -const coord_t SEQ_PRUSA_MK4_HOSE_LEVEL = 18000000; -const coord_t SEQ_PRUSA_MK4_GANTRY_LEVEL = 26000000; - -const int SEQ_PRUSA_XL_X_SIZE = 3600; -const int SEQ_PRUSA_XL_Y_SIZE = 3600; - -// TODO: measure for true values -const coord_t SEQ_PRUSA_XL_NOZZLE_LEVEL = 0; -const coord_t SEQ_PRUSA_XL_EXTRUDER_LEVEL = 2000000; -const coord_t SEQ_PRUSA_XL_HOSE_LEVEL = 18000000; -const coord_t SEQ_PRUSA_XL_GANTRY_LEVEL = 26000000; - - -/*----------------------------------------------------------------*/ - -struct SolverConfiguration -{ - SolverConfiguration() - : bounding_box_size_optimization_step(4) - , minimum_X_bounding_box_size(10) - , minimum_Y_bounding_box_size(10) - , maximum_X_bounding_box_size(SEQ_PRUSA_MK3S_X_SIZE) - , maximum_Y_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) - , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) - , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) - , object_group_size(4) - , temporal_spread(16) - , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) - , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) - , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) - { - /* nothing */ - } - - SolverConfiguration(const PrinterGeometry &printer_geometry) - : bounding_box_size_optimization_step(4) - , minimum_X_bounding_box_size(10) - , minimum_Y_bounding_box_size(10) - , maximum_X_bounding_box_size(printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR) - , maximum_Y_bounding_box_size(printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR) - , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) - , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) - , object_group_size(4) - , temporal_spread(16) - , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) - , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) - , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) - { - /* nothing */ - } - - static double convert_DecimationPrecision2Tolerance(DecimationPrecision decimation_precision) - { - switch (decimation_precision) - { - case SEQ_DECIMATION_PRECISION_UNDEFINED: - { - return SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED; - break; - } - case SEQ_DECIMATION_PRECISION_LOW: - { - return SEQ_DECIMATION_TOLERANCE_VALUE_HIGH; - break; - } - case SEQ_DECIMATION_PRECISION_HIGH: - { - return SEQ_DECIMATION_TOLERANCE_VALUE_LOW; - break; - } - default: - { - break; - } - } - return SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED; - } - - void setup(const PrinterGeometry &printer_geometry) - { - maximum_X_bounding_box_size = printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR; - maximum_Y_bounding_box_size = printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR; - minimum_bounding_box_size = MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size); - maximum_bounding_box_size = MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size); - } - - int bounding_box_size_optimization_step; - int minimum_X_bounding_box_size; - int minimum_Y_bounding_box_size; - int maximum_X_bounding_box_size; - int maximum_Y_bounding_box_size; - int minimum_bounding_box_size; - int maximum_bounding_box_size; - int object_group_size; - int temporal_spread; - - DecimationPrecision decimation_precision; - PrinterType printer_type; - - string optimization_timeout; -}; - /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/include/seq_step b/src/libseqarrange/include/seq_step deleted file mode 100644 index 66321c084c..0000000000 --- a/src/libseqarrange/include/seq_step +++ /dev/null @@ -1 +0,0 @@ -189 \ No newline at end of file diff --git a/src/libseqarrange/include/seq_version.hpp b/src/libseqarrange/include/seq_version.hpp index 803b4440dc..2cb62d53a9 100644 --- a/src/libseqarrange/include/seq_version.hpp +++ b/src/libseqarrange/include/seq_version.hpp @@ -2,6 +2,6 @@ #define __SEQ_VERSION_HPP__ -#define SEQ_SEQUENTIAL_BUILD "189" +#define SEQ_SEQUENTIAL_BUILD "193" #endif /* __SEQ_VERSION_HPP__ */ diff --git a/src/libseqarrange/include/seq_version.sh b/src/libseqarrange/include/seq_version.sh deleted file mode 100644 index 2e4b64d125..0000000000 --- a/src/libseqarrange/include/seq_version.sh +++ /dev/null @@ -1,7 +0,0 @@ -echo "#ifndef __SEQ_VERSION_HPP__" -echo "#define __SEQ_VERSION_HPP__" -echo "" -echo "" -echo "#define SEQ_SEQUENTIAL_BUILD "\"`cat ./SEQUENTIAL-Prusa/include/seq_step`\" -echo "" -echo "#endif /* __SEQ_VERSION_HPP__ */" diff --git a/src/libseqarrange/printers/printer_geometry.mk3s.txt b/src/libseqarrange/printers/printer_geometry.mk3s.txt deleted file mode 100644 index 514216fc13..0000000000 --- a/src/libseqarrange/printers/printer_geometry.mk3s.txt +++ /dev/null @@ -1,31 +0,0 @@ -X_SIZE250000000 -Y_SIZE210000000 - -CONVEX_HEIGHT0 -CONVEX_HEIGHT2000000 -BOX_HEIGHT18000000 -BOX_HEIGHT26000000 - -POLYGON_AT_HEIGHT0 -POINT-500000 -500000 -POINT500000 -500000 -POINT500000 500000 -POINT-500000 500000 - -POLYGON_AT_HEIGHT2000000 -POINT-2000000 -10000000 -POINT2000000 -10000000 -POINT2000000 2000000 -POINT-2000000 2000000 - -POLYGON_AT_HEIGHT18000000 -POINT-1000000 500000 -POINT1000000 500000 -POINT1000000 -250000000 -POINT-1000000 -250000000 - -POLYGON_AT_HEIGHT26000000 -POINT-250000000 2000000 -POINT250000000 2000000 -POINT250000000 2100000 -POINT-250000000 2100000 diff --git a/src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt b/src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt deleted file mode 100644 index 3b1cd0706c..0000000000 --- a/src/libseqarrange/printers/printer_geometry.mk4.compatibility.txt +++ /dev/null @@ -1,43 +0,0 @@ -X_SIZE250000000 -Y_SIZE210000000 - -CONVEX_HEIGHT0 -CONVEX_HEIGHT2000000 -BOX_HEIGHT18000000 -BOX_HEIGHT26000000 - -POLYGON_AT_HEIGHT0 -POINT-500000 -500000 -POINT500000 -500000 -POINT500000 500000 -POINT-500000 500000 - -POLYGON_AT_HEIGHT2000000 -POINT-1000000 -21000000 -POINT37000000 -21000000 -POINT37000000 44000000 -POINT-1000000 44000000 - -POLYGON_AT_HEIGHT2000000 -POINT-40000000 -45000000 -POINT38000000 -45000000 -POINT38000000 20000000 -POINT-40000000 20000000 - -POLYGON_AT_HEIGHT18000000 -POINT-350000000 -4000000 -POINT350000000 -4000000 -POINT350000000 -14000000 -POINT-350000000 -14000000 - -POLYGON_AT_HEIGHT26000000 -POINT-12000000 -350000000 -POINT9000000 -350000000 -POINT9000000 -39000000 -POINT-12000000 -39000000 - -POLYGON_AT_HEIGHT26000000 -POINT-12000000 -350000000 -POINT250000000 -350000000 -POINT250000000 -82000000 -POINT-12000000 -82000000 diff --git a/src/libseqarrange/printers/printer_geometry.mk4.txt b/src/libseqarrange/printers/printer_geometry.mk4.txt deleted file mode 100644 index 159a779980..0000000000 --- a/src/libseqarrange/printers/printer_geometry.mk4.txt +++ /dev/null @@ -1,45 +0,0 @@ -X_SIZE250000000 -Y_SIZE210000000 - -CONVEX_HEIGHT0 -CONVEX_HEIGHT3000000 -BOX_HEIGHT11000000 -BOX_HEIGHT13000000 - -POLYGON_AT_HEIGHT0 -POINT-500000 -500000 -POINT500000 -500000 -POINT500000 500000 -POINT-500000 500000 - -POLYGON_AT_HEIGHT3000000 -POINT-1000000 -21000000 -POINT37000000 -21000000 -POINT37000000 44000000 -POINT-1000000 44000000 - -POLYGON_AT_HEIGHT3000000 -POINT-40000000 -45000000 -POINT38000000 -45000000 -POINT38000000 20000000 -POINT-40000000 20000000 - -POLYGON_AT_HEIGHT11000000 -POINT-350000000 -4000000 -POINT350000000 -4000000 -POINT350000000 -14000000 -POINT-350000000 -14000000 - -POLYGON_AT_HEIGHT13000000 -POINT-12000000 -350000000 -POINT9000000 -350000000 -POINT9000000 -39000000 -POINT-12000000 -39000000 - -POLYGON_AT_HEIGHT13000000 -POINT-12000000 -350000000 -POINT250000000 -350000000 -POINT250000000 -82000000 -POINT-12000000 -82000000 - - diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index fee987926f..dabf6681f0 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -22,7 +22,126 @@ namespace Sequential { + +/*----------------------------------------------------------------*/ + +const int SEQ_OBJECT_GROUP_SIZE = 4; + +const int SEQ_PRUSA_MK3S_X_SIZE = 2500; +const int SEQ_PRUSA_MK3S_Y_SIZE = 2100; + +const coord_t SEQ_PRUSA_MK3S_NOZZLE_LEVEL = 0; +const coord_t SEQ_PRUSA_MK3S_EXTRUDER_LEVEL = 2000000; +const coord_t SEQ_PRUSA_MK3S_HOSE_LEVEL = 18000000; +const coord_t SEQ_PRUSA_MK3S_GANTRY_LEVEL = 26000000; + +const int SEQ_PRUSA_MK4_X_SIZE = 2500; +const int SEQ_PRUSA_MK4_Y_SIZE = 2100; + +// TODO: measure for true values +const coord_t SEQ_PRUSA_MK4_NOZZLE_LEVEL = 0; +const coord_t SEQ_PRUSA_MK4_EXTRUDER_LEVEL = 2000000; +const coord_t SEQ_PRUSA_MK4_HOSE_LEVEL = 18000000; +const coord_t SEQ_PRUSA_MK4_GANTRY_LEVEL = 26000000; + +const int SEQ_PRUSA_XL_X_SIZE = 3600; +const int SEQ_PRUSA_XL_Y_SIZE = 3600; + +// TODO: measure for true values +const coord_t SEQ_PRUSA_XL_NOZZLE_LEVEL = 0; +const coord_t SEQ_PRUSA_XL_EXTRUDER_LEVEL = 2000000; +const coord_t SEQ_PRUSA_XL_HOSE_LEVEL = 18000000; +const coord_t SEQ_PRUSA_XL_GANTRY_LEVEL = 26000000; + + +/*----------------------------------------------------------------*/ + +SolverConfiguration::SolverConfiguration() + : bounding_box_size_optimization_step(4) + , minimum_X_bounding_box_size(10) + , minimum_Y_bounding_box_size(10) + , maximum_X_bounding_box_size(SEQ_PRUSA_MK3S_X_SIZE) + , maximum_Y_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) + , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) + , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) + , object_group_size(SEQ_OBJECT_GROUP_SIZE) + , temporal_spread(16) + , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) + , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) + , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) +{ + /* nothing */ +} + + +SolverConfiguration::SolverConfiguration(const PrinterGeometry &printer_geometry) + : bounding_box_size_optimization_step(4) + , minimum_X_bounding_box_size(10) + , minimum_Y_bounding_box_size(10) + , maximum_X_bounding_box_size(printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR) + , maximum_Y_bounding_box_size(printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR) + , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) + , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) + , object_group_size(SEQ_OBJECT_GROUP_SIZE) + , temporal_spread(16) + , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) + , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) + , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) +{ + /* nothing */ +} + + +double SolverConfiguration::convert_DecimationPrecision2Tolerance(DecimationPrecision decimation_precision) +{ + switch (decimation_precision) + { + case SEQ_DECIMATION_PRECISION_UNDEFINED: + { + return SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED; + break; + } + case SEQ_DECIMATION_PRECISION_LOW: + { + return SEQ_DECIMATION_TOLERANCE_VALUE_HIGH; + break; + } + case SEQ_DECIMATION_PRECISION_HIGH: + { + return SEQ_DECIMATION_TOLERANCE_VALUE_LOW; + break; + } + default: + { + break; + } + } + return SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED; +} + + +void SolverConfiguration::setup(const PrinterGeometry &printer_geometry) +{ + maximum_X_bounding_box_size = printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR; + maximum_Y_bounding_box_size = printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR; + minimum_bounding_box_size = MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size); + maximum_bounding_box_size = MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size); +} + + +void SolverConfiguration::set_DecimationPrecision(DecimationPrecision _decimation_precision) +{ + decimation_precision = _decimation_precision; +} + + +void SolverConfiguration::set_ObjectGroupSize(int _object_group_size) +{ + object_group_size = _object_group_size; +} + + /*----------------------------------------------------------------*/ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration &solver_configuration, diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp index 2125e61d94..555ffef2be 100644 --- a/src/libseqarrange/src/seq_preprocess.cpp +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -653,11 +653,6 @@ void extend_PolygonBoxUnreachableZone(const SolverConfiguration &SEQ_UN { BoundingBox extruder_box = get_extents(extruder_polygons[i]); - /* - coord_t extruder_box_size_x = extruder_box.max.x() - extruder_box.min.x(); - coord_t extruder_box_size_y = extruder_box.max.y() - extruder_box.min.y(); - */ - coord_t min_x = polygon_box.min.x() + extruder_box.min.x(); coord_t min_y = polygon_box.min.y() + extruder_box.min.y(); @@ -703,7 +698,11 @@ void prepare_ExtruderPolygons(const SolverConfiguration &solver if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) { - printf("Object too large to fit onto plate.\n"); + #ifdef DEBUG + { + printf("Object too large to fit onto plate.\n"); + } + #endif throw std::runtime_error("OBJECT TOO LARGE"); } @@ -892,7 +891,7 @@ double calc_PolygonArea(const Slic3r::Polygon &polygon) double calc_PolygonUnreachableZoneArea(const Slic3r::Polygon &polygon, - const std::vector &unreachable_polygons) + const std::vector &unreachable_polygons) { Polygons overlapping_polygons; @@ -945,7 +944,7 @@ double calc_PolygonArea(const std::vector &fixed, double calc_PolygonUnreachableZoneArea(const std::vector &polygons, - const std::vector > &unreachable_polygons) + const std::vector > &unreachable_polygons) { assert(polygons.size() == unreachable_polygons.size()); double area = 0; diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 72670d4f64..ad62f8e699 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -8968,13 +8968,6 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration undecided.clear(); - /* - for (int i = 0; i < object_group_size; ++i) - { - undecided.push_back(curr_polygon + i); - } - */ - for (int i = object_group_size - 1; i >= 0; --i) { undecided.push_back(curr_polygon + i + remaining_polygon); diff --git a/src/libseqarrange/src/seq_utilities.cpp b/src/libseqarrange/src/seq_utilities.cpp index 08b696edce..2f8aea3dcb 100644 --- a/src/libseqarrange/src/seq_utilities.cpp +++ b/src/libseqarrange/src/seq_utilities.cpp @@ -19,6 +19,7 @@ #include "libslic3r/ClipperUtils.hpp" #include "seq_utilities.hpp" +#include "seq_preprocess.hpp" /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/src/sequential_decimator.cpp b/src/libseqarrange/src/sequential_decimator.cpp index c184323187..2e69caca53 100644 --- a/src/libseqarrange/src/sequential_decimator.cpp +++ b/src/libseqarrange/src/sequential_decimator.cpp @@ -15,7 +15,7 @@ #include #include "libslic3r/Polygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include "seq_version.hpp" diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index f00bb66b62..43e9d43c24 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -11,7 +11,7 @@ #include "libslic3r/Polygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include "seq_version.hpp" diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index 0118a30eb1..e76cdf119e 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -16,13 +16,14 @@ #include "libslic3r/Polygon.hpp" #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include #include "seq_interface.hpp" #include "seq_utilities.hpp" +#include "seq_preprocess.hpp" #include "seq_test_interface.hpp" @@ -35,6 +36,7 @@ using namespace Sequential; /*----------------------------------------------------------------*/ +/* static bool find_and_remove(std::string& src, const std::string& key) { size_t pos = src.find(key); @@ -44,6 +46,7 @@ static bool find_and_remove(std::string& src, const std::string& key) } return false; } +*/ /* std::vector load_exported_data(const std::string& filename) @@ -332,7 +335,7 @@ int test_interface_5(void) SolverConfiguration solver_configuration; solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; - solver_configuration.object_group_size = 4; + solver_configuration.object_group_size = 4; printf("Loading objects ...\n"); std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); diff --git a/src/libseqarrange/test/seq_test_polygon.cpp b/src/libseqarrange/test/seq_test_polygon.cpp index e8852d2696..b439464776 100644 --- a/src/libseqarrange/test/seq_test_polygon.cpp +++ b/src/libseqarrange/test/seq_test_polygon.cpp @@ -15,7 +15,7 @@ #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index 899e8079fe..a296b5801e 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -17,7 +17,7 @@ #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include diff --git a/src/libseqarrange/test/seq_test_sequential.cpp b/src/libseqarrange/test/seq_test_sequential.cpp index 9f7757b58f..60382e34b1 100644 --- a/src/libseqarrange/test/seq_test_sequential.cpp +++ b/src/libseqarrange/test/seq_test_sequential.cpp @@ -16,7 +16,7 @@ #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include @@ -26,10 +26,6 @@ #include "seq_test_sequential.hpp" -#ifndef M_PI -#define M_PI 3.14159 -#endif - /*----------------------------------------------------------------*/ @@ -836,13 +832,15 @@ void test_sequential_4(void) int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; + poly_1_pos_x = poly_1_pos_y = poly_2_pos_x = poly_2_pos_y = poly_3_pos_x = poly_3_pos_y = poly_4_pos_x = poly_4_pos_y = 0.0; + double time_1_t, time_2_t, time_3_t, time_4_t; + time_1_t = time_2_t = time_3_t = time_4_t = -1.0; double _poly_1_pos_x, _poly_1_pos_y, _poly_2_pos_x, _poly_2_pos_y, _poly_3_pos_x, _poly_3_pos_y, _poly_4_pos_x, _poly_4_pos_y; + _poly_1_pos_x = _poly_1_pos_y = _poly_2_pos_x = _poly_2_pos_y = _poly_3_pos_x = _poly_3_pos_y = _poly_4_pos_x = _poly_4_pos_y = 0.0; double _time_1_t, _time_2_t, _time_3_t, _time_4_t; - - //time_1_t = time_2_t = time_3_t = time_4_t = -1.0; - + _time_1_t = _time_2_t = _time_3_t = _time_4_t = -1.0; for (int bounding_box_size = 200; bounding_box_size > 10; bounding_box_size -= 4) { From 15823c3776ca92c0a98bd516b101a92544c90fa4 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 30 Sep 2024 15:33:27 +0200 Subject: [PATCH 05/88] Fixed conflicts, fixed compilation of tests --- src/libseqarrange/include/seq_interface.hpp | 6 +++--- src/libseqarrange/include/seq_sequential.hpp | 2 +- src/libseqarrange/src/sequential_decimator.cpp | 2 +- src/libseqarrange/src/sequential_prusa.cpp | 2 +- src/libseqarrange/test/seq_test_interface.cpp | 2 +- src/libseqarrange/test/seq_test_polygon.cpp | 2 +- src/libseqarrange/test/seq_test_preprocess.cpp | 2 +- src/libseqarrange/test/seq_test_sequential.cpp | 2 +- src/slic3r/GUI/ArrangeHelper.cpp | 1 - tests/slic3rutils/CMakeLists.txt | 2 +- 10 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/libseqarrange/include/seq_interface.hpp b/src/libseqarrange/include/seq_interface.hpp index b1cdf0fa20..12b6730225 100644 --- a/src/libseqarrange/include/seq_interface.hpp +++ b/src/libseqarrange/include/seq_interface.hpp @@ -16,7 +16,7 @@ /*----------------------------------------------------------------*/ #include "libslic3r/Polygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "seq_defs.hpp" @@ -43,7 +43,7 @@ struct PrinterGeometry std::set convex_heights; std::set box_heights; - std::map > extruder_slices; + std::map > extruder_slices; }; @@ -106,7 +106,7 @@ struct ObjectToPrint { int id = 0; coord_t total_height = 0; - std::vector> pgns_at_height; + std::vector> pgns_at_height; }; diff --git a/src/libseqarrange/include/seq_sequential.hpp b/src/libseqarrange/include/seq_sequential.hpp index 6a1f1a518a..3c2d2df691 100644 --- a/src/libseqarrange/include/seq_sequential.hpp +++ b/src/libseqarrange/include/seq_sequential.hpp @@ -25,7 +25,7 @@ #include "libslic3r/Geometry.hpp" #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include diff --git a/src/libseqarrange/src/sequential_decimator.cpp b/src/libseqarrange/src/sequential_decimator.cpp index 2e69caca53..c184323187 100644 --- a/src/libseqarrange/src/sequential_decimator.cpp +++ b/src/libseqarrange/src/sequential_decimator.cpp @@ -15,7 +15,7 @@ #include #include "libslic3r/Polygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include "seq_version.hpp" diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index 43e9d43c24..f00bb66b62 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -11,7 +11,7 @@ #include "libslic3r/Polygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include "seq_version.hpp" diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index e76cdf119e..e41187e33c 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -16,7 +16,7 @@ #include "libslic3r/Polygon.hpp" #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include diff --git a/src/libseqarrange/test/seq_test_polygon.cpp b/src/libseqarrange/test/seq_test_polygon.cpp index b439464776..e8852d2696 100644 --- a/src/libseqarrange/test/seq_test_polygon.cpp +++ b/src/libseqarrange/test/seq_test_polygon.cpp @@ -15,7 +15,7 @@ #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index a296b5801e..899e8079fe 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -17,7 +17,7 @@ #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include diff --git a/src/libseqarrange/test/seq_test_sequential.cpp b/src/libseqarrange/test/seq_test_sequential.cpp index 60382e34b1..595f22ac47 100644 --- a/src/libseqarrange/test/seq_test_sequential.cpp +++ b/src/libseqarrange/test/seq_test_sequential.cpp @@ -16,7 +16,7 @@ #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/ConvexHull.hpp" +#include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" #include diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index f90ae679cd..aeedcf65be 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -6,7 +6,6 @@ #include #include "libseqarrange/include/seq_interface.hpp" -#include "libseqarrange/include/seq_sequential.hpp" namespace Slic3r { diff --git a/tests/slic3rutils/CMakeLists.txt b/tests/slic3rutils/CMakeLists.txt index ac025ce46c..83c320ec22 100644 --- a/tests/slic3rutils/CMakeLists.txt +++ b/tests/slic3rutils/CMakeLists.txt @@ -8,7 +8,7 @@ add_executable(${_TEST_NAME}_tests ) # mold linker for successful linking needs also to link TBB library and link it before libslic3r. -target_link_libraries(${_TEST_NAME}_tests test_common TBB::tbb TBB::tbbmalloc libslic3r_gui libslic3r) +target_link_libraries(${_TEST_NAME}_tests test_common TBB::tbb TBB::tbbmalloc libslic3r_gui libslic3r libseqarrange) if (MSVC) target_link_libraries(${_TEST_NAME}_tests Setupapi.lib) From 1109ad8ee34cf4e89983e66a6cd42e43e4bb449d Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 30 Sep 2024 16:02:35 +0200 Subject: [PATCH 06/88] Some more CMake polishing --- src/libseqarrange/CMakeLists.txt | 45 ++++++++++++++++++- .../{ => libseqarrange}/seq_interface.hpp | 5 +-- src/libseqarrange/src/CMakeLists.txt | 23 ---------- .../{include => src}/seq_defs.hpp | 0 .../{include => src}/seq_preprocess.hpp | 0 .../{include => src}/seq_sequential.hpp | 0 .../{include => src}/seq_utilities.hpp | 0 .../{include => src}/seq_version.hpp | 0 src/libseqarrange/test/CMakeLists.txt | 22 --------- src/slic3r/CMakeLists.txt | 1 + src/slic3r/GUI/ArrangeHelper.cpp | 2 +- 11 files changed, 46 insertions(+), 52 deletions(-) rename src/libseqarrange/include/{ => libseqarrange}/seq_interface.hpp (98%) delete mode 100644 src/libseqarrange/src/CMakeLists.txt rename src/libseqarrange/{include => src}/seq_defs.hpp (100%) rename src/libseqarrange/{include => src}/seq_preprocess.hpp (100%) rename src/libseqarrange/{include => src}/seq_sequential.hpp (100%) rename src/libseqarrange/{include => src}/seq_utilities.hpp (100%) rename src/libseqarrange/{include => src}/seq_version.hpp (100%) delete mode 100644 src/libseqarrange/test/CMakeLists.txt diff --git a/src/libseqarrange/CMakeLists.txt b/src/libseqarrange/CMakeLists.txt index b2f56fbd8d..751d7149d9 100644 --- a/src/libseqarrange/CMakeLists.txt +++ b/src/libseqarrange/CMakeLists.txt @@ -1,5 +1,46 @@ cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.10) -add_subdirectory(src) -add_subdirectory(test) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_CXX_EXTENSIONS False) + +find_package(Z3 REQUIRED) +slic3r_remap_configs("z3::libz3" RelWithDebInfo Release) + +add_library(libseqarrange STATIC src/seq_interface.cpp src/seq_preprocess.cpp src/seq_sequential.cpp src/seq_utilities.cpp) +target_include_directories(libseqarrange PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange) +target_link_libraries(libseqarrange libslic3r z3::libz3) + +add_executable(sequential_arrange src/sequential_prusa.cpp) +target_include_directories(sequential_arrange PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange) +target_link_libraries(sequential_arrange libseqarrange) + +add_executable(sequential_decimator src/sequential_decimator.cpp) +target_include_directories(sequential_decimator PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange) +target_link_libraries(sequential_decimator libseqarrange) + + + +# The tests - separate executables for now. + +# Commented-out for now - depends on Gecode +# add_executable(seq_test_arrangement test/seq_test_arrangement.cpp) +# target_link_libraries(seq_test_arrangement libseqarrange) + +add_executable(seq_test_polygon test/seq_test_polygon.cpp test/prusaparts.cpp) +target_link_libraries(seq_test_polygon libseqarrange) +target_include_directories(seq_test_polygon PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") + +add_executable(seq_test_sequential test/seq_test_sequential.cpp) +target_link_libraries(seq_test_sequential libseqarrange) +target_include_directories(seq_test_sequential PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") + +add_executable(seq_test_preprocess test/seq_test_preprocess.cpp test/prusaparts.cpp) +target_link_libraries(seq_test_preprocess libseqarrange) +target_include_directories(seq_test_preprocess PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") + +add_executable(seq_test_interface test/seq_test_interface.cpp) +target_link_libraries(seq_test_interface libseqarrange) +target_include_directories(seq_test_interface PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") diff --git a/src/libseqarrange/include/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp similarity index 98% rename from src/libseqarrange/include/seq_interface.hpp rename to src/libseqarrange/include/libseqarrange/seq_interface.hpp index 12b6730225..9f6633b7fc 100644 --- a/src/libseqarrange/include/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -18,9 +18,6 @@ #include "libslic3r/Polygon.hpp" #include "libslic3r/Geometry/ConvexHull.hpp" -#include "seq_defs.hpp" - - /*----------------------------------------------------------------*/ using namespace Slic3r; @@ -96,7 +93,7 @@ struct SolverConfiguration // Setting printer type is obsolete, will be removed PrinterType printer_type; - string optimization_timeout; + std::string optimization_timeout; }; diff --git a/src/libseqarrange/src/CMakeLists.txt b/src/libseqarrange/src/CMakeLists.txt deleted file mode 100644 index c533254064..0000000000 --- a/src/libseqarrange/src/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -cmake_minimum_required(VERSION 3.10) - -project(Surynek LANGUAGES CXX) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED True) -set(CMAKE_CXX_EXTENSIONS False) - -add_library(libseqarrange STATIC seq_interface.cpp seq_preprocess.cpp seq_sequential.cpp seq_utilities.cpp) -add_executable(sequential_arrange sequential_prusa.cpp) -add_executable(sequential_decimator sequential_decimator.cpp) - -target_include_directories(libseqarrange PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../include) - -find_package(Z3 REQUIRED) -slic3r_remap_configs("z3::libz3" RelWithDebInfo Release) - -target_link_libraries(libseqarrange libslic3r z3::libz3) -target_link_libraries(sequential_arrange libseqarrange) -target_link_libraries(sequential_decimator libseqarrange) - - - diff --git a/src/libseqarrange/include/seq_defs.hpp b/src/libseqarrange/src/seq_defs.hpp similarity index 100% rename from src/libseqarrange/include/seq_defs.hpp rename to src/libseqarrange/src/seq_defs.hpp diff --git a/src/libseqarrange/include/seq_preprocess.hpp b/src/libseqarrange/src/seq_preprocess.hpp similarity index 100% rename from src/libseqarrange/include/seq_preprocess.hpp rename to src/libseqarrange/src/seq_preprocess.hpp diff --git a/src/libseqarrange/include/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp similarity index 100% rename from src/libseqarrange/include/seq_sequential.hpp rename to src/libseqarrange/src/seq_sequential.hpp diff --git a/src/libseqarrange/include/seq_utilities.hpp b/src/libseqarrange/src/seq_utilities.hpp similarity index 100% rename from src/libseqarrange/include/seq_utilities.hpp rename to src/libseqarrange/src/seq_utilities.hpp diff --git a/src/libseqarrange/include/seq_version.hpp b/src/libseqarrange/src/seq_version.hpp similarity index 100% rename from src/libseqarrange/include/seq_version.hpp rename to src/libseqarrange/src/seq_version.hpp diff --git a/src/libseqarrange/test/CMakeLists.txt b/src/libseqarrange/test/CMakeLists.txt deleted file mode 100644 index 32c0d6964b..0000000000 --- a/src/libseqarrange/test/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Minimum required version of CMake -cmake_minimum_required(VERSION 3.10) - -# Set C++ standard and flags -set(CMAKE_CXX_STANDARD 17) - - -# add_executable(seq_test_arrangement seq_test_arrangement.cpp) -# target_link_libraries(seq_test_arrangement libseqarrange) - -add_executable(seq_test_polygon seq_test_polygon.cpp prusaparts.cpp) -target_link_libraries(seq_test_polygon libseqarrange) - -add_executable(seq_test_sequential seq_test_sequential.cpp) -target_link_libraries(seq_test_sequential libseqarrange) - -add_executable(seq_test_preprocess seq_test_preprocess.cpp prusaparts.cpp) -target_link_libraries(seq_test_preprocess libseqarrange) - -add_executable(seq_test_interface seq_test_interface.cpp) -target_link_libraries(seq_test_interface libseqarrange) - diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index baec0f0869..878c154c57 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -455,6 +455,7 @@ target_link_libraries( stb_dxt fastfloat boost_headeronly + libseqarrange ) if (MSVC) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index aeedcf65be..62968bbb42 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -5,7 +5,7 @@ #include -#include "libseqarrange/include/seq_interface.hpp" +#include "libseqarrange/seq_interface.hpp" namespace Slic3r { From 5cfd3e745b70e77bb0ea7ee61be4f2224a1325ee Mon Sep 17 00:00:00 2001 From: surynek Date: Thu, 3 Oct 2024 19:41:36 +0200 Subject: [PATCH 07/88] Corrected gantry unreachable zone for MK4. --- src/slic3r/GUI/ArrangeHelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 62968bbb42..7d86da366a 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -28,7 +28,7 @@ static Sequential::PrinterGeometry get_printer_geometry() { slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -500000, -500000 }, { 500000, -500000 }, { 500000, 500000 }, { -500000, 500000 } } } }); slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -1000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -1000000, 44000000 } }, { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); - slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -4000000 }, {350000000, -4000000 }, {350000000, -14000000 }, {-350000000, -14000000 } } } }); + slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, {350000000, -23000000 }, {350000000, -35000000 }, {-350000000, -35000000 } } } }); slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -12000000, -350000000 }, { 9000000, -350000000 }, { 9000000, -39000000 }, { -12000000, -39000000 } }, { { -12000000, -350000000 }, {250000000, -350000000 }, {250000000, -82000000 }, { -12000000, -82000000} } } }); From e89d74f698ae8d3f87c77353d465f626c4fa887e Mon Sep 17 00:00:00 2001 From: surynek Date: Thu, 3 Oct 2024 23:51:04 +0200 Subject: [PATCH 08/88] Corrected inconsistency between sequential scheduling and sequential printability check. --- src/libseqarrange/src/seq_interface.cpp | 16 +- src/libseqarrange/src/seq_preprocess.cpp | 112 ++- src/libseqarrange/src/seq_preprocess.hpp | 15 +- src/libseqarrange/src/seq_sequential.cpp | 878 ++++++++++-------- src/libseqarrange/src/seq_sequential.hpp | 2 +- .../src/sequential_decimator.cpp | 3 +- src/libseqarrange/src/sequential_prusa.cpp | 6 +- .../test/seq_test_preprocess.cpp | 6 +- 8 files changed, 563 insertions(+), 475 deletions(-) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index dabf6681f0..08ca77fd27 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -67,7 +67,7 @@ SolverConfiguration::SolverConfiguration() , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) , object_group_size(SEQ_OBJECT_GROUP_SIZE) , temporal_spread(16) - , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) + , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) { @@ -85,7 +85,7 @@ SolverConfiguration::SolverConfiguration(const PrinterGeometry &printer_geometry , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) , object_group_size(SEQ_OBJECT_GROUP_SIZE) , temporal_spread(16) - , decimation_precision(SEQ_DECIMATION_PRECISION_UNDEFINED) + , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) { @@ -174,7 +174,8 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration convex_level_polygons, box_level_polygons, extruder_convex_level_polygons, - extruder_box_level_polygons); + extruder_box_level_polygons, + false); prepare_ObjectPolygons(solver_configuration, convex_level_polygons, @@ -324,7 +325,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver convex_level_polygons, box_level_polygons, extruder_convex_level_polygons, - extruder_box_level_polygons); + extruder_box_level_polygons, + true); prepare_ObjectPolygons(solver_configuration, convex_level_polygons, @@ -551,7 +553,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ { decimate_PolygonForSequentialSolver(solver_configuration, objects_to_print[i].pgns_at_height[j].second, - decimated_polygon); + decimated_polygon, + true); } else { @@ -977,7 +980,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration { decimate_PolygonForSequentialSolver(solver_configuration, objects_to_print[i].pgns_at_height[j].second, - decimated_polygon); + decimated_polygon, + true); } else { diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp index 555ffef2be..b082a31ec9 100644 --- a/src/libseqarrange/src/seq_preprocess.cpp +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -371,7 +371,7 @@ void scaleDown_PolygonForSequentialSolver(coord_t scale_factor, const Slic3r::Polygon &polygon, Slic3r::Polygon &scale_down_polygon) { - for (int i = 0; i < polygon.points.size(); ++i) + for (unsigned int i = 0; i < polygon.points.size(); ++i) { scale_down_polygon.points.insert(scale_down_polygon.points.begin() + i, Point(polygon.points[i].x() / scale_factor, polygon.points[i].y() / scale_factor)); } @@ -383,7 +383,7 @@ Slic3r::Polygon scaleDown_PolygonForSequentialSolver(coord_t scale_factor, const { Slic3r::Polygon scale_down_polygon; - for (int i = 0; i < polygon.points.size(); ++i) + for (unsigned int i = 0; i < polygon.points.size(); ++i) { scale_down_polygon.points.insert(scale_down_polygon.points.begin() + i, Point(polygon.points[i].x() / scale_factor, polygon.points[i].y() / scale_factor)); } @@ -441,7 +441,7 @@ Slic3r::Polygon scaleUp_PolygonForSlicer(coord_t scale_factor, const Slic3r::Pol { Slic3r::Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Slic3r::Point(poly.points[i].x() * scale_factor, poly.points[i].y() * scale_factor); } @@ -460,7 +460,7 @@ Slic3r::Polygon scaleUp_PolygonForSlicer(coord_t scale_factor, const Polygon &po { Slic3r::Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * scale_factor + x_pos * scale_factor, poly.points[i].y() * scale_factor + y_pos * scale_factor); @@ -474,7 +474,7 @@ void ground_PolygonByBoundingBox(Slic3r::Polygon &polygon) { BoundingBox polygon_box = get_extents(polygon); - for (int i = 0; i < polygon.points.size(); ++i) + for (unsigned int i = 0; i < polygon.points.size(); ++i) { polygon.points[i] -= polygon_box.min; } @@ -484,7 +484,7 @@ void ground_PolygonByBoundingBox(Slic3r::Polygon &polygon) void ground_PolygonByFirstPoint(Slic3r::Polygon &polygon) { Point first = polygon.points[0]; - for (int i = 0; i < polygon.points.size(); ++i) + for (unsigned int i = 0; i < polygon.points.size(); ++i) { polygon.points[i] -= first; } @@ -501,7 +501,7 @@ void shift_Polygon(Slic3r::Polygon &polygon, coord_t x_offset, coord_t y_offset) void shift_Polygon(Slic3r::Polygon &polygon, const Slic3r::Point &offset) { - for (int i = 0; i < polygon.points.size(); ++i) + for (unsigned int i = 0; i < polygon.points.size(); ++i) { polygon.points[i] += offset; } @@ -520,7 +520,7 @@ Polygon transform_UpsideDown(const SolverConfiguration &solver_configuration, co { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x(), (coord_t)(solver_configuration.maximum_Y_bounding_box_size * scale_factor - poly.points[i].y())); @@ -545,47 +545,59 @@ void transform_UpsideDown(const SolverConfiguration &solver_configuration, coord /*----------------------------------------------------------------*/ -void decimate_PolygonForSequentialSolver(const SolverConfiguration &solver_configuration, - const Slic3r::Polygon &polygon, - Slic3r::Polygon &decimated_polygon) +void grow_PolygonForContainedness(coord_t center_x, coord_t center_y, Slic3r::Polygon &polygon) { - double DP_tolerance = SolverConfiguration::convert_DecimationPrecision2Tolerance(solver_configuration.decimation_precision); - - decimate_PolygonForSequentialSolver(DP_tolerance, polygon, decimated_polygon); + for (unsigned int i = 0; i < polygon.points.size(); ++i) + { + polygon.points[i] *= SEQ_POLYGON_DECIMATION_GROW_FACTOR; + } + + BoundingBox polygon_box = get_extents(polygon); + + coord_t shift_x = ((polygon_box.min.x() + polygon_box.max.x()) / 2) - center_x; + coord_t shift_y = ((polygon_box.min.y() + polygon_box.max.y()) / 2) - center_y; + + for (unsigned int i = 0; i < polygon.points.size(); ++i) + { + polygon.points[i] -= Point(shift_x, shift_y); + } } -void decimate_PolygonForSequentialSolver(double DP_tolerance, +void decimate_PolygonForSequentialSolver(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon, - Slic3r::Polygon &decimated_polygon) + Slic3r::Polygon &decimated_polygon, + bool extra_safety) +{ + double DP_tolerance = SolverConfiguration::convert_DecimationPrecision2Tolerance(solver_configuration.decimation_precision); + + decimate_PolygonForSequentialSolver(DP_tolerance, polygon, decimated_polygon, extra_safety); +} + + +void decimate_PolygonForSequentialSolver(double DP_tolerance, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &decimated_polygon, + bool extra_safety) { decimated_polygon = polygon; decimated_polygon.make_counter_clockwise(); decimated_polygon.douglas_peucker(DP_tolerance); + + BoundingBox polygon_box = get_extents(polygon); + + coord_t center_x = (polygon_box.min.x() + polygon_box.max.x()) / 2; + coord_t center_y = (polygon_box.min.y() + polygon_box.max.y()) / 2; if (decimated_polygon.points.size() >= 4) { while (true) { - for (int i = 0; i < decimated_polygon.points.size(); ++i) - { - decimated_polygon.points[i] *= SEQ_POLYGON_DECIMATION_GROW_FACTOR; - } - - BoundingBox polygon_box = get_extents(polygon); - BoundingBox decimated_polygon_box = get_extents(decimated_polygon); - - coord_t shift_x = ((decimated_polygon_box.min.x() + decimated_polygon_box.max.x()) / 2) - ((polygon_box.min.x() + polygon_box.max.x()) / 2); - coord_t shift_y = ((decimated_polygon_box.min.y() + decimated_polygon_box.max.y()) / 2) - ((polygon_box.min.y() + polygon_box.max.y()) / 2); - - for (int i = 0; i < decimated_polygon.points.size(); ++i) - { - decimated_polygon.points[i] -= Point(shift_x, shift_y); - } + grow_PolygonForContainedness(center_x, center_y, decimated_polygon); bool contains = true; - for (int i = 0; i < polygon.points.size(); ++i) + for (unsigned int i = 0; i < polygon.points.size(); ++i) { if (!decimated_polygon.contains(polygon.points[i])) { @@ -596,6 +608,10 @@ void decimate_PolygonForSequentialSolver(double DP_tolerance if (contains) { + if (extra_safety) + { + grow_PolygonForContainedness(center_x, center_y, decimated_polygon); + } break; } } @@ -627,11 +643,11 @@ void extend_PolygonConvexUnreachableZone(const SolverConfiguration &SEQ { Slic3r::ClipperLib::Paths paths; - for (int i = 0; i < extruder_polygons.size(); ++i) + for (unsigned int i = 0; i < extruder_polygons.size(); ++i) { ClipperLib::MinkowskiSum(extruder_polygons[i].points, polygon.points, paths, true); - for (int j = 0; j < paths.size(); ++j) + for (unsigned int j = 0; j < paths.size(); ++j) { unreachable_polygons.push_back(Polygon(paths[j])); } @@ -649,7 +665,7 @@ void extend_PolygonBoxUnreachableZone(const SolverConfiguration &SEQ_UN { BoundingBox polygon_box = get_extents(polygon); - for (int i = 0; i < extruder_polygons.size(); ++i) + for (unsigned int i = 0; i < extruder_polygons.size(); ++i) { BoundingBox extruder_box = get_extents(extruder_polygons[i]); @@ -674,9 +690,10 @@ void prepare_ExtruderPolygons(const SolverConfiguration &solver std::vector &convex_level_polygons, std::vector &box_level_polygons, std::vector > &extruder_convex_level_polygons, - std::vector > &extruder_box_level_polygons) + std::vector > &extruder_box_level_polygons, + bool extra_safety) { - for (int j = 0; j < object_to_print.pgns_at_height.size(); ++j) + for (unsigned int j = 0; j < object_to_print.pgns_at_height.size(); ++j) { coord_t height = object_to_print.pgns_at_height[j].first; @@ -688,7 +705,8 @@ void prepare_ExtruderPolygons(const SolverConfiguration &solver { decimate_PolygonForSequentialSolver(solver_configuration, object_to_print.pgns_at_height[j].second, - decimated_polygon); + decimated_polygon, + extra_safety); } else { @@ -763,7 +781,7 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration { std::vector scaled_unreachable_polygons; - for (int i = 0; i < extruder_convex_level_polygons.size(); ++i) + for (unsigned int i = 0; i < extruder_convex_level_polygons.size(); ++i) { extend_PolygonConvexUnreachableZone(solver_configuration, polygon, @@ -771,7 +789,7 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration scaled_unreachable_polygons); } - for (int i = 0; i < extruder_box_level_polygons.size(); ++i) + for (unsigned int i = 0; i < extruder_box_level_polygons.size(); ++i) { extend_PolygonBoxUnreachableZone(solver_configuration, polygon, @@ -779,7 +797,7 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration scaled_unreachable_polygons); } - for (int i = 0; i < scaled_unreachable_polygons.size(); ++i) + for (unsigned int i = 0; i < scaled_unreachable_polygons.size(); ++i) { Polygon scale_down_polygon; @@ -801,7 +819,7 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration std::vector scaled_unreachable_polygons; assert(extruder_convex_level_polygons.size() == convex_level_polygons.size()); - for (int i = 0; i < extruder_convex_level_polygons.size(); ++i) + for (unsigned int i = 0; i < extruder_convex_level_polygons.size(); ++i) { extend_PolygonConvexUnreachableZone(solver_configuration, convex_level_polygons[i], @@ -811,7 +829,7 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration assert(extruder_box_level_polygons.size() == box_level_polygons.size()); - for (int i = 0; i < extruder_box_level_polygons.size(); ++i) + for (unsigned int i = 0; i < extruder_box_level_polygons.size(); ++i) { extend_PolygonBoxUnreachableZone(solver_configuration, box_level_polygons[i], @@ -819,7 +837,7 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration scaled_unreachable_polygons); } - for (int i = 0; i < scaled_unreachable_polygons.size(); ++i) + for (unsigned int i = 0; i < scaled_unreachable_polygons.size(); ++i) { Polygon scale_down_polygon; @@ -930,11 +948,11 @@ double calc_PolygonArea(const std::vector &fixed, { double area = 0; - for (int i = 0; i < fixed.size(); ++i) + for (unsigned int i = 0; i < fixed.size(); ++i) { area += calc_PolygonArea(polygons[i]); } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { area += calc_PolygonArea(polygons[i]); } @@ -949,7 +967,7 @@ double calc_PolygonUnreachableZoneArea(const std::vector assert(polygons.size() == unreachable_polygons.size()); double area = 0; - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { area += calc_PolygonUnreachableZoneArea(polygons[i], unreachable_polygons[i]); } diff --git a/src/libseqarrange/src/seq_preprocess.hpp b/src/libseqarrange/src/seq_preprocess.hpp index 0396ef414b..2436bc40a1 100644 --- a/src/libseqarrange/src/seq_preprocess.hpp +++ b/src/libseqarrange/src/seq_preprocess.hpp @@ -136,13 +136,17 @@ void transform_UpsideDown(const SolverConfiguration &solver_configuration, /*----------------------------------------------------------------*/ +void grow_PolygonForContainedness(coord_t center_x, coord_t center_y, Slic3r::Polygon &polygon); + void decimate_PolygonForSequentialSolver(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon, - Slic3r::Polygon &scale_down_polygon); + Slic3r::Polygon &scale_down_polygon, + bool extra_safety); -void decimate_PolygonForSequentialSolver(double DP_tolerance, - const Slic3r::Polygon &polygon, - Slic3r::Polygon &decimated_polygon); +void decimate_PolygonForSequentialSolver(double DP_tolerance, + const Slic3r::Polygon &polygon, + Slic3r::Polygon &decimated_polygon, + bool extra_safety); void extend_PolygonConvexUnreachableZone(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon, @@ -165,7 +169,8 @@ void prepare_ExtruderPolygons(const SolverConfiguration &solver std::vector &convex_level_polygons, std::vector &box_level_polygons, std::vector > &extruder_convex_level_polygons, - std::vector > &extruder_box_level_polygons); + std::vector > &extruder_box_level_polygons, + bool extra_safety); void prepare_ObjectPolygons(const SolverConfiguration &solver_configuration, const std::vector &convex_level_polygons, diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index ad62f8e699..e5ba747ca5 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -146,7 +146,7 @@ void introduce_BedBoundingBox(z3::solver &Solver, int box_size_x, int box_size_y) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { BoundingBox box = get_extents(polygons[i]); @@ -166,7 +166,7 @@ void assume_BedBoundingBox(const z3::expr_vector &dec_vars_X, int box_size_y, z3::expr_vector &bounding_constraints) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { BoundingBox box = get_extents(polygons[i]); @@ -188,7 +188,7 @@ void introduce_BedBoundingBox(z3::solver &Solver, int box_max_x, int box_max_y) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { BoundingBox box = get_extents(polygons[i]); @@ -210,7 +210,7 @@ void assume_BedBoundingBox_(const z3::expr_vector &dec_vars_X, int box_max_y, z3::expr_vector &bounding_constraints) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { BoundingBox box = get_extents(polygons[i]); @@ -229,12 +229,12 @@ void assume_ConsequentialObjectPresence(z3::context &Context, const std::vector &missing, z3::expr_vector &presence_constraints) { - for (int i = 0; i < present.size(); ++i) + for (unsigned int i = 0; i < present.size(); ++i) { presence_constraints.push_back(dec_vars_T[present[i]] > Context.real_val(SEQ_TEMPORAL_PRESENCE_THRESHOLD)); } - for (int i = 0; i < missing.size(); ++i) + for (unsigned int i = 0; i < missing.size(); ++i) { presence_constraints.push_back(dec_vars_T[missing[i]] < Context.real_val(SEQ_TEMPORAL_ABSENCE_THRESHOLD)); } @@ -247,9 +247,9 @@ void introduce_TemporalOrdering(z3::solver &Solver, int temporal_spread, const std::vector &polygons) { - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { Solver.add(dec_vars_T[i] > dec_vars_T[j] + temporal_spread || dec_vars_T[i] + temporal_spread < dec_vars_T[j]); } @@ -266,17 +266,17 @@ void introduce_SequentialTemporalOrderingAgainstFixed(z3::solver int temporal_spread, const std::vector &SEQ_UNUSED(polygons)) { - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { Solver.add( dec_vars_T[undecided[i]] > Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator) + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator)); @@ -286,7 +286,7 @@ void introduce_SequentialTemporalOrderingAgainstFixed(z3::solver #ifdef DEBUG { printf("Origo\n"); - for (int i = 0; i < fixed.size(); ++i) + for (unsigned int i = 0; i < fixed.size(); ++i) { printf("%.3f\n", dec_values_T[fixed[i]].as_double()); } @@ -304,17 +304,17 @@ void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver int temporal_spread, const std::vector &SEQ_UNUSED(polygons)) { - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { Solver.add( dec_vars_T[undecided[i]] > Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator) + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < Context.real_val(dec_values_T[fixed[j]].numerator, dec_values_T[fixed[j]].denominator)); @@ -324,7 +324,7 @@ void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver #ifdef DEBUG { printf("Origo\n"); - for (int i = 0; i < fixed.size(); ++i) + for (unsigned int i = 0; i < fixed.size(); ++i) { printf("%.3f\n", dec_values_T[fixed[i]].as_double()); } @@ -1074,7 +1074,7 @@ void introduce_ConsequentialFixedLineNonIntersectionAgainstLine_implicit(z3::sol Solver.add((Context.real_val(dec_value_X1.numerator, dec_value_X1.denominator) + line1.a.x() + v1x * dec_var_t1) == (dec_var_X2 + line2.a.x() + v2x * dec_var_t2)); Solver.add((Context.real_val(dec_value_Y1.numerator, dec_value_Y1.denominator) + line1.a.y() + v1y * dec_var_t1) == (dec_var_Y2 + line2.a.y() + v2y * dec_var_t2)); - Solver.add( dec_var_T2 < 0 + Solver.add( dec_var_T2 < 0 || Context.real_val(dec_value_T1.numerator, dec_value_T1.denominator) < dec_var_T2 || dec_var_t1 < Context.real_val(SEQ_INTERSECTION_REPULSION_MIN) || dec_var_t1 > Context.real_val(SEQ_INTERSECTION_REPULSION_MAX) @@ -1178,7 +1178,7 @@ void introduce_PointOutsidePolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1221,7 +1221,7 @@ void introduce_SequentialPointOutsidePolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon2.points.size(); ++p) + for (unsigned int p = 0; p < polygon2.points.size(); ++p) { int np = (p + 1) % polygon2.points.size(); @@ -1264,7 +1264,7 @@ void introduce_ConsequentialPointOutsidePolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon2.points.size(); ++p) + for (unsigned int p = 0; p < polygon2.points.size(); ++p) { int np = (p + 1) % polygon2.points.size(); @@ -1309,7 +1309,7 @@ void introduce_ShiftSequentialPointOutsidePolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon2.points.size(); ++p) + for (unsigned int p = 0; p < polygon2.points.size(); ++p) { int np = (p + 1) % polygon2.points.size(); @@ -1354,7 +1354,7 @@ void introduce_ShiftConsequentialPointOutsidePolygon(z3::solver &Solv { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon2.points.size(); ++p) + for (unsigned int p = 0; p < polygon2.points.size(); ++p) { int np = (p + 1) % polygon2.points.size(); @@ -1395,7 +1395,7 @@ void introduce_FixedPointOutsidePolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1438,7 +1438,7 @@ void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1481,7 +1481,7 @@ void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); Line line(polygon.points[p], polygon.points[np]); @@ -1525,7 +1525,7 @@ void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solv { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1571,7 +1571,7 @@ void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solv { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); Line line(polygon.points[p], polygon.points[np]); @@ -1612,7 +1612,7 @@ void introduce_PointOutsideFixedPolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1655,7 +1655,7 @@ void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1698,7 +1698,7 @@ void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1743,7 +1743,7 @@ void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solv { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1789,7 +1789,7 @@ void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solv { z3::expr out_disjunction(Context); - for (int p = 0; p < polygon.points.size(); ++p) + for (unsigned int p = 0; p < polygon.points.size(); ++p) { int np = (p + 1) % polygon.points.size(); @@ -1827,12 +1827,12 @@ void introduce_PolygonLineNonIntersection(z3::solver &Solver, const z3::expr &dec_var_Y2, const Slic3r::Polygon &polygon2) { - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; const Point &next_point1 = polygon1.points[(p1 + 1) % polygon1.points.size()]; - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; const Point &next_point2 = polygon2.points[(p2 + 1) % polygon2.points.size()]; @@ -1841,12 +1841,13 @@ void introduce_PolygonLineNonIntersection(z3::solver &Solver, Context, dec_var_X1, dec_var_Y1, - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_var_X2, dec_var_Y2, - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; } } } @@ -1861,7 +1862,7 @@ void introduce_PolygonOutsidePolygon(z3::solver &Solver, const z3::expr &dec_var_Y2, const Slic3r::Polygon &polygon2) { - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; @@ -1874,7 +1875,7 @@ void introduce_PolygonOutsidePolygon(z3::solver &Solver, polygon2); } - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; @@ -1898,7 +1899,7 @@ void introduce_PolygonOutsideFixedPolygon(z3::solver &Solver, const Rational &dec_value_Y2, const Slic3r::Polygon &polygon2) { - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; @@ -1911,7 +1912,7 @@ void introduce_PolygonOutsideFixedPolygon(z3::solver &Solver, polygon2); } - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; @@ -1978,16 +1979,16 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver #ifdef DEBUG { printf("polygon1:\n"); - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { printf("[%d,%d] ", polygon1.points[p1].x(), polygon1.points[p1].y()); } printf("\n"); - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { printf("pro_polygon1 %d:\n", poly1); - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { printf("[%d,%d] ", unreachable_polygons1[poly1].points[p1].x(), unreachable_polygons1[poly1].points[p1].y()); } @@ -1996,16 +1997,16 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver printf("\n"); printf("polygon2:\n"); - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { printf("[%d,%d] ", polygon2.points[p2].x(), polygon2.points[p2].y()); } printf("\n"); - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { printf("pro_polygon2 %d:\n", poly2); - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { printf("[%d,%d] ", unreachable_polygons2[poly2].points[p2].x(), unreachable_polygons2[poly2].points[p2].y()); } @@ -2016,11 +2017,11 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver #endif - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { introduce_SequentialPointOutsidePolygon(Solver, Context, @@ -2034,9 +2035,9 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver } } - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; @@ -2052,11 +2053,11 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver } } - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { /* introduce_ShiftSequentialPointOutsidePolygon(Solver, @@ -2084,9 +2085,9 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; @@ -2102,7 +2103,7 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver } } /* - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; @@ -2116,7 +2117,7 @@ void introduce_SequentialPolygonOutsidePolygon(z3::solver } */ /* - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; @@ -2180,11 +2181,11 @@ void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver const Slic3r::Polygon &polygon2, const std::vector &unreachable_polygons2) { - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { introduce_SequentialPointOutsideFixedPolygon(Solver, Context, @@ -2198,9 +2199,9 @@ void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver } } - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; @@ -2216,11 +2217,11 @@ void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver } } - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { introduce_SequentialFixedPointOutsidePolygon(Solver, Context, @@ -2234,9 +2235,9 @@ void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; @@ -2253,7 +2254,7 @@ void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver } /* - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; @@ -2266,7 +2267,7 @@ void introduce_SequentialPolygonOutsideFixedPolygon(z3::solver polygon2); } - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; @@ -2335,16 +2336,16 @@ void introduce_ConsequentialPolygonOutsidePolygon(z3::solver #ifdef DEBUG { printf("polygon1:\n"); - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { printf("[%d,%d] ", polygon1.points[p1].x(), polygon1.points[p1].y()); } printf("\n"); - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { printf("pro_polygon1 %d:\n", poly1); - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { printf("[%d,%d] ", unreachable_polygons1[poly1].points[p1].x(), unreachable_polygons1[poly1].points[p1].y()); } @@ -2353,16 +2354,16 @@ void introduce_ConsequentialPolygonOutsidePolygon(z3::solver printf("\n"); printf("polygon2:\n"); - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { printf("[%d,%d] ", polygon2.points[p2].x(), polygon2.points[p2].y()); } printf("\n"); - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { printf("pro_polygon2 %d:\n", poly2); - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { printf("[%d,%d] ", unreachable_polygons2[poly2].points[p2].x(), unreachable_polygons2[poly2].points[p2].y()); } @@ -2373,11 +2374,11 @@ void introduce_ConsequentialPolygonOutsidePolygon(z3::solver #endif - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { introduce_ConsequentialPointOutsidePolygon(Solver, Context, @@ -2391,9 +2392,9 @@ void introduce_ConsequentialPolygonOutsidePolygon(z3::solver } } - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; @@ -2409,11 +2410,11 @@ void introduce_ConsequentialPolygonOutsidePolygon(z3::solver } } - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { introduce_ConsequentialPointOutsidePolygon(Solver, Context, @@ -2427,9 +2428,9 @@ void introduce_ConsequentialPolygonOutsidePolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; @@ -2494,11 +2495,11 @@ void introduce_ConsequentialPolygonExternalPolygon(z3::solver const Slic3r::Polygon &polygon2, const std::vector &unreachable_polygons2) { - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { if (unreachable_polygons2[poly2].area() > polygon1.area()) { - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; @@ -2515,11 +2516,11 @@ void introduce_ConsequentialPolygonExternalPolygon(z3::solver } } - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { if (unreachable_polygons2[poly2].area() < polygon1.area()) { - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; @@ -2536,11 +2537,11 @@ void introduce_ConsequentialPolygonExternalPolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { if (unreachable_polygons1[poly1].area() > polygon2.area()) { - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; @@ -2557,11 +2558,11 @@ void introduce_ConsequentialPolygonExternalPolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { if (unreachable_polygons1[poly1].area() < polygon2.area()) { - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; @@ -2627,11 +2628,11 @@ void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver const Slic3r::Polygon &polygon2, const std::vector &unreachable_polygons2) { - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { introduce_ConsequentialPointOutsideFixedPolygon(Solver, Context, @@ -2645,9 +2646,9 @@ void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver } } - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; @@ -2663,11 +2664,11 @@ void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver } } - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { introduce_ConsequentialFixedPointOutsidePolygon(Solver, Context, @@ -2681,9 +2682,9 @@ void introduce_ConsequentialPolygonOutsideFixedPolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; @@ -2749,11 +2750,11 @@ void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver const Slic3r::Polygon &polygon2, const std::vector &unreachable_polygons2) { - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { if (unreachable_polygons2[poly2].area() > polygon1.area()) { - for (int p1 = 0; p1 < polygon1.points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygon1.points.size(); ++p1) { const Point &point1 = polygon1.points[p1]; @@ -2770,11 +2771,11 @@ void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver } } - for (int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons2.size(); ++poly2) { if (unreachable_polygons2[poly2].area() < polygon1.area()) { - for (int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons2[poly2].points.size(); ++p2) { const Point &pro_point2 = unreachable_polygons2[poly2].points[p2]; @@ -2791,11 +2792,11 @@ void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { if (unreachable_polygons1[poly1].area() > polygon2.area()) { - for (int p2 = 0; p2 < polygon2.points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygon2.points.size(); ++p2) { const Point &point2 = polygon2.points[p2]; @@ -2812,11 +2813,11 @@ void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver } } - for (int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons1.size(); ++poly1) { if (unreachable_polygons1[poly1].area() < polygon2.area()) { - for (int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons1[poly1].points.size(); ++p1) { const Point &pro_point1 = unreachable_polygons1[poly1].points[p1]; @@ -2843,9 +2844,9 @@ void introduce_PolygonWeakNonoverlapping(z3::solver &Sol const z3::expr_vector &dec_vars_Y, const std::vector &polygons) { - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { introduce_PolygonOutsidePolygon(Solver, Context, @@ -2871,7 +2872,7 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -2894,9 +2895,9 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { introduce_SequentialPolygonOutsidePolygon(Solver, Context, @@ -2926,7 +2927,7 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -2949,9 +2950,9 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { introduce_ConsequentialPolygonOutsidePolygon(Solver, Context, @@ -2980,9 +2981,9 @@ void introduce_PolygonWeakNonoverlapping(z3::solver &Sol const std::vector &undecided, const std::vector &polygons) { - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { introduce_PolygonOutsidePolygon(Solver, Context, @@ -2995,9 +2996,9 @@ void introduce_PolygonWeakNonoverlapping(z3::solver &Sol } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { introduce_PolygonOutsideFixedPolygon(Solver, Context, @@ -3028,7 +3029,7 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -3061,9 +3062,9 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { #ifdef DEBUG { @@ -3085,9 +3086,9 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { #ifdef DEBUG { @@ -3127,7 +3128,7 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -3160,9 +3161,9 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { #ifdef DEBUG { @@ -3184,9 +3185,9 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { #ifdef DEBUG { @@ -3222,16 +3223,16 @@ void introduce_PolygonStrongNonoverlapping(z3::solver &S dec_vars_Y, polygons); - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -3240,12 +3241,13 @@ void introduce_PolygonStrongNonoverlapping(z3::solver &S Context, dec_vars_X[i], dec_vars_Y[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; } } } @@ -3353,12 +3355,12 @@ bool lines_intersect(double ax, double ay, double ux, double uy, double bx, doub } else { -// #ifdef DEBUG + #ifdef DEBUG { printf("t:%.6f\n", t); printf("tt:%.6f\n", tt); } -// #endif + #endif return true; } } @@ -3374,12 +3376,12 @@ bool lines_intersect(double ax, double ay, double ux, double uy, double bx, doub } else { -// #ifdef DEBUG + #ifdef DEBUG { printf("t:%.6f\n", t); printf("tt2:%.6f\n", tt); } -// #endif + #endif return true; } } @@ -3430,12 +3432,12 @@ bool lines_intersect_open(double ax, double ay, double ux, double uy, double bx, } else { -// #ifdef DEBUG + #ifdef DEBUG { printf("t:%.6f\n", t); printf("tt:%.6f\n", tt); } -// #endif + #endif return true; } } @@ -3451,12 +3453,12 @@ bool lines_intersect_open(double ax, double ay, double ux, double uy, double bx, } else { -// #ifdef DEBUG + #ifdef DEBUG { printf("t:%.6f\n", t); printf("tt2:%.6f\n", tt); } -// #endif + #endif return true; } } @@ -3482,16 +3484,16 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -3539,12 +3541,14 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver Context, dec_vars_X[i], dec_vars_Y[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -3565,16 +3569,16 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -3617,12 +3621,14 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver Context, dec_vars_X[i], dec_vars_Y[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -3643,16 +3649,16 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -3695,12 +3701,14 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver Context, dec_vars_X[i], dec_vars_Y[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -3724,18 +3732,18 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { if (dec_values_T[i] > dec_values_T[j]) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int p2 = 0; p2 < unreachable_polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[j].points.size(); ++p2) { const Point &point2 = unreachable_polygons[j].points[p2]; const Point &next_point2 = unreachable_polygons[j].points[(p2 + 1) % unreachable_polygons[j].points.size()]; @@ -3774,13 +3782,15 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -3790,12 +3800,12 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver { if (dec_values_T[i] < dec_values_T[j]) { - for (int p1 = 0; p1 < unreachable_polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[i].points.size(); ++p1) { const Point &point1 = unreachable_polygons[i].points[p1]; const Point &next_point1 = unreachable_polygons[i].points[(p1 + 1) % unreachable_polygons[i].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -3836,13 +3846,15 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point1, next_point1)); + hidden_var_cnt += 2; + refined = true; } } @@ -3878,7 +3890,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -3909,18 +3921,18 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { if (dec_values_T[i] > dec_values_T[j]) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) { #ifdef DEBUG { @@ -3929,7 +3941,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver } #endif - for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[j][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; @@ -3976,13 +3988,15 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -3993,9 +4007,9 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver { if (dec_values_T[i] < dec_values_T[j]) { - for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) { #ifdef DEBUG { @@ -4007,7 +4021,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver const Point &point1 = unreachable_polygons[i][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -4054,13 +4068,15 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point1, next_point1)); + hidden_var_cnt += 2; + /* introduce_SequentialLineNonIntersection(Solver, Context, @@ -4111,18 +4127,18 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { if (dec_values_T[i] > dec_values_T[j]) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int p2 = 0; p2 < unreachable_polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[j].points.size(); ++p2) { const Point &point2 = unreachable_polygons[j].points[p2]; const Point &next_point2 = unreachable_polygons[j].points[(p2 + 1) % unreachable_polygons[j].points.size()]; @@ -4161,13 +4177,15 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -4177,12 +4195,12 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver { if (dec_values_T[i] < dec_values_T[j]) { - for (int p1 = 0; p1 < unreachable_polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[i].points.size(); ++p1) { const Point &point1 = unreachable_polygons[i].points[p1]; const Point &next_point1 = unreachable_polygons[i].points[(p1 + 1) % unreachable_polygons[i].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -4220,13 +4238,15 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point1, next_point1)); + hidden_var_cnt += 2; + refined = true; } } @@ -4262,7 +4282,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -4293,18 +4313,18 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { if (dec_values_T[i] > dec_values_T[j]) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) { #ifdef DEBUG { @@ -4314,7 +4334,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver } #endif - for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[j][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; @@ -4361,13 +4381,15 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -4378,9 +4400,9 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver { if (dec_values_T[i] < dec_values_T[j]) { - for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) { #ifdef DEBUG { @@ -4392,7 +4414,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver const Point &point1 = unreachable_polygons[i][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -4439,13 +4461,15 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[j], dec_vars_Y[j], dec_vars_T[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[i], dec_vars_Y[i], dec_vars_T[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point1, next_point1)); + hidden_var_cnt += 2; + /* introduce_SequentialLineNonIntersection(Solver, Context, @@ -4495,9 +4519,9 @@ void introduce_PolygonWeakNonoverlappingAgainstFixed(z3::solver const std::vector &undecided, const std::vector &polygons) { - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { introduce_PolygonOutsidePolygon(Solver, Context, @@ -4510,9 +4534,9 @@ void introduce_PolygonWeakNonoverlappingAgainstFixed(z3::solver } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < decided.size(); ++j) + for (unsigned int j = 0; j < decided.size(); ++j) { introduce_PolygonOutsidePolygon(Solver, Context, @@ -4539,16 +4563,16 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) { const Point &point2 = polygons[undecided[j]].points[p2]; const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; @@ -4595,12 +4619,14 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver Context, dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[undecided[j]], dec_vars_Y[undecided[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -4608,16 +4634,16 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) { const Point &point2 = polygons[fixed[j]].points[p2]; const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; @@ -4665,12 +4691,14 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver Context, dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[fixed[j]], dec_vars_Y[fixed[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -4699,21 +4727,21 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver printf("Refining ***************************\n"); } #endif - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { #ifdef DEBUG { printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); } #endif - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) { const Point &point2 = polygons[undecided[j]].points[p2]; const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; @@ -4772,12 +4800,14 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver Context, dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[undecided[j]], dec_vars_Y[undecided[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -4785,21 +4815,21 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { #ifdef DEBUG { printf("Fixo ------------------------> Polygons: %d,%d\n", undecided[i], fixed[j]); } #endif - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) { const Point &point2 = polygons[fixed[j]].points[p2]; const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; @@ -4854,12 +4884,14 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver Context, dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_values_X[fixed[j]], dec_values_Y[fixed[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), - Line(point2, next_point2)); + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -4887,7 +4919,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -4926,7 +4958,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver { printf("Refining *************************** alpha\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf("%d: %.3f,%.3f [%.3f]\n", undecided[i], @@ -4937,9 +4969,9 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver } #endif - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { if (dec_values_T[undecided[i]] > dec_values_T[undecided[j]]) { @@ -4948,14 +4980,14 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); } #endif - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int poly2 = 0; poly2 < unreachable_polygons[undecided[j]].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[undecided[j]].size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons[undecided[j]][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[undecided[j]][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[undecided[j]][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[undecided[j]][poly2].points[(p2 + 1) % unreachable_polygons[undecided[j]][poly2].points.size()]; @@ -5027,13 +5059,15 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[undecided[j]], dec_vars_Y[undecided[j]], dec_vars_T[undecided[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), - Line(point2, next_point2)); + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -5049,14 +5083,14 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); } #endif - for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) { const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; - for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) { const Point &point2 = polygons[undecided[j]].points[p2]; const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; @@ -5133,13 +5167,15 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[undecided[j]], dec_vars_Y[undecided[j]], dec_vars_T[undecided[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), - Line(point1, next_point1)); + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point1, next_point1)); + hidden_var_cnt += 2; + refined = true; } } @@ -5154,9 +5190,9 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver } } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { if (dec_values_T[undecided[i]] > dec_values_T[fixed[j]]) { @@ -5167,14 +5203,14 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver } #endif - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int poly2 = 0; poly2 < unreachable_polygons[fixed[j]].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[fixed[j]].size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons[fixed[j]][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[fixed[j]][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[fixed[j]][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[fixed[j]][poly2].points[(p2 + 1) % unreachable_polygons[fixed[j]][poly2].points.size()]; @@ -5247,7 +5283,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 0)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_values_X[fixed[j]], dec_values_Y[fixed[j]], @@ -5272,14 +5308,14 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver } #endif - for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) { const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; - for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) { const Point &point2 = polygons[fixed[j]].points[p2]; const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; @@ -5346,13 +5382,15 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver dec_values_X[fixed[j]], dec_values_Y[fixed[j]], dec_values_T[fixed[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), - Line(point1, next_point1)); + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point1, next_point1)); + hidden_var_cnt += 2; + refined = true; } } @@ -5393,7 +5431,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -5432,7 +5470,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver { printf("Refining *************************** alpha\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf("%d: %.3f,%.3f [%.3f]\n", undecided[i], @@ -5443,9 +5481,9 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver } #endif - for (int i = 0; i < undecided.size() - 1; ++i) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - for (int j = i + 1; j < undecided.size(); ++j) + for (unsigned int j = i + 1; j < undecided.size(); ++j) { if (dec_values_T[undecided[i]].is_Positive() && dec_values_T[undecided[j]].is_Positive() && dec_values_T[undecided[i]] > dec_values_T[undecided[j]]) { @@ -5454,14 +5492,14 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); } #endif - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int poly2 = 0; poly2 < unreachable_polygons[undecided[j]].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[undecided[j]].size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons[undecided[j]][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[undecided[j]][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[undecided[j]][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[undecided[j]][poly2].points[(p2 + 1) % unreachable_polygons[undecided[j]][poly2].points.size()]; @@ -5533,13 +5571,15 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_vars_X[undecided[j]], dec_vars_Y[undecided[j]], dec_vars_T[undecided[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), - Line(point2, next_point2)); + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point2, next_point2)); + hidden_var_cnt += 2; + refined = true; } } @@ -5555,14 +5595,14 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver printf("------------------------> Polygons: %d,%d\n", undecided[i], undecided[j]); } #endif - for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) { const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; - for (int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[undecided[j]].points.size(); ++p2) { const Point &point2 = polygons[undecided[j]].points[p2]; const Point &next_point2 = polygons[undecided[j]].points[(p2 + 1) % polygons[undecided[j]].points.size()]; @@ -5639,13 +5679,15 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[undecided[j]], dec_vars_Y[undecided[j]], dec_vars_T[undecided[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), - Line(point1, next_point1)); + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point1, next_point1)); + hidden_var_cnt += 2; + refined = true; } } @@ -5665,9 +5707,9 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { - for (int j = 0; j < fixed.size(); ++j) + for (unsigned int j = 0; j < fixed.size(); ++j) { if (dec_values_T[undecided[i]].is_Positive() && dec_values_T[fixed[j]].is_Positive() && dec_values_T[undecided[i]] > dec_values_T[fixed[j]]) { @@ -5677,14 +5719,14 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver printf("Times iota: %.3f, %.3f\n", dec_values_T[undecided[i]].as_double(), dec_values_T[fixed[j]].as_double()); } #endif - for (int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[undecided[i]].points.size(); ++p1) { const Point &point1 = polygons[undecided[i]].points[p1]; const Point &next_point1 = polygons[undecided[i]].points[(p1 + 1) % polygons[undecided[i]].points.size()]; - for (int poly2 = 0; poly2 < unreachable_polygons[fixed[j]].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[fixed[j]].size(); ++poly2) { - for (int p2 = 0; p2 < unreachable_polygons[fixed[j]][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[fixed[j]][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[fixed[j]][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[fixed[j]][poly2].points[(p2 + 1) % unreachable_polygons[fixed[j]][poly2].points.size()]; @@ -5757,7 +5799,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 0)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point1, next_point1), dec_values_X[fixed[j]], dec_values_Y[fixed[j]], @@ -5782,14 +5824,14 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver } #endif - for (int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[undecided[i]].size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[undecided[i]][poly1].points.size(); ++p1) { const Point &point1 = unreachable_polygons[undecided[i]][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[undecided[i]][poly1].points[(p1 + 1) % unreachable_polygons[undecided[i]][poly1].points.size()]; - for (int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[fixed[j]].points.size(); ++p2) { const Point &point2 = polygons[fixed[j]].points[p2]; const Point &next_point2 = polygons[fixed[j]].points[(p2 + 1) % polygons[fixed[j]].points.size()]; @@ -5856,13 +5898,15 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver dec_values_X[fixed[j]], dec_values_Y[fixed[j]], dec_values_T[fixed[j]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), Line(point2, next_point2), dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], dec_vars_T[undecided[i]], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt++)).c_str())), - Line(point1, next_point1)); + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point1, next_point1)); + hidden_var_cnt += 2; + refined = true; } } @@ -5900,13 +5944,13 @@ bool check_PointsOutsidePolygons(const std::vector const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { if (dec_values_T[i] > dec_values_T[j]) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; @@ -5916,13 +5960,19 @@ bool check_PointsOutsidePolygons(const std::vector } #endif - for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) { if (unreachable_polygons[j][poly2].points.size() >= 3) { bool always_inside_halfplane = true; + + #ifdef DEBUG + { + printf("....\n"); + } + #endif - for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[j][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; @@ -5963,7 +6013,7 @@ bool check_PointsOutsidePolygons(const std::vector } else if (dec_values_T[i] < dec_values_T[j]) { - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; @@ -5973,13 +6023,19 @@ bool check_PointsOutsidePolygons(const std::vector } #endif - for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) { if (unreachable_polygons[i][poly1].points.size() >= 3) { bool always_inside_halfplane = true; + + #ifdef DEBUG + { + printf("....\n"); + } + #endif - for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) { const Point &point1 = unreachable_polygons[i][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; @@ -6045,18 +6101,18 @@ bool check_PolygonLineIntersections(const std::vector const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (int j = i + 1; j < polygons.size(); ++j) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { if (dec_values_T[i] > dec_values_T[j]) { - for (int p1 = 0; p1 < polygons[i].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { const Point &point1 = polygons[i].points[p1]; const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - for (int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) { #ifdef DEBUG { @@ -6065,7 +6121,7 @@ bool check_PolygonLineIntersections(const std::vector } #endif - for (int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) { const Point &point2 = unreachable_polygons[j][poly2].points[p2]; const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; @@ -6117,9 +6173,9 @@ bool check_PolygonLineIntersections(const std::vector { if (dec_values_T[i] < dec_values_T[j]) { - for (int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) { - for (int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) { #ifdef DEBUG { @@ -6130,7 +6186,7 @@ bool check_PolygonLineIntersections(const std::vector const Point &point1 = unreachable_polygons[i][poly1].points[p1]; const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; - for (int p2 = 0; p2 < polygons[j].points.size(); ++p2) + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { const Point &point2 = polygons[j].points[p2]; const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; @@ -6208,7 +6264,7 @@ void extract_DecisionValuesFromModel(const z3::model &Model, std::vector &dec_values_X, std::vector &dec_values_Y) { - for (int i = 0; i < Model.size(); ++i) + for (unsigned int i = 0; i < Model.size(); ++i) { double value = Model.get_const_interp(Model[i]).as_double(); @@ -6250,7 +6306,7 @@ void extract_DecisionValuesFromModel(const z3::model &Model, std::map values_X; std::map values_Y; - for (int i = 0; i < Model.size(); ++i) + for (unsigned int i = 0; i < Model.size(); ++i) { z3::expr value = Model.get_const_interp(Model[i]); @@ -6325,7 +6381,7 @@ void extract_DecisionValuesFromModel(const z3::model &Model, std::vector &dec_values_X, std::vector &dec_values_Y) { - for (int i = 0; i < Model.size(); ++i) + for (unsigned int i = 0; i < Model.size(); ++i) { z3::expr value = Model.get_const_interp(Model[i]); @@ -6384,7 +6440,7 @@ void extract_DecisionValuesFromModel(const z3::model &Model, std::vector &dec_values_Y, std::vector &dec_values_T) { - for (int i = 0; i < Model.size(); ++i) + for (unsigned int i = 0; i < Model.size(); ++i) { z3::expr value = Model.get_const_interp(Model[i]); #ifdef DEBUG @@ -6461,7 +6517,7 @@ void build_WeakPolygonNonoverlapping(z3::solver &Solver, std::vector &dec_values_Y, string_map &dec_var_names_map) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "X_pos-" + to_string(i); @@ -6469,7 +6525,7 @@ void build_WeakPolygonNonoverlapping(z3::solver &Solver, dec_var_names_map[name] = i; } - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "Y_pos-" + to_string(i); @@ -6497,7 +6553,7 @@ void build_WeakPolygonNonoverlapping(z3::solver &Solver, z3::expr_vector &dec_values_Y, string_map &dec_var_names_map) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "X_pos-" + to_string(i); @@ -6505,7 +6561,7 @@ void build_WeakPolygonNonoverlapping(z3::solver &Solver, dec_var_names_map[name] = i; } - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "Y_pos-" + to_string(i); @@ -6535,7 +6591,7 @@ void build_WeakPolygonNonoverlapping(z3::solver &Solver, const std::vector &undecided, string_map &dec_var_names_map) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "X_pos-" + to_string(i); @@ -6543,7 +6599,7 @@ void build_WeakPolygonNonoverlapping(z3::solver &Solver, dec_var_names_map[name] = i; } - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "Y_pos-" + to_string(i); @@ -6580,7 +6636,7 @@ void build_SequentialWeakPolygonNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -6614,7 +6670,7 @@ void build_SequentialWeakPolygonNonoverlapping(z3::solver const std::vector &undecided, string_map &dec_var_names_map) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "X_pos-" + to_string(i); @@ -6622,7 +6678,7 @@ void build_SequentialWeakPolygonNonoverlapping(z3::solver dec_var_names_map[name] = i; } - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "Y_pos-" + to_string(i); @@ -6630,7 +6686,7 @@ void build_SequentialWeakPolygonNonoverlapping(z3::solver dec_var_names_map[name] = i; } - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "T_time-" + to_string(i); @@ -6670,7 +6726,7 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -6705,7 +6761,7 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver const std::vector &undecided, string_map &dec_var_names_map) { - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "X_pos-" + to_string(i); @@ -6713,7 +6769,7 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver dec_var_names_map[name] = i; } - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "Y_pos-" + to_string(i); @@ -6721,7 +6777,7 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver dec_var_names_map[name] = i; } - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { string name = "T_time-" + to_string(i); @@ -6770,7 +6826,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #endif z3::expr_vector bounding_box_assumptions(Context); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { assume_BedBoundingBox(dec_vars_X[i], dec_vars_Y[i], polygons[i], bounding_box_size, bounding_box_size, bounding_box_assumptions); } @@ -6858,7 +6914,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf(" %.3f, %.3f\n", dec_values_X[i], dec_values_Y[i]); } @@ -6915,7 +6971,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #endif z3::expr_vector bounding_box_assumptions(Context); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { assume_BedBoundingBox(dec_vars_X[i], dec_vars_Y[i], polygons[i], bounding_box_size, bounding_box_size, bounding_box_assumptions); } @@ -7005,7 +7061,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf(" %.3f, %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double()); } @@ -7063,7 +7119,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #endif z3::expr_vector bounding_box_assumptions(Context); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { assume_BedBoundingBox(dec_vars_X[i], dec_vars_Y[i], polygons[i], bounding_box_size, bounding_box_size, bounding_box_assumptions); } @@ -7151,7 +7207,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf(" %ld/%ld, %ld/%ld\n", dec_values_X[i].numerator, dec_values_X[i].denominator, dec_values_Y[i].numerator, dec_values_Y[i].denominator); } @@ -7213,7 +7269,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv z3::expr_vector bounding_box_assumptions(Context); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], polygons[undecided[i]], bounding_box_size, bounding_box_size, bounding_box_assumptions); } @@ -7305,7 +7361,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf(" %.3f, %.3f\n", dec_values_X[undecided[i]].as_double(), dec_values_Y[undecided[i]].as_double()); } @@ -7368,7 +7424,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv z3::expr_vector bounding_box_assumptions(Context); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], polygons[undecided[i]], bounding_box_size, bounding_box_size, bounding_box_assumptions); } @@ -7459,7 +7515,7 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf(" %ld/%ld, %ld/%ld\n", local_dec_values_X[undecided[i]].numerator, @@ -7518,7 +7574,7 @@ bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -7578,7 +7634,7 @@ bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver z3::expr_vector bounding_box_assumptions(Context); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], polygons[undecided[i]], bounding_box_size, bounding_box_size, bounding_box_assumptions); } @@ -7718,7 +7774,7 @@ bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", i, undecided[i], @@ -7823,7 +7879,7 @@ bool optimize_SequentialWeakPolygonNonoverlappingCentered(z3::solver z3::expr_vector bounding_box_assumptions(Context); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], @@ -7969,7 +8025,7 @@ bool optimize_SequentialWeakPolygonNonoverlappingCentered(z3::solver #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", i, undecided[i], @@ -8100,7 +8156,7 @@ bool checkExtens_SequentialWeakPolygonNonoverlapping(coord_t max_X = dec_values_X[fixed[0]].as_double() + polygon_box.max.x(); max_Y = dec_values_Y[fixed[0]].as_double() + polygon_box.max.y(); - for (int i = 1; i < fixed.size(); ++i) + for (unsigned int i = 1; i < fixed.size(); ++i) { BoundingBox polygon_box = get_extents(polygons[fixed[i]]); @@ -8202,7 +8258,7 @@ bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver } #endif - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], @@ -8371,7 +8427,7 @@ bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", i, undecided[i], @@ -8542,12 +8598,12 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver z3::expr_vector complete_assumptions(Context); - for (int i = 0; i < presence_constraints.size(); ++i) + for (unsigned int i = 0; i < presence_constraints.size(); ++i) { complete_assumptions.push_back(presence_constraints[i]); } - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { assume_BedBoundingBox(dec_vars_X[undecided[i]], dec_vars_Y[undecided[i]], @@ -8764,7 +8820,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver #ifdef DEBUG { printf("Refined positions:\n"); - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { printf(" i:%d, undecided[i]:%d: %ld/%ld (%.3f), %ld/%ld (%.3f) [%ld/%ld (%.3f)]\n", i, undecided[i], @@ -8886,14 +8942,14 @@ void augment_TemporalSpread(const SolverConfiguration &solver_configuration, #ifdef DEBUG { printf("Origo\n"); - for (int i = 0; i < dec_values_T.size(); ++i) + for (unsigned int i = 0; i < dec_values_T.size(); ++i) { printf("%.3f\n", dec_values_T[i].as_double()); } } #endif - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { sorted_polygons[dec_values_T[decided_polygons[i]].as_double()] = decided_polygons[i]; } @@ -8909,7 +8965,7 @@ void augment_TemporalSpread(const SolverConfiguration &solver_configuration, #ifdef DEBUG { printf("Augment\n"); - for (int i = 0; i < dec_values_T.size(); ++i) + for (unsigned int i = 0; i < dec_values_T.size(); ++i) { printf("%.3f\n", dec_values_T[i].as_double()); } @@ -8934,12 +8990,12 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration dec_values_X.resize(polygons.size()); dec_values_Y.resize(polygons.size()); - for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { bool optimized = false; int remaining_polygon = 0; - for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::context z_context; z3::solver z_solver(z_context); @@ -8953,7 +9009,7 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration local_values_X.resize(polygons.size()); local_values_Y.resize(polygons.size()); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { #ifdef DEBUG { @@ -8976,17 +9032,17 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration #ifdef DEBUG { printf("Undecided\n"); - for (int j = 0; j < undecided.size(); ++j) + for (unsigned int j = 0; j < undecided.size(); ++j) { printf(" %d\n", undecided[j]); } printf("Decided\n"); - for (int j = 0; j < decided_polygons.size(); ++j) + for (unsigned int j = 0; j < decided_polygons.size(); ++j) { printf(" %d\n", decided_polygons[j]); } printf("Locals\n"); - for (int j = 0; j < polygons.size(); ++j) + for (unsigned int j = 0; j < polygons.size(); ++j) { printf("X: %ld,%ld Y: %ld,%ld \n", local_values_X[j].numerator, @@ -9012,10 +9068,10 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration { printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf("poly: %ld\n", polygons[i].points.size()); - for (int j = 0; j < polygons[i].points.size(); ++j) + for (unsigned int j = 0; j < polygons[i].points.size(); ++j) { printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); } @@ -9037,13 +9093,13 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration if (optimized) { - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; decided_polygons.push_back(undecided[i]); } - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -9071,7 +9127,7 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration } else { - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -9099,7 +9155,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -9135,12 +9191,12 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration dec_values_Y.resize(polygons.size()); dec_values_T.resize(polygons.size()); - for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { bool optimized = false; int remaining_polygon = 0; - for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); //z3::set_param("parallel.enable", "true"); @@ -9162,7 +9218,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration local_values_Y.resize(polygons.size()); local_values_T.resize(polygons.size()); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { #ifdef DEBUG { @@ -9184,7 +9240,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration undecided.clear(); /* - for (int i = 0; i < object_group_size; ++i) + for (unsigned int i = 0; i < object_group_size; ++i) { undecided.push_back(curr_polygon + i); } @@ -9198,17 +9254,17 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration #ifdef DEBUG { printf("Undecided\n"); - for (int j = 0; j < undecided.size(); ++j) + for (unsigned int j = 0; j < undecided.size(); ++j) { printf(" %d\n", undecided[j]); } printf("Decided\n"); - for (int j = 0; j < decided_polygons.size(); ++j) + for (unsigned int j = 0; j < decided_polygons.size(); ++j) { printf(" %d\n", decided_polygons[j]); } printf("Locals\n"); - for (int j = 0; j < polygons.size(); ++j) + for (unsigned int j = 0; j < polygons.size(); ++j) { printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", local_values_X[j].numerator, @@ -9250,10 +9306,10 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration { printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf("poly: %ld\n", polygons[i].points.size()); - for (int j = 0; j < polygons[i].points.size(); ++j) + for (unsigned int j = 0; j < polygons[i].points.size(); ++j) { printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); } @@ -9287,7 +9343,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration cout << z_solver.to_smt2() << "\n"; */ - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; @@ -9296,7 +9352,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -9324,7 +9380,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration } else { - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -9352,7 +9408,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -9388,12 +9444,12 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi dec_values_Y.resize(polygons.size()); dec_values_T.resize(polygons.size()); - for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { bool optimized = false; int remaining_polygon = 0; - for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); //z3::set_param("parallel.enable", "true"); @@ -9415,7 +9471,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi local_values_Y.resize(polygons.size()); local_values_T.resize(polygons.size()); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { #ifdef DEBUG { @@ -9437,7 +9493,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi undecided.clear(); /* - for (int i = 0; i < object_group_size; ++i) + for (unsigned int i = 0; i < object_group_size; ++i) { undecided.push_back(curr_polygon + i); } @@ -9451,17 +9507,17 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi #ifdef DEBUG { printf("Undecided\n"); - for (int j = 0; j < undecided.size(); ++j) + for (unsigned int j = 0; j < undecided.size(); ++j) { printf(" %d\n", undecided[j]); } printf("Decided\n"); - for (int j = 0; j < decided_polygons.size(); ++j) + for (unsigned int j = 0; j < decided_polygons.size(); ++j) { printf(" %d\n", decided_polygons[j]); } printf("Locals\n"); - for (int j = 0; j < polygons.size(); ++j) + for (unsigned int j = 0; j < polygons.size(); ++j) { printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", local_values_X[j].numerator, @@ -9503,10 +9559,10 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi { printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf("poly: %ld\n", polygons[i].points.size()); - for (int j = 0; j < polygons[i].points.size(); ++j) + for (unsigned int j = 0; j < polygons[i].points.size(); ++j) { printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); } @@ -9540,7 +9596,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi cout << z_solver.to_smt2() << "\n"; */ - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; @@ -9549,7 +9605,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -9577,7 +9633,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi } else { - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -9605,7 +9661,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -9644,12 +9700,12 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve coord_t box_half_x_max = solver_configuration.maximum_X_bounding_box_size / 2; coord_t box_half_y_max = solver_configuration.maximum_Y_bounding_box_size / 2; - for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { bool optimized = false; int remaining_polygon = 0; - for(int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) + for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); //z3::set_param("parallel.enable", "true"); @@ -9671,7 +9727,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve local_values_Y.resize(polygons.size()); local_values_T.resize(polygons.size()); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { #ifdef DEBUG { @@ -9693,7 +9749,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve undecided.clear(); /* - for (int i = 0; i < object_group_size; ++i) + for (unsigned int i = 0; i < object_group_size; ++i) { undecided.push_back(curr_polygon + i); } @@ -9707,17 +9763,17 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve #ifdef DEBUG { printf("Undecided\n"); - for (int j = 0; j < undecided.size(); ++j) + for (unsigned int j = 0; j < undecided.size(); ++j) { printf(" %d\n", undecided[j]); } printf("Decided\n"); - for (int j = 0; j < decided_polygons.size(); ++j) + for (unsigned int j = 0; j < decided_polygons.size(); ++j) { printf(" %d\n", decided_polygons[j]); } printf("Locals\n"); - for (int j = 0; j < polygons.size(); ++j) + for (unsigned int j = 0; j < polygons.size(); ++j) { printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", local_values_X[j].numerator, @@ -9758,10 +9814,10 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve { printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf("poly: %ld\n", polygons[i].points.size()); - for (int j = 0; j < polygons[i].points.size(); ++j) + for (unsigned int j = 0; j < polygons[i].points.size(); ++j) { printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); } @@ -9797,7 +9853,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve cout << z_solver.to_smt2() << "\n"; */ - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; @@ -9806,7 +9862,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -9834,7 +9890,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve } else { - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; @@ -9868,7 +9924,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); - for (int poly = 0; poly < unreachable_polygons.size(); ++poly) + for (unsigned int poly = 0; poly < unreachable_polygons.size(); ++poly) { _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } @@ -9912,7 +9968,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So int box_half_x_max = solver_configuration.maximum_X_bounding_box_size / 2; int box_half_y_max = solver_configuration.maximum_Y_bounding_box_size / 2; - for (int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) + for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { bool optimized = false; @@ -9936,7 +9992,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So local_values_Y.resize(polygons.size()); local_values_T.resize(polygons.size()); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { #ifdef DEBUG { @@ -9955,7 +10011,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So string_map dec_var_names_map; - int object_group_size = MIN(solver_configuration.object_group_size, polygons.size() - curr_polygon); + int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); undecided.clear(); @@ -10001,17 +10057,17 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So #ifdef DEBUG { printf("Undecided\n"); - for (int j = 0; j < undecided.size(); ++j) + for (unsigned int j = 0; j < undecided.size(); ++j) { printf(" %d\n", undecided[j]); } printf("Decided\n"); - for (int j = 0; j < decided_polygons.size(); ++j) + for (unsigned int j = 0; j < decided_polygons.size(); ++j) { printf(" %d\n", decided_polygons[j]); } printf("Locals\n"); - for (int j = 0; j < polygons.size(); ++j) + for (unsigned int j = 0; j < polygons.size(); ++j) { printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", local_values_X[j].numerator, @@ -10038,10 +10094,10 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So { printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); - for (int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf("poly: %ld\n", polygons[i].points.size()); - for (int j = 0; j < polygons[i].points.size(); ++j) + for (unsigned int j = 0; j < polygons[i].points.size(); ++j) { printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); } @@ -10077,7 +10133,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So cout << z_solver.to_smt2() << "\n"; */ - for (int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; @@ -10086,7 +10142,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; } @@ -10125,7 +10181,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { - if (polygons.size() - curr_polygon > solver_configuration.object_group_size) + if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) { curr_polygon += solver_configuration.object_group_size; diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index 3c2d2df691..b8c8aa1f92 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -58,7 +58,7 @@ const coord_t SEQ_SVG_SCALE_FACTOR = 50000; #define SEQ_Z3_SOLVER_TIMEOUT "8000" const int SEQ_GROUND_PRESENCE_TIME = 32; -const int64_t SEQ_RATIONAL_PRECISION = 1000; +const int64_t SEQ_RATIONAL_PRECISION = 1000000; const double SEQ_DECIMATION_TOLERANCE = 400000.0; const double SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED = 0.0; diff --git a/src/libseqarrange/src/sequential_decimator.cpp b/src/libseqarrange/src/sequential_decimator.cpp index c184323187..4f54e00ae6 100644 --- a/src/libseqarrange/src/sequential_decimator.cpp +++ b/src/libseqarrange/src/sequential_decimator.cpp @@ -189,7 +189,8 @@ int decimate_Polygons(const CommandParameters &command_parameters) decimate_PolygonForSequentialSolver(command_parameters.tolerance, objects_to_print[i].pgns_at_height[j].second, - decimated_polygon); + decimated_polygon, + false); decimated_polygons.push_back(decimated_polygon); } diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index f00bb66b62..6e73af7c7c 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -255,7 +255,8 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) } decimate_PolygonForSequentialSolver(solver_configuration, objects_to_print[i].pgns_at_height[j].second, - decimated_polygon); + decimated_polygon, + true); } else { @@ -327,7 +328,8 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) convex_level_polygons, box_level_polygons, extruder_convex_level_polygons, - extruder_box_level_polygons); + extruder_box_level_polygons, + true); prepare_ObjectPolygons(solver_configuration, convex_level_polygons, diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index 899e8079fe..c02287cfa2 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -844,7 +844,8 @@ void test_preprocess_5(void) decimate_PolygonForSequentialSolver(solver_configuration, PRUSA_PART_POLYGONS[i], - simplified_polygon); + simplified_polygon, + false); /* scaleDown_PolygonForSequentialSolver(solver_configuration, PRUSA_PART_POLYGONS[i], scale_down_polygon); polygons.push_back(scale_down_polygon); @@ -900,7 +901,8 @@ void test_preprocess_6(void) Polygon decimated_polygon; decimate_PolygonForSequentialSolver(solver_configuration, PRUSA_PART_POLYGONS[i], - decimated_polygon); + decimated_polygon, + false); Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(decimated_polygon, scale_down_polygon); From 5716a560e65b298fb16d5d3fe9e96b62a3259547 Mon Sep 17 00:00:00 2001 From: surynek Date: Sun, 6 Oct 2024 13:47:56 +0200 Subject: [PATCH 09/88] Warnings elimination. --- src/libseqarrange/src/seq_interface.cpp | 14 ++-- src/libseqarrange/test/seq_test_polygon.cpp | 92 ++++++++++----------- 2 files changed, 54 insertions(+), 52 deletions(-) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 08ca77fd27..5faf2843c0 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -27,6 +27,8 @@ namespace Sequential /*----------------------------------------------------------------*/ const int SEQ_OBJECT_GROUP_SIZE = 4; +const int SEQ_SCHEDULING_TEMPORAL_SPREAD = 16; +const int SEQ_MINIMUM_BOUNDING_BOX_SIZE = 10; const int SEQ_PRUSA_MK3S_X_SIZE = 2500; const int SEQ_PRUSA_MK3S_Y_SIZE = 2100; @@ -59,14 +61,14 @@ const coord_t SEQ_PRUSA_XL_GANTRY_LEVEL = 26000000; SolverConfiguration::SolverConfiguration() : bounding_box_size_optimization_step(4) - , minimum_X_bounding_box_size(10) - , minimum_Y_bounding_box_size(10) + , minimum_X_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) + , minimum_Y_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) , maximum_X_bounding_box_size(SEQ_PRUSA_MK3S_X_SIZE) , maximum_Y_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) , object_group_size(SEQ_OBJECT_GROUP_SIZE) - , temporal_spread(16) + , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) @@ -77,14 +79,14 @@ SolverConfiguration::SolverConfiguration() SolverConfiguration::SolverConfiguration(const PrinterGeometry &printer_geometry) : bounding_box_size_optimization_step(4) - , minimum_X_bounding_box_size(10) - , minimum_Y_bounding_box_size(10) + , minimum_X_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) + , minimum_Y_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) , maximum_X_bounding_box_size(printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR) , maximum_Y_bounding_box_size(printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR) , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) , object_group_size(SEQ_OBJECT_GROUP_SIZE) - , temporal_spread(16) + , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) diff --git a/src/libseqarrange/test/seq_test_polygon.cpp b/src/libseqarrange/test/seq_test_polygon.cpp index e8852d2696..3c84e6797c 100644 --- a/src/libseqarrange/test/seq_test_polygon.cpp +++ b/src/libseqarrange/test/seq_test_polygon.cpp @@ -51,7 +51,7 @@ void test_polygon_1(void) Polygon polygon_1 = {{-1000000, -1000000}, {1000000, -1000000}, {1000000, 1000000}, {-1000000, 1000000} }; - for (int i = 0; i < polygon_1.size(); ++i) + for (usingned int i = 0; i < polygon_1.size(); ++i) { Point point = polygon_1[i]; printf("%d,%d\n", point.x(), point.y()); @@ -72,14 +72,14 @@ void test_polygon_2(void) const Polygon &polygon_1 = PRUSA_PART_POLYGONS[k]; Polygon hull_1 = convex_hull(polygon_1); - for (int i = 0; i < polygon_1.size(); ++i) + for (usingned int i = 0; i < polygon_1.size(); ++i) { const Point &point = polygon_1[i]; printf("poly %d: %d,%d\n", i, point.x(), point.y()); } printf("\n"); - for (int i = 0; i < hull_1.size(); ++i) + for (usingned int i = 0; i < hull_1.size(); ++i) { const Point &point = hull_1[i]; printf("hull %d: %d,%d\n", i, point.x(), point.y()); @@ -154,7 +154,7 @@ void test_polygon_3(void) z3::expr_vector Y_positions(z_context); z3::expr_vector T_parameters(z_context); - for (int i = 0; i < line_count; ++i) + for (usingned int i = 0; i < line_count; ++i) { printf("i:%d\n", i); string name = "x_pos-" + to_string(i); @@ -163,7 +163,7 @@ void test_polygon_3(void) X_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < line_count; ++i) + for (usingned int i = 0; i < line_count; ++i) { string name = "y_pos-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -171,7 +171,7 @@ void test_polygon_3(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < line_count; ++i) + for (usingned int i = 0; i < line_count; ++i) { string name = "t_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -240,7 +240,7 @@ void test_polygon_3(void) finish = clock(); printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -380,7 +380,7 @@ void test_polygon_4(void) finish = clock(); printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -521,7 +521,7 @@ void test_polygon_5(void) finish = clock(); printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -642,7 +642,7 @@ void test_polygon_6(void) finish = clock(); printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -723,7 +723,7 @@ void test_polygon_7(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_1.points.size(); ++i) + for (usingned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -731,7 +731,7 @@ void test_polygon_7(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_2.points.size(); ++i) + for (usingned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -792,7 +792,7 @@ void test_polygon_7(void) double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y; printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -874,7 +874,7 @@ Polygon scale_UP(const Polygon &polygon) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (usingned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); } @@ -887,7 +887,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (usingned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); } @@ -931,7 +931,7 @@ void test_polygon_8(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_1.points.size(); ++i) + for (usingned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -939,7 +939,7 @@ void test_polygon_8(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_2.points.size(); ++i) + for (usingned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -947,7 +947,7 @@ void test_polygon_8(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_3.points.size(); ++i) + for (usingned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1102,7 +1102,7 @@ void test_polygon_8(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1232,7 +1232,7 @@ void test_polygon_9(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_1.points.size(); ++i) + for (usingned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1240,7 +1240,7 @@ void test_polygon_9(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_2.points.size(); ++i) + for (usingned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1248,7 +1248,7 @@ void test_polygon_9(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_3.points.size(); ++i) + for (usingned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1399,7 +1399,7 @@ void test_polygon_9(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1532,7 +1532,7 @@ void test_polygon_10(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_1.points.size(); ++i) + for (usingned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1540,7 +1540,7 @@ void test_polygon_10(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_2.points.size(); ++i) + for (usingned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1548,7 +1548,7 @@ void test_polygon_10(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_3.points.size(); ++i) + for (usingned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1556,7 +1556,7 @@ void test_polygon_10(void) T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_4.points.size(); ++i) + for (usingned int i = 0; i < polygon_4.points.size(); ++i) { string name = "t4_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1718,7 +1718,7 @@ void test_polygon_10(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1866,7 +1866,7 @@ void test_polygon_11(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_1.points.size(); ++i) + for (usingned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1874,7 +1874,7 @@ void test_polygon_11(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_2.points.size(); ++i) + for (usingned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1882,7 +1882,7 @@ void test_polygon_11(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_3.points.size(); ++i) + for (usingned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1890,7 +1890,7 @@ void test_polygon_11(void) T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_4.points.size(); ++i) + for (usingned int i = 0; i < polygon_4.points.size(); ++i) { string name = "t4_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -2045,7 +2045,7 @@ void test_polygon_11(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -2153,7 +2153,7 @@ void test_polygon_11(void) printf("Printing model:\n"); cout << z_model << "\n"; - for (int i = 0; i < z_model.size(); ++i) + for (usingned int i = 0; i < z_model.size(); ++i) { //printf("Variable:%s ", z_model[i].name().str().c_str()); double value = z_model.get_const_interp(z_model[i]).as_double(); @@ -2329,14 +2329,14 @@ void test_polygon_12(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < polygons.size(); ++i) + for (usingned int i = 0; i < polygons.size(); ++i) { printf(" %.3f, %.3f\n", X_values[i], Y_values[i]); } SVG preview_svg("polygon_test_12.svg"); - for (int i = 0; i < polygons.size(); ++i) + for (usingned int i = 0; i < polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[i], X_values[i], Y_values[i]); @@ -2455,14 +2455,14 @@ void test_polygon_13(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < polygons.size(); ++i) + for (usingned int i = 0; i < polygons.size(); ++i) { printf(" %.3f, %.3f\n", X_values[i], Y_values[i]); } SVG preview_svg("polygon_test_13.svg"); - for (int i = 0; i < polygons.size(); ++i) + for (usingned int i = 0; i < polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[i], X_values[i], Y_values[i]); @@ -2633,7 +2633,7 @@ void test_polygon_14(void) dec_var_names_map, polygons); - for (int i = 0; i < undecided.size(); ++i) + for (usingned int i = 0; i < undecided.size(); ++i) { poly_positions_X[undecided[i]] = X_values[undecided[i]]; poly_positions_Y[undecided[i]] = Y_values[undecided[i]]; @@ -2662,7 +2662,7 @@ void test_polygon_14(void) decided.push_back(2); decided.push_back(3); - for (int i = 0; i < decided.size(); ++i) + for (usingned int i = 0; i < decided.size(); ++i) { X_values[decided[i]] = poly_positions_X[decided[i]]; Y_values[decided[i]] = poly_positions_Y[decided[i]]; @@ -2708,14 +2708,14 @@ void test_polygon_14(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided.size(); ++i) + for (usingned int i = 0; i < decided.size(); ++i) { printf(" %.3f, %.3f\n", X_values[decided[i]].as_double(), Y_values[decided[i]].as_double()); } SVG preview_svg("polygon_test_14.svg"); - for (int i = 0; i < decided.size(); ++i) + for (usingned int i = 0; i < decided.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided[i]], X_values[decided[i]].as_double(), Y_values[decided[i]].as_double()); @@ -2882,19 +2882,19 @@ void test_polygon_15(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (usingned int i = 0; i < decided_polygons.size(); ++i) { printf(" %.3f, %.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (usingned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } SVG preview_svg("polygon_test_15.svg"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (usingned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -2983,7 +2983,7 @@ void test_polygon_15(void) vector next_polygons; - for (int i = 0; i < remaining_polygons.size(); ++i) + for (usingned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); } From ff40a861ff74ff6ebad27c33e368292a179c0aaa Mon Sep 17 00:00:00 2001 From: surynek Date: Sun, 6 Oct 2024 23:40:37 +0200 Subject: [PATCH 10/88] Warning elimination. --- .../test/seq_test_preprocess.cpp | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index c02287cfa2..b0a60fa25f 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -51,7 +51,7 @@ Polygon scale_UP(const Polygon &polygon) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); } @@ -64,7 +64,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); @@ -85,14 +85,14 @@ void test_preprocess_1(void) SolverConfiguration solver_configuration; start = clock(); - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); test_polygons.push_back(scale_down_polygon); } - for (int i = 0; i < test_polygons.size(); ++i) + for (unsigned int i = 0; i < test_polygons.size(); ++i) { SVG preview_svg("preprocess_test_1.svg"); Polygon display_polygon = scale_UP(test_polygons[i], 1000, 1000); @@ -122,7 +122,7 @@ void test_preprocess_2(void) vector polygons; vector unreachable_polygons; - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); @@ -164,12 +164,12 @@ void test_preprocess_2(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -178,7 +178,7 @@ void test_preprocess_2(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -203,7 +203,7 @@ void test_preprocess_2(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -295,11 +295,11 @@ void test_preprocess_2(void) vector next_polygons; vector next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -663,12 +663,12 @@ void test_preprocess_4(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -677,7 +677,7 @@ void test_preprocess_4(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -702,7 +702,7 @@ void test_preprocess_4(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -794,11 +794,11 @@ void test_preprocess_4(void) vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -838,7 +838,7 @@ void test_preprocess_5(void) std::vector polygons; std::vector > unreachable_polygons; - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon simplified_polygon; @@ -896,7 +896,7 @@ void test_preprocess_6(void) std::vector polygons; std::vector > unreachable_polygons; - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon decimated_polygon; decimate_PolygonForSequentialSolver(solver_configuration, @@ -958,12 +958,12 @@ void test_preprocess_6(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -972,7 +972,7 @@ void test_preprocess_6(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -997,7 +997,7 @@ void test_preprocess_6(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -1089,11 +1089,11 @@ void test_preprocess_6(void) vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); From db67a7eab3cf032f0ad191d493530654b206c4ab Mon Sep 17 00:00:00 2001 From: surynek Date: Sun, 6 Oct 2024 23:58:44 +0200 Subject: [PATCH 11/88] Warning elimination. --- src/libseqarrange/src/seq_interface.cpp | 48 ++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 5faf2843c0..355fb87ceb 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -156,7 +156,7 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration map flat_index_map; - for (int i = 0; i < objects_to_print.size(); ++i) + for (unsigned int i = 0; i < objects_to_print.size(); ++i) { std::vector convex_level_polygons; std::vector box_level_polygons; @@ -307,7 +307,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver } #endif - for (int i = 0; i < objects_to_print.size(); ++i) + for (unsigned int i = 0; i < objects_to_print.size(); ++i) { std::vector convex_level_polygons; std::vector box_level_polygons; @@ -346,7 +346,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver vector polygon_index_map; vector decided_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -397,7 +397,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver #ifdef DEBUG { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", original_index_map[decided_polygons[i]], @@ -407,7 +407,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); } @@ -415,7 +415,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver #endif std::map scheduled_polygons; - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); } @@ -458,7 +458,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -474,7 +474,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver vector next_polygon_index_map; map next_original_index_map; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; @@ -534,7 +534,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } #endif - for (int i = 0; i < objects_to_print.size(); ++i) + for (unsigned int i = 0; i < objects_to_print.size(); ++i) { Polygon nozzle_polygon; Polygon extruder_polygon; @@ -543,7 +543,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ original_index_map[i] = objects_to_print[i].id; - for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + for (unsigned int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) { coord_t height = objects_to_print[i].pgns_at_height[j].first; @@ -739,7 +739,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ vector polygon_index_map; vector decided_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -790,7 +790,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ #ifdef DEBUG { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", original_index_map[decided_polygons[i]], @@ -800,7 +800,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); } @@ -808,7 +808,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ #endif std::map scheduled_polygons; - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); } @@ -850,7 +850,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -866,7 +866,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ vector next_polygon_index_map; map next_original_index_map; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; @@ -961,7 +961,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration } #endif - for (int i = 0; i < objects_to_print.size(); ++i) + for (unsigned int i = 0; i < objects_to_print.size(); ++i) { Polygon nozzle_polygon; Polygon extruder_polygon; @@ -972,7 +972,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration int ht = 0; - for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + for (unsigned int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) { if (!objects_to_print[i].pgns_at_height[j].second.points.empty()) { @@ -1061,7 +1061,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration vector polygon_index_map; vector decided_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -1112,7 +1112,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration #ifdef DEBUG { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsgined int i = 0; i < decided_polygons.size(); ++i) { printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", original_index_map[decided_polygons[i]], @@ -1122,7 +1122,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); } @@ -1130,7 +1130,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration #endif std::map scheduled_polygons; - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); } @@ -1172,7 +1172,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -1188,7 +1188,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration vector next_polygon_index_map; map next_original_index_map; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; From 78c8463c15818b867e42891a65056386d826cf38 Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 7 Oct 2024 01:25:16 +0200 Subject: [PATCH 12/88] Fix of utilization of the front part of the plate for object scheduling. --- src/libseqarrange/src/seq_sequential.cpp | 2 +- src/libseqarrange/test/seq_test_polygon.cpp | 101 +++++++++--------- .../test/seq_test_preprocess.cpp | 50 ++++----- 3 files changed, 79 insertions(+), 74 deletions(-) diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index e5ba747ca5..160536c35c 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -8954,7 +8954,7 @@ void augment_TemporalSpread(const SolverConfiguration &solver_configuration, sorted_polygons[dec_values_T[decided_polygons[i]].as_double()] = decided_polygons[i]; } - int time = SEQ_GROUND_PRESENCE_TIME; + int time = SEQ_GROUND_PRESENCE_TIME + 2 * solver_configuration.temporal_spread * solver_configuration.object_group_size; for (const auto& sorted_polygon: sorted_polygons) { diff --git a/src/libseqarrange/test/seq_test_polygon.cpp b/src/libseqarrange/test/seq_test_polygon.cpp index 3c84e6797c..09a485167e 100644 --- a/src/libseqarrange/test/seq_test_polygon.cpp +++ b/src/libseqarrange/test/seq_test_polygon.cpp @@ -51,7 +51,7 @@ void test_polygon_1(void) Polygon polygon_1 = {{-1000000, -1000000}, {1000000, -1000000}, {1000000, 1000000}, {-1000000, 1000000} }; - for (usingned int i = 0; i < polygon_1.size(); ++i) + for (unsigned int i = 0; i < polygon_1.size(); ++i) { Point point = polygon_1[i]; printf("%d,%d\n", point.x(), point.y()); @@ -65,21 +65,21 @@ void test_polygon_2(void) { printf("Testing polygon 2 ...\n"); - for (int k = 0; k < PRUSA_PART_POLYGONS.size(); ++k) + for (unsigned int k = 0; k < PRUSA_PART_POLYGONS.size(); ++k) { printf("k = %d\n", k); const Polygon &polygon_1 = PRUSA_PART_POLYGONS[k]; Polygon hull_1 = convex_hull(polygon_1); - for (usingned int i = 0; i < polygon_1.size(); ++i) + for (unsigned int i = 0; i < polygon_1.size(); ++i) { const Point &point = polygon_1[i]; printf("poly %d: %d,%d\n", i, point.x(), point.y()); } printf("\n"); - for (usingned int i = 0; i < hull_1.size(); ++i) + for (unsigned int i = 0; i < hull_1.size(); ++i) { const Point &point = hull_1[i]; printf("hull %d: %d,%d\n", i, point.x(), point.y()); @@ -154,7 +154,7 @@ void test_polygon_3(void) z3::expr_vector Y_positions(z_context); z3::expr_vector T_parameters(z_context); - for (usingned int i = 0; i < line_count; ++i) + for (int i = 0; i < line_count; ++i) { printf("i:%d\n", i); string name = "x_pos-" + to_string(i); @@ -163,7 +163,7 @@ void test_polygon_3(void) X_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < line_count; ++i) + for (int i = 0; i < line_count; ++i) { string name = "y_pos-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -171,7 +171,7 @@ void test_polygon_3(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < line_count; ++i) + for (int i = 0; i < line_count; ++i) { string name = "t_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -240,7 +240,7 @@ void test_polygon_3(void) finish = clock(); printf("Printing interpretation:\n"); - for (usingned usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -380,7 +380,7 @@ void test_polygon_4(void) finish = clock(); printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -521,7 +521,7 @@ void test_polygon_5(void) finish = clock(); printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -642,7 +642,7 @@ void test_polygon_6(void) finish = clock(); printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -723,7 +723,7 @@ void test_polygon_7(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_1.points.size(); ++i) + for (unsigned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -731,7 +731,7 @@ void test_polygon_7(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_2.points.size(); ++i) + for (unsigned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -790,9 +790,10 @@ void test_polygon_7(void) finish = clock(); double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y; + poly_1_pos_x = poly_1_pos_y = poly_2_pos_x = poly_2_pos_y = 0.0; printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -874,7 +875,7 @@ Polygon scale_UP(const Polygon &polygon) { Polygon poly = polygon; - for (usingned int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); } @@ -887,7 +888,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) { Polygon poly = polygon; - for (usingned int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); } @@ -931,7 +932,7 @@ void test_polygon_8(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_1.points.size(); ++i) + for (unsigned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -939,7 +940,7 @@ void test_polygon_8(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_2.points.size(); ++i) + for (unsigned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -947,7 +948,7 @@ void test_polygon_8(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_3.points.size(); ++i) + for (unsigned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1058,6 +1059,7 @@ void test_polygon_8(void) int last_solvable_decision_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y; + poly_1_pos_x = poly_1_pos_y = poly_2_pos_x = poly_2_pos_y = poly_3_pos_x = poly_3_pos_y = 0.0; for (int decision_box_size = 300; decision_box_size > 10; decision_box_size -= 4) { @@ -1102,7 +1104,7 @@ void test_polygon_8(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1232,7 +1234,7 @@ void test_polygon_9(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_1.points.size(); ++i) + for (unsigned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1240,7 +1242,7 @@ void test_polygon_9(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_2.points.size(); ++i) + for (unsigned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1248,7 +1250,7 @@ void test_polygon_9(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_3.points.size(); ++i) + for (unsigned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1355,6 +1357,7 @@ void test_polygon_9(void) int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y; + poly_1_pos_x = poly_1_pos_y = poly_2_pos_x = poly_2_pos_y = poly_3_pos_x = poly_3_pos_y = 0.0; for (int bounding_box_size = 300; bounding_box_size > 10; bounding_box_size -= 4) { @@ -1399,7 +1402,7 @@ void test_polygon_9(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1532,7 +1535,7 @@ void test_polygon_10(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_1.points.size(); ++i) + for (unsigned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1540,7 +1543,7 @@ void test_polygon_10(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_2.points.size(); ++i) + for (unsigned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1548,7 +1551,7 @@ void test_polygon_10(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_3.points.size(); ++i) + for (unsigned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1556,7 +1559,7 @@ void test_polygon_10(void) T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_4.points.size(); ++i) + for (unsigned int i = 0; i < polygon_4.points.size(); ++i) { string name = "t4_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1672,6 +1675,7 @@ void test_polygon_10(void) int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; + poly_1_pos_x = poly_1_pos_y = poly_2_pos_x = poly_2_pos_y = poly_3_pos_x = poly_3_pos_y = poly_4_pos_x = poly_4_pos_y = 0.0; for (int bounding_box_size = 300; bounding_box_size > 10; bounding_box_size -= 4) { @@ -1718,7 +1722,7 @@ void test_polygon_10(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1866,7 +1870,7 @@ void test_polygon_11(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_1.points.size(); ++i) + for (unsigned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t1_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1874,7 +1878,7 @@ void test_polygon_11(void) T1_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_2.points.size(); ++i) + for (unsigned int i = 0; i < polygon_2.points.size(); ++i) { string name = "t2_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1882,7 +1886,7 @@ void test_polygon_11(void) T2_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_3.points.size(); ++i) + for (unsigned int i = 0; i < polygon_3.points.size(); ++i) { string name = "t3_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1890,7 +1894,7 @@ void test_polygon_11(void) T3_parameters.push_back(expr(z_context.real_const(name.c_str()))); } - for (usingned int i = 0; i < polygon_4.points.size(); ++i) + for (unsigned int i = 0; i < polygon_4.points.size(); ++i) { string name = "t4_par-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1999,6 +2003,7 @@ void test_polygon_11(void) int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; + poly_1_pos_x = poly_1_pos_y = poly_2_pos_x = poly_2_pos_y = poly_3_pos_x = poly_3_pos_y = poly_4_pos_x = poly_4_pos_y = 0.0; for (int bounding_box_size = 200; bounding_box_size > 10; bounding_box_size -= 4) { @@ -2045,7 +2050,7 @@ void test_polygon_11(void) cout << z_model << "\n"; printf("Printing interpretation:\n"); - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -2153,7 +2158,7 @@ void test_polygon_11(void) printf("Printing model:\n"); cout << z_model << "\n"; - for (usingned int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { //printf("Variable:%s ", z_model[i].name().str().c_str()); double value = z_model.get_const_interp(z_model[i]).as_double(); @@ -2329,14 +2334,14 @@ void test_polygon_12(void) if (optimized) { printf("Polygon positions:\n"); - for (usingned int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf(" %.3f, %.3f\n", X_values[i], Y_values[i]); } SVG preview_svg("polygon_test_12.svg"); - for (usingned int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[i], X_values[i], Y_values[i]); @@ -2455,14 +2460,14 @@ void test_polygon_13(void) if (optimized) { printf("Polygon positions:\n"); - for (usingned int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { printf(" %.3f, %.3f\n", X_values[i], Y_values[i]); } SVG preview_svg("polygon_test_13.svg"); - for (usingned int i = 0; i < polygons.size(); ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[i], X_values[i], Y_values[i]); @@ -2633,7 +2638,7 @@ void test_polygon_14(void) dec_var_names_map, polygons); - for (usingned int i = 0; i < undecided.size(); ++i) + for (unsigned int i = 0; i < undecided.size(); ++i) { poly_positions_X[undecided[i]] = X_values[undecided[i]]; poly_positions_Y[undecided[i]] = Y_values[undecided[i]]; @@ -2662,7 +2667,7 @@ void test_polygon_14(void) decided.push_back(2); decided.push_back(3); - for (usingned int i = 0; i < decided.size(); ++i) + for (unsigned int i = 0; i < decided.size(); ++i) { X_values[decided[i]] = poly_positions_X[decided[i]]; Y_values[decided[i]] = poly_positions_Y[decided[i]]; @@ -2708,14 +2713,14 @@ void test_polygon_14(void) if (optimized) { printf("Polygon positions:\n"); - for (usingned int i = 0; i < decided.size(); ++i) + for (unsigned int i = 0; i < decided.size(); ++i) { printf(" %.3f, %.3f\n", X_values[decided[i]].as_double(), Y_values[decided[i]].as_double()); } SVG preview_svg("polygon_test_14.svg"); - for (usingned int i = 0; i < decided.size(); ++i) + for (unsigned int i = 0; i < decided.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided[i]], X_values[decided[i]].as_double(), Y_values[decided[i]].as_double()); @@ -2853,7 +2858,7 @@ void test_polygon_15(void) polygons.push_back(polygon_3); polygons.push_back(polygon_4); */ - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -2882,19 +2887,19 @@ void test_polygon_15(void) if (optimized) { printf("Polygon positions:\n"); - for (usingned int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" %.3f, %.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (usingned int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } SVG preview_svg("polygon_test_15.svg"); - for (usingned int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -2983,7 +2988,7 @@ void test_polygon_15(void) vector next_polygons; - for (usingned int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); } diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index b0a60fa25f..c02287cfa2 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -51,7 +51,7 @@ Polygon scale_UP(const Polygon &polygon) { Polygon poly = polygon; - for (unsigned int i = 0; i < poly.points.size(); ++i) + for (int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); } @@ -64,7 +64,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) { Polygon poly = polygon; - for (unsigned int i = 0; i < poly.points.size(); ++i) + for (int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); @@ -85,14 +85,14 @@ void test_preprocess_1(void) SolverConfiguration solver_configuration; start = clock(); - for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); test_polygons.push_back(scale_down_polygon); } - for (unsigned int i = 0; i < test_polygons.size(); ++i) + for (int i = 0; i < test_polygons.size(); ++i) { SVG preview_svg("preprocess_test_1.svg"); Polygon display_polygon = scale_UP(test_polygons[i], 1000, 1000); @@ -122,7 +122,7 @@ void test_preprocess_2(void) vector polygons; vector unreachable_polygons; - for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); @@ -164,12 +164,12 @@ void test_preprocess_2(void) if (optimized) { printf("Polygon positions:\n"); - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (unsigned int i = 0; i < remaining_polygons.size(); ++i) + for (int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -178,7 +178,7 @@ void test_preprocess_2(void) if (!unreachable_polygons.empty()) { - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -203,7 +203,7 @@ void test_preprocess_2(void) } } - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -295,11 +295,11 @@ void test_preprocess_2(void) vector next_polygons; vector next_unreachable_polygons; - for (unsigned int i = 0; i < polygon_index_map.size(); ++i) + for (int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (unsigned int i = 0; i < remaining_polygons.size(); ++i) + for (int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -663,12 +663,12 @@ void test_preprocess_4(void) if (optimized) { printf("Polygon positions:\n"); - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (unsigned int i = 0; i < remaining_polygons.size(); ++i) + for (int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -677,7 +677,7 @@ void test_preprocess_4(void) if (!unreachable_polygons.empty()) { - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -702,7 +702,7 @@ void test_preprocess_4(void) } } - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -794,11 +794,11 @@ void test_preprocess_4(void) vector next_polygons; vector > next_unreachable_polygons; - for (unsigned int i = 0; i < polygon_index_map.size(); ++i) + for (int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (unsigned int i = 0; i < remaining_polygons.size(); ++i) + for (int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -838,7 +838,7 @@ void test_preprocess_5(void) std::vector polygons; std::vector > unreachable_polygons; - for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon simplified_polygon; @@ -896,7 +896,7 @@ void test_preprocess_6(void) std::vector polygons; std::vector > unreachable_polygons; - for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon decimated_polygon; decimate_PolygonForSequentialSolver(solver_configuration, @@ -958,12 +958,12 @@ void test_preprocess_6(void) if (optimized) { printf("Polygon positions:\n"); - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (unsigned int i = 0; i < remaining_polygons.size(); ++i) + for (int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -972,7 +972,7 @@ void test_preprocess_6(void) if (!unreachable_polygons.empty()) { - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -997,7 +997,7 @@ void test_preprocess_6(void) } } - for (unsigned int i = 0; i < decided_polygons.size(); ++i) + for (int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -1089,11 +1089,11 @@ void test_preprocess_6(void) vector next_polygons; vector > next_unreachable_polygons; - for (unsigned int i = 0; i < polygon_index_map.size(); ++i) + for (int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (unsigned int i = 0; i < remaining_polygons.size(); ++i) + for (int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); From a2dd47cec705ea2a4b47edf25421f2b7a78aed60 Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 7 Oct 2024 01:26:45 +0200 Subject: [PATCH 13/88] Fix of utilization of the front part of the plate for object scheduling. --- src/libseqarrange/src/seq_sequential.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index b8c8aa1f92..2bbbeed567 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -641,10 +641,10 @@ void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solv z3::context &Context, const Rational &dec_value_X1, const Rational &dec_value_Y1, - const z3::expr &dec_var_T1, + const Rational &dec_value_T1, const z3::expr &dec_var_X2, const z3::expr &dec_var_Y2, - const Rational &dec_value_T2, + const z3::expr &dec_var_T2, const Slic3r::Polygon &polygon); void introduce_PointOutsideFixedPolygon(z3::solver &Solver, From 91a12c4b7cfc83a30c3041d74189de9255febe17 Mon Sep 17 00:00:00 2001 From: surynek Date: Thu, 10 Oct 2024 00:43:32 +0200 Subject: [PATCH 14/88] Code polishing, eliminating obsolete parts of the interface, and warning elimination. --- .../include/libseqarrange/seq_interface.hpp | 35 ++---- src/libseqarrange/src/seq_interface.cpp | 83 ++++++++------ src/libseqarrange/src/seq_preprocess.cpp | 12 +-- src/libseqarrange/src/seq_sequential.cpp | 90 +++++++--------- .../src/sequential_decimator.cpp | 22 ++-- src/libseqarrange/src/sequential_prusa.cpp | 34 +++--- src/libseqarrange/test/seq_test_interface.cpp | 8 +- .../test/seq_test_preprocess.cpp | 102 +++++++++--------- .../test/seq_test_sequential.cpp | 78 ++++++++------ 9 files changed, 233 insertions(+), 231 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index 9f6633b7fc..022cb0b888 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -41,22 +41,14 @@ struct PrinterGeometry std::set box_heights; std::map > extruder_slices; + + int convert_Geometry2PlateBoundingBoxSize(void) const; + void convert_Geometry2PlateBoundingBoxSize(int &X_bounding_box_size, int &Y_bounding_box_size) const; }; /*----------------------------------------------------------------*/ -// Setting printer type is obsolete, will be removed -enum PrinterType -{ - SEQ_PRINTER_TYPE_UNDEFINED, - SEQ_PRINTER_TYPE_PRUSA_MINI, - SEQ_PRINTER_TYPE_PRUSA_MK3S, - SEQ_PRINTER_TYPE_PRUSA_MK4, - SEQ_PRINTER_TYPE_PRUSA_XL, -}; - - enum DecimationPrecision { SEQ_DECIMATION_PRECISION_UNDEFINED, @@ -72,27 +64,22 @@ struct SolverConfiguration SolverConfiguration(); SolverConfiguration(const PrinterGeometry &printer_geometry); - static double convert_DecimationPrecision2Tolerance(DecimationPrecision decimation_precision); - void setup(const PrinterGeometry &printer_geometry); - void set_DecimationPrecision(DecimationPrecision decimation_precision); void set_ObjectGroupSize(int object_group_size); + void setup(const PrinterGeometry &printer_geometry); + + static double convert_DecimationPrecision2Tolerance(DecimationPrecision decimation_precision); + int bounding_box_size_optimization_step; - int minimum_X_bounding_box_size; - int minimum_Y_bounding_box_size; - int maximum_X_bounding_box_size; - int maximum_Y_bounding_box_size; int minimum_bounding_box_size; - int maximum_bounding_box_size; + int x_plate_bounding_box_size; + int y_plate_bounding_box_size; + int object_group_size; int temporal_spread; - DecimationPrecision decimation_precision; - - // Setting printer type is obsolete, will be removed - PrinterType printer_type; - + DecimationPrecision decimation_precision; std::string optimization_timeout; }; diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 355fb87ceb..a3821f7d7f 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -26,9 +26,24 @@ namespace Sequential /*----------------------------------------------------------------*/ -const int SEQ_OBJECT_GROUP_SIZE = 4; -const int SEQ_SCHEDULING_TEMPORAL_SPREAD = 16; -const int SEQ_MINIMUM_BOUNDING_BOX_SIZE = 10; +const int SEQ_OBJECT_GROUP_SIZE = 4; +const int SEQ_SCHEDULING_TEMPORAL_SPREAD = 16; + +const int SEQ_BOUNDING_BOX_SIZE_OPTIMIZATION_STEP = 4; +const int SEQ_MINIMUM_BOUNDING_BOX_SIZE = 16; + + +/*----------------------------------------------------------------*/ + +enum PrinterType +{ + SEQ_PRINTER_TYPE_UNDEFINED, + SEQ_PRINTER_TYPE_PRUSA_MINI, + SEQ_PRINTER_TYPE_PRUSA_MK3S, + SEQ_PRINTER_TYPE_PRUSA_MK4, + SEQ_PRINTER_TYPE_PRUSA_XL +}; + const int SEQ_PRUSA_MK3S_X_SIZE = 2500; const int SEQ_PRUSA_MK3S_Y_SIZE = 2100; @@ -41,7 +56,6 @@ const coord_t SEQ_PRUSA_MK3S_GANTRY_LEVEL = 26000000; const int SEQ_PRUSA_MK4_X_SIZE = 2500; const int SEQ_PRUSA_MK4_Y_SIZE = 2100; -// TODO: measure for true values const coord_t SEQ_PRUSA_MK4_NOZZLE_LEVEL = 0; const coord_t SEQ_PRUSA_MK4_EXTRUDER_LEVEL = 2000000; const coord_t SEQ_PRUSA_MK4_HOSE_LEVEL = 18000000; @@ -50,48 +64,52 @@ const coord_t SEQ_PRUSA_MK4_GANTRY_LEVEL = 26000000; const int SEQ_PRUSA_XL_X_SIZE = 3600; const int SEQ_PRUSA_XL_Y_SIZE = 3600; -// TODO: measure for true values const coord_t SEQ_PRUSA_XL_NOZZLE_LEVEL = 0; const coord_t SEQ_PRUSA_XL_EXTRUDER_LEVEL = 2000000; const coord_t SEQ_PRUSA_XL_HOSE_LEVEL = 18000000; const coord_t SEQ_PRUSA_XL_GANTRY_LEVEL = 26000000; + +/*----------------------------------------------------------------*/ + +int PrinterGeometry::convert_Geometry2PlateBoundingBoxSize(void) const +{ + return MAX(x_size / SEQ_SLICER_SCALE_FACTOR, y_size / SEQ_SLICER_SCALE_FACTOR); +} + + +void PrinterGeometry::convert_Geometry2PlateBoundingBoxSize(int &x_plate_bounding_box_size, int &y_plate_bounding_box_size) const +{ + x_plate_bounding_box_size = x_size / SEQ_SLICER_SCALE_FACTOR; + y_plate_bounding_box_size = y_size / SEQ_SLICER_SCALE_FACTOR; +} + /*----------------------------------------------------------------*/ SolverConfiguration::SolverConfiguration() - : bounding_box_size_optimization_step(4) - , minimum_X_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) - , minimum_Y_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) - , maximum_X_bounding_box_size(SEQ_PRUSA_MK3S_X_SIZE) - , maximum_Y_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) - , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) - , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) + : bounding_box_size_optimization_step(SEQ_BOUNDING_BOX_SIZE_OPTIMIZATION_STEP) + , minimum_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) + , x_plate_bounding_box_size(SEQ_PRUSA_MK3S_X_SIZE) + , y_plate_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) , object_group_size(SEQ_OBJECT_GROUP_SIZE) , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) - , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) { /* nothing */ } - + SolverConfiguration::SolverConfiguration(const PrinterGeometry &printer_geometry) - : bounding_box_size_optimization_step(4) - , minimum_X_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) - , minimum_Y_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) - , maximum_X_bounding_box_size(printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR) - , maximum_Y_bounding_box_size(printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR) - , minimum_bounding_box_size(MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size)) - , maximum_bounding_box_size(MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size)) + : bounding_box_size_optimization_step(SEQ_BOUNDING_BOX_SIZE_OPTIMIZATION_STEP) + , minimum_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) , object_group_size(SEQ_OBJECT_GROUP_SIZE) , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) - , printer_type(SEQ_PRINTER_TYPE_PRUSA_MK3S) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) { - /* nothing */ + setup(printer_geometry); } @@ -122,13 +140,10 @@ double SolverConfiguration::convert_DecimationPrecision2Tolerance(DecimationPrec return SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED; } - + void SolverConfiguration::setup(const PrinterGeometry &printer_geometry) { - maximum_X_bounding_box_size = printer_geometry.x_size / SEQ_SLICER_SCALE_FACTOR; - maximum_Y_bounding_box_size = printer_geometry.y_size / SEQ_SLICER_SCALE_FACTOR; - minimum_bounding_box_size = MIN(minimum_X_bounding_box_size, minimum_Y_bounding_box_size); - maximum_bounding_box_size = MAX(maximum_X_bounding_box_size, maximum_Y_bounding_box_size); + printer_geometry.convert_Geometry2PlateBoundingBoxSize(x_plate_bounding_box_size, y_plate_bounding_box_size); } @@ -523,6 +538,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } #endif + PrinterType printer_type = SEQ_PRINTER_TYPE_PRUSA_MK3S; + std::vector polygons; std::vector > unreachable_polygons; @@ -573,7 +590,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ return -1; } - switch (solver_configuration.printer_type) + switch (printer_type) { case SEQ_PRINTER_TYPE_PRUSA_MK3S: { @@ -693,7 +710,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ std::vector scale_down_unreachable_polygons; - switch (solver_configuration.printer_type) + switch (printer_type) { case SEQ_PRINTER_TYPE_PRUSA_MK3S: { @@ -900,11 +917,13 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } -void setup_ExtruderUnreachableZones(const SolverConfiguration &solver_configuration, +void setup_ExtruderUnreachableZones(const SolverConfiguration &solver_configuration, std::vector > &convex_unreachable_zones, std::vector > &box_unreachable_zones) { - switch (solver_configuration.printer_type) + PrinterType printer_type = SEQ_PRINTER_TYPE_PRUSA_MK3S; + + switch (printer_type) { case SEQ_PRINTER_TYPE_PRUSA_MK3S: { diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp index b082a31ec9..25f78eb30d 100644 --- a/src/libseqarrange/src/seq_preprocess.cpp +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -523,7 +523,7 @@ Polygon transform_UpsideDown(const SolverConfiguration &solver_configuration, co for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x(), - (coord_t)(solver_configuration.maximum_Y_bounding_box_size * scale_factor - poly.points[i].y())); + (coord_t)(solver_configuration.y_plate_bounding_box_size * scale_factor - poly.points[i].y())); } return poly; @@ -539,7 +539,7 @@ void transform_UpsideDown(const SolverConfiguration &solver_configuration, const void transform_UpsideDown(const SolverConfiguration &solver_configuration, coord_t scale_factor, const coord_t &scaled_x_pos, const coord_t &scaled_y_pos, coord_t &transformed_x_pos, coord_t &transformed_y_pos) { transformed_x_pos = scaled_x_pos; - transformed_y_pos = solver_configuration.maximum_Y_bounding_box_size * scale_factor - scaled_y_pos; + transformed_y_pos = solver_configuration.y_plate_bounding_box_size * scale_factor - scaled_y_pos; } @@ -854,13 +854,13 @@ bool check_PolygonSize(const SolverConfiguration &solver_configuration, const Sl BoundingBox polygon_box = get_extents(polygon); coord_t x_size = polygon_box.max.x() - polygon_box.min.x(); - if (x_size > solver_configuration.maximum_X_bounding_box_size) + if (x_size > solver_configuration.x_plate_bounding_box_size) { return false; } coord_t y_size = polygon_box.max.y() - polygon_box.min.y(); - if (y_size > solver_configuration.maximum_Y_bounding_box_size) + if (y_size > solver_configuration.y_plate_bounding_box_size) { return false; } @@ -874,13 +874,13 @@ bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t BoundingBox polygon_box = get_extents(polygon); coord_t x_size = polygon_box.max.x() - polygon_box.min.x(); - if (x_size > solver_configuration.maximum_X_bounding_box_size * scale_factor) + if (x_size > solver_configuration.x_plate_bounding_box_size * scale_factor) { return false; } coord_t y_size = polygon_box.max.y() - polygon_box.min.y(); - if (y_size > solver_configuration.maximum_Y_bounding_box_size * scale_factor) + if (y_size > solver_configuration.y_plate_bounding_box_size * scale_factor) { return false; } diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 160536c35c..97d1f7e331 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -6814,9 +6814,10 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); int last_solvable_bounding_box_size = -1; + + int maximum_bounding_box_size = MAX(solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size); - for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; - bounding_box_size > solver_configuration.minimum_bounding_box_size; + for (int bounding_box_size = maximum_bounding_box_size; bounding_box_size > solver_configuration.minimum_bounding_box_size; bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) { #ifdef DEBUG @@ -6959,9 +6960,10 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv { Z3_global_param_set("timeout", solver_configuration.optimization_timeout.c_str()); int last_solvable_bounding_box_size = -1; + + int maximum_bounding_box_size = MAX(solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size); - for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; - bounding_box_size > solver_configuration.minimum_bounding_box_size; + for (int bounding_box_size = maximum_bounding_box_size; bounding_box_size > solver_configuration.minimum_bounding_box_size; bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) { #ifdef DEBUG @@ -7107,9 +7109,10 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); int last_solvable_bounding_box_size = -1; + + int maximum_bounding_box_size = MAX(solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size); - for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; - bounding_box_size > solver_configuration.minimum_bounding_box_size; + for (int bounding_box_size = maximum_bounding_box_size; bounding_box_size > solver_configuration.minimum_bounding_box_size; bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) { #ifdef DEBUG @@ -7256,9 +7259,10 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); int last_solvable_bounding_box_size = -1; + + int maximum_bounding_box_size = MAX(solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size); - for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; - bounding_box_size > solver_configuration.minimum_bounding_box_size; + for (int bounding_box_size = maximum_bounding_box_size; bounding_box_size > solver_configuration.minimum_bounding_box_size; bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) { #ifdef DEBUG @@ -7408,12 +7412,13 @@ bool optimize_WeakPolygonNonoverlapping(z3::solver &Solv { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); int last_solvable_bounding_box_size = -1; - - std::vector local_dec_values_X = dec_values_X; - std::vector local_dec_values_Y = dec_values_Y; - for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; - bounding_box_size > solver_configuration.minimum_bounding_box_size; + std::vector local_dec_values_X = dec_values_X; + std::vector local_dec_values_Y = dec_values_Y; + + int maximum_bounding_box_size = MAX(solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size); + + for (int bounding_box_size = maximum_bounding_box_size; bounding_box_size > solver_configuration.minimum_bounding_box_size; bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) { #ifdef DEBUG @@ -7611,17 +7616,17 @@ bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); int last_solvable_bounding_box_size = -1; std::vector local_dec_values_X = dec_values_X; std::vector local_dec_values_Y = dec_values_Y; - std::vector local_dec_values_T = dec_values_T; + std::vector local_dec_values_T = dec_values_T; + + int maximum_bounding_box_size = MAX(solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size); - for (int bounding_box_size = solver_configuration.maximum_bounding_box_size; - bounding_box_size > solver_configuration.minimum_bounding_box_size; + for (int bounding_box_size = maximum_bounding_box_size; bounding_box_size > solver_configuration.minimum_bounding_box_size; bounding_box_size -= solver_configuration.bounding_box_size_optimization_step) { #ifdef DEBUG @@ -7630,8 +7635,6 @@ bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver } #endif - //Solver.reset(); - z3::expr_vector bounding_box_assumptions(Context); for (unsigned int i = 0; i < undecided.size(); ++i) @@ -7641,8 +7644,6 @@ bool optimize_SequentialWeakPolygonNonoverlapping(z3::solver bool sat = false; -// Solver.add(bounding_box_assumptions); - #ifdef DEBUG { printf("Solving 11 ...\n"); @@ -7862,12 +7863,12 @@ bool optimize_SequentialWeakPolygonNonoverlappingCentered(z3::solver std::vector local_dec_values_X = dec_values_X; std::vector local_dec_values_Y = dec_values_Y; - std::vector local_dec_values_T = dec_values_T; + std::vector local_dec_values_T = dec_values_T; int box_min_x = 0; - int box_max_x = solver_configuration.maximum_X_bounding_box_size; + int box_max_x = solver_configuration.x_plate_bounding_box_size; int box_min_y = 0; - int box_max_y = solver_configuration.maximum_Y_bounding_box_size; + int box_max_y = solver_configuration.y_plate_bounding_box_size; while (box_min_x < box_max_x && box_min_y < box_max_y) { @@ -8230,10 +8231,10 @@ bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver std::vector local_dec_values_T = dec_values_T; coord_t half_x_min = 0; - coord_t half_x_max = box_half_x_max; //solver_configuration.maximum_X_bounding_box_size / 2; + coord_t half_x_max = box_half_x_max; coord_t half_y_min = 0; - coord_t half_y_max = box_half_y_max; //solver_configuration.maximum_Y_bounding_box_size / 2; + coord_t half_y_max = box_half_y_max; while ((half_x_max - half_x_min) > 1 && (half_y_max - half_y_min) > 1) { @@ -8248,9 +8249,9 @@ bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver z3::expr_vector bounding_box_assumptions(Context); coord_t box_min_x = (half_x_max + half_x_min) / 2; - coord_t box_max_x = solver_configuration.maximum_X_bounding_box_size - box_min_x; + coord_t box_max_x = solver_configuration.x_plate_bounding_box_size - box_min_x; coord_t box_min_y = (half_y_max + half_y_min) / 2; - coord_t box_max_y = solver_configuration.maximum_Y_bounding_box_size - box_min_y; + coord_t box_max_y = solver_configuration.y_plate_bounding_box_size - box_min_y; #ifdef DEBUG { @@ -8565,13 +8566,13 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver std::vector local_dec_values_X = dec_values_X; std::vector local_dec_values_Y = dec_values_Y; - std::vector local_dec_values_T = dec_values_T; + std::vector local_dec_values_T = dec_values_T; coord_t half_x_min = 0; - coord_t half_x_max = box_half_x_max; //solver_configuration.maximum_X_bounding_box_size / 2; + coord_t half_x_max = box_half_x_max; coord_t half_y_min = 0; - coord_t half_y_max = box_half_y_max; //solver_configuration.maximum_Y_bounding_box_size / 2; + coord_t half_y_max = box_half_y_max; while ((half_x_max - half_x_min) > 1 && (half_y_max - half_y_min) > 1) { @@ -8586,9 +8587,9 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver z3::expr_vector bounding_box_assumptions(Context); coord_t box_min_x = (half_x_max + half_x_min) / 2; - coord_t box_max_x = solver_configuration.maximum_X_bounding_box_size - box_min_x; + coord_t box_max_x = solver_configuration.x_plate_bounding_box_size - box_min_x; coord_t box_min_y = (half_y_max + half_y_min) / 2; - coord_t box_max_y = solver_configuration.maximum_Y_bounding_box_size - box_min_y; + coord_t box_max_y = solver_configuration.y_plate_bounding_box_size - box_min_y; #ifdef DEBUG { @@ -9199,9 +9200,6 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); - //z3::set_param("smt.threads", "8"); - //z3::set_param("parallel.threads.max", "16"); z3::context z_context; z3::solver z_solver(z_context); @@ -9452,9 +9450,6 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); - //z3::set_param("smt.threads", "8"); - //z3::set_param("parallel.threads.max", "16"); z3::context z_context; z3::solver z_solver(z_context); @@ -9697,8 +9692,8 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve dec_values_Y.resize(polygons.size()); dec_values_T.resize(polygons.size()); - coord_t box_half_x_max = solver_configuration.maximum_X_bounding_box_size / 2; - coord_t box_half_y_max = solver_configuration.maximum_Y_bounding_box_size / 2; + coord_t box_half_x_max = solver_configuration.x_plate_bounding_box_size / 2; + coord_t box_half_y_max = solver_configuration.y_plate_bounding_box_size / 2; for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { @@ -9708,9 +9703,6 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); - //z3::set_param("smt.threads", "8"); - //z3::set_param("parallel.threads.max", "16"); z3::context z_context; z3::solver z_solver(z_context); @@ -9965,17 +9957,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_values_Y.resize(polygons.size()); dec_values_T.resize(polygons.size()); - int box_half_x_max = solver_configuration.maximum_X_bounding_box_size / 2; - int box_half_y_max = solver_configuration.maximum_Y_bounding_box_size / 2; + int box_half_x_max = solver_configuration.x_plate_bounding_box_size / 2; + int box_half_y_max = solver_configuration.y_plate_bounding_box_size / 2; for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { bool optimized = false; - z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); - //z3::set_param("smt.threads", "8"); - //z3::set_param("parallel.threads.max", "16"); z3::context z_context; z3::solver z_solver(z_context); diff --git a/src/libseqarrange/src/sequential_decimator.cpp b/src/libseqarrange/src/sequential_decimator.cpp index 4f54e00ae6..53025e1e45 100644 --- a/src/libseqarrange/src/sequential_decimator.cpp +++ b/src/libseqarrange/src/sequential_decimator.cpp @@ -140,7 +140,7 @@ void save_DecimatedPolygons(const CommandParameters &command_paramete Point nozzle_offset(-command_parameters.x_nozzle, -command_parameters.y_nozzle); - for (int i = 0; i < decimated_polygons.size(); ++i) + for (unsigned int i = 0; i < decimated_polygons.size(); ++i) { out << "[" << i << "]" << endl; out << "{" << endl; @@ -176,11 +176,11 @@ int decimate_Polygons(const CommandParameters &command_parameters) printf(" Decimating objects (polygons) ...\n"); - for (int i = 0; i < objects_to_print.size(); ++i) + for (unsigned int i = 0; i < objects_to_print.size(); ++i) { - for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + for (unsigned int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) { - coord_t height = objects_to_print[i].pgns_at_height[j].first; + //coord_t height = objects_to_print[i].pgns_at_height[j].first; if (!objects_to_print[i].pgns_at_height[j].second.points.empty()) { @@ -200,7 +200,7 @@ int decimate_Polygons(const CommandParameters &command_parameters) Point nozzle_offset(-command_parameters.x_nozzle, -command_parameters.y_nozzle); - for (int i = 0; i < decimated_polygons.size(); ++i) + for (unsigned int i = 0; i < decimated_polygons.size(); ++i) { printf(" [%d]\n", i); Slic3r::Polygon shift_polygon = decimated_polygons[i]; @@ -225,7 +225,7 @@ int decimate_Polygons(const CommandParameters &command_parameters) string svg_filename = "sequential_decimator.svg"; SVG preview_svg(svg_filename); - for (int i = 0; i < decimated_polygons.size(); ++i) + for (unsigned int i = 0; i < decimated_polygons.size(); ++i) { Polygon transformed_polygon; Polygon shift_polygon = decimated_polygons[i]; @@ -237,8 +237,8 @@ int decimate_Polygons(const CommandParameters &command_parameters) transformed_polygon = transform_UpsideDown(solver_configuration, scaleUp_PolygonForSlicer(1, shift_polygon, - rand() % (solver_configuration.maximum_X_bounding_box_size * SEQ_SLICER_SCALE_FACTOR), - rand() % (solver_configuration.maximum_Y_bounding_box_size * SEQ_SLICER_SCALE_FACTOR))); + rand() % (solver_configuration.x_plate_bounding_box_size * SEQ_SLICER_SCALE_FACTOR), + rand() % (solver_configuration.y_plate_bounding_box_size * SEQ_SLICER_SCALE_FACTOR))); } else { @@ -345,9 +345,9 @@ int decimate_Polygons(const CommandParameters &command_parameters) } Polygon bed_polygon({ { 0, 0}, - { solver_configuration.maximum_X_bounding_box_size, 0 }, - { solver_configuration.maximum_X_bounding_box_size, solver_configuration.maximum_Y_bounding_box_size}, - { 0, solver_configuration.maximum_Y_bounding_box_size} }); + { solver_configuration.x_plate_bounding_box_size, 0 }, + { solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size}, + { 0, solver_configuration.y_plate_bounding_box_size} }); Polygon display_bed_polygon = scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, bed_polygon, 0, diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index 6e73af7c7c..a194b09715 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -215,7 +215,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) map original_index_map; - for (int i = 0; i < objects_to_print.size(); ++i) + for (unsigned int i = 0; i < objects_to_print.size(); ++i) { Polygon nozzle_polygon; Polygon extruder_polygon; @@ -234,7 +234,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) if (command_parameters.printer_filename.empty()) { - for (int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) + for (unsigned int j = 0; j < objects_to_print[i].pgns_at_height.size(); ++j) { coord_t height = objects_to_print[i].pgns_at_height[j].first; @@ -344,7 +344,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) } SVG preview_svg("sequential_prusa.svg"); - for (int k = 0; k < unreachable_polygons.back().size(); ++k) + for (unsigned int k = 0; k < unreachable_polygons.back().size(); ++k) { Polygon display_unreachable_polygon = transform_UpsideDown(solver_configuration, SEQ_SVG_SCALE_FACTOR, scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, unreachable_polygons.back()[k], 0, 0)); preview_svg.draw(display_unreachable_polygon, "lightgrey"); @@ -361,7 +361,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) //vector original_index_map; vector decided_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -412,7 +412,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [ID:%d,RID:%d] x:%.3f, y:%.3f (t:%.3f)\n", original_index_map[decided_polygons[i]], @@ -422,13 +422,13 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" ID:%d\n", original_index_map[remaining_polygons[i]]); } std::map scheduled_polygons; - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); } @@ -469,9 +469,9 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { - for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { Polygon display_unreachable_polygon = transform_UpsideDown(solver_configuration, SEQ_SVG_SCALE_FACTOR, scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, unreachable_polygons[decided_polygons[i]][j], @@ -532,7 +532,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = transform_UpsideDown(solver_configuration, SEQ_SVG_SCALE_FACTOR, scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, polygons[decided_polygons[i]], @@ -635,7 +635,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) preview_svg.draw(display_polygon, color); } std::map::const_iterator scheduled_polygon = scheduled_polygons.begin(); - for (int i = 0; i < decided_polygons.size(); ++i, ++scheduled_polygon) + for (unsigned int i = 0; i < decided_polygons.size(); ++i, ++scheduled_polygon) { coord_t sx, sy, x, y; @@ -682,9 +682,9 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) preview_svg.draw_text(Point(x, y), ("ID:" + std::to_string(original_index_map[decided_polygons[i]]) + " T:" + std::to_string(times_T[decided_polygons[i]].as_int64())).c_str(), text_color.c_str()); } Polygon plate_polygon({ { 0, 0}, - { solver_configuration.maximum_X_bounding_box_size, 0 }, - { solver_configuration.maximum_X_bounding_box_size, solver_configuration.maximum_Y_bounding_box_size}, - { 0, solver_configuration.maximum_Y_bounding_box_size} }); + { solver_configuration.x_plate_bounding_box_size, 0 }, + { solver_configuration.x_plate_bounding_box_size, solver_configuration.y_plate_bounding_box_size}, + { 0, solver_configuration.y_plate_bounding_box_size} }); Polygon display_plate_polygon = scaleUp_PolygonForSlicer(SEQ_SVG_SCALE_FACTOR, plate_polygon, 0, @@ -725,13 +725,13 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) #ifdef DEBUG { - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } } #endif - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -748,7 +748,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) //vector next_original_index_map; map next_original_index_map; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index e41187e33c..48dcfccaf0 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -137,7 +137,7 @@ void test_interface_1(void) printf("Number of plates: %ld\n", scheduled_plates.size()); - for (int plate = 0; plate < scheduled_plates.size(); ++plate) + for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); @@ -194,7 +194,7 @@ void test_interface_2(void) printf("Number of plates: %ld\n", scheduled_plates.size()); - for (int plate = 0; plate < scheduled_plates.size(); ++plate) + for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); @@ -306,7 +306,7 @@ int test_interface_4(void) printf("Number of plates: %ld\n", scheduled_plates.size()); - for (int plate = 0; plate < scheduled_plates.size(); ++plate) + for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); @@ -365,7 +365,7 @@ int test_interface_5(void) printf("Number of plates: %ld\n", scheduled_plates.size()); - for (int plate = 0; plate < scheduled_plates.size(); ++plate) + for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index c02287cfa2..e93ae639bc 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -51,7 +51,7 @@ Polygon scale_UP(const Polygon &polygon) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); } @@ -64,7 +64,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); @@ -85,14 +85,14 @@ void test_preprocess_1(void) SolverConfiguration solver_configuration; start = clock(); - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); test_polygons.push_back(scale_down_polygon); } - for (int i = 0; i < test_polygons.size(); ++i) + for (unsigned int i = 0; i < test_polygons.size(); ++i) { SVG preview_svg("preprocess_test_1.svg"); Polygon display_polygon = scale_UP(test_polygons[i], 1000, 1000); @@ -122,7 +122,7 @@ void test_preprocess_2(void) vector polygons; vector unreachable_polygons; - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); @@ -135,7 +135,7 @@ void test_preprocess_2(void) vector polygon_index_map; vector decided_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -164,12 +164,12 @@ void test_preprocess_2(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -178,7 +178,7 @@ void test_preprocess_2(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -187,7 +187,7 @@ void test_preprocess_2(void) printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); } */ -// for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) +// for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { /* for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) @@ -203,7 +203,7 @@ void test_preprocess_2(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -295,11 +295,11 @@ void test_preprocess_2(void) vector next_polygons; vector next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -312,7 +312,7 @@ void test_preprocess_2(void) polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -340,7 +340,7 @@ void test_preprocess_3(void) std::vector hose_unreachable_polygons; std::vector gantry_unreachable_polygons; - for (int p = 0; p < PRUSA_PART_POLYGONS.size(); ++p) + for (unsigned int p = 0; p < PRUSA_PART_POLYGONS.size(); ++p) { { nozzle_unreachable_polygons.clear(); @@ -354,14 +354,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S[j], "lightgrey"); } if (!nozzle_unreachable_polygons.empty()) { - for (int j = 0; j < nozzle_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < nozzle_unreachable_polygons.size(); ++j) { preview_svg.draw(nozzle_unreachable_polygons[j], "lightgrey"); } @@ -385,14 +385,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S[j], "lightgrey"); } if (!nozzle_unreachable_polygons.empty()) { - for (int j = 0; j < nozzle_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < nozzle_unreachable_polygons.size(); ++j) { preview_svg.draw(nozzle_unreachable_polygons[j], "lightgrey"); } @@ -415,14 +415,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S[j], "lightgrey"); } if (!extruder_unreachable_polygons.empty()) { - for (int j = 0; j < extruder_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < extruder_unreachable_polygons.size(); ++j) { preview_svg.draw(extruder_unreachable_polygons[j], "lightgrey"); } @@ -446,14 +446,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S[j], "lightgrey"); } if (!extruder_unreachable_polygons.empty()) { - for (int j = 0; j < extruder_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < extruder_unreachable_polygons.size(); ++j) { preview_svg.draw(extruder_unreachable_polygons[j], "lightgrey"); } @@ -476,14 +476,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S[j], "lightgrey"); } if (!hose_unreachable_polygons.empty()) { - for (int j = 0; j < hose_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < hose_unreachable_polygons.size(); ++j) { preview_svg.draw(hose_unreachable_polygons[j], "lightgrey"); } @@ -507,14 +507,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S[j], "lightgrey"); } if (!hose_unreachable_polygons.empty()) { - for (int j = 0; j < hose_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < hose_unreachable_polygons.size(); ++j) { preview_svg.draw(hose_unreachable_polygons[j], "lightgrey"); } @@ -537,14 +537,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S[j], "lightgrey"); } if (!gantry_unreachable_polygons.empty()) { - for (int j = 0; j < gantry_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < gantry_unreachable_polygons.size(); ++j) { preview_svg.draw(gantry_unreachable_polygons[j], "lightgrey"); } @@ -568,14 +568,14 @@ void test_preprocess_3(void) //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) + for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S[j], "lightgrey"); } if (!gantry_unreachable_polygons.empty()) { - for (int j = 0; j < gantry_unreachable_polygons.size(); ++j) + for (unsigned int j = 0; j < gantry_unreachable_polygons.size(); ++j) { preview_svg.draw(gantry_unreachable_polygons[j], "lightgrey"); } @@ -634,7 +634,7 @@ void test_preprocess_4(void) vector polygon_index_map; vector decided_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -663,12 +663,12 @@ void test_preprocess_4(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -677,7 +677,7 @@ void test_preprocess_4(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -686,7 +686,7 @@ void test_preprocess_4(void) printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); } */ - for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { /* for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) @@ -702,7 +702,7 @@ void test_preprocess_4(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -794,11 +794,11 @@ void test_preprocess_4(void) vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -811,7 +811,7 @@ void test_preprocess_4(void) polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -838,7 +838,7 @@ void test_preprocess_5(void) std::vector polygons; std::vector > unreachable_polygons; - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon simplified_polygon; @@ -896,7 +896,7 @@ void test_preprocess_6(void) std::vector polygons; std::vector > unreachable_polygons; - for (int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) + for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { Polygon decimated_polygon; decimate_PolygonForSequentialSolver(solver_configuration, @@ -929,7 +929,7 @@ void test_preprocess_6(void) vector polygon_index_map; vector decided_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -958,12 +958,12 @@ void test_preprocess_6(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -972,7 +972,7 @@ void test_preprocess_6(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -981,7 +981,7 @@ void test_preprocess_6(void) printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); } */ - for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { /* for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) @@ -997,7 +997,7 @@ void test_preprocess_6(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -1089,11 +1089,11 @@ void test_preprocess_6(void) vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -1106,7 +1106,7 @@ void test_preprocess_6(void) polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } diff --git a/src/libseqarrange/test/seq_test_sequential.cpp b/src/libseqarrange/test/seq_test_sequential.cpp index 595f22ac47..6c985c7fab 100644 --- a/src/libseqarrange/test/seq_test_sequential.cpp +++ b/src/libseqarrange/test/seq_test_sequential.cpp @@ -46,7 +46,7 @@ Polygon scale_UP(const Polygon &polygon) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR); } @@ -59,7 +59,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) { Polygon poly = polygon; - for (int i = 0; i < poly.points.size(); ++i) + for (unsigned int i = 0; i < poly.points.size(); ++i) { poly.points[i] = Point(poly.points[i].x() * SCALE_FACTOR + x_pos * SCALE_FACTOR, poly.points[i].y() * SCALE_FACTOR + y_pos * SCALE_FACTOR); @@ -142,18 +142,25 @@ void test_sequential_1(void) printf("Printing model:\n"); cout << z_model << "\n"; - for (int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s\n", z_model[i].name().str().c_str()); printf("Printing interpretation:\n"); cout << z_model.get_const_interp(z_model[i]) << "\n"; - switch (z_model.get_const_interp(z_model[i]).is_bool()) + if (z_model.get_const_interp(z_model[i]).is_bool()) { + printf(" value: TRUE\n"); + } + else + { + printf(" value: FALSE\n"); + } + /* case Z3_L_FALSE: { - printf(" value: FALSE\n"); + printf(" value: FALSE\n"); break; } case Z3_L_TRUE: @@ -170,7 +177,8 @@ void test_sequential_1(void) { break; } - } + } + */ } printf("Testing sequential scheduling 1 ... finished\n"); @@ -395,7 +403,7 @@ void test_sequential_2(void) finish = clock(); - for (int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s\n", z_model[i].name().str().c_str()); @@ -672,7 +680,7 @@ void test_sequential_3(void) finish = clock(); - for (int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s\n", z_model[i].name().str().c_str()); @@ -789,7 +797,7 @@ void test_sequential_4(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_1.points.size(); ++i) + for (unsigned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t_time-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -888,7 +896,7 @@ void test_sequential_4(void) */ printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1036,7 +1044,7 @@ void test_sequential_4(void) cout << z_model << "\n"; */ - for (int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { //printf("Variable:%s ", z_model[i].name().str().c_str()); double value = z_model.get_const_interp(z_model[i]).as_double(); @@ -1250,7 +1258,7 @@ void test_sequential_5(void) Y_positions.push_back(expr(z_context.real_const(name.c_str()))); } - for (int i = 0; i < polygon_1.points.size(); ++i) + for (unsigned int i = 0; i < polygon_1.points.size(); ++i) { string name = "t_time-" + to_string(i); printf("name: %s\n", name.c_str()); @@ -1350,7 +1358,7 @@ void test_sequential_5(void) cout << z_model << "\n"; */ printf("Printing interpretation:\n"); - for (int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); @@ -1515,7 +1523,7 @@ void test_sequential_5(void) cout << z_model << "\n"; */ - for (int i = 0; i < z_model.size(); ++i) + for (unsigned int i = 0; i < z_model.size(); ++i) { printf("Variable:%s ", z_model[i].name().str().c_str()); double value = z_model.get_const_interp(z_model[i]).as_double(); @@ -1675,25 +1683,25 @@ void test_sequential_5(void) SVG preview_svg("sequential_test_5.svg"); - for (int i = 0; i < unreachable_polygons[0].size(); ++i) + for (unsigned int i = 0; i < unreachable_polygons[0].size(); ++i) { Polygon display_pro_polygon_1 = scale_UP(unreachable_polygons[0][i], _poly_1_pos_x.as_double(), _poly_1_pos_y.as_double()); preview_svg.draw(display_pro_polygon_1, "lightgrey"); } - for (int i = 0; i < unreachable_polygons[1].size(); ++i) + for (unsigned int i = 0; i < unreachable_polygons[1].size(); ++i) { Polygon display_pro_polygon_2 = scale_UP(unreachable_polygons[1][i], _poly_2_pos_x.as_double(), _poly_2_pos_y.as_double()); preview_svg.draw(display_pro_polygon_2, "lightgrey"); } - for (int i = 0; i < unreachable_polygons[2].size(); ++i) + for (unsigned int i = 0; i < unreachable_polygons[2].size(); ++i) { Polygon display_pro_polygon_3 = scale_UP(unreachable_polygons[2][i], _poly_3_pos_x.as_double(), _poly_3_pos_y.as_double()); preview_svg.draw(display_pro_polygon_3, "lightgrey"); } - for (int i = 0; i < unreachable_polygons[3].size(); ++i) + for (unsigned int i = 0; i < unreachable_polygons[3].size(); ++i) { Polygon display_pro_polygon_4 = scale_UP(unreachable_polygons[3][i], _poly_4_pos_x.as_double(), _poly_4_pos_y.as_double()); preview_svg.draw(display_pro_polygon_4, "lightgrey"); @@ -1811,7 +1819,7 @@ void test_sequential_6(void) } */ - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -1854,13 +1862,13 @@ void test_sequential_6(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { // printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -1869,7 +1877,7 @@ void test_sequential_6(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -1888,7 +1896,7 @@ void test_sequential_6(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -1978,11 +1986,11 @@ void test_sequential_6(void) vector next_polygons; vector next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -1995,7 +2003,7 @@ void test_sequential_6(void) polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -2094,7 +2102,7 @@ void test_sequential_7(void) } */ - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } @@ -2128,12 +2136,12 @@ void test_sequential_7(void) if (optimized) { printf("Polygon positions:\n"); - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { printf(" %d\n", remaining_polygons[i]); } @@ -2142,7 +2150,7 @@ void test_sequential_7(void) if (!unreachable_polygons.empty()) { - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { /* printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -2151,7 +2159,7 @@ void test_sequential_7(void) printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); } */ - for (int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { /* for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) @@ -2167,7 +2175,7 @@ void test_sequential_7(void) } } - for (int i = 0; i < decided_polygons.size(); ++i) + for (unsigned int i = 0; i < decided_polygons.size(); ++i) { Polygon display_polygon = scale_UP(polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), @@ -2257,11 +2265,11 @@ void test_sequential_7(void) vector next_polygons; vector > next_unreachable_polygons; - for (int i = 0; i < polygon_index_map.size(); ++i) + for (unsigned int i = 0; i < polygon_index_map.size(); ++i) { printf(" %d\n", polygon_index_map[i]); } - for (int i = 0; i < remaining_polygons.size(); ++i) + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); @@ -2274,7 +2282,7 @@ void test_sequential_7(void) polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - for (int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } From a651173be12aaeb91dbb350e90bb87a5afda7394 Mon Sep 17 00:00:00 2001 From: surynek Date: Wed, 16 Oct 2024 23:42:46 +0200 Subject: [PATCH 15/88] Added progress to seqential print scheduling. --- .../include/libseqarrange/seq_interface.hpp | 13 +- src/libseqarrange/src/seq_interface.cpp | 85 ++++++++++--- src/libseqarrange/src/seq_sequential.cpp | 120 +++++++++++++----- src/libseqarrange/src/sequential_prusa.cpp | 25 +++- src/libseqarrange/test/seq_test_interface.cpp | 3 +- 5 files changed, 189 insertions(+), 57 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index 022cb0b888..e945cdfec8 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -89,6 +89,7 @@ struct SolverConfiguration struct ObjectToPrint { int id = 0; + int previous_id = -1; /* object 'id' will be scheduled right after object 'previous_id' */ coord_t total_height = 0; std::vector> pgns_at_height; }; @@ -145,12 +146,14 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration std::vector schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, const PrinterGeometry &printer_geometry, - const std::vector &objects_to_print); + const std::vector &objects_to_print, + std::function progress_callback = [](int progress){}); void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, const PrinterGeometry &printer_geometry, const std::vector &objects_to_print, - std::vector &scheduled_plates); + std::vector &scheduled_plates, + std::function progress_callback = [](int progress){}); /*----------------------------------------------------------------*/ @@ -160,7 +163,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, const std::vector &objects_to_print, - std::vector &scheduled_plates); + std::vector &scheduled_plates, + std::function progress_callback = [](int progress){}); void setup_ExtruderUnreachableZones(const SolverConfiguration &solver_configuration, std::vector > &convex_unreachable_zones, @@ -170,7 +174,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration const std::vector &objects_to_print, const std::vector > &convex_unreachable_zones, const std::vector > &box_unreachable_zones, - std::vector &scheduled_plates); + std::vector &scheduled_plates, + std::function progress_callback = [](int progress){}); /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index a3821f7d7f..5e7dada43d 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -169,7 +169,7 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration std::vector polygons; std::vector > unreachable_polygons; - map flat_index_map; + std::map flat_index_map; for (unsigned int i = 0; i < objects_to_print.size(); ++i) { @@ -203,7 +203,7 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration scale_down_unreachable_polygons); unreachable_polygons.push_back(scale_down_unreachable_polygons); - polygons.push_back(scale_down_object_polygon); + polygons.push_back(scale_down_object_polygon); } for (const auto& scheduled_plate: scheduled_plates) @@ -283,14 +283,16 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration std::vector schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, const PrinterGeometry &printer_geometry, - const std::vector &objects_to_print) + const std::vector &objects_to_print, + std::function progress_callback) { std::vector scheduled_plates; schedule_ObjectsForSequentialPrint(solver_configuration, printer_geometry, objects_to_print, - scheduled_plates); + scheduled_plates, + progress_callback); return scheduled_plates; } @@ -298,7 +300,8 @@ std::vector schedule_ObjectsForSequentialPrint(const SolverConfi void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, const PrinterGeometry &printer_geometry, const std::vector &objects_to_print, - std::vector &scheduled_plates) + std::vector &scheduled_plates, + std::function progress_callback) { #ifdef PROFILE clock_t start, finish; @@ -314,7 +317,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver std::vector polygons; std::vector > unreachable_polygons; - map original_index_map; + std::map original_index_map; + std::vector previous_polygons; #ifdef DEBUG { @@ -354,7 +358,9 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver scale_down_unreachable_polygons); unreachable_polygons.push_back(scale_down_unreachable_polygons); - polygons.push_back(scale_down_object_polygon); + polygons.push_back(scale_down_object_polygon); + + previous_polygons.push_back(objects_to_print[i].previous_id); } vector remaining_polygons; @@ -376,6 +382,9 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver } #endif + int progress_objects_done = 0; + int progress_objects_total = objects_to_print.size(); + do { ScheduledPlate scheduled_plate; @@ -397,9 +406,13 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver times_T, polygons, unreachable_polygons, + previous_polygons, polygon_index_map, decided_polygons, - remaining_polygons); + remaining_polygons, + progress_objects_done, + progress_objects_total, + progress_callback); #ifdef DEBUG { @@ -446,7 +459,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver const auto& original_index = original_index_map.find(scheduled_polygon.second); scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); - } + } + progress_objects_done += decided_polygons.size(); } else { @@ -472,19 +486,23 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver vector next_polygons; vector > next_unreachable_polygons; + vector next_previous_polygons; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); } polygons.clear(); unreachable_polygons.clear(); + previous_polygons.clear(); polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; + previous_polygons = next_previous_polygons; vector next_polygon_index_map; map next_original_index_map; @@ -525,7 +543,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_configuration, const std::vector &objects_to_print, - std::vector &scheduled_plates) + std::vector &scheduled_plates, + std::function progress_callback) { #ifdef PROFILE clock_t start, finish; @@ -542,6 +561,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ std::vector polygons; std::vector > unreachable_polygons; + std::vector previous_polygons; map original_index_map; @@ -750,6 +770,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } unreachable_polygons.push_back(scale_down_unreachable_polygons); + previous_polygons.push_back(objects_to_print[i].previous_id); } vector remaining_polygons; @@ -771,6 +792,9 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } #endif + int progress_objects_done = 0; + int progress_objects_total = objects_to_print.size(); + do { ScheduledPlate scheduled_plate; @@ -792,9 +816,13 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ times_T, polygons, unreachable_polygons, + previous_polygons, polygon_index_map, decided_polygons, - remaining_polygons); + remaining_polygons, + progress_objects_done, + progress_objects_total, + progress_callback); #ifdef DEBUG { @@ -841,7 +869,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ const auto& original_index = original_index_map.find(scheduled_polygon.second); scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); - } + } + progress_objects_done += decided_polygons.size(); } else { @@ -866,19 +895,23 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ vector next_polygons; vector > next_unreachable_polygons; + vector next_previous_polygons; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); } polygons.clear(); unreachable_polygons.clear(); + previous_polygons.clear(); polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; + previous_polygons = next_previous_polygons; vector next_polygon_index_map; map next_original_index_map; @@ -956,7 +989,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration const std::vector &objects_to_print, const std::vector > &convex_unreachable_zones, const std::vector > &box_unreachable_zones, - std::vector &scheduled_plates) + std::vector &scheduled_plates, + std::function progress_callback) { #ifdef PROFILE clock_t start, finish; @@ -972,7 +1006,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration std::vector polygons; std::vector > unreachable_polygons; - map original_index_map; + std::map original_index_map; + std::vector previous_polygons; #ifdef DEBUG { @@ -1074,6 +1109,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration scale_down_unreachable_polygons); unreachable_polygons.push_back(scale_down_unreachable_polygons); + previous_polygons.push_back(objects_to_print[i].previous_id); } vector remaining_polygons; @@ -1095,6 +1131,9 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration } #endif + int progress_objects_done = 0; + int progress_objects_total = objects_to_print.size(); + do { ScheduledPlate scheduled_plate; @@ -1116,9 +1155,14 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration times_T, polygons, unreachable_polygons, + previous_polygons, polygon_index_map, decided_polygons, - remaining_polygons); + remaining_polygons, + progress_objects_done, + progress_objects_total, + progress_callback); + #ifdef DEBUG { @@ -1165,7 +1209,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration const auto& original_index = original_index_map.find(scheduled_polygon.second); scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); - } + } + progress_objects_done += decided_polygons.size(); } else { @@ -1188,21 +1233,25 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration } #endif - vector next_polygons; - vector > next_unreachable_polygons; + std::vector next_polygons; + std::vector > next_unreachable_polygons; + std::vector next_previous_polygons; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); } polygons.clear(); unreachable_polygons.clear(); + previous_polygons.clear(); polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; + previous_polygons = next_previous_polygons; vector next_polygon_index_map; map next_original_index_map; diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 97d1f7e331..13ed266f0a 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -301,7 +301,7 @@ void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver std::vector &dec_values_T, const std::vector &fixed, const std::vector &undecided, - int temporal_spread, + int temporal_spread, const std::vector &SEQ_UNUSED(polygons)) { for (unsigned int i = 0; i < undecided.size() - 1; ++i) @@ -333,6 +333,39 @@ void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver } +void introduce_ConsequentialTemporalLepoxAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + int temporal_spread, + const std::vector &SEQ_UNUSED(polygons), + const std::vector &previous_polygons) +{ + std::set fixed_(fixed.begin(), fixed.end()); + std::set undecided_(undecided.begin(), undecided.end()); + + for (unsigned int i = 0; i < undecided.size(); ++i) + { + if (previous_polygons[undecided[i]] >= 0) + { + //Solver.add(dec_vars_T[previous_polygons[undecided[i]]] + temporal_spread < dec_vars_T[undecided[i]] && dec_vars_T[previous_polygons[undecided[i]]] + temporal_spread + temporal_spread / 2 > dec_vars_T[undecided[i]]); + } + } + + #ifdef DEBUG + { + printf("Origo\n"); + for (unsigned int i = 0; i < fixed.size(); ++i) + { + printf("%.3f\n", dec_values_T[fixed[i]].as_double()); + } + } + #endif +} + + /*----------------------------------------------------------------*/ void introduce_LineNonIntersection(z3::solver &Solver, @@ -6303,8 +6336,11 @@ void extract_DecisionValuesFromModel(const z3::model &Model, z3::expr_vector &dec_values_X, z3::expr_vector &dec_values_Y) { - std::map values_X; - std::map values_Y; + z3::expr_vector unordered_values_X(Context); + z3::expr_vector unordered_values_Y(Context); + + std::map value_indices_X; + std::map value_indices_Y; for (unsigned int i = 0; i < Model.size(); ++i) { @@ -6323,12 +6359,12 @@ void extract_DecisionValuesFromModel(const z3::model &Model, string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); if (var_item != dec_var_names_map.end()) { - //printf("saving: %d <-- %.3f, %d, %d\n", var_item->second, value.as_double(), value.numerator().as_int64(), value.denominator().as_int64()); - values_X[var_item->second] = new z3::expr(Context.real_val(value.numerator().as_int64(), value.denominator().as_int64())); - //dec_values_X[var_item->second] = value; + value_indices_X[var_item->second] = i; + unordered_values_X.push_back(z3::expr(Context.real_val(value.numerator().as_int64(), value.denominator().as_int64()))); + #ifdef DEBUG { - printf("saved: %.3f\n", values_X[var_item->second]->as_double()); + printf("saved: %.3f\n", unordered_values_X.back()->as_double()); } #endif } @@ -6339,15 +6375,12 @@ void extract_DecisionValuesFromModel(const z3::model &Model, string_map::const_iterator var_item = dec_var_names_map.find(Model[i].name().str()); if (var_item != dec_var_names_map.end()) { - //printf("saving: %d <-- %.3f\n", var_item->second, value.as_double()); - - values_Y[var_item->second] = new z3::expr(Context.real_val(value.numerator().as_int64(), value.denominator().as_int64())); - //dec_values_Y[var_item->second] = value; - //printf("saved: %.3f, %.3f\n", values_X[var_item->second]->as_dou + value_indices_Y[var_item->second] = i; + unordered_values_Y.push_back(z3::expr(Context.real_val(value.numerator().as_int64(), value.denominator().as_int64()))); #ifdef DEBUG { - printf("saved: %.3f\n", values_Y[var_item->second]->as_double()); + printf("saved: %.3f\n", unordered_values_Y.back()->as_double()); } #endif } @@ -6363,15 +6396,13 @@ void extract_DecisionValuesFromModel(const z3::model &Model, dec_values_X.resize(0); dec_values_Y.resize(0); - for (std::map::const_iterator value = values_X.begin(); value != values_X.end(); ++value) + for (std::map::const_iterator value = value_indices_X.begin(); value != value_indices_X.end(); ++value) { - dec_values_X.push_back(*value->second); - delete value->second; + dec_values_X.push_back(unordered_values_X[value->second]); } - for (std::map::const_iterator value = values_Y.begin(); value != values_Y.end(); ++value) + for (std::map::const_iterator value = value_indices_Y.begin(); value != value_indices_Y.end(); ++value) { - dec_values_Y.push_back(*value->second); - delete value->second; + dec_values_Y.push_back(unordered_values_Y[value->second]); } } @@ -9712,7 +9743,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve z3::expr_vector local_dec_vars_T(z_context); vector local_values_X; - vector local_values_Y; + vector local_values_Y; vector local_values_T; local_values_X.resize(polygons.size()); @@ -9909,9 +9940,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector &unreachable_polygons, + const std::vector &previous_polygons, const std::vector &undecided_polygons, std::vector &decided_polygons, - std::vector &remaining_polygons) + std::vector &remaining_polygons, + int objects_done, + int total_objects, + std::function progress_callback) { std::vector > _unreachable_polygons; _unreachable_polygons.resize(unreachable_polygons.size()); @@ -9927,9 +9962,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_values_T, polygons, _unreachable_polygons, + previous_polygons, undecided_polygons, decided_polygons, - remaining_polygons); + remaining_polygons, + objects_done, + total_objects, + progress_callback); } @@ -9944,9 +9983,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector > &unreachable_polygons, + const std::vector &previous_polygons, const std::vector &undecided_polygons, std::vector &decided_polygons, - std::vector &remaining_polygons) + std::vector &remaining_polygons, + int objects_done, + int total_objects, + std::function progress_callback) { vector undecided; @@ -9958,7 +10001,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_values_T.resize(polygons.size()); int box_half_x_max = solver_configuration.x_plate_bounding_box_size / 2; - int box_half_y_max = solver_configuration.y_plate_bounding_box_size / 2; + int box_half_y_max = solver_configuration.y_plate_bounding_box_size / 2; for (unsigned int curr_polygon = 0; curr_polygon < polygons.size(); /* nothing */) { @@ -10002,7 +10045,6 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); undecided.clear(); - int remaining_polygon = 0; for (int i = object_group_size - 1; i >= 0; --i) @@ -10063,8 +10105,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So local_values_Y[j].numerator, local_values_Y[j].denominator, local_values_T[j].numerator, - local_values_T[j].denominator); - + local_values_T[j].denominator); } } #endif @@ -10078,6 +10119,16 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So solver_configuration.temporal_spread, polygons); + introduce_ConsequentialTemporalLepoxAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons, + previous_polygons); + #ifdef DEBUG { printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); @@ -10093,6 +10144,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); + optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, z_context, solver_configuration, @@ -10136,8 +10189,12 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { + curr_polygon += polygons.size() - curr_polygon; + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); return true; } + + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); break; } else @@ -10148,11 +10205,14 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); - } + } + missing.push_back(undecided.back()); - undecided.pop_back(); + undecided.pop_back(); - --object_group_size; + --object_group_size; + + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); } #ifdef PROFILE diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index a194b09715..9cf2e437dc 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -210,6 +210,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) std::vector polygons; std::vector > unreachable_polygons; + std::vector previous_polygons; printf(" Preparing objects ...\n"); @@ -316,7 +317,8 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4, scale_down_unreachable_polygons); - unreachable_polygons.push_back(scale_down_unreachable_polygons); + unreachable_polygons.push_back(scale_down_unreachable_polygons); + previous_polygons.push_back(objects_to_print[i].previous_id); } else { @@ -340,7 +342,9 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) scale_down_unreachable_polygons); unreachable_polygons.push_back(scale_down_unreachable_polygons); - polygons.push_back(scale_down_object_polygon); + polygons.push_back(scale_down_object_polygon); + + previous_polygons.push_back(objects_to_print[i].previous_id); } SVG preview_svg("sequential_prusa.svg"); @@ -373,6 +377,9 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) printf(" Preparing objects ... finished\n"); int plate_index = 0; + + int progress_objects_done = 0; + int progress_objects_total = objects_to_print.size(); do { @@ -390,9 +397,13 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) times_T, polygons, unreachable_polygons, + previous_polygons, polygon_index_map, decided_polygons, - remaining_polygons); + remaining_polygons, + progress_objects_done, + progress_objects_total); + } else { @@ -404,7 +415,8 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) unreachable_polygons, polygon_index_map, decided_polygons, - remaining_polygons); + remaining_polygons); + } printf(" Object scheduling/arranging ... finished\n"); @@ -432,6 +444,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) { scheduled_polygons.insert(std::pair(times_T[decided_polygons[i]].as_double(), decided_polygons[i])); } + progress_objects_done += decided_polygons.size(); string output_filename; @@ -722,6 +735,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) vector next_polygons; vector > next_unreachable_polygons; + vector next_previous_polygons; #ifdef DEBUG { @@ -735,14 +749,17 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); + next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); } polygons.clear(); unreachable_polygons.clear(); + previous_polygons.clear(); polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; + previous_polygons = next_previous_polygons; vector next_polygon_index_map; //vector next_original_index_map; diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index 48dcfccaf0..258e1678c0 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -359,7 +359,8 @@ int test_interface_5(void) scheduled_plates = schedule_ObjectsForSequentialPrint(solver_configuration, printer_geometry, - objects_to_print); + objects_to_print, + [](int progress) { printf("Progress: %d\n", progress); }); printf("Object scheduling for sequential print SUCCESSFUL !\n"); From 7cd23ab3e73c084bc27026693ac0306bb632614b Mon Sep 17 00:00:00 2001 From: surynek Date: Thu, 17 Oct 2024 13:11:08 +0200 Subject: [PATCH 16/88] Interface preparation for passing object instances. --- .../include/libseqarrange/seq_interface.hpp | 1 + src/libseqarrange/src/seq_sequential.cpp | 26 ++++++++----------- src/libseqarrange/src/seq_sequential.hpp | 14 ++++++++-- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index e945cdfec8..f91f7f2cf8 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -89,6 +89,7 @@ struct SolverConfiguration struct ObjectToPrint { int id = 0; + bool lepox = false; /* object must be scheduled right after the previous object */ int previous_id = -1; /* object 'id' will be scheduled right after object 'previous_id' */ coord_t total_height = 0; std::vector> pgns_at_height; diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 13ed266f0a..08b0d93ba1 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -9730,7 +9730,6 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve { bool optimized = false; - int remaining_polygon = 0; for(int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); object_group_size > 0; --object_group_size) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); @@ -9778,9 +9777,9 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve } */ - for (int i = object_group_size - 1; i >= 0; --i) + for (int i = 0; i < object_group_size; ++i) { - undecided.push_back(curr_polygon + i + remaining_polygon); + undecided.push_back(curr_polygon + i); } #ifdef DEBUG @@ -9899,10 +9898,10 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve { #ifdef DEBUG { - printf("Remaining polygon: %d\n", curr_polygon + remaining_polygon); + printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif - remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); + remaining_polygons.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); } } if (!optimized) @@ -9991,7 +9990,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So int total_objects, std::function progress_callback) { - vector undecided; + std::vector undecided; decided_polygons.clear(); remaining_polygons.clear(); @@ -10040,16 +10039,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So local_values_T[decided_polygons[i]] = dec_values_T[decided_polygons[i]]; } - string_map dec_var_names_map; - + string_map dec_var_names_map; int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, polygons.size() - curr_polygon); - undecided.clear(); - int remaining_polygon = 0; - - for (int i = object_group_size - 1; i >= 0; --i) + undecided.clear(); + for (int i = 0; i < object_group_size; ++i) { - undecided.push_back(curr_polygon + i + remaining_polygon); + undecided.push_back(curr_polygon + i); } #ifdef PROFILE @@ -10201,10 +10197,10 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So { #ifdef DEBUG { - printf("Remaining polygon: %d\n", curr_polygon + remaining_polygon); + printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif - remaining_polygons.push_back(undecided_polygons[curr_polygon + remaining_polygon++]); + remaining_polygons.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); } missing.push_back(undecided.back()); diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index 2bbbeed567..ed6572b812 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -58,6 +58,8 @@ const coord_t SEQ_SVG_SCALE_FACTOR = 50000; #define SEQ_Z3_SOLVER_TIMEOUT "8000" const int SEQ_GROUND_PRESENCE_TIME = 32; +const int SEQ_PROGRESS_RANGE = 100; + const int64_t SEQ_RATIONAL_PRECISION = 1000000; const double SEQ_DECIMATION_TOLERANCE = 400000.0; @@ -1551,9 +1553,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector &unreachable_polygons, + const std::vector &previous_polygons, const std::vector &undecided_polygons, std::vector &decided_polygons, - std::vector &remaining_polygons); + std::vector &remaining_polygons, + int objects_done, + int total_objects, + std::function progress_callback = [](int progress){}); bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, std::vector &dec_values_X, @@ -1561,9 +1567,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector > &unreachable_polygons, + const std::vector &previous_polygons, const std::vector &undecided_polygons, std::vector &decided_polygons, - std::vector &remaining_polygons); + std::vector &remaining_polygons, + int objects_done, + int total_objects, + std::function progress_callback = [](int progress){}); /*----------------------------------------------------------------*/ From 73cd351e2d18860612caa723cd23881a3a978fb7 Mon Sep 17 00:00:00 2001 From: surynek Date: Thu, 17 Oct 2024 22:07:17 +0200 Subject: [PATCH 17/88] Minor code improvements. --- src/libseqarrange/src/seq_sequential.cpp | 28 ++++++++++++------------ src/libseqarrange/src/seq_sequential.hpp | 22 +++---------------- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 08b0d93ba1..5e23a88f46 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -1223,7 +1223,7 @@ void introduce_PointOutsidePolygon(z3::solver &Solver, - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1266,7 +1266,7 @@ void introduce_SequentialPointOutsidePolygon(z3::solver &Solver, - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1309,7 +1309,7 @@ void introduce_ConsequentialPointOutsidePolygon(z3::solver &Solver, - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1354,7 +1354,7 @@ void introduce_ShiftSequentialPointOutsidePolygon(z3::solver &Solver, - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1399,7 +1399,7 @@ void introduce_ShiftConsequentialPointOutsidePolygon(z3::solver &Solv - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1483,7 +1483,7 @@ void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1525,7 +1525,7 @@ void introduce_SequentialFixedPointOutsidePolygon(z3::solver &Solver, - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1570,7 +1570,7 @@ void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solv - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1615,7 +1615,7 @@ void introduce_ConsequentialFixedPointOutsidePolygon(z3::solver &Solv - (normal.x() * dec_var_X2) - (normal.x() * line.a.x()) - (normal.y() * dec_var_Y2) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1657,7 +1657,7 @@ void introduce_PointOutsideFixedPolygon(z3::solver &Solver, - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) - (normal.x() * line.a.x()) - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1700,7 +1700,7 @@ void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) - (normal.x() * line.a.x()) - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1743,7 +1743,7 @@ void introduce_SequentialPointOutsideFixedPolygon(z3::solver &Solver, - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) - (normal.x() * line.a.x()) - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1788,7 +1788,7 @@ void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solv - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) - (normal.x() * line.a.x()) - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { @@ -1834,7 +1834,7 @@ void introduce_ConsequentialPointOutsideFixedPolygon(z3::solver &Solv - (normal.x() * Context.real_val(dec_value_X2.numerator, dec_value_X2.denominator)) - (normal.x() * line.a.x()) - (normal.y() * Context.real_val(dec_value_Y2.numerator, dec_value_Y2.denominator)) - - (normal.y() * line.a.y()) > 0/*Context.real_val("0")*/); + - (normal.y() * line.a.y()) > 0); if (p == 0) { diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index ed6572b812..b880bb0fb7 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -47,16 +47,15 @@ namespace Sequential /*----------------------------------------------------------------*/ - -const coord_t SEQ_SVG_SCALE_FACTOR = 50000; - + #define SEQ_INTERSECTION_REPULSION_MIN "-0.01" #define SEQ_INTERSECTION_REPULSION_MAX "1.01" #define SEQ_TEMPORAL_ABSENCE_THRESHOLD "-16" #define SEQ_TEMPORAL_PRESENCE_THRESHOLD "16" #define SEQ_Z3_SOLVER_TIMEOUT "8000" - + +const coord_t SEQ_SVG_SCALE_FACTOR = 50000; const int SEQ_GROUND_PRESENCE_TIME = 32; const int SEQ_PROGRESS_RANGE = 100; @@ -72,21 +71,6 @@ const double SEQ_DECIMATION_TOLERANCE_VALUE_HIGH = 450000.0; typedef std::basic_string string; typedef std::unordered_map string_map; - - -/*----------------------------------------------------------------*/ -/* -struct PrinterGeometry -{ - coord_t x_size; - coord_t y_size; - - std::set convex_heights; - std::set box_heights; - - std::map > extruder_slices; -}; -*/ /*----------------------------------------------------------------*/ From 967a0710d369add85219eb01c8291bb1e14f6aef Mon Sep 17 00:00:00 2001 From: surynek Date: Fri, 18 Oct 2024 00:10:56 +0200 Subject: [PATCH 18/88] Updating interface for object instances via object gluing. --- .../include/libseqarrange/seq_interface.hpp | 3 +- src/libseqarrange/src/seq_interface.cpp | 100 ++++++++++-------- src/libseqarrange/src/seq_sequential.cpp | 16 +-- src/libseqarrange/src/seq_sequential.hpp | 22 ++-- src/libseqarrange/src/sequential_prusa.cpp | 29 ++--- src/libseqarrange/test/seq_test_interface.cpp | 2 +- 6 files changed, 94 insertions(+), 78 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index f91f7f2cf8..3d62409b66 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -89,8 +89,7 @@ struct SolverConfiguration struct ObjectToPrint { int id = 0; - bool lepox = false; /* object must be scheduled right after the previous object */ - int previous_id = -1; /* object 'id' will be scheduled right after object 'previous_id' */ + bool glued_to_next = false; /* the next object must be scheduled right after this object */ coord_t total_height = 0; std::vector> pgns_at_height; }; diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 5e7dada43d..deaa4629a3 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -318,7 +318,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver std::vector > unreachable_polygons; std::map original_index_map; - std::vector previous_polygons; + std::vector lepox_to_next; #ifdef DEBUG { @@ -360,21 +360,21 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver unreachable_polygons.push_back(scale_down_unreachable_polygons); polygons.push_back(scale_down_object_polygon); - previous_polygons.push_back(objects_to_print[i].previous_id); + lepox_to_next.push_back(objects_to_print[i].glued_to_next); } - vector remaining_polygons; - vector polygon_index_map; - vector decided_polygons; + std::vector remaining_polygons; + std::vector polygon_index_map; + std::vector decided_polygons; for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } - vector poly_positions_X; - vector poly_positions_Y; - vector times_T; + std::vector poly_positions_X; + std::vector poly_positions_Y; + std::vector times_T; #ifdef DEBUG { @@ -406,7 +406,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver times_T, polygons, unreachable_polygons, - previous_polygons, + lepox_to_next, polygon_index_map, decided_polygons, remaining_polygons, @@ -484,28 +484,30 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver } #endif - vector next_polygons; - vector > next_unreachable_polygons; - vector next_previous_polygons; + std::vector next_polygons; + std::vector > next_unreachable_polygons; + std::vector next_lepox_to_next; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); - next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); + next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); } - + + /* TODO: remove */ polygons.clear(); unreachable_polygons.clear(); - previous_polygons.clear(); + lepox_to_next.clear(); + polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - previous_polygons = next_previous_polygons; + lepox_to_next = next_lepox_to_next; - vector next_polygon_index_map; - map next_original_index_map; + std::vector next_polygon_index_map; + std::map next_original_index_map; for (unsigned int index = 0; index < polygons.size(); ++index) { @@ -561,9 +563,9 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ std::vector polygons; std::vector > unreachable_polygons; - std::vector previous_polygons; + std::vector lepox_to_next; - map original_index_map; + std::map original_index_map; #ifdef DEBUG { @@ -770,7 +772,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } unreachable_polygons.push_back(scale_down_unreachable_polygons); - previous_polygons.push_back(objects_to_print[i].previous_id); + lepox_to_next.push_back(objects_to_print[i].glued_to_next); } vector remaining_polygons; @@ -816,7 +818,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ times_T, polygons, unreachable_polygons, - previous_polygons, + lepox_to_next, polygon_index_map, decided_polygons, remaining_polygons, @@ -893,28 +895,30 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } #endif - vector next_polygons; - vector > next_unreachable_polygons; - vector next_previous_polygons; + std::vector next_polygons; + std::vector > next_unreachable_polygons; + std::vector next_lepox_to_next; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); - next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); + next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); } - + + /* TODO: remove */ polygons.clear(); unreachable_polygons.clear(); - previous_polygons.clear(); + lepox_to_next.clear(); + polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - previous_polygons = next_previous_polygons; + lepox_to_next = next_lepox_to_next; - vector next_polygon_index_map; - map next_original_index_map; + std::vector next_polygon_index_map; + std::map next_original_index_map; for (unsigned int index = 0; index < polygons.size(); ++index) { @@ -1007,7 +1011,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration std::vector > unreachable_polygons; std::map original_index_map; - std::vector previous_polygons; + std::vector lepox_to_next; #ifdef DEBUG { @@ -1109,21 +1113,21 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration scale_down_unreachable_polygons); unreachable_polygons.push_back(scale_down_unreachable_polygons); - previous_polygons.push_back(objects_to_print[i].previous_id); + lepox_to_next.push_back(objects_to_print[i].glued_to_next); } - vector remaining_polygons; - vector polygon_index_map; - vector decided_polygons; + std::vector remaining_polygons; + std::vector polygon_index_map; + std::vector decided_polygons; for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } - vector poly_positions_X; - vector poly_positions_Y; - vector times_T; + std::vector poly_positions_X; + std::vector poly_positions_Y; + std::vector times_T; #ifdef DEBUG { @@ -1155,7 +1159,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration times_T, polygons, unreachable_polygons, - previous_polygons, + lepox_to_next, polygon_index_map, decided_polygons, remaining_polygons, @@ -1235,26 +1239,28 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration std::vector next_polygons; std::vector > next_unreachable_polygons; - std::vector next_previous_polygons; + std::vector next_lepox_to_next; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); - next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); + next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); } - + + /* TODO: remove */ polygons.clear(); unreachable_polygons.clear(); - previous_polygons.clear(); + lepox_to_next.clear(); + polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - previous_polygons = next_previous_polygons; + lepox_to_next = next_lepox_to_next; - vector next_polygon_index_map; - map next_original_index_map; + std::vector next_polygon_index_map; + std::map next_original_index_map; for (unsigned int index = 0; index < polygons.size(); ++index) { diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 5e23a88f46..765a1e3ad4 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -341,15 +341,16 @@ void introduce_ConsequentialTemporalLepoxAgainstFixed(z3::solver const std::vector &undecided, int temporal_spread, const std::vector &SEQ_UNUSED(polygons), - const std::vector &previous_polygons) + const std::vector &lepox_to_next) { std::set fixed_(fixed.begin(), fixed.end()); std::set undecided_(undecided.begin(), undecided.end()); for (unsigned int i = 0; i < undecided.size(); ++i) { - if (previous_polygons[undecided[i]] >= 0) + if (lepox_to_next[undecided[i]]) { + /* TODO: we know what to do */ //Solver.add(dec_vars_T[previous_polygons[undecided[i]]] + temporal_spread < dec_vars_T[undecided[i]] && dec_vars_T[previous_polygons[undecided[i]]] + temporal_spread + temporal_spread / 2 > dec_vars_T[undecided[i]]); } } @@ -9939,7 +9940,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector &unreachable_polygons, - const std::vector &previous_polygons, + const std::vector &lepox_to_next, const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, @@ -9961,7 +9962,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_values_T, polygons, _unreachable_polygons, - previous_polygons, + lepox_to_next, undecided_polygons, decided_polygons, remaining_polygons, @@ -9982,7 +9983,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector > &unreachable_polygons, - const std::vector &previous_polygons, + const std::vector &lepox_to_next, const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, @@ -10123,7 +10124,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So undecided, solver_configuration.temporal_spread, polygons, - previous_polygons); + lepox_to_next); #ifdef DEBUG { @@ -10174,7 +10175,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; - dec_values_T[undecided[i]] = local_values_T[undecided[i]]; + dec_values_T[undecided[i]] = local_values_T[undecided[i]]; decided_polygons.push_back(undecided[i]); } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); @@ -10207,7 +10208,6 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So undecided.pop_back(); --object_group_size; - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); } diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index b880bb0fb7..9cd02f6e6b 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -64,7 +64,7 @@ const double SEQ_DECIMATION_TOLERANCE = 400000.0; const double SEQ_DECIMATION_TOLERANCE_VALUE_UNDEFINED = 0.0; const double SEQ_DECIMATION_TOLERANCE_VALUE_LOW = 150000.0; -const double SEQ_DECIMATION_TOLERANCE_VALUE_HIGH = 450000.0; +const double SEQ_DECIMATION_TOLERANCE_VALUE_HIGH = 650000.0; /*----------------------------------------------------------------*/ @@ -300,6 +300,16 @@ void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver int temporal_spread, const std::vector &polygons); +void introduce_ConsequentialTemporalLepoxAgainstFixed(z3::solver &Solver, + z3::context &Context, + const z3::expr_vector &dec_vars_T, + std::vector &dec_values_T, + const std::vector &fixed, + const std::vector &undecided, + int temporal_spread, + const std::vector &SEQ_UNUSED(polygons), + const std::vector &lepox_to_next); + /*----------------------------------------------------------------*/ void introduce_LineNonIntersection(z3::solver &Solver, @@ -1537,13 +1547,13 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector &unreachable_polygons, - const std::vector &previous_polygons, + const std::vector &lepox_to_next, const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, int objects_done, - int total_objects, - std::function progress_callback = [](int progress){}); + int total_objects, + std::function progress_callback = [](int progress){}); bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, std::vector &dec_values_X, @@ -1551,12 +1561,12 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_T, const std::vector &polygons, const std::vector > &unreachable_polygons, - const std::vector &previous_polygons, + const std::vector &lepox_to_next, const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, int objects_done, - int total_objects, + int total_objects, std::function progress_callback = [](int progress){}); /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index 9cf2e437dc..de752dfcb5 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -210,7 +210,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) std::vector polygons; std::vector > unreachable_polygons; - std::vector previous_polygons; + std::vector lepox_to_next; printf(" Preparing objects ...\n"); @@ -318,7 +318,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) scale_down_unreachable_polygons); unreachable_polygons.push_back(scale_down_unreachable_polygons); - previous_polygons.push_back(objects_to_print[i].previous_id); + lepox_to_next.push_back(objects_to_print[i].glued_to_next); } else { @@ -344,7 +344,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) unreachable_polygons.push_back(scale_down_unreachable_polygons); polygons.push_back(scale_down_object_polygon); - previous_polygons.push_back(objects_to_print[i].previous_id); + lepox_to_next.push_back(objects_to_print[i].glued_to_next); } SVG preview_svg("sequential_prusa.svg"); @@ -397,7 +397,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) times_T, polygons, unreachable_polygons, - previous_polygons, + lepox_to_next, polygon_index_map, decided_polygons, remaining_polygons, @@ -733,9 +733,9 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) printf("All objects fit onto plate.\n"); } - vector next_polygons; - vector > next_unreachable_polygons; - vector next_previous_polygons; + std::vector next_polygons; + std::vector > next_unreachable_polygons; + std::vector next_lepox_to_next; #ifdef DEBUG { @@ -749,21 +749,22 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) { next_polygons.push_back(polygons[remaining_polygons[i]]); next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); - next_previous_polygons.push_back(previous_polygons[remaining_polygons[i]]); + next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); } - + + /* TODO: remove */ polygons.clear(); unreachable_polygons.clear(); - previous_polygons.clear(); + lepox_to_next.clear(); + polygon_index_map.clear(); polygons = next_polygons; unreachable_polygons = next_unreachable_polygons; - previous_polygons = next_previous_polygons; + lepox_to_next = next_lepox_to_next; - vector next_polygon_index_map; - //vector next_original_index_map; - map next_original_index_map; + std::vector next_polygon_index_map; + std::map next_original_index_map; for (unsigned int index = 0; index < polygons.size(); ++index) { diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index 258e1678c0..2753409769 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -334,7 +334,7 @@ int test_interface_5(void) start = clock(); SolverConfiguration solver_configuration; - solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_LOW; solver_configuration.object_group_size = 4; printf("Loading objects ...\n"); From e627aeb685e90f907104e395bf8f9ed7077b5b0d Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 21 Oct 2024 01:46:33 +0200 Subject: [PATCH 19/88] Implementation of object gluing into the sequential solver and more fine grained progress callback. --- src/libseqarrange/src/seq_interface.cpp | 185 +++----- src/libseqarrange/src/seq_sequential.cpp | 406 ++++++++++++++++-- src/libseqarrange/src/seq_sequential.hpp | 47 +- src/libseqarrange/src/sequential_prusa.cpp | 5 - src/libseqarrange/test/seq_test_interface.cpp | 84 +++- src/libseqarrange/test/seq_test_interface.hpp | 2 + src/slic3r/GUI/ArrangeHelper.cpp | 2 +- 7 files changed, 565 insertions(+), 166 deletions(-) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index deaa4629a3..8460b414a0 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -320,6 +320,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver std::map original_index_map; std::vector lepox_to_next; + std::vector solvable_objects; + #ifdef DEBUG { printf(" Preparing objects ...\n"); @@ -333,12 +335,9 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver std::vector > extruder_convex_level_polygons; std::vector > extruder_box_level_polygons; - - std::vector scale_down_unreachable_polygons; + SolvableObject solvable_object; original_index_map[i] = objects_to_print[i].id; - - Polygon scale_down_object_polygon; prepare_ExtruderPolygons(solver_configuration, printer_geometry, @@ -354,13 +353,13 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver box_level_polygons, extruder_convex_level_polygons, extruder_box_level_polygons, - scale_down_object_polygon, - scale_down_unreachable_polygons); - - unreachable_polygons.push_back(scale_down_unreachable_polygons); - polygons.push_back(scale_down_object_polygon); + solvable_object.polygon, + solvable_object.unreachable_polygons); - lepox_to_next.push_back(objects_to_print[i].glued_to_next); + solvable_object.id = objects_to_print[i].id; + solvable_object.lepox_to_next = objects_to_print[i].glued_to_next; + + solvable_objects.push_back(solvable_object); } std::vector remaining_polygons; @@ -404,9 +403,7 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver poly_positions_X, poly_positions_Y, times_T, - polygons, - unreachable_polygons, - lepox_to_next, + solvable_objects, polygon_index_map, decided_polygons, remaining_polygons, @@ -483,28 +480,15 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver printf("Intermediate CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); } #endif - - std::vector next_polygons; - std::vector > next_unreachable_polygons; - std::vector next_lepox_to_next; + + std::vector next_solvable_objects; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { - next_polygons.push_back(polygons[remaining_polygons[i]]); - next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); - next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); - } - - /* TODO: remove */ - polygons.clear(); - unreachable_polygons.clear(); - lepox_to_next.clear(); - + next_solvable_objects.push_back(solvable_objects[remaining_polygons[i]]); + } polygon_index_map.clear(); - - polygons = next_polygons; - unreachable_polygons = next_unreachable_polygons; - lepox_to_next = next_lepox_to_next; + solvable_objects = next_solvable_objects; std::vector next_polygon_index_map; std::map next_original_index_map; @@ -565,6 +549,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ std::vector > unreachable_polygons; std::vector lepox_to_next; + std::vector solvable_objects; + std::map original_index_map; #ifdef DEBUG @@ -718,10 +704,9 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } } } - - Polygon scale_down_polygon; - scaleDown_PolygonForSequentialSolver(nozzle_polygon, scale_down_polygon); - polygons.push_back(scale_down_polygon); + SolvableObject solvable_object; + + scaleDown_PolygonForSequentialSolver(nozzle_polygon, solvable_object.polygon); std::vector convex_level_polygons; convex_level_polygons.push_back(nozzle_polygon); @@ -737,31 +722,31 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ case SEQ_PRINTER_TYPE_PRUSA_MK3S: { prepare_UnreachableZonePolygons(solver_configuration, - convex_level_polygons, - box_level_polygons, - SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S, - SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S, - scale_down_unreachable_polygons); + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S, + solvable_object.unreachable_polygons); break; } case SEQ_PRINTER_TYPE_PRUSA_MK4: { prepare_UnreachableZonePolygons(solver_configuration, - convex_level_polygons, - box_level_polygons, - SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK4, - SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4, - scale_down_unreachable_polygons); + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK4, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK4, + solvable_object.unreachable_polygons); break; } case SEQ_PRINTER_TYPE_PRUSA_XL: { prepare_UnreachableZonePolygons(solver_configuration, - convex_level_polygons, - box_level_polygons, - SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_XL, - SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_XL, - scale_down_unreachable_polygons); + convex_level_polygons, + box_level_polygons, + SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_XL, + SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_XL, + solvable_object.unreachable_polygons); break; } default: @@ -771,22 +756,24 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } } - unreachable_polygons.push_back(scale_down_unreachable_polygons); - lepox_to_next.push_back(objects_to_print[i].glued_to_next); + solvable_object.id = objects_to_print[i].id; + solvable_object.lepox_to_next = objects_to_print[i].glued_to_next; + + solvable_objects.push_back(solvable_object); } - vector remaining_polygons; - vector polygon_index_map; - vector decided_polygons; + std::vector remaining_polygons; + std::vector polygon_index_map; + std::vector decided_polygons; for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); } - vector poly_positions_X; - vector poly_positions_Y; - vector times_T; + std::vector poly_positions_X; + std::vector poly_positions_Y; + std::vector times_T; #ifdef DEBUG { @@ -816,9 +803,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ poly_positions_X, poly_positions_Y, times_T, - polygons, - unreachable_polygons, - lepox_to_next, + solvable_objects, polygon_index_map, decided_polygons, remaining_polygons, @@ -894,28 +879,15 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ printf("Intermediate CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); } #endif - - std::vector next_polygons; - std::vector > next_unreachable_polygons; - std::vector next_lepox_to_next; + + std::vector next_solvable_objects; for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { - next_polygons.push_back(polygons[remaining_polygons[i]]); - next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); - next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); - } - - /* TODO: remove */ - polygons.clear(); - unreachable_polygons.clear(); - lepox_to_next.clear(); - + next_solvable_objects.push_back(solvable_objects[i]); + } polygon_index_map.clear(); - - polygons = next_polygons; - unreachable_polygons = next_unreachable_polygons; - lepox_to_next = next_lepox_to_next; + solvable_objects = next_solvable_objects; std::vector next_polygon_index_map; std::map next_original_index_map; @@ -1007,11 +979,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration } #endif - std::vector polygons; - std::vector > unreachable_polygons; - + std::vector solvable_objects; std::map original_index_map; - std::vector lepox_to_next; #ifdef DEBUG { @@ -1020,7 +989,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration #endif for (unsigned int i = 0; i < objects_to_print.size(); ++i) - { + { Polygon nozzle_polygon; Polygon extruder_polygon; Polygon hose_polygon; @@ -1090,10 +1059,9 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration } ++ht; } - - Polygon scale_down_polygon; - scaleDown_PolygonForSequentialSolver(nozzle_polygon, scale_down_polygon); - polygons.push_back(scale_down_polygon); + SolvableObject solvable_object; + + scaleDown_PolygonForSequentialSolver(nozzle_polygon, solvable_object.polygon); std::vector convex_level_polygons; convex_level_polygons.push_back(nozzle_polygon); @@ -1110,17 +1078,19 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration box_level_polygons, convex_unreachable_zones, box_unreachable_zones, - scale_down_unreachable_polygons); - - unreachable_polygons.push_back(scale_down_unreachable_polygons); - lepox_to_next.push_back(objects_to_print[i].glued_to_next); + solvable_object.unreachable_polygons); + + solvable_object.id = objects_to_print[i].id; + solvable_object.lepox_to_next = objects_to_print[i].glued_to_next; + + solvable_objects.push_back(solvable_object); } std::vector remaining_polygons; std::vector polygon_index_map; std::vector decided_polygons; - for (unsigned int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < solvable_objects.size(); ++index) { polygon_index_map.push_back(index); } @@ -1157,9 +1127,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration poly_positions_X, poly_positions_Y, times_T, - polygons, - unreachable_polygons, - lepox_to_next, + solvable_objects, polygon_index_map, decided_polygons, remaining_polygons, @@ -1236,33 +1204,20 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration printf("Intermediate CPU time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); } #endif - - std::vector next_polygons; - std::vector > next_unreachable_polygons; - std::vector next_lepox_to_next; + std::vector next_solvable_objects; + for (unsigned int i = 0; i < remaining_polygons.size(); ++i) { - next_polygons.push_back(polygons[remaining_polygons[i]]); - next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); - next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); - } - - /* TODO: remove */ - polygons.clear(); - unreachable_polygons.clear(); - lepox_to_next.clear(); - + next_solvable_objects.push_back(solvable_objects[i]); + } polygon_index_map.clear(); - - polygons = next_polygons; - unreachable_polygons = next_unreachable_polygons; - lepox_to_next = next_lepox_to_next; + solvable_objects = next_solvable_objects; std::vector next_polygon_index_map; std::map next_original_index_map; - for (unsigned int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < solvable_objects.size(); ++index) { next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 765a1e3ad4..557f6cbb54 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -343,15 +343,41 @@ void introduce_ConsequentialTemporalLepoxAgainstFixed(z3::solver const std::vector &SEQ_UNUSED(polygons), const std::vector &lepox_to_next) { - std::set fixed_(fixed.begin(), fixed.end()); - std::set undecided_(undecided.begin(), undecided.end()); - for (unsigned int i = 0; i < undecided.size(); ++i) { + if (i == 0) + { + if ((undecided[0] - 1) >= 0) + { + if (lepox_to_next[undecided[0] - 1]) + { + for (unsigned int j = 1; j < undecided.size(); ++j) + { + Solver.add(dec_vars_T[undecided[0]] + temporal_spread < dec_vars_T[undecided[j]]); + } + if (!fixed.empty()) + { + int prev_fix_i = fixed[fixed.size() - 1]; + Solver.add(Context.real_val(dec_values_T[prev_fix_i].numerator, dec_values_T[prev_fix_i].denominator) + temporal_spread < dec_vars_T[undecided[0]]); + } + } + } + } if (lepox_to_next[undecided[i]]) { - /* TODO: we know what to do */ - //Solver.add(dec_vars_T[previous_polygons[undecided[i]]] + temporal_spread < dec_vars_T[undecided[i]] && dec_vars_T[previous_polygons[undecided[i]]] + temporal_spread + temporal_spread / 2 > dec_vars_T[undecided[i]]); + printf("Lepox constraint present: %d\n", undecided[i]); + if (undecided.size() > i + 1) + { + int next_i = undecided[i + 1]; + Solver.add(dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[next_i] && dec_vars_T[undecided[i]] + temporal_spread + temporal_spread / 2 > dec_vars_T[next_i]); + } + else + { + for (unsigned int j = 0; j < undecided.size() - 1; ++j) + { + Solver.add(dec_vars_T[undecided[j]] + temporal_spread < dec_vars_T[undecided[i]]); + } + } } } @@ -8589,7 +8615,9 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver const string_map &dec_var_names_map, const std::vector &polygons, const std::vector > &unreachable_polygons, - const z3::expr_vector &presence_constraints) + const z3::expr_vector &presence_constraints, + const ProgressRange &progress_range, + std::function progress_callback) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); //z3::set_param("parallel.enable", "true"); @@ -8605,6 +8633,9 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver coord_t half_y_min = 0; coord_t half_y_max = box_half_y_max; + + int progress_total_estimation = MAX(1,std::log2(half_x_max - half_x_min)); + int progress = 0; while ((half_x_max - half_x_min) > 1 && (half_y_max - half_y_min) > 1) { @@ -8940,7 +8971,11 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver printf("Halves augmented: X:[%d,%d] Y:[%d,%d]\n", half_x_min, half_x_max, half_y_min, half_y_max); } #endif + + ++progress; + progress_callback(progress_range.progress_min + (progress_range.progress_max - progress_range.progress_min) * progress / progress_total_estimation); } + progress_callback(progress_range.progress_max); if (last_solvable_bounding_box_size > 0) { @@ -9987,8 +10022,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, - int objects_done, - int total_objects, + int progress_objects_done, + int progress_total_objects, std::function progress_callback) { std::vector undecided; @@ -10067,6 +10102,26 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So decided_polygons, undecided, dec_var_names_map); + + introduce_ConsequentialTemporalOrderingAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons); + + introduce_ConsequentialTemporalLepoxAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons, + lepox_to_next); + #ifdef PROFILE { build_finish = clock(); @@ -10074,7 +10129,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - vector missing; + std::vector missing; + std::vector remaining_local; while(object_group_size > 0) { @@ -10107,25 +10163,6 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - introduce_ConsequentialTemporalOrderingAgainstFixed(z_solver, - z_context, - local_dec_vars_T, - local_values_T, - decided_polygons, - undecided, - solver_configuration.temporal_spread, - polygons); - - introduce_ConsequentialTemporalLepoxAgainstFixed(z_solver, - z_context, - local_dec_vars_T, - local_values_T, - decided_polygons, - undecided, - solver_configuration.temporal_spread, - polygons, - lepox_to_next); - #ifdef DEBUG { printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); @@ -10141,7 +10178,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, z_context, @@ -10159,7 +10196,10 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_var_names_map, polygons, unreachable_polygons, - presence_assumptions); + presence_assumptions, + ProgressRange((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects, + (SEQ_PROGRESS_RANGE * (decided_polygons.size() + (progress_objects_done + 1))) / progress_total_objects), + progress_callback); if (optimized) { @@ -10175,23 +10215,22 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; - dec_values_T[undecided[i]] = local_values_T[undecided[i]]; + dec_values_T[undecided[i]] = local_values_T[undecided[i]]; decided_polygons.push_back(undecided[i]); } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + + if (polygons.size() - curr_polygon > (unsigned int)object_group_size) { - curr_polygon += solver_configuration.object_group_size; + curr_polygon += object_group_size; } else { - curr_polygon += polygons.size() - curr_polygon; - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); return true; } - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); break; } else @@ -10201,16 +10240,18 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif - remaining_polygons.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); + remaining_local.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); } - missing.push_back(undecided.back()); undecided.pop_back(); --object_group_size; - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + objects_done)) / total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); } + std::reverse(remaining_local.begin(), remaining_local.end()); + remaining_polygons.insert(remaining_polygons.end(), remaining_local.begin(), remaining_local.end()); + #ifdef PROFILE { printf("Build: %.3f\n", build_cumul); @@ -10233,15 +10274,298 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So { remaining_polygons.push_back(undecided_polygons[curr_polygon]); } - return true; + } + return true; + } + } + assert(remaining_polygons.empty()); + } + assert(remaining_polygons.empty()); + + return true; +} + + +bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &solvable_objects, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons, + int progress_objects_done, + int progress_total_objects, + std::function progress_callback) +{ + std::vector undecided; + + decided_polygons.clear(); + remaining_polygons.clear(); + + dec_values_X.resize(solvable_objects.size()); + dec_values_Y.resize(solvable_objects.size()); + dec_values_T.resize(solvable_objects.size()); + + int box_half_x_max = solver_configuration.x_plate_bounding_box_size / 2; + int box_half_y_max = solver_configuration.y_plate_bounding_box_size / 2; + + std::vector polygons; + std::vector > unreachable_polygons; + std::vector lepox_to_next; + + for (const auto& solvable_object: solvable_objects) + { + polygons.push_back(solvable_object.polygon); + unreachable_polygons.push_back(solvable_object.unreachable_polygons); + lepox_to_next.push_back(solvable_object.lepox_to_next); + } + + for (unsigned int curr_polygon = 0; curr_polygon < solvable_objects.size(); /* nothing */) + { + bool optimized = false; + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + + z3::context z_context; + z3::solver z_solver(z_context); + + z3::expr_vector local_dec_vars_X(z_context); + z3::expr_vector local_dec_vars_Y(z_context); + z3::expr_vector local_dec_vars_T(z_context); + + vector local_values_X; + vector local_values_Y; + vector local_values_T; + + local_values_X.resize(solvable_objects.size()); + local_values_Y.resize(solvable_objects.size()); + local_values_T.resize(solvable_objects.size()); + + for (unsigned int i = 0; i < decided_polygons.size(); ++i) + { + #ifdef DEBUG + { + printf("Decided: %d %.3f, %.3f, %.3f\n", + decided_polygons[i], + dec_values_X[decided_polygons[i]].as_double(), + dec_values_Y[decided_polygons[i]].as_double(), + dec_values_T[decided_polygons[i]].as_double()); + } + #endif + + local_values_X[decided_polygons[i]] = dec_values_X[decided_polygons[i]]; + local_values_Y[decided_polygons[i]] = dec_values_Y[decided_polygons[i]]; + local_values_T[decided_polygons[i]] = dec_values_T[decided_polygons[i]]; + } + + string_map dec_var_names_map; + int object_group_size = MIN((unsigned int)solver_configuration.object_group_size, solvable_objects.size() - curr_polygon); + + undecided.clear(); + for (int i = 0; i < object_group_size; ++i) + { + undecided.push_back(curr_polygon + i); + } + + #ifdef PROFILE + { + build_start = clock(); + } + #endif + + build_ConsequentialWeakPolygonNonoverlapping(z_solver, + z_context, + polygons, + unreachable_polygons, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map); + + introduce_ConsequentialTemporalOrderingAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons); + + introduce_ConsequentialTemporalLepoxAgainstFixed(z_solver, + z_context, + local_dec_vars_T, + local_values_T, + decided_polygons, + undecided, + solver_configuration.temporal_spread, + polygons, + lepox_to_next); + + #ifdef PROFILE + { + build_finish = clock(); + build_cumul += (build_finish - build_start) / (double)CLOCKS_PER_SEC; + } + #endif + + std::vector missing; + std::vector remaining_local; + + while(object_group_size > 0) + { + z3::expr_vector presence_assumptions(z_context); + assume_ConsequentialObjectPresence(z_context, local_dec_vars_T, undecided, missing, presence_assumptions); + + #ifdef DEBUG + { + printf("Undecided\n"); + for (unsigned int j = 0; j < undecided.size(); ++j) + { + printf(" %d\n", undecided[j]); + } + printf("Decided\n"); + for (unsigned int j = 0; j < decided_solvable_objects.size(); ++j) + { + printf(" %d\n", decided_polygons[j]); + } + printf("Locals\n"); + for (unsigned int j = 0; j < solvable_objects.size(); ++j) + { + printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", + local_values_X[j].numerator, + local_values_X[j].denominator, + local_values_Y[j].numerator, + local_values_Y[j].denominator, + local_values_T[j].numerator, + local_values_T[j].denominator); + } + } + #endif + + #ifdef DEBUG + { + printf("%ld,%ld\n", local_values_X.size(), local_values_Y.size()); + + for (unsigned int i = 0; i < solvable_objects.size(); ++i) + { + printf("poly: %ld\n", polygons[i].points.size()); + for (unsigned int j = 0; j < polygons[i].points.size(); ++j) + { + printf(" %d,%d\n", polygons[i].points[j].x(), polygons[i].points[j].y()); + } + } + } + #endif + + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + + optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, + z_context, + solver_configuration, + box_half_x_max, + box_half_y_max, + local_dec_vars_X, + local_dec_vars_Y, + local_dec_vars_T, + local_values_X, + local_values_Y, + local_values_T, + decided_polygons, + undecided, + dec_var_names_map, + polygons, + unreachable_polygons, + presence_assumptions, + ProgressRange((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects, + (SEQ_PROGRESS_RANGE * (decided_polygons.size() + (progress_objects_done + 1))) / progress_total_objects), + progress_callback); + + if (optimized) + { + /* + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + */ + + for (unsigned int i = 0; i < undecided.size(); ++i) + { + dec_values_X[undecided[i]] = local_values_X[undecided[i]]; + dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; + dec_values_T[undecided[i]] = local_values_T[undecided[i]]; + decided_polygons.push_back(undecided[i]); + } + augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); + + if (solvable_objects.size() - curr_polygon > (unsigned int)object_group_size) + { + curr_polygon += object_group_size; } else { + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); return true; } + + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + break; + } + else + { + #ifdef DEBUG + { + printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); + } + #endif + remaining_local.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); + } + missing.push_back(undecided.back()); + undecided.pop_back(); + + --object_group_size; + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + } + + std::reverse(remaining_local.begin(), remaining_local.end()); + remaining_polygons.insert(remaining_polygons.end(), remaining_local.begin(), remaining_local.end()); + + #ifdef PROFILE + { + printf("Build: %.3f\n", build_cumul); + } + #endif + + if (!optimized) + { + if (curr_polygon <= 0) + { + return false; + } + else + { + if (solvable_objects.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + { + curr_polygon += solver_configuration.object_group_size; + + for (; curr_polygon < solvable_objects.size(); ++curr_polygon) + { + remaining_polygons.push_back(undecided_polygons[curr_polygon]); + } + } + return true; } } + assert(remaining_polygons.empty()); } + assert(remaining_polygons.empty()); + return true; } diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index 9cd02f6e6b..b7dfae9c86 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -73,6 +73,18 @@ typedef std::basic_string string; typedef std::unordered_map string_map; +/*----------------------------------------------------------------*/ + +struct SolvableObject +{ + int id = 0; + + Slic3r::Polygon polygon; + std::vector unreachable_polygons; + bool lepox_to_next; +}; + + /*----------------------------------------------------------------*/ struct Rational @@ -179,6 +191,20 @@ struct Rational }; +/*----------------------------------------------------------------*/ + +struct ProgressRange +{ + ProgressRange(int min, int max) + : progress_min(min) + , progress_max(max) + { /* nothing */ } + + int progress_min; + int progress_max; +}; + + /*----------------------------------------------------------------*/ bool lines_intersect_(coord_t ax, coord_t ay, coord_t ux, coord_t uy, coord_t bx, coord_t by, coord_t vx, coord_t vy); @@ -1447,6 +1473,7 @@ bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons); + bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver &Solver, z3::context &Context, const SolverConfiguration &solver_configuration, @@ -1462,7 +1489,9 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver const std::vector &undecided, const string_map &dec_var_names_map, const std::vector &polygons, - const std::vector > &unreachable_polygons); + const std::vector > &unreachable_polygons, + const ProgressRange &progress_range, + std::function progress_callback); /*----------------------------------------------------------------*/ @@ -1565,10 +1594,22 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, - int objects_done, - int total_objects, + int progress_objects_done, + int progress_total_objects, std::function progress_callback = [](int progress){}); +bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, + std::vector &dec_values_X, + std::vector &dec_values_Y, + std::vector &dec_values_T, + const std::vector &solvable_objects, + const std::vector &undecided_polygons, + std::vector &decided_polygons, + std::vector &remaining_polygons, + int progress_objects_done, + int progress_total_objects, + std::function progress_callback = [](int progress){}); + /*----------------------------------------------------------------*/ } // namespace Sequential diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index de752dfcb5..a1a73c40f0 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -751,11 +751,6 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) next_unreachable_polygons.push_back(unreachable_polygons[remaining_polygons[i]]); next_lepox_to_next.push_back(lepox_to_next[remaining_polygons[i]]); } - - /* TODO: remove */ - polygons.clear(); - unreachable_polygons.clear(); - lepox_to_next.clear(); polygon_index_map.clear(); diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index 2753409769..ef10322ca3 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -401,6 +401,87 @@ int test_interface_5(void) } +int test_interface_6(void) +{ + clock_t start, finish; + + printf("Testing interface 6 ...\n"); + + start = clock(); + + SolverConfiguration solver_configuration; + solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_LOW; + solver_configuration.object_group_size = 4; + + printf("Loading objects ...\n"); + std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + printf("Loading objects ... finished\n"); + + for (auto& object_to_print: objects_to_print) + { + object_to_print.glued_to_next = true; + } + + PrinterGeometry printer_geometry; + + printf("Loading printer geometry ...\n"); + int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); + + if (result != 0) + { + printf("Cannot load printer geometry (code: %d).\n", result); + return result; + } + solver_configuration.setup(printer_geometry); + printf("Loading printer geometry ... finished\n"); + + std::vector scheduled_plates; + printf("Scheduling objects for sequential print ...\n"); + + scheduled_plates = schedule_ObjectsForSequentialPrint(solver_configuration, + printer_geometry, + objects_to_print, + [](int progress) { printf("Progress: %d\n", progress); }); + + printf("Object scheduling for sequential print SUCCESSFUL !\n"); + + printf("Number of plates: %ld\n", scheduled_plates.size()); + + for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) + { + printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + + for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) + { + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + } + } + + finish = clock(); + printf("Solving time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + + start = clock(); + + printf("Checking sequential printability ...\n"); + + bool printable = check_ScheduledObjectsForSequentialPrintability(solver_configuration, + printer_geometry, + objects_to_print, + scheduled_plates); + + printf(" Scheduled/arranged objects are sequentially printable: %s\n", (printable ? "YES" : "NO")); + + printf("Checking sequential printability ... finished\n"); + + finish = clock(); + printf("Checking time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); + + printf("Testing interface 6 ... finished\n"); + + return 0; +} + + /*----------------------------------------------------------------*/ int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) @@ -409,7 +490,8 @@ int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) // test_interface_2(); // test_interface_3(); // test_interface_4(); - test_interface_5(); + test_interface_5(); +// test_interface_6(); return 0; } diff --git a/src/libseqarrange/test/seq_test_interface.hpp b/src/libseqarrange/test/seq_test_interface.hpp index de92e28f01..b9e1f54820 100644 --- a/src/libseqarrange/test/seq_test_interface.hpp +++ b/src/libseqarrange/test/seq_test_interface.hpp @@ -29,6 +29,8 @@ int test_interface_4(void); /* Interface test 5 */ int test_interface_5(void); +/* Interface test 6 */ +int test_interface_6(void); /*----------------------------------------------------------------*/ diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 7d86da366a..9c1c71fdb7 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -59,7 +59,7 @@ static std::vector get_objects_to_print(const Model& std::vector objects; for (const ModelObject* mo : model.objects) { const ModelInstance* mi = mo->instances.front(); - objects.emplace_back(Sequential::ObjectToPrint{int(mo->id().id), scaled(mo->instance_bounding_box(0).size().z()), {}}); + objects.emplace_back(Sequential::ObjectToPrint{int(mo->id().id), false, scaled(mo->instance_bounding_box(0).size().z()), {}}); for (double height : heights) { auto tr = Transform3d::Identity(); Vec3d offset = mi->get_offset(); From e75ff22438409820ef4c2a6085852dc41a6dd3e3 Mon Sep 17 00:00:00 2001 From: surynek Date: Tue, 22 Oct 2024 00:36:58 +0200 Subject: [PATCH 20/88] Scheduling solving process speed improvement and bug fix. --- .../include/libseqarrange/seq_interface.hpp | 1 + src/libseqarrange/src/seq_interface.cpp | 52 ++---- src/libseqarrange/src/seq_preprocess.cpp | 29 ++++ src/libseqarrange/src/seq_preprocess.hpp | 2 + src/libseqarrange/src/seq_sequential.cpp | 153 +++++++++--------- src/libseqarrange/src/seq_sequential.hpp | 1 - 6 files changed, 116 insertions(+), 122 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index 3d62409b66..cea7d80d07 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -75,6 +75,7 @@ struct SolverConfiguration int minimum_bounding_box_size; int x_plate_bounding_box_size; int y_plate_bounding_box_size; + int max_refines; int object_group_size; int temporal_spread; diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 8460b414a0..0379fb060c 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -32,6 +32,8 @@ const int SEQ_SCHEDULING_TEMPORAL_SPREAD = 16; const int SEQ_BOUNDING_BOX_SIZE_OPTIMIZATION_STEP = 4; const int SEQ_MINIMUM_BOUNDING_BOX_SIZE = 16; +const int SEQ_MAX_REFINES = 2; + /*----------------------------------------------------------------*/ @@ -91,7 +93,8 @@ SolverConfiguration::SolverConfiguration() : bounding_box_size_optimization_step(SEQ_BOUNDING_BOX_SIZE_OPTIMIZATION_STEP) , minimum_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) , x_plate_bounding_box_size(SEQ_PRUSA_MK3S_X_SIZE) - , y_plate_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) + , y_plate_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) + , max_refines(SEQ_MAX_REFINES) , object_group_size(SEQ_OBJECT_GROUP_SIZE) , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) @@ -104,6 +107,7 @@ SolverConfiguration::SolverConfiguration() SolverConfiguration::SolverConfiguration(const PrinterGeometry &printer_geometry) : bounding_box_size_optimization_step(SEQ_BOUNDING_BOX_SIZE_OPTIMIZATION_STEP) , minimum_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) + , max_refines(SEQ_MAX_REFINES) , object_group_size(SEQ_OBJECT_GROUP_SIZE) , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) @@ -314,9 +318,6 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver } #endif - std::vector polygons; - std::vector > unreachable_polygons; - std::map original_index_map; std::vector lepox_to_next; @@ -363,14 +364,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver } std::vector remaining_polygons; - std::vector polygon_index_map; std::vector decided_polygons; - for (unsigned int index = 0; index < polygons.size(); ++index) - { - polygon_index_map.push_back(index); - } - std::vector poly_positions_X; std::vector poly_positions_Y; std::vector times_T; @@ -404,7 +399,6 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver poly_positions_Y, times_T, solvable_objects, - polygon_index_map, decided_polygons, remaining_polygons, progress_objects_done, @@ -487,18 +481,14 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver { next_solvable_objects.push_back(solvable_objects[remaining_polygons[i]]); } - polygon_index_map.clear(); solvable_objects = next_solvable_objects; - std::vector next_polygon_index_map; std::map next_original_index_map; - for (unsigned int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < solvable_objects.size(); ++index) { - next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; } - polygon_index_map = next_polygon_index_map; original_index_map = next_original_index_map; scheduled_plates.push_back(scheduled_plate); @@ -545,12 +535,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ PrinterType printer_type = SEQ_PRINTER_TYPE_PRUSA_MK3S; - std::vector polygons; - std::vector > unreachable_polygons; - std::vector lepox_to_next; - std::vector solvable_objects; - std::map original_index_map; #ifdef DEBUG @@ -763,13 +748,14 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } std::vector remaining_polygons; - std::vector polygon_index_map; std::vector decided_polygons; - for (unsigned int index = 0; index < polygons.size(); ++index) + /* + for (unsigned int index = 0; index < solvable_objects.size(); ++index) { polygon_index_map.push_back(index); } + */ std::vector poly_positions_X; std::vector poly_positions_Y; @@ -804,7 +790,6 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ poly_positions_Y, times_T, solvable_objects, - polygon_index_map, decided_polygons, remaining_polygons, progress_objects_done, @@ -886,18 +871,13 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ { next_solvable_objects.push_back(solvable_objects[i]); } - polygon_index_map.clear(); solvable_objects = next_solvable_objects; - - std::vector next_polygon_index_map; std::map next_original_index_map; - for (unsigned int index = 0; index < polygons.size(); ++index) + for (unsigned int index = 0; index < solvable_objects.size(); ++index) { - next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; } - polygon_index_map = next_polygon_index_map; original_index_map = next_original_index_map; scheduled_plates.push_back(scheduled_plate); @@ -1087,13 +1067,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration } std::vector remaining_polygons; - std::vector polygon_index_map; std::vector decided_polygons; - - for (unsigned int index = 0; index < solvable_objects.size(); ++index) - { - polygon_index_map.push_back(index); - } std::vector poly_positions_X; std::vector poly_positions_Y; @@ -1128,7 +1102,6 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration poly_positions_Y, times_T, solvable_objects, - polygon_index_map, decided_polygons, remaining_polygons, progress_objects_done, @@ -1211,18 +1184,13 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration { next_solvable_objects.push_back(solvable_objects[i]); } - polygon_index_map.clear(); solvable_objects = next_solvable_objects; - - std::vector next_polygon_index_map; std::map next_original_index_map; for (unsigned int index = 0; index < solvable_objects.size(); ++index) { - next_polygon_index_map.push_back(index); next_original_index_map[index] = original_index_map[remaining_polygons[index]]; } - polygon_index_map = next_polygon_index_map; original_index_map = next_original_index_map; scheduled_plates.push_back(scheduled_plate); diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp index 25f78eb30d..60e4449c9f 100644 --- a/src/libseqarrange/src/seq_preprocess.cpp +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -889,6 +889,35 @@ bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t } +void glue_LowObjects(std::vector &solvable_objects) +{ + int low = 0; + + for (unsigned int i = 0; i < solvable_objects.size(); ++i) + { + double polygon_area = calc_PolygonArea(solvable_objects[i].polygon); + double unreachable_area = calc_PolygonUnreachableZoneArea(solvable_objects[i].polygon, solvable_objects[i].unreachable_polygons); + + if (2 * polygon_area > unreachable_area) + { + printf("Low: %d\n", solvable_objects[i].id); + if (++low >= 2) + { + assert(i > 0); + printf("---> gluing: %d -> %d\n", solvable_objects[i-1].id, solvable_objects[i].id); + solvable_objects[i-1].lepox_to_next = true; + low = 1; + } + } + else + { + printf("noLow: %d\n", solvable_objects[i].id); + low = 0; + } + } +} + + /*----------------------------------------------------------------*/ double calc_PolygonArea(const Slic3r::Polygon &polygon) diff --git a/src/libseqarrange/src/seq_preprocess.hpp b/src/libseqarrange/src/seq_preprocess.hpp index 2436bc40a1..e4791d9047 100644 --- a/src/libseqarrange/src/seq_preprocess.hpp +++ b/src/libseqarrange/src/seq_preprocess.hpp @@ -199,6 +199,8 @@ bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t void simplify_ConvexUnreachablePolygons(const std::vector > &unreachable_convex_polygons, std::vector &simplified_unreachable_polygons); +void glue_LowObjects(std::vector &solvable_ojects); + /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 557f6cbb54..815f520d18 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -365,7 +365,6 @@ void introduce_ConsequentialTemporalLepoxAgainstFixed(z3::solver } if (lepox_to_next[undecided[i]]) { - printf("Lepox constraint present: %d\n", undecided[i]); if (undecided.size() > i + 1) { int next_i = undecided[i + 1]; @@ -7915,7 +7914,6 @@ bool optimize_SequentialWeakPolygonNonoverlappingCentered(z3::solver const std::vector > &unreachable_polygons) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); int last_solvable_bounding_box_size = -1; @@ -8280,8 +8278,7 @@ bool optimize_SequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver const std::vector > &unreachable_polygons) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); - + coord_t last_solvable_bounding_box_size = -1; std::vector local_dec_values_X = dec_values_X; @@ -8620,7 +8617,6 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver std::function progress_callback) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - //z3::set_param("parallel.enable", "true"); coord_t last_solvable_bounding_box_size = -1; @@ -8640,7 +8636,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver while ((half_x_max - half_x_min) > 1 && (half_y_max - half_y_min) > 1) { #ifdef DEBUG - { + { printf("Halves: %d, %d, %d, %d\n", half_x_min, half_x_max, half_y_min, half_y_max); } #endif @@ -8752,6 +8748,8 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver local_dec_values_Y, local_dec_values_T); + int total_refines = 0; + while (true) { #ifdef PROFILE @@ -8777,79 +8775,83 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver refine_cumul += (refine_finish - refine_start) / (double)CLOCKS_PER_SEC; } #endif - + if (refined) { + ++total_refines; + bool refined_sat = false; - #ifdef DEBUG + if (total_refines < solver_configuration.max_refines) { - printf("Solving 12 ...\n"); - } - #endif + #ifdef DEBUG + { + printf("------> ... Solving 12 ... <------\n"); + } + #endif - if (checkArea_SequentialWeakPolygonNonoverlapping(box_min_x, - box_min_y, - box_max_x, - box_max_y, - fixed, - undecided, - polygons, - unreachable_polygons)) - { - #ifdef PROFILE - { - recheck_start = clock(); - } - #endif - - switch (Solver.check(complete_assumptions)) - { - case z3::sat: + if (checkArea_SequentialWeakPolygonNonoverlapping(box_min_x, + box_min_y, + box_max_x, + box_max_y, + fixed, + undecided, + polygons, + unreachable_polygons)) { #ifdef PROFILE { - recheck_finish = clock(); - recheck_SAT_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + recheck_start = clock(); } #endif - refined_sat = true; - break; - } - case z3::unsat: - { - #ifdef PROFILE - { - recheck_finish = clock(); - recheck_UNSAT_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; - } - #endif - refined_sat = false; - break; - } - case z3::unknown: - { - #ifdef PROFILE + switch (Solver.check(complete_assumptions)) { - recheck_finish = clock(); - recheck_INDET_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + case z3::sat: + { + #ifdef PROFILE + { + recheck_finish = clock(); + recheck_SAT_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + } + #endif + + refined_sat = true; + break; } - #endif + case z3::unsat: + { + #ifdef PROFILE + { + recheck_finish = clock(); + recheck_UNSAT_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + } + #endif + refined_sat = false; + break; + } + case z3::unknown: + { + #ifdef PROFILE + { + recheck_finish = clock(); + recheck_INDET_cumul += (recheck_finish - recheck_start) / (double)CLOCKS_PER_SEC; + } + #endif + refined_sat = false; + break; + } + default: + { + break; + } + } + } + else + { refined_sat = false; - break; - } - default: - { - break; - } } } - else - { - refined_sat = false; - } - #ifdef DEBUG { printf("Solving 12 ... finished: %d\n", refined_sat); @@ -8860,6 +8862,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver printf("Printing solver status:\n"); cout << Solver << "\n"; */ + progress_callback(progress_range.progress_min + (progress_range.progress_max - progress_range.progress_min) * progress / progress_total_estimation); if (refined_sat) { @@ -8933,14 +8936,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver } #endif - if (last_solvable_bounding_box_size > 0) - { - size_solvable = false; - } - else - { - size_solvable = false; - } + size_solvable = false; } coord_t half_x_med = (half_x_max + half_x_min) / 2; @@ -8954,14 +8950,14 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver } #endif half_x_min = half_x_med; - half_y_min = half_y_med; + half_y_min = half_y_med; } else { #ifdef DEBUG { printf("Unsolvable\n"); - } + } #endif half_x_max = half_x_med; half_y_max = half_y_med; @@ -8994,7 +8990,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver #endif return true; - } + } return false; } @@ -10291,7 +10287,6 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_Y, std::vector &dec_values_T, const std::vector &solvable_objects, - const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, int progress_objects_done, @@ -10429,12 +10424,12 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So printf(" %d\n", undecided[j]); } printf("Decided\n"); - for (unsigned int j = 0; j < decided_solvable_objects.size(); ++j) + for (unsigned int j = 0; j < decided_polygons.size(); ++j) { printf(" %d\n", decided_polygons[j]); } printf("Locals\n"); - for (unsigned int j = 0; j < solvable_objects.size(); ++j) + for (unsigned int j = 0; j < decided_polygons.size(); ++j) { printf("X: %ld,%ld Y: %ld,%ld T: %ld,%ld\n", local_values_X[j].numerator, @@ -10524,7 +10519,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif - remaining_local.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); + remaining_local.push_back(undecided.back()); } missing.push_back(undecided.back()); undecided.pop_back(); @@ -10545,7 +10540,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So if (!optimized) { if (curr_polygon <= 0) - { + { return false; } else @@ -10556,7 +10551,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So for (; curr_polygon < solvable_objects.size(); ++curr_polygon) { - remaining_polygons.push_back(undecided_polygons[curr_polygon]); + remaining_polygons.push_back(curr_polygon); } } return true; diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index b7dfae9c86..3386f6d2f1 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -1603,7 +1603,6 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So std::vector &dec_values_Y, std::vector &dec_values_T, const std::vector &solvable_objects, - const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, int progress_objects_done, From 46d0d60df90d678a2cc506ed7ce4d02feb7f5a68 Mon Sep 17 00:00:00 2001 From: surynek Date: Wed, 23 Oct 2024 00:50:34 +0200 Subject: [PATCH 21/88] Major scheduling speed improvement via various algorithmic techniques. --- .../include/libseqarrange/seq_interface.hpp | 1 + src/libseqarrange/src/seq_interface.cpp | 7 +- src/libseqarrange/src/seq_preprocess.cpp | 157 +++++++++-- src/libseqarrange/src/seq_sequential.cpp | 244 ++++++++++++++++-- src/libseqarrange/src/seq_sequential.hpp | 12 +- src/libseqarrange/src/sequential_prusa.cpp | 4 +- 6 files changed, 363 insertions(+), 62 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index cea7d80d07..aa09fa4210 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -78,6 +78,7 @@ struct SolverConfiguration int max_refines; int object_group_size; + int fixed_object_grouping_limit; int temporal_spread; DecimationPrecision decimation_precision; diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 0379fb060c..e3780fa358 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -27,6 +27,7 @@ namespace Sequential /*----------------------------------------------------------------*/ const int SEQ_OBJECT_GROUP_SIZE = 4; +const int SEQ_FIXED_OBJECT_GROUPING_LIMIT = 64; const int SEQ_SCHEDULING_TEMPORAL_SPREAD = 16; const int SEQ_BOUNDING_BOX_SIZE_OPTIMIZATION_STEP = 4; @@ -96,6 +97,7 @@ SolverConfiguration::SolverConfiguration() , y_plate_bounding_box_size(SEQ_PRUSA_MK3S_Y_SIZE) , max_refines(SEQ_MAX_REFINES) , object_group_size(SEQ_OBJECT_GROUP_SIZE) + , fixed_object_grouping_limit(SEQ_FIXED_OBJECT_GROUPING_LIMIT) , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) @@ -109,6 +111,7 @@ SolverConfiguration::SolverConfiguration(const PrinterGeometry &printer_geometry , minimum_bounding_box_size(SEQ_MINIMUM_BOUNDING_BOX_SIZE) , max_refines(SEQ_MAX_REFINES) , object_group_size(SEQ_OBJECT_GROUP_SIZE) + , fixed_object_grouping_limit(SEQ_FIXED_OBJECT_GROUPING_LIMIT) , temporal_spread(SEQ_SCHEDULING_TEMPORAL_SPREAD) , decimation_precision(SEQ_DECIMATION_PRECISION_LOW) , optimization_timeout(SEQ_Z3_SOLVER_TIMEOUT) @@ -573,7 +576,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ decimated_polygon = objects_to_print[i].pgns_at_height[j].second; decimated_polygon.make_counter_clockwise(); } - if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + if (!check_PolygonSizeFitToPlate(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) { #ifdef DEBUG { @@ -998,7 +1001,7 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration decimated_polygon.make_counter_clockwise(); } - if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + if (!check_PolygonSizeFitToPlate(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) { #ifdef DEBUG { diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp index 60e4449c9f..1587646d6b 100644 --- a/src/libseqarrange/src/seq_preprocess.cpp +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -714,7 +714,7 @@ void prepare_ExtruderPolygons(const SolverConfiguration &solver decimated_polygon.make_counter_clockwise(); } - if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + if (!check_PolygonSizeFitToPlate(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) { #ifdef DEBUG { @@ -779,32 +779,40 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration const std::vector > &extruder_box_level_polygons, std::vector &unreachable_polygons) { - std::vector scaled_unreachable_polygons; + std::vector > scaled_unreachable_polygons; for (unsigned int i = 0; i < extruder_convex_level_polygons.size(); ++i) { + std::vector scaled_level_unreachable_polygons; extend_PolygonConvexUnreachableZone(solver_configuration, polygon, extruder_convex_level_polygons[i], - scaled_unreachable_polygons); + scaled_level_unreachable_polygons); + scaled_unreachable_polygons.push_back(scaled_level_unreachable_polygons); } for (unsigned int i = 0; i < extruder_box_level_polygons.size(); ++i) { + std::vector scaled_level_unreachable_polygons; extend_PolygonBoxUnreachableZone(solver_configuration, polygon, extruder_box_level_polygons[i], - scaled_unreachable_polygons); + scaled_level_unreachable_polygons); + scaled_unreachable_polygons.push_back(scaled_level_unreachable_polygons); } + scaled_unreachable_polygons = simplify_UnreachableZonePolygons(scaled_unreachable_polygons); for (unsigned int i = 0; i < scaled_unreachable_polygons.size(); ++i) { - Polygon scale_down_polygon; + for (unsigned int j = 0; j < scaled_unreachable_polygons[i].size(); ++j) + { + Polygon scale_down_polygon; - scaleDown_PolygonForSequentialSolver(scaled_unreachable_polygons[i], - scale_down_polygon); - scale_down_polygon.make_counter_clockwise(); - unreachable_polygons.push_back(scale_down_polygon); + scaleDown_PolygonForSequentialSolver(scaled_unreachable_polygons[i][j], + scale_down_polygon); + scale_down_polygon.make_counter_clockwise(); + unreachable_polygons.push_back(scale_down_polygon); + } } } @@ -816,40 +824,48 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration const std::vector > &extruder_box_level_polygons, std::vector &unreachable_polygons) { - std::vector scaled_unreachable_polygons; + std::vector > scaled_unreachable_polygons; assert(extruder_convex_level_polygons.size() == convex_level_polygons.size()); for (unsigned int i = 0; i < extruder_convex_level_polygons.size(); ++i) { - extend_PolygonConvexUnreachableZone(solver_configuration, - convex_level_polygons[i], - extruder_convex_level_polygons[i], - scaled_unreachable_polygons); + std::vector scaled_level_unreachable_polygons; + extend_PolygonConvexUnreachableZone(solver_configuration, + convex_level_polygons[i], + extruder_convex_level_polygons[i], + scaled_level_unreachable_polygons); + scaled_unreachable_polygons.push_back(scaled_level_unreachable_polygons); } assert(extruder_box_level_polygons.size() == box_level_polygons.size()); for (unsigned int i = 0; i < extruder_box_level_polygons.size(); ++i) { + std::vector scaled_level_unreachable_polygons; extend_PolygonBoxUnreachableZone(solver_configuration, - box_level_polygons[i], - extruder_box_level_polygons[i], - scaled_unreachable_polygons); + box_level_polygons[i], + extruder_box_level_polygons[i], + scaled_level_unreachable_polygons); + scaled_unreachable_polygons.push_back(scaled_level_unreachable_polygons); } + scaled_unreachable_polygons = simplify_UnreachableZonePolygons(scaled_unreachable_polygons); for (unsigned int i = 0; i < scaled_unreachable_polygons.size(); ++i) { - Polygon scale_down_polygon; - - scaleDown_PolygonForSequentialSolver(scaled_unreachable_polygons[i], - scale_down_polygon); - scale_down_polygon.make_counter_clockwise(); - unreachable_polygons.push_back(scale_down_polygon); + for (unsigned int j = 0; j < scaled_unreachable_polygons[i].size(); ++j) + { + Polygon scale_down_polygon; + + scaleDown_PolygonForSequentialSolver(scaled_unreachable_polygons[i][j], + scale_down_polygon); + scale_down_polygon.make_counter_clockwise(); + unreachable_polygons.push_back(scale_down_polygon); + } } } -bool check_PolygonSize(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon) +bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon) { BoundingBox polygon_box = get_extents(polygon); @@ -869,7 +885,7 @@ bool check_PolygonSize(const SolverConfiguration &solver_configuration, const Sl } -bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon) +bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon) { BoundingBox polygon_box = get_extents(polygon); @@ -889,6 +905,73 @@ bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t } +/*----------------------------------------------------------------*/ + +bool check_PolygonConsumation(const std::vector &polygons, const std::vector &consumer_polygons) +{ + std::vector polygons_to_clip; + std::vector next_polygons_to_clip; + + polygons_to_clip = polygons; + + for (unsigned int poly_cons = 0; poly_cons < consumer_polygons.size(); ++poly_cons) + { + for (unsigned int clip_poly = 0; clip_poly < polygons_to_clip.size(); ++clip_poly) + { + Slic3r::Polygons clip_result; + clip_result = diff(polygons_to_clip[clip_poly], consumer_polygons[poly_cons]); + + for (const auto& clipped_polygon: clip_result) + { + next_polygons_to_clip.push_back(clipped_polygon); + } + } + polygons_to_clip = next_polygons_to_clip; + } + + if (polygons_to_clip.empty()) + { + return true; + } + return false; +} + + +std::vector > simplify_UnreachableZonePolygons(const std::vector > &unreachable_polygons) +{ + std::vector > simplified_unreachable_polygons; + + for (unsigned int i = 0; i < unreachable_polygons.size(); ++i) + { + bool consumed = false; + + for (unsigned int j = 0; j < unreachable_polygons.size(); ++j) + { + if (i != j) + { + double area_i = calc_PolygonUnreachableZoneArea(unreachable_polygons[i]); + double area_j = calc_PolygonUnreachableZoneArea(unreachable_polygons[j]); + + if (area_j > area_i) + { + if (check_PolygonConsumation(unreachable_polygons[i], unreachable_polygons[j])) + { + consumed = true; + break; + } + } + } + } + if (!consumed) + { + simplified_unreachable_polygons.push_back(unreachable_polygons[i]); + } + } + + return simplified_unreachable_polygons; +} + + void glue_LowObjects(std::vector &solvable_objects) { int low = 0; @@ -900,18 +983,15 @@ void glue_LowObjects(std::vector &solvable_objects) if (2 * polygon_area > unreachable_area) { - printf("Low: %d\n", solvable_objects[i].id); if (++low >= 2) { assert(i > 0); - printf("---> gluing: %d -> %d\n", solvable_objects[i-1].id, solvable_objects[i].id); solvable_objects[i-1].lepox_to_next = true; low = 1; } } else { - printf("noLow: %d\n", solvable_objects[i].id); low = 0; } } @@ -937,6 +1017,27 @@ double calc_PolygonArea(const Slic3r::Polygon &polygon) } + +double calc_PolygonUnreachableZoneArea(const std::vector &unreachable_polygons) +{ + Polygons overlapping_polygons; + + for (const auto& unreachable_polygon: unreachable_polygons) + { + overlapping_polygons.push_back(unreachable_polygon); + } + ExPolygons union_polygons = union_ex(overlapping_polygons); + + double area = 0; + for (const auto& union_polygon: union_polygons) + { + area += union_polygon.area(); + } + + return area; +} + + double calc_PolygonUnreachableZoneArea(const Slic3r::Polygon &polygon, const std::vector &unreachable_polygons) { diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 815f520d18..908ed62411 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -9,6 +9,8 @@ */ /*================================================================*/ +#include + #include "seq_defs.hpp" #include "seq_sequential.hpp" @@ -2895,6 +2897,92 @@ void introduce_ConsequentialPolygonExternalFixedPolygon(z3::solver } +void introduce_ConsequentialPolygonExternalFixedGroupPolygon(z3::solver &Solver, + z3::context &Context, + const z3::expr &dec_var_X1, + const z3::expr &dec_var_Y1, + const z3::expr &dec_var_T1, + const Slic3r::Polygon &polygon, + const std::vector &unreachable_polygons, + const Rational &dec_value_group_min_T, + const Rational &dec_value_group_max_T, + const Slic3r::Polygon &group_polygon, + const std::vector &group_unreachable_polygons) +{ + for (unsigned int poly2 = 0; poly2 < group_unreachable_polygons.size(); ++poly2) + { + for (unsigned int p1 = 0; p1 < polygon.points.size(); ++p1) + { + const Point &point1 = polygon.points[p1]; + + introduce_ConsequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + point1.x(), + dec_var_Y1 + point1.y(), + dec_var_T1, + Rational(0), + Rational(0), + dec_value_group_min_T, + group_unreachable_polygons[poly2]); + } + } + + for (unsigned int poly2 = 0; poly2 < group_unreachable_polygons.size(); ++poly2) + { + for (unsigned int p2 = 0; p2 < group_unreachable_polygons[poly2].points.size(); ++p2) + { + const Point &pro_point2 = group_unreachable_polygons[poly2].points[p2]; + + introduce_ConsequentialFixedPointOutsidePolygon(Solver, + Context, + pro_point2.x(), + pro_point2.y(), + dec_var_T1, + dec_var_X1, + dec_var_Y1, + dec_value_group_min_T, + polygon); + } + } + + for (unsigned int poly1 = 0; poly1 < unreachable_polygons.size(); ++poly1) + { + for (unsigned int p2 = 0; p2 < group_polygon.points.size(); ++p2) + { + const Point &point2 = group_polygon.points[p2]; + + introduce_ConsequentialFixedPointOutsidePolygon(Solver, + Context, + point2.x(), + point2.y(), + dec_value_group_max_T, + dec_var_X1, + dec_var_Y1, + dec_var_T1, + unreachable_polygons[poly1]); + } + } + + for (unsigned int poly1 = 0; poly1 < unreachable_polygons.size(); ++poly1) + { + for (unsigned int p1 = 0; p1 < unreachable_polygons[poly1].points.size(); ++p1) + { + const Point &pro_point1 = unreachable_polygons[poly1].points[p1]; + + introduce_ConsequentialPointOutsideFixedPolygon(Solver, + Context, + dec_var_X1 + pro_point1.x(), + dec_var_Y1 + pro_point1.y(), + dec_value_group_max_T, + Rational(0), + Rational(0), + dec_var_T1, + group_polygon); + } + } +} + + /*----------------------------------------------------------------*/ void introduce_PolygonWeakNonoverlapping(z3::solver &Solver, @@ -3171,7 +3259,8 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver } -void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, +void introduce_ConsequentialPolygonWeakNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const z3::expr_vector &dec_vars_X, const z3::expr_vector &dec_vars_Y, @@ -3192,7 +3281,8 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } - introduce_ConsequentialPolygonWeakNonoverlapping(Solver, + introduce_ConsequentialPolygonWeakNonoverlapping(solver_configuration, + Solver, Context, dec_vars_X, dec_vars_Y, @@ -3207,7 +3297,8 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver } -void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, +void introduce_ConsequentialPolygonWeakNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const z3::expr_vector &dec_vars_X, const z3::expr_vector &dec_vars_Y, @@ -3219,7 +3310,7 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver const std::vector &undecided, const std::vector &polygons, const std::vector > &unreachable_polygons) -{ +{ for (unsigned int i = 0; i < undecided.size() - 1; ++i) { for (unsigned int j = i + 1; j < undecided.size(); ++j) @@ -3244,27 +3335,124 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver } } - for (unsigned int i = 0; i < undecided.size(); ++i) + if (fixed.size() < (unsigned int)solver_configuration.fixed_object_grouping_limit) { - for (unsigned int j = 0; j < fixed.size(); ++j) + for (unsigned int i = 0; i < undecided.size(); ++i) + { + for (unsigned int j = 0; j < fixed.size(); ++j) + { + #ifdef DEBUG + { + printf("PoFP: %d,%d\n", undecided[i], fixed[j]); + } + #endif + introduce_ConsequentialPolygonExternalFixedPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + polygons[fixed[j]], + unreachable_polygons[fixed[j]]); + } + } + } + else + { + for (unsigned int i = 0; i < undecided.size(); ++i) + { + for (unsigned int j = fixed.size() - (unsigned int)solver_configuration.fixed_object_grouping_limit; j < fixed.size(); ++j) + { + #ifdef DEBUG + { + printf("PoFP: %d,%d\n", undecided[i], fixed[j]); + } + #endif + introduce_ConsequentialPolygonExternalFixedPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_values_X[fixed[j]], + dec_values_Y[fixed[j]], + dec_values_T[fixed[j]], + polygons[fixed[j]], + unreachable_polygons[fixed[j]]); + } + } + + Slic3r::Polygons flat_polygons; + for (unsigned int i = 0; i < fixed.size() - (unsigned int)solver_configuration.fixed_object_grouping_limit; ++i) + { + Polygon fixed_polygon = polygons[fixed[i]]; + + for (unsigned int p = 0; p < fixed_polygon.points.size(); ++p) + { + fixed_polygon.points[p] += Point(dec_values_X[fixed[i]].as_double(), dec_values_Y[fixed[i]].as_double()); + } + flat_polygons.push_back(fixed_polygon); + } + + Slic3r::Polygons flat_unreachable_polygons; + for (unsigned int i = 0; i < fixed.size() - (unsigned int)solver_configuration.fixed_object_grouping_limit; ++i) + { + for (unsigned int j = 0; j < unreachable_polygons[fixed[i]].size(); ++j) + { + Polygon fixed_polygon = unreachable_polygons[fixed[i]][j]; + + for (unsigned int p = 0; p < fixed_polygon.points.size(); ++p) + { + fixed_polygon.points[p] += Point(dec_values_X[fixed[i]].as_double(), dec_values_Y[fixed[i]].as_double()); + } + flat_unreachable_polygons.push_back(fixed_polygon); + } + } + Polygon flat_hull = Slic3r::Geometry::convex_hull(flat_polygons); + Polygon flat_unreachable_hull = Slic3r::Geometry::convex_hull(flat_unreachable_polygons); + std::vector flat_unreachable_hulls; + flat_unreachable_hulls.push_back(flat_unreachable_hull); + + assert(!fixed.empty()); + Rational dec_value_flat_min_T = dec_values_T[fixed[0]]; + Rational dec_value_flat_max_T = dec_values_T[fixed[0]]; + + for (unsigned int i = 1; i < fixed.size() - (unsigned int)solver_configuration.fixed_object_grouping_limit; ++i) + { + if (dec_values_T[fixed[i]] < dec_value_flat_min_T) + { + dec_value_flat_min_T = dec_values_T[fixed[i]]; + } + if (dec_values_T[fixed[i]] > dec_value_flat_max_T) + { + dec_value_flat_max_T = dec_values_T[fixed[i]]; + } + } + + for (unsigned int i = 0; i < undecided.size(); ++i) { #ifdef DEBUG { - printf("PoFP: %d,%d\n", undecided[i], fixed[j]); + printf("PoGROUP: %d\n", undecided[i]); } #endif - introduce_ConsequentialPolygonExternalFixedPolygon(Solver, - Context, - dec_vars_X[undecided[i]], - dec_vars_Y[undecided[i]], - dec_vars_T[undecided[i]], - polygons[undecided[i]], - unreachable_polygons[undecided[i]], - dec_values_X[fixed[j]], - dec_values_Y[fixed[j]], - dec_values_T[fixed[j]], - polygons[fixed[j]], - unreachable_polygons[fixed[j]]); + + introduce_ConsequentialPolygonExternalFixedGroupPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_value_flat_min_T, + dec_value_flat_max_T, + flat_hull, + flat_unreachable_hulls); } } } @@ -6766,7 +6954,8 @@ void build_SequentialWeakPolygonNonoverlapping(z3::solver } -void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, +void build_ConsequentialWeakPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const std::vector &polygons, const std::vector &unreachable_polygons, @@ -6788,7 +6977,8 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver _unreachable_polygons[poly].push_back(unreachable_polygons[poly]); } - build_ConsequentialWeakPolygonNonoverlapping(Solver, + build_ConsequentialWeakPolygonNonoverlapping(solver_configuration, + Solver, Context, polygons, _unreachable_polygons, @@ -6804,7 +6994,8 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver } -void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, +void build_ConsequentialWeakPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const std::vector &polygons, const std::vector > &unreachable_polygons, @@ -6842,7 +7033,8 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver dec_var_names_map[name] = i; } - introduce_ConsequentialPolygonWeakNonoverlapping(Solver, + introduce_ConsequentialPolygonWeakNonoverlapping(solver_configuration, + Solver, Context, dec_vars_X, dec_vars_Y, @@ -10085,7 +10277,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So build_start = clock(); } #endif - build_ConsequentialWeakPolygonNonoverlapping(z_solver, + build_ConsequentialWeakPolygonNonoverlapping(solver_configuration, + z_solver, z_context, polygons, unreachable_polygons, @@ -10368,7 +10561,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - build_ConsequentialWeakPolygonNonoverlapping(z_solver, + build_ConsequentialWeakPolygonNonoverlapping(solver_configuration, + z_solver, z_context, polygons, unreachable_polygons, diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index 3386f6d2f1..2a97a022a4 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -994,7 +994,8 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons); -void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, +void introduce_ConsequentialPolygonWeakNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const z3::expr_vector &dec_vars_X, const z3::expr_vector &dec_vars_Y, @@ -1007,7 +1008,8 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector &unreachable_polygons); -void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver &Solver, +void introduce_ConsequentialPolygonWeakNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const z3::expr_vector &dec_vars_X, const z3::expr_vector &dec_vars_Y, @@ -1339,7 +1341,8 @@ void build_SequentialWeakPolygonNonoverlapping(z3::solver const std::vector &undecided, string_map &dec_var_names_map); -void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, +void build_ConsequentialWeakPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const std::vector &polygons, const std::vector &unreachable_polygons, @@ -1353,7 +1356,8 @@ void build_ConsequentialWeakPolygonNonoverlapping(z3::solver const std::vector &undecided, string_map &dec_var_names_map); -void build_ConsequentialWeakPolygonNonoverlapping(z3::solver &Solver, +void build_ConsequentialWeakPolygonNonoverlapping(const SolverConfiguration &solver_configuration, + z3::solver &Solver, z3::context &Context, const std::vector &polygons, const std::vector > &unreachable_polygons, diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index a1a73c40f0..8097a66208 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -242,7 +242,6 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) if (!objects_to_print[i].pgns_at_height[j].second.points.empty()) { Polygon decimated_polygon; - //ground_PolygonByFirstPoint(objects_to_print[i].pgns_at_height[j].second); if (command_parameters.decimation) { @@ -264,7 +263,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) decimated_polygon = objects_to_print[i].pgns_at_height[j].second; decimated_polygon.make_counter_clockwise(); } - if (!check_PolygonSize(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) + if (!check_PolygonSizeFitToPlate(solver_configuration, SEQ_SLICER_SCALE_FACTOR, decimated_polygon)) { printf("Object too large to fit onto plate [ID:%d RID:%d].\n", original_index_map[i], i); return -1; @@ -362,7 +361,6 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) vector remaining_polygons; vector polygon_index_map; - //vector original_index_map; vector decided_polygons; for (unsigned int index = 0; index < polygons.size(); ++index) From 847dc52a24cb558879e1868309ca12e0e6a5a444 Mon Sep 17 00:00:00 2001 From: surynek Date: Wed, 23 Oct 2024 21:00:08 +0200 Subject: [PATCH 22/88] Corrected nozzle size and extruder part above nozzle. --- src/libseqarrange/src/seq_preprocess.cpp | 23 ++++++++++++++--------- src/libseqarrange/src/seq_preprocess.hpp | 14 +++++++++----- src/slic3r/GUI/ArrangeHelper.cpp | 4 ++-- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp index 1587646d6b..528ed9f0ca 100644 --- a/src/libseqarrange/src/seq_preprocess.cpp +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -135,10 +135,10 @@ const std::vector SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK4 = const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK4 = { { /* fan - hand tailored */ - { -1000000, -21000000}, + { -10000000, -21000000}, { 37000000, -21000000}, { 37000000, 44000000}, - { -1000000, 44000000} + { -10000000, 44000000} /* fan - original from decimator { 87952801, 3665480}, @@ -148,14 +148,14 @@ const std::vector SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK4 = { 107889619, 2905295}, { 102396166, 55454515}, { 101386126, 58737097}, - { 93053422, 62777197}, - { 87447788, 59999636}, - { 70782970, 28440457}, + { 93 053 422, 62777197}, + { 87 447 788, 59999636}, + { 70 782 970, 28440457}, // nozzle - { -29076068, 18872356}, - { -29001876, 18872356}, - { -29001876, 18952646}, + { -29 076 068, 18 872 356}, + { -29 001 876, 18 872 356}, + { -29 001 876, 18 952 646}, { -29076068, 18952646}, */ @@ -956,6 +956,11 @@ std::vector > simplify_UnreachableZonePolygons(cons { if (check_PolygonConsumation(unreachable_polygons[i], unreachable_polygons[j])) { + #ifdef DEBUG + { + printf("Consumed: %d vs %d\n", i, j); + } + #endif consumed = true; break; } @@ -963,7 +968,7 @@ std::vector > simplify_UnreachableZonePolygons(cons } } if (!consumed) - { + { simplified_unreachable_polygons.push_back(unreachable_polygons[i]); } } diff --git a/src/libseqarrange/src/seq_preprocess.hpp b/src/libseqarrange/src/seq_preprocess.hpp index e4791d9047..0aacdcb616 100644 --- a/src/libseqarrange/src/seq_preprocess.hpp +++ b/src/libseqarrange/src/seq_preprocess.hpp @@ -193,12 +193,15 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration const std::vector > &extruder_box_level_polygons, std::vector &unreachable_polygons); -bool check_PolygonSize(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon); -bool check_PolygonSize(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon); - -void simplify_ConvexUnreachablePolygons(const std::vector > &unreachable_convex_polygons, - std::vector &simplified_unreachable_polygons); +bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon); +bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon); + +/*----------------------------------------------------------------*/ + +bool check_PolygonConsumation(const std::vector &polygons, const std::vector &consumer_polygons); +std::vector > simplify_UnreachableZonePolygons(const std::vector > &unreachable_polygons); + void glue_LowObjects(std::vector &solvable_ojects); @@ -206,6 +209,7 @@ void glue_LowObjects(std::vector &solvable_ojects); double calc_PolygonArea(const Slic3r::Polygon &polygon); +double calc_PolygonUnreachableZoneArea(const std::vector &unreachable_polygons); double calc_PolygonUnreachableZoneArea(const Slic3r::Polygon &polygon, const std::vector &unreachable_polygons); diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 9c1c71fdb7..e2f4cf96ff 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -25,8 +25,8 @@ static Sequential::PrinterGeometry get_printer_geometry() { // Just hardcode MK4 geometry for now. std::vector slices; - slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -500000, -500000 }, { 500000, -500000 }, { 500000, 500000 }, { -500000, 500000 } } } }); - slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -1000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -1000000, 44000000 } }, + slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); + slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, {350000000, -23000000 }, {350000000, -35000000 }, {-350000000, -35000000 } } } }); slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -12000000, -350000000 }, { 9000000, -350000000 }, { 9000000, -39000000 }, { -12000000, -39000000 } }, From c65315ce5a868421aa47b9969fe5777ff6194786 Mon Sep 17 00:00:00 2001 From: surynek Date: Sun, 10 Nov 2024 21:26:08 +0100 Subject: [PATCH 23/88] Bug fix in scheduling test (empty set of objects) and reformating of tests using test macros. --- src/libseqarrange/CMakeLists.txt | 9 +- src/libseqarrange/src/seq_interface.cpp | 4 +- src/libseqarrange/src/seq_sequential.cpp | 708 ++++++++++-------- .../test/seq_test_arrangement.cpp | 152 ++-- .../test/seq_test_arrangement.hpp | 25 - src/libseqarrange/test/seq_test_interface.cpp | 40 +- src/libseqarrange/test/seq_test_interface.hpp | 19 - src/libseqarrange/test/seq_test_polygon.cpp | 65 +- src/libseqarrange/test/seq_test_polygon.hpp | 49 -- .../test/seq_test_preprocess.cpp | 29 +- .../test/seq_test_preprocess.hpp | 20 - .../test/seq_test_sequential.cpp | 32 +- .../test/seq_test_sequential.hpp | 23 - 13 files changed, 517 insertions(+), 658 deletions(-) diff --git a/src/libseqarrange/CMakeLists.txt b/src/libseqarrange/CMakeLists.txt index 751d7149d9..b134ae13a5 100644 --- a/src/libseqarrange/CMakeLists.txt +++ b/src/libseqarrange/CMakeLists.txt @@ -8,6 +8,9 @@ set(CMAKE_CXX_EXTENSIONS False) find_package(Z3 REQUIRED) slic3r_remap_configs("z3::libz3" RelWithDebInfo Release) +find_package(Catch2 2.9 REQUIRED) +include(Catch) + add_library(libseqarrange STATIC src/seq_interface.cpp src/seq_preprocess.cpp src/seq_sequential.cpp src/seq_utilities.cpp) target_include_directories(libseqarrange PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange) target_link_libraries(libseqarrange libslic3r z3::libz3) @@ -29,7 +32,7 @@ target_link_libraries(sequential_decimator libseqarrange) # target_link_libraries(seq_test_arrangement libseqarrange) add_executable(seq_test_polygon test/seq_test_polygon.cpp test/prusaparts.cpp) -target_link_libraries(seq_test_polygon libseqarrange) +target_link_libraries(seq_test_polygon Catch2::Catch2 libseqarrange) target_include_directories(seq_test_polygon PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") add_executable(seq_test_sequential test/seq_test_sequential.cpp) @@ -44,3 +47,7 @@ add_executable(seq_test_interface test/seq_test_interface.cpp) target_link_libraries(seq_test_interface libseqarrange) target_include_directories(seq_test_interface PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") +add_test(seq_test_polygon seq_test_polygon) +add_test(seq_test_preprocess seq_test_preprocess) +add_test(seq_test_sequential seq_test_sequential) +add_test(seq_test_interface seq_test_interface) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index e3780fa358..77b2112354 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -222,7 +222,7 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration std::vector dec_values_X; std::vector dec_values_Y; - std::vector dec_values_T; + std::vector dec_values_T; for (const auto& scheduled_object: scheduled_plate.scheduled_objects) { @@ -261,7 +261,7 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration { printf("Line check ...\n"); } - #endif + #endif if (!check_PolygonLineIntersections(dec_values_X, dec_values_Y, dec_values_T, diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 908ed62411..2c0cfb2fae 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -249,11 +249,14 @@ void introduce_TemporalOrdering(z3::solver &Solver, int temporal_spread, const std::vector &polygons) { - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + if (!polygons.empty()) { - for (unsigned int j = i + 1; j < polygons.size(); ++j) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - Solver.add(dec_vars_T[i] > dec_vars_T[j] + temporal_spread || dec_vars_T[i] + temporal_spread < dec_vars_T[j]); + for (unsigned int j = i + 1; j < polygons.size(); ++j) + { + Solver.add(dec_vars_T[i] > dec_vars_T[j] + temporal_spread || dec_vars_T[i] + temporal_spread < dec_vars_T[j]); + } } } } @@ -268,14 +271,17 @@ void introduce_SequentialTemporalOrderingAgainstFixed(z3::solver int temporal_spread, const std::vector &SEQ_UNUSED(polygons)) { - for (unsigned int i = 0; i < undecided.size() - 1; ++i) + if (!undecided.empty()) { - for (unsigned int j = i + 1; j < undecided.size(); ++j) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); + for (unsigned int j = i + 1; j < undecided.size(); ++j) + { + Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); + } } } - + for (unsigned int i = 0; i < undecided.size(); ++i) { for (unsigned int j = 0; j < fixed.size(); ++j) @@ -306,11 +312,14 @@ void introduce_ConsequentialTemporalOrderingAgainstFixed(z3::solver int temporal_spread, const std::vector &SEQ_UNUSED(polygons)) { - for (unsigned int i = 0; i < undecided.size() - 1; ++i) + if (!undecided.empty()) { - for (unsigned int j = i + 1; j < undecided.size(); ++j) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); + for (unsigned int j = i + 1; j < undecided.size(); ++j) + { + Solver.add(dec_vars_T[undecided[i]] > dec_vars_T[undecided[j]] + temporal_spread || dec_vars_T[undecided[i]] + temporal_spread < dec_vars_T[undecided[j]]); + } } } @@ -374,9 +383,12 @@ void introduce_ConsequentialTemporalLepoxAgainstFixed(z3::solver } else { - for (unsigned int j = 0; j < undecided.size() - 1; ++j) + if (!undecided.empty()) { - Solver.add(dec_vars_T[undecided[j]] + temporal_spread < dec_vars_T[undecided[i]]); + for (unsigned int j = 0; j < undecided.size() - 1; ++j) + { + Solver.add(dec_vars_T[undecided[j]] + temporal_spread < dec_vars_T[undecided[i]]); + } } } } @@ -2991,18 +3003,21 @@ void introduce_PolygonWeakNonoverlapping(z3::solver &Sol const z3::expr_vector &dec_vars_Y, const std::vector &polygons) { - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + if (!polygons.empty()) { - for (unsigned int j = i + 1; j < polygons.size(); ++j) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - introduce_PolygonOutsidePolygon(Solver, - Context, - dec_vars_X[i], - dec_vars_Y[i], - polygons[i], - dec_vars_X[j], - dec_vars_Y[j], - polygons[j]); + for (unsigned int j = i + 1; j < polygons.size(); ++j) + { + introduce_PolygonOutsidePolygon(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + polygons[i], + dec_vars_X[j], + dec_vars_Y[j], + polygons[j]); + } } } } @@ -3042,22 +3057,25 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + if (!polygons.empty()) { - for (unsigned int j = i + 1; j < polygons.size(); ++j) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - introduce_SequentialPolygonOutsidePolygon(Solver, - Context, - dec_vars_X[i], - dec_vars_Y[i], - dec_vars_T[i], - polygons[i], - unreachable_polygons[i], - dec_vars_X[j], - dec_vars_Y[j], - dec_vars_T[j], - polygons[j], - unreachable_polygons[j]); + for (unsigned int j = i + 1; j < polygons.size(); ++j) + { + introduce_SequentialPolygonOutsidePolygon(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + polygons[i], + unreachable_polygons[i], + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + polygons[j], + unreachable_polygons[j]); + } } } } @@ -3097,22 +3115,25 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + if (!polygons.empty()) { - for (unsigned int j = i + 1; j < polygons.size(); ++j) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - introduce_ConsequentialPolygonOutsidePolygon(Solver, - Context, - dec_vars_X[i], - dec_vars_Y[i], - dec_vars_T[i], - polygons[i], - unreachable_polygons[i], - dec_vars_X[j], - dec_vars_Y[j], - dec_vars_T[j], - polygons[j], - unreachable_polygons[j]); + for (unsigned int j = i + 1; j < polygons.size(); ++j) + { + introduce_ConsequentialPolygonOutsidePolygon(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + dec_vars_T[i], + polygons[i], + unreachable_polygons[i], + dec_vars_X[j], + dec_vars_Y[j], + dec_vars_T[j], + polygons[j], + unreachable_polygons[j]); + } } } } @@ -3128,18 +3149,21 @@ void introduce_PolygonWeakNonoverlapping(z3::solver &Sol const std::vector &undecided, const std::vector &polygons) { - for (unsigned int i = 0; i < undecided.size() - 1; ++i) + if (!undecided.empty()) { - for (unsigned int j = i + 1; j < undecided.size(); ++j) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - introduce_PolygonOutsidePolygon(Solver, - Context, - dec_vars_X[undecided[i]], - dec_vars_Y[undecided[i]], - polygons[undecided[i]], - dec_vars_X[undecided[j]], - dec_vars_Y[undecided[j]], - polygons[undecided[j]]); + for (unsigned int j = i + 1; j < undecided.size(); ++j) + { + introduce_PolygonOutsidePolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + polygons[undecided[j]]); + } } } @@ -3209,27 +3233,30 @@ void introduce_SequentialPolygonWeakNonoverlapping(z3::solver const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (unsigned int i = 0; i < undecided.size() - 1; ++i) + if (!undecided.empty()) { - for (unsigned int j = i + 1; j < undecided.size(); ++j) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - #ifdef DEBUG + for (unsigned int j = i + 1; j < undecided.size(); ++j) { - printf("PoP: %d,%d\n", undecided[i], undecided[j]); + #ifdef DEBUG + { + printf("PoP: %d,%d\n", undecided[i], undecided[j]); + } + #endif + introduce_SequentialPolygonOutsidePolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + polygons[undecided[j]], + unreachable_polygons[undecided[j]]); } - #endif - introduce_SequentialPolygonOutsidePolygon(Solver, - Context, - dec_vars_X[undecided[i]], - dec_vars_Y[undecided[i]], - dec_vars_T[undecided[i]], - polygons[undecided[i]], - unreachable_polygons[undecided[i]], - dec_vars_X[undecided[j]], - dec_vars_Y[undecided[j]], - dec_vars_T[undecided[j]], - polygons[undecided[j]], - unreachable_polygons[undecided[j]]); } } @@ -3310,28 +3337,31 @@ void introduce_ConsequentialPolygonWeakNonoverlapping(const SolverConfiguration const std::vector &undecided, const std::vector &polygons, const std::vector > &unreachable_polygons) -{ - for (unsigned int i = 0; i < undecided.size() - 1; ++i) +{ + if (!undecided.empty()) { - for (unsigned int j = i + 1; j < undecided.size(); ++j) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - #ifdef DEBUG + for (unsigned int j = i + 1; j < undecided.size(); ++j) { - printf("PoP: %d,%d\n", undecided[i], undecided[j]); + #ifdef DEBUG + { + printf("PoP: %d,%d\n", undecided[i], undecided[j]); + } + #endif + introduce_ConsequentialPolygonExternalPolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + dec_vars_T[undecided[i]], + polygons[undecided[i]], + unreachable_polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + dec_vars_T[undecided[j]], + polygons[undecided[j]], + unreachable_polygons[undecided[j]]); } - #endif - introduce_ConsequentialPolygonExternalPolygon(Solver, - Context, - dec_vars_X[undecided[i]], - dec_vars_Y[undecided[i]], - dec_vars_T[undecided[i]], - polygons[undecided[i]], - unreachable_polygons[undecided[i]], - dec_vars_X[undecided[j]], - dec_vars_Y[undecided[j]], - dec_vars_T[undecided[j]], - polygons[undecided[j]], - unreachable_polygons[undecided[j]]); } } @@ -3470,31 +3500,34 @@ void introduce_PolygonStrongNonoverlapping(z3::solver &S dec_vars_Y, polygons); - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + if (!polygons.empty()) { - for (unsigned int j = i + 1; j < polygons.size(); ++j) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) - { - const Point &point1 = polygons[i].points[p1]; - const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - - for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) - { - const Point &point2 = polygons[j].points[p2]; - const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; - - introduce_LineNonIntersection(Solver, - Context, - dec_vars_X[i], - dec_vars_Y[i], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), - Line(point1, next_point1), - dec_vars_X[j], - dec_vars_Y[j], - z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), - Line(point2, next_point2)); - hidden_var_cnt += 2; + for (unsigned int j = i + 1; j < polygons.size(); ++j) + { + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + introduce_LineNonIntersection(Solver, + Context, + dec_vars_X[i], + dec_vars_Y[i], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt)).c_str())), + Line(point1, next_point1), + dec_vars_X[j], + dec_vars_Y[j], + z3::expr(Context.real_const(("hidden-var-" + to_string(hidden_var_cnt + 1)).c_str())), + Line(point2, next_point2)); + hidden_var_cnt += 2; + } } } } @@ -3731,6 +3764,7 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; + assert(!polygons.empty()); for (unsigned int i = 0; i < polygons.size() - 1; ++i) { for (unsigned int j = i + 1; j < polygons.size(); ++j) @@ -3816,6 +3850,7 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; + assert(!polygons.empty()); for (unsigned int i = 0; i < polygons.size() - 1; ++i) { for (unsigned int j = i + 1; j < polygons.size(); ++j) @@ -3896,6 +3931,7 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; + assert(!polygons.empty()); for (unsigned int i = 0; i < polygons.size() - 1; ++i) { for (unsigned int j = i + 1; j < polygons.size(); ++j) @@ -3979,6 +4015,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; + assert(!polygons.empty()); for (unsigned int i = 0; i < polygons.size() - 1; ++i) { for (unsigned int j = i + 1; j < polygons.size(); ++j) @@ -4168,6 +4205,7 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; + assert(!polygons.empty()); for (unsigned int i = 0; i < polygons.size() - 1; ++i) { for (unsigned int j = i + 1; j < polygons.size(); ++j) @@ -4374,6 +4412,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; + assert(!polygons.empty()); for (unsigned int i = 0; i < polygons.size() - 1; ++i) { for (unsigned int j = i + 1; j < polygons.size(); ++j) @@ -4560,6 +4599,7 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver { bool refined = false; + assert(!polygons.empty()); for (unsigned int i = 0; i < polygons.size() - 1; ++i) { for (unsigned int j = i + 1; j < polygons.size(); ++j) @@ -4766,18 +4806,21 @@ void introduce_PolygonWeakNonoverlappingAgainstFixed(z3::solver const std::vector &undecided, const std::vector &polygons) { - for (unsigned int i = 0; i < undecided.size() - 1; ++i) + if (!undecided.empty()) { - for (unsigned int j = i + 1; j < undecided.size(); ++j) + for (unsigned int i = 0; i < undecided.size() - 1; ++i) { - introduce_PolygonOutsidePolygon(Solver, - Context, - dec_vars_X[undecided[i]], - dec_vars_Y[undecided[i]], - polygons[undecided[i]], - dec_vars_X[undecided[j]], - dec_vars_Y[undecided[j]], - polygons[undecided[j]]); + for (unsigned int j = i + 1; j < undecided.size(); ++j) + { + introduce_PolygonOutsidePolygon(Solver, + Context, + dec_vars_X[undecided[i]], + dec_vars_Y[undecided[i]], + polygons[undecided[i]], + dec_vars_X[undecided[j]], + dec_vars_Y[undecided[j]], + polygons[undecided[j]]); + } } } @@ -4810,6 +4853,7 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver { bool refined = false; + assert(!undecided.empty()); for (unsigned int i = 0; i < undecided.size() - 1; ++i) { for (unsigned int j = i + 1; j < undecided.size(); ++j) @@ -4974,6 +5018,7 @@ bool refine_PolygonWeakNonoverlapping(z3::solver &Solver printf("Refining ***************************\n"); } #endif + assert(!undecided.empty()); for (unsigned int i = 0; i < undecided.size() - 1; ++i) { for (unsigned int j = i + 1; j < undecided.size(); ++j) @@ -5215,7 +5260,8 @@ bool refine_SequentialPolygonWeakNonoverlapping(z3::solver } } #endif - + + assert(!undecided.empty()); for (unsigned int i = 0; i < undecided.size() - 1; ++i) { for (unsigned int j = i + 1; j < undecided.size(); ++j) @@ -5727,7 +5773,8 @@ bool refine_ConsequentialPolygonWeakNonoverlapping(z3::solver } } #endif - + + assert(!undecided.empty()); for (unsigned int i = 0; i < undecided.size() - 1; ++i) { for (unsigned int j = i + 1; j < undecided.size(); ++j) @@ -6191,146 +6238,149 @@ bool check_PointsOutsidePolygons(const std::vector const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + if (!polygons.empty()) { - for (unsigned int j = i + 1; j < polygons.size(); ++j) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - if (dec_values_T[i] > dec_values_T[j]) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { - for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) + if (dec_values_T[i] > dec_values_T[j]) { - const Point &point1 = polygons[i].points[p1]; - - #ifdef DEBUG + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) { - printf(">----------------\n"); - } - #endif + const Point &point1 = polygons[i].points[p1]; - for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) - { - if (unreachable_polygons[j][poly2].points.size() >= 3) + #ifdef DEBUG { - bool always_inside_halfplane = true; + printf(">----------------\n"); + } + #endif + + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) + { + if (unreachable_polygons[j][poly2].points.size() >= 3) + { + bool always_inside_halfplane = true; - #ifdef DEBUG - { - printf("....\n"); - } - #endif + #ifdef DEBUG + { + printf("....\n"); + } + #endif - for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) - { - const Point &point2 = unreachable_polygons[j][poly2].points[p2]; - const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; - - Line line(point2, next_point2); - Vector normal = line.normal(); + for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) + { + const Point &point2 = unreachable_polygons[j][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; + + Line line(point2, next_point2); + Vector normal = line.normal(); - double outside = (normal.x() * (dec_values_X[i].as_double() + point1.x())) - + (normal.y() * (dec_values_Y[i].as_double() + point1.y())) - - (normal.x() * dec_values_X[j].as_double()) - - (normal.x() * line.a.x()) - - (normal.y() * dec_values_Y[j].as_double()) - - (normal.y() * line.a.y()); + double outside = (normal.x() * (dec_values_X[i].as_double() + point1.x())) + + (normal.y() * (dec_values_Y[i].as_double() + point1.y())) + - (normal.x() * dec_values_X[j].as_double()) + - (normal.x() * line.a.x()) + - (normal.y() * dec_values_Y[j].as_double()) + - (normal.y() * line.a.y()); - #ifdef DEBUG - { - printf("Tested point: %d, %d\n", point1.x(), point1.y()); - printf("Point: %d, %d\n", point2.x(), point2.y()); - printf("Next point: %d, %d\n", next_point2.x(), next_point2.y()); - printf("X[i]: %.3f, Y[i]: %.3f, X[j]: %.3f, Y[j]: %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); - printf("Outside 1: %.3f\n", outside); - } - #endif + #ifdef DEBUG + { + printf("Tested point: %d, %d\n", point1.x(), point1.y()); + printf("Point: %d, %d\n", point2.x(), point2.y()); + printf("Next point: %d, %d\n", next_point2.x(), next_point2.y()); + printf("X[i]: %.3f, Y[i]: %.3f, X[j]: %.3f, Y[j]: %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); + printf("Outside 1: %.3f\n", outside); + } + #endif - if (outside > -EPSILON) - { - always_inside_halfplane = false; - break; + if (outside > -EPSILON) + { + always_inside_halfplane = false; + break; + } + } + if (always_inside_halfplane) + { + return false; } - } - if (always_inside_halfplane) - { - return false; } } } } - } - else if (dec_values_T[i] < dec_values_T[j]) - { - for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) + else if (dec_values_T[i] < dec_values_T[j]) { - const Point &point2 = polygons[j].points[p2]; - - #ifdef DEBUG + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) { - printf("<----------------\n"); - } - #endif - - for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) - { - if (unreachable_polygons[i][poly1].points.size() >= 3) - { - bool always_inside_halfplane = true; + const Point &point2 = polygons[j].points[p2]; - #ifdef DEBUG + #ifdef DEBUG + { + printf("<----------------\n"); + } + #endif + + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + { + if (unreachable_polygons[i][poly1].points.size() >= 3) { - printf("....\n"); - } - #endif + bool always_inside_halfplane = true; + + #ifdef DEBUG + { + printf("....\n"); + } + #endif - for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) - { - const Point &point1 = unreachable_polygons[i][poly1].points[p1]; - const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; - - Line line(point1, next_point1); - Vector normal = line.normal(); + for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + { + const Point &point1 = unreachable_polygons[i][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; + + Line line(point1, next_point1); + Vector normal = line.normal(); - double outside = (normal.x() * (dec_values_X[j].as_double() + point2.x())) - + (normal.y() * (dec_values_Y[j].as_double() + point2.y())) - - (normal.x() * dec_values_X[i].as_double()) - - (normal.x() * line.a.x()) - - (normal.y() * dec_values_Y[i].as_double()) - - (normal.y() * line.a.y()); + double outside = (normal.x() * (dec_values_X[j].as_double() + point2.x())) + + (normal.y() * (dec_values_Y[j].as_double() + point2.y())) + - (normal.x() * dec_values_X[i].as_double()) + - (normal.x() * line.a.x()) + - (normal.y() * dec_values_Y[i].as_double()) + - (normal.y() * line.a.y()); - #ifdef DEBUG - { - printf("Tested point: %.3f, %.3f\n", dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y()); - printf("Point: %.3f, %.3f\n", point1.x() + dec_values_X[i].as_double(), point1.y() + dec_values_Y[i].as_double()); - printf("Next point: %.3f, %.3f\n", next_point1.x() + dec_values_X[i].as_double(), next_point1.y() + dec_values_Y[i].as_double()); - printf("X[i]: %.3f, Y[i]: %.3f, X[j]: %.3f, Y[j]: %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); - printf("Outside 2: %.3f\n", outside); + #ifdef DEBUG + { + printf("Tested point: %.3f, %.3f\n", dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y()); + printf("Point: %.3f, %.3f\n", point1.x() + dec_values_X[i].as_double(), point1.y() + dec_values_Y[i].as_double()); + printf("Next point: %.3f, %.3f\n", next_point1.x() + dec_values_X[i].as_double(), next_point1.y() + dec_values_Y[i].as_double()); + printf("X[i]: %.3f, Y[i]: %.3f, X[j]: %.3f, Y[j]: %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); + printf("Outside 2: %.3f\n", outside); + } + #endif + + if (outside > -EPSILON) + { + always_inside_halfplane = false; + break; + } } - #endif - - if (outside > -EPSILON) + if (always_inside_halfplane) { - always_inside_halfplane = false; - break; - } - } - if (always_inside_halfplane) - { - return false; + return false; + } } } - } - } - } - else - { - #ifdef DEBUG - { - printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + } + #endif + assert(false); } - #endif - assert(false); } - } + } } #ifdef DEBUG { @@ -6348,99 +6398,36 @@ bool check_PolygonLineIntersections(const std::vector const std::vector &polygons, const std::vector > &unreachable_polygons) { - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + if (!polygons.empty()) { - for (unsigned int j = i + 1; j < polygons.size(); ++j) + for (unsigned int i = 0; i < polygons.size() - 1; ++i) { - if (dec_values_T[i] > dec_values_T[j]) + for (unsigned int j = i + 1; j < polygons.size(); ++j) { - for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) - { - const Point &point1 = polygons[i].points[p1]; - const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; - - for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) - { - #ifdef DEBUG - { - printf("temporal: %.3f %.3f [ij: %d,%d]\n", dec_values_T[i].as_double(), dec_values_T[j].as_double(), i, j); - printf("proto X1: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[j].size(), unreachable_polygons[j][poly2].points.size()); - } - #endif - - for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) - { - const Point &point2 = unreachable_polygons[j][poly2].points[p2]; - const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; - - #ifdef DEBUG - { - printf("testing alpha %d %d (%d,%d): [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", i, j, p1, p2, - dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), - dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), - dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), - dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); - } - #endif - - if (lines_intersect_open(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), - next_point1.x() - point1.x(), next_point1.y() - point1.y(), - dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), - next_point2.x() - point2.x(), next_point2.y() - point2.y())) - - { - #ifdef DEBUG - { - printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, - dec_values_T[i].as_double(), - dec_values_T[j].as_double()); - - printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", - dec_values_X[i].as_double(), - dec_values_Y[i].as_double(), - dec_values_X[j].as_double(), - dec_values_Y[j].as_double()); - - printf("intersect 1: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", - hidden_var_cnt, - dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), - dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), - dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), - dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); - } - #endif - - return false; - } - } - } - } - } - else - { - if (dec_values_T[i] < dec_values_T[j]) + if (dec_values_T[i] > dec_values_T[j]) { - for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) - { - for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + for (unsigned int p1 = 0; p1 < polygons[i].points.size(); ++p1) + { + const Point &point1 = polygons[i].points[p1]; + const Point &next_point1 = polygons[i].points[(p1 + 1) % polygons[i].points.size()]; + + for (unsigned int poly2 = 0; poly2 < unreachable_polygons[j].size(); ++poly2) { #ifdef DEBUG - { - printf("proto2: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[i].size(), unreachable_polygons[i][poly1].points.size()); + { + printf("temporal: %.3f %.3f [ij: %d,%d]\n", dec_values_T[i].as_double(), dec_values_T[j].as_double(), i, j); + printf("proto X1: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[j].size(), unreachable_polygons[j][poly2].points.size()); } #endif - - const Point &point1 = unreachable_polygons[i][poly1].points[p1]; - const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; - - for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) + + for (unsigned int p2 = 0; p2 < unreachable_polygons[j][poly2].points.size(); ++p2) { - const Point &point2 = polygons[j].points[p2]; - const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + const Point &point2 = unreachable_polygons[j][poly2].points[p2]; + const Point &next_point2 = unreachable_polygons[j][poly2].points[(p2 + 1) % unreachable_polygons[j][poly2].points.size()]; #ifdef DEBUG { - printf("testing beta: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + printf("testing alpha %d %d (%d,%d): [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", i, j, p1, p2, dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), @@ -6465,8 +6452,8 @@ bool check_PolygonLineIntersections(const std::vector dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); - - printf("intersect 2: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + + printf("intersect 1: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", hidden_var_cnt, dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), @@ -6479,16 +6466,81 @@ bool check_PolygonLineIntersections(const std::vector } } } - } + } } else { - #ifdef DEBUG + if (dec_values_T[i] < dec_values_T[j]) { - printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + for (unsigned int poly1 = 0; poly1 < unreachable_polygons[i].size(); ++poly1) + { + for (unsigned int p1 = 0; p1 < unreachable_polygons[i][poly1].points.size(); ++p1) + { + #ifdef DEBUG + { + printf("proto2: %ld, %ld, %ld\n", unreachable_polygons.size(), unreachable_polygons[i].size(), unreachable_polygons[i][poly1].points.size()); + } + #endif + + const Point &point1 = unreachable_polygons[i][poly1].points[p1]; + const Point &next_point1 = unreachable_polygons[i][poly1].points[(p1 + 1) % unreachable_polygons[i][poly1].points.size()]; + + for (unsigned int p2 = 0; p2 < polygons[j].points.size(); ++p2) + { + const Point &point2 = polygons[j].points[p2]; + const Point &next_point2 = polygons[j].points[(p2 + 1) % polygons[j].points.size()]; + + #ifdef DEBUG + { + printf("testing beta: [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + if (lines_intersect_open(dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + next_point1.x() - point1.x(), next_point1.y() - point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + next_point2.x() - point2.x(), next_point2.y() - point2.y())) + { + #ifdef DEBUG + { + printf("temps: [ij: %d,%d] [%.3f, %.3f]\n", i, j, + dec_values_T[i].as_double(), + dec_values_T[j].as_double()); + + printf("dec_values: [%.3f, %.3f] [%.3f,%.3f]\n", + dec_values_X[i].as_double(), + dec_values_Y[i].as_double(), + dec_values_X[j].as_double(), + dec_values_Y[j].as_double()); + + printf("intersect 2: %d [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f] [%.3f,%.3f]\n", + hidden_var_cnt, + dec_values_X[i].as_double() + point1.x(), dec_values_Y[i].as_double() + point1.y(), + dec_values_X[i].as_double() + next_point1.x(), dec_values_Y[i].as_double() + next_point1.y(), + dec_values_X[j].as_double() + point2.x(), dec_values_Y[j].as_double() + point2.y(), + dec_values_X[j].as_double() + next_point2.x(), dec_values_Y[j].as_double() + next_point2.y()); + } + #endif + + return false; + } + } + } + } + } + else + { + #ifdef DEBUG + { + printf("Time collision: %.3f, %.3f\n", dec_values_T[i].as_double(), dec_values_T[j].as_double()); + } + #endif + assert(false); } - #endif - assert(false); } } } diff --git a/src/libseqarrange/test/seq_test_arrangement.cpp b/src/libseqarrange/test/seq_test_arrangement.cpp index 6df36e482c..acb022d6ae 100644 --- a/src/libseqarrange/test/seq_test_arrangement.cpp +++ b/src/libseqarrange/test/seq_test_arrangement.cpp @@ -19,6 +19,10 @@ #include #include +#define CATCH_CONFIG_EXTERNAL_INTERFACES +#define CATCH_CONFIG_MAIN +#include "catch2/catch.hpp" + #include "seq_defs.hpp" #include "seq_test_arrangement.hpp" @@ -81,9 +85,9 @@ public: }; -void test_arrangement_1(void) +TEST_CASE("Arrangement test 1", "[Classical Arrangement]") { - printf("Testing sheet arrangement 1 ...\n"); + printf("Testing plate arrangement 1 ...\n"); SizeOptions opt("Queens"); opt.iterations(200); @@ -92,7 +96,7 @@ void test_arrangement_1(void) Script::run(opt); - printf("Testing sheet arrangement 1 ... finished\n"); + printf("Testing plate arrangement 1 ... finished\n"); } @@ -140,7 +144,7 @@ public: }; -const int sheet_size = 9; +const int plate_size = 9; const int Obj1_width = 5; const int Obj1_height = 4; @@ -161,7 +165,7 @@ public: public: ArrangementProblem() - : vars(*this, 6, 0, sheet_size - 1) + : vars(*this, 6, 0, plate_size - 1) , Obj1_x(vars[0]) , Obj1_y(vars[1]) , Obj2_x(vars[2]) @@ -191,16 +195,16 @@ public: nooverlap(*this, Xs, widths, Ys, heights); - rel(*this, Obj1_x + Obj1_width <= sheet_size); - rel(*this, Obj2_x + Obj2_width <= sheet_size); - rel(*this, Obj3_x + Obj3_width <= sheet_size); + rel(*this, Obj1_x + Obj1_width <= plate_size); + rel(*this, Obj2_x + Obj2_width <= plate_size); + rel(*this, Obj3_x + Obj3_width <= plate_size); rel(*this, Obj2_x == Obj1_x + 5); rel(*this, Obj2_y == Obj1_y + 1); - rel(*this, Obj1_y + Obj1_height <= sheet_size); - rel(*this, Obj2_y + Obj2_height <= sheet_size); - rel(*this, Obj3_y + Obj3_height <= sheet_size); + rel(*this, Obj1_y + Obj1_height <= plate_size); + rel(*this, Obj2_y + Obj2_height <= plate_size); + rel(*this, Obj3_y + Obj3_height <= plate_size); branch(*this, vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); }; @@ -236,7 +240,7 @@ public: }; -const int sheet_resolution = 20; +const int plate_resolution = 20; const int time_resolution = 80; const int low_Obj1_width = 5; @@ -274,9 +278,9 @@ public: public: SimpleSequentialProblem() - : space_vars(*this, 8, 0, sheet_resolution) + : space_vars(*this, 8, 0, plate_resolution) , time_vars(*this, 4, 0, time_resolution) - , kine_vars(*this, 2, 0, sheet_resolution) + , kine_vars(*this, 2, 0, plate_resolution) , low_Obj1_x(space_vars[0]) , low_Obj1_y(space_vars[1]) @@ -362,15 +366,15 @@ public: rel(*this, low_Obj2_t >= high_Obj1_t + high_Obj1_duration || high_Obj1_t >= low_Obj2_t + low_Obj2_duration); rel(*this, low_Obj1_t >= high_Obj1_t + high_Obj1_duration || high_Obj1_t >= low_Obj1_t + low_Obj1_duration); - rel(*this, low_Obj1_x + low_Obj1_width <= sheet_resolution); - rel(*this, low_Obj2_x + low_Obj2_width <= sheet_resolution); - rel(*this, low_Obj3_x + low_Obj3_width <= sheet_resolution); - rel(*this, high_Obj1_x + high_Obj1_width <= sheet_resolution); + rel(*this, low_Obj1_x + low_Obj1_width <= plate_resolution); + rel(*this, low_Obj2_x + low_Obj2_width <= plate_resolution); + rel(*this, low_Obj3_x + low_Obj3_width <= plate_resolution); + rel(*this, high_Obj1_x + high_Obj1_width <= plate_resolution); - rel(*this, low_Obj1_y + low_Obj1_height <= sheet_resolution); - rel(*this, low_Obj2_y + low_Obj2_height <= sheet_resolution); - rel(*this, low_Obj3_y + low_Obj3_height <= sheet_resolution); - rel(*this, high_Obj1_y + high_Obj1_height <= sheet_resolution); + rel(*this, low_Obj1_y + low_Obj1_height <= plate_resolution); + rel(*this, low_Obj2_y + low_Obj2_height <= plate_resolution); + rel(*this, low_Obj3_y + low_Obj3_height <= plate_resolution); + rel(*this, high_Obj1_y + high_Obj1_height <= plate_resolution); rel(*this, low_Obj1_t + low_Obj1_duration <= time_resolution); rel(*this, low_Obj2_t + low_Obj2_duration <= time_resolution); @@ -436,10 +440,10 @@ public: }; -int complex_sheet_resolution = 30; +int complex_plate_resolution = 30; -int complex_sheet_resolution_min = 10; -int complex_sheet_resolution_max = 200; +int complex_plate_resolution_min = 10; +int complex_plate_resolution_max = 200; int complex_time_resolution = 1000; int complex_height_threshold = 25; @@ -482,9 +486,9 @@ public: public: ComplexSequentialProblem() - : space_vars(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution) + : space_vars(*this, 2 * complex_Obj_count, 0, complex_plate_resolution) , time_vars(*this, complex_Obj_count, 0, complex_time_resolution) - , kine_vars(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution) + , kine_vars(*this, 2 * complex_Obj_count, 0, complex_plate_resolution) { /* int width_span = max_width - min_width; @@ -535,8 +539,8 @@ public: for (int i = 0; i < complex_Obj_count; ++i) { - rel(*this, complex_Obj_x[i] + complex_Obj_widths[i] <= complex_sheet_resolution, IPL_BND); - rel(*this, complex_Obj_y[i] + complex_Obj_heights[i] <= complex_sheet_resolution, IPL_BND); + rel(*this, complex_Obj_x[i] + complex_Obj_widths[i] <= complex_plate_resolution, IPL_BND); + rel(*this, complex_Obj_y[i] + complex_Obj_heights[i] <= complex_plate_resolution, IPL_BND); } for (int i = 0; i < complex_Obj_count; ++i) @@ -617,16 +621,16 @@ public: }; -int complex_sheet_resolution_X = 200; +int complex_plate_resolution_X = 200; -int complex_sheet_resolution_X_min = 10; -int complex_sheet_resolution_X_max = 200; +int complex_plate_resolution_X_min = 10; +int complex_plate_resolution_X_max = 200; -int complex_sheet_resolution_Y = 30; +int complex_plate_resolution_Y = 30; -int complex_sheet_resolution_Y_min = 10; -int complex_sheet_resolution_Y_max = 200; +int complex_plate_resolution_Y_min = 10; +int complex_plate_resolution_Y_max = 200; void generate_random_complex_objects(void) @@ -665,11 +669,11 @@ public: public: ComplexSequentialProblemXY() - : space_vars_X(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution_X) - , space_vars_Y(*this, 2 * complex_Obj_count, 0, complex_sheet_resolution_Y) + : space_vars_X(*this, 2 * complex_Obj_count, 0, complex_plate_resolution_X) + , space_vars_Y(*this, 2 * complex_Obj_count, 0, complex_plate_resolution_Y) , time_vars(*this, complex_Obj_count, 0, complex_time_resolution) - , kine_vars_L(*this, complex_Obj_count, 0, complex_sheet_resolution_Y) - , kine_vars_R(*this, complex_Obj_count, 0, complex_sheet_resolution_Y) + , kine_vars_L(*this, complex_Obj_count, 0, complex_plate_resolution_Y) + , kine_vars_R(*this, complex_Obj_count, 0, complex_plate_resolution_Y) { for (int i = 0; i < complex_Obj_count; ++i) { @@ -709,8 +713,8 @@ public: for (int i = 0; i < complex_Obj_count; ++i) { - rel(*this, complex_Obj_x[i] + complex_Obj_widths[i] <= complex_sheet_resolution_X, IPL_BND); - rel(*this, complex_Obj_y[i] + complex_Obj_heights[i] <= complex_sheet_resolution_Y, IPL_BND); + rel(*this, complex_Obj_x[i] + complex_Obj_widths[i] <= complex_plate_resolution_X, IPL_BND); + rel(*this, complex_Obj_y[i] + complex_Obj_heights[i] <= complex_plate_resolution_Y, IPL_BND); } @@ -794,9 +798,9 @@ public: }; -void test_arrangement_2(void) +TEST_CASE("Arrangement test 2", "[Classical Arrangement]") { - printf("Testing sheet arrangement 2 ...\n"); + printf("Testing plate arrangement 2 ...\n"); SimpleProblem *simple_problem = new SimpleProblem(); DFS engine(simple_problem); @@ -810,13 +814,13 @@ void test_arrangement_2(void) Search::Statistics stat = engine.statistics(); printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); - printf("Testing sheet arrangement 2 ... finished\n"); + printf("Testing plate arrangement 2 ... finished\n"); } -void test_arrangement_3(void) +TEST_CASE("Arrangement test 3", "[Classical Arrangement]") { - printf("Testing sheet arrangement 3 ...\n"); + printf("Testing plate arrangement 3 ...\n"); ArrangementProblem *arrangement_problem = new ArrangementProblem(); DFS engine(arrangement_problem); @@ -832,13 +836,13 @@ void test_arrangement_3(void) Search::Statistics stat = engine.statistics(); printf("Statistics: %ld, %ld, %ld, %ld, %ld\n", stat.fail, stat.node, stat.depth, stat.restart, stat.nogood); - printf("Testing sheet arrangement 3 ... finished\n"); + printf("Testing plate arrangement 3 ... finished\n"); } -void test_arrangement_4(void) +TEST_CASE("Arrangement test 4", "[Classical Arrangement]") { - printf("Testing sheet arrangement 4 ...\n"); + printf("Testing plate arrangement 4 ...\n"); SimpleSequentialProblem *sequential_problem = new SimpleSequentialProblem(); DFS engine(sequential_problem); @@ -855,13 +859,13 @@ void test_arrangement_4(void) getchar(); } - printf("Testing sheet arrangement 4 ... finished\n"); + printf("Testing plate arrangement 4 ... finished\n"); } -void test_arrangement_5(void) +TEST_CASE("Arrangement test 5", "[Classical Arrangement]") { - printf("Testing sheet arrangement 5 ...\n"); + printf("Testing plate arrangement 5 ...\n"); generate_random_complex_objects(); ComplexSequentialProblem *sequential_problem = new ComplexSequentialProblem(); @@ -889,20 +893,20 @@ void test_arrangement_5(void) clock_t end = clock(); printf("Time (CPU): %.3fs\n", (end - begin) / (double)CLOCKS_PER_SEC); - printf("Testing sheet arrangement 5 ... finished\n"); + printf("Testing plate arrangement 5 ... finished\n"); } -void test_arrangement_6(void) +TEST_CASE("Arrangement test 6", "[Classical Arrangement]") { - printf("Testing sheet arrangement 6 ...\n"); + printf("Testing plate arrangement 6 ...\n"); generate_random_complex_objects(); - complex_sheet_resolution = complex_sheet_resolution_max; + complex_plate_resolution = complex_plate_resolution_max; - while (complex_sheet_resolution > complex_sheet_resolution_min) + while (complex_plate_resolution > complex_plate_resolution_min) { - printf("Trying sheet resolution = %d\n", complex_sheet_resolution); + printf("Trying plate resolution = %d\n", complex_plate_resolution); ComplexSequentialProblem *sequential_problem = new ComplexSequentialProblem(); @@ -943,23 +947,23 @@ void test_arrangement_6(void) } delete sequential_P; - complex_sheet_resolution -= 1; + complex_plate_resolution -= 1; } - printf("Testing sheet arrangement 6 ... finished\n"); + printf("Testing plate arrangement 6 ... finished\n"); } -void test_arrangement_7(void) +TEST_CASE("Arrangement test 7", "[Classical Arrangement]") { - printf("Testing sheet arrangement 7 ...\n"); + printf("Testing plate arrangement 7 ...\n"); generate_random_complex_objects(); - complex_sheet_resolution_X = complex_sheet_resolution_X_max; + complex_plate_resolution_X = complex_plate_resolution_X_max; - while (complex_sheet_resolution_X > complex_sheet_resolution_X_min) + while (complex_plate_resolution_X > complex_plate_resolution_X_min) { - printf("Trying sheet resolution X = %d, Y = %d\n", complex_sheet_resolution_X, complex_sheet_resolution_Y); + printf("Trying plate resolution X = %d, Y = %d\n", complex_plate_resolution_X, complex_plate_resolution_Y); ComplexSequentialProblemXY *sequential_problem = new ComplexSequentialProblemXY(); Search::Options options; @@ -998,26 +1002,12 @@ void test_arrangement_7(void) } delete sequential_P; - complex_sheet_resolution_X -= 1; + complex_plate_resolution_X -= 1; } - printf("Testing sheet arrangement 7 ... finished\n"); + printf("Testing plate arrangement 7 ... finished\n"); } /*----------------------------------------------------------------*/ - -int main(int UNUSED(argc), char **UNUSED(argv)) -{ -// test_arrangement_1(); -// test_arrangement_2(); -// test_arrangement_3(); -// test_arrangement_4(); -// test_arrangement_5(); -// test_arrangement_6(); - test_arrangement_7(); - - return 0; -} - diff --git a/src/libseqarrange/test/seq_test_arrangement.hpp b/src/libseqarrange/test/seq_test_arrangement.hpp index 005b778ddd..417fd752b2 100644 --- a/src/libseqarrange/test/seq_test_arrangement.hpp +++ b/src/libseqarrange/test/seq_test_arrangement.hpp @@ -15,30 +15,5 @@ /*----------------------------------------------------------------*/ -/* Plate arrangment test 1 */ -void test_arrangement_1(void); - -/* Plate arrangment test 2 */ -void test_arrangement_2(void); - -/* Plate arrangment test 3 */ -void test_arrangement_3(void); - -/* Plate arrangment test 4 */ -void test_arrangement_4(void); - -/* Plate arrangment test 5 */ -void test_arrangement_5(void); - -/* Plate arrangment test 6 */ -void test_arrangement_6(void); - -/* Plate arrangment test 7 */ -void test_arrangement_7(void); - - - - -/*----------------------------------------------------------------*/ #endif /* __SEQ_TEST_ARRANGEMENT_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index ef10322ca3..9763afbeca 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -19,6 +19,10 @@ #include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" +#define CATCH_CONFIG_EXTERNAL_INTERFACES +#define CATCH_CONFIG_MAIN +#include "catch2/catch.hpp" + #include #include "seq_interface.hpp" @@ -111,7 +115,7 @@ void save_import_data(const std::string &filename, /*----------------------------------------------------------------*/ -void test_interface_1(void) +TEST_CASE("Interface test 1", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -159,7 +163,7 @@ void test_interface_1(void) } -void test_interface_2(void) +TEST_CASE("Interface test 2", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -216,7 +220,7 @@ void test_interface_2(void) } -void test_interface_3(void) +TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -266,7 +270,7 @@ void test_interface_3(void) } -int test_interface_4(void) +TEST_CASE("Interface test 4", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -290,7 +294,7 @@ int test_interface_4(void) if (result != 0) { printf("Cannot load printer geometry (code: %d).\n", result); - return result; + return; } solver_configuration.setup(printer_geometry); printf("Loading printer geometry ... finished\n"); @@ -320,12 +324,10 @@ int test_interface_4(void) printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); printf("Testing interface 4 ... finished\n"); - - return 0; } -int test_interface_5(void) +TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -349,7 +351,7 @@ int test_interface_5(void) if (result != 0) { printf("Cannot load printer geometry (code: %d).\n", result); - return result; + return; } solver_configuration.setup(printer_geometry); printf("Loading printer geometry ... finished\n"); @@ -396,12 +398,10 @@ int test_interface_5(void) printf("Checking time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); printf("Testing interface 5 ... finished\n"); - - return 0; } -int test_interface_6(void) +TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -430,7 +430,7 @@ int test_interface_6(void) if (result != 0) { printf("Cannot load printer geometry (code: %d).\n", result); - return result; + return; } solver_configuration.setup(printer_geometry); printf("Loading printer geometry ... finished\n"); @@ -477,23 +477,9 @@ int test_interface_6(void) printf("Checking time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); printf("Testing interface 6 ... finished\n"); - - return 0; } /*----------------------------------------------------------------*/ -int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) -{ -// test_interface_1(); -// test_interface_2(); -// test_interface_3(); -// test_interface_4(); - test_interface_5(); -// test_interface_6(); - - return 0; -} - diff --git a/src/libseqarrange/test/seq_test_interface.hpp b/src/libseqarrange/test/seq_test_interface.hpp index b9e1f54820..5292a70f2a 100644 --- a/src/libseqarrange/test/seq_test_interface.hpp +++ b/src/libseqarrange/test/seq_test_interface.hpp @@ -14,24 +14,5 @@ /*----------------------------------------------------------------*/ -/* Interface test 1 */ -void test_interface_1(void); - -/* Interface test 2 */ -void test_interface_2(void); - -/* Interface test 3 */ -void test_interface_3(void); - -/* Interface test 4 */ -int test_interface_4(void); - -/* Interface test 5 */ -int test_interface_5(void); - -/* Interface test 6 */ -int test_interface_6(void); - -/*----------------------------------------------------------------*/ #endif /* __SEQ_TEST_PREPROCESS_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_polygon.cpp b/src/libseqarrange/test/seq_test_polygon.cpp index 09a485167e..56f0e10d6e 100644 --- a/src/libseqarrange/test/seq_test_polygon.cpp +++ b/src/libseqarrange/test/seq_test_polygon.cpp @@ -18,6 +18,10 @@ #include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" +#define CATCH_CONFIG_EXTERNAL_INTERFACES +#define CATCH_CONFIG_MAIN +#include "catch2/catch.hpp" + #include #include "prusaparts.hpp" @@ -45,8 +49,8 @@ using namespace Sequential; /*----------------------------------------------------------------*/ -void test_polygon_1(void) -{ +TEST_CASE("Polygon test 1", "[Polygon]") +{ printf("Testing polygon 1 ...\n"); Polygon polygon_1 = {{-1000000, -1000000}, {1000000, -1000000}, {1000000, 1000000}, {-1000000, 1000000} }; @@ -61,7 +65,7 @@ void test_polygon_1(void) } -void test_polygon_2(void) +TEST_CASE("Polygon test 2", "[Polygon]") { printf("Testing polygon 2 ...\n"); @@ -129,9 +133,7 @@ void test_polygon_2(void) printf("%s\n", ins3 ? "yes" : "no"); bool ins4 = is_inside(point_1 - point_2); printf("%s\n", ins4 ? "yes" : "no"); - } - - getchar(); + } } printf("Testing polygon 2 ... finished\n"); @@ -141,7 +143,7 @@ void test_polygon_2(void) int line_count = 4; Line lines[] = {{Point(100,100), Point(200,200)}, {Point(200,100), Point(100,200)}, {Point(0,0), Point(100,10)}, {Point(50,0), Point(60,100)} }; -void test_polygon_3(void) +TEST_CASE("Polygon test 3", "[Polygon]") { clock_t start, finish; @@ -281,7 +283,7 @@ void test_polygon_3(void) } -void test_polygon_4(void) +TEST_CASE("Polygon test 4", "[Polygon]") { clock_t start, finish; @@ -425,7 +427,7 @@ int poly_line_count = 4; Line poly_lines[] = {{Point(100,100), Point(200,100)}, {Point(200,100), Point(200,200)}, {Point(200,200), Point(100,200)}, {Point(100,200), Point(100,100)} }; -void test_polygon_5(void) +TEST_CASE("Polygon test 5", "[Polygon]") { clock_t start, finish; @@ -566,7 +568,7 @@ Polygon polygon_1 = {{0, 0}, {50, 0}, {50, 50}, {0, 50}}; //Polygon polygon_1 = {{scale_(0), scale_(0)}, {scale_(50), scale_(0)}, {scale_(50), scale_(50)}, {scale_(0), scale_(50)}}; -void test_polygon_6(void) +TEST_CASE("Polygon test 6", "[Polygon]") { clock_t start, finish; @@ -692,7 +694,7 @@ Polygon polygon_2 = {{0, 0}, {150, 0}, {150, 50}, {75, 120}, {0, 50} }; //Polygon polygon_2 = {{scale_(0), scale_(0)}, {scale_(150), scale_(0)}, {scale_(150), scale_(50)}, {scale_(75), scale_(120)}, {scale_(0), scale_(50)} }; -void test_polygon_7(void) +TEST_CASE("Polygon test 7", "[Polygon]") { clock_t start, finish; @@ -900,7 +902,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) Polygon polygon_3 = {{40, 0}, {80, 40}, {40, 80}, {0, 40}}; //Polygon polygon_3 = {{20, 0}, {40, 0}, {60, 30}, {30, 50}, {0, 30}}; -void test_polygon_8(void) +TEST_CASE("Polygon test 8", "[Polygon]") { clock_t start, finish; @@ -1202,7 +1204,7 @@ void test_polygon_8(void) } -void test_polygon_9(void) +TEST_CASE("Polygon test 9", "[Polygon]") { clock_t start, finish; @@ -1502,7 +1504,7 @@ void test_polygon_9(void) Polygon polygon_4 = {{20, 0}, {40, 0}, {60, 30}, {30, 50}, {0, 30}}; -void test_polygon_10(void) +TEST_CASE("Polygon test 10", "[Polygon]") { clock_t start, finish; @@ -1837,7 +1839,7 @@ void test_polygon_10(void) } -void test_polygon_11(void) +TEST_CASE("Polygon test 11", "[Polygon]") { clock_t start, finish; @@ -2290,7 +2292,7 @@ void test_polygon_11(void) } -void test_polygon_12(void) +TEST_CASE("Polygon test 12", "[Polygon]") { clock_t start, finish; @@ -2400,7 +2402,7 @@ void test_polygon_12(void) } -void test_polygon_13(void) +TEST_CASE("Polygon test 13", "[Polygon]") { clock_t start, finish; @@ -2556,7 +2558,7 @@ void test_polygon_13(void) } -void test_polygon_14(void) +TEST_CASE("Polygon test 14", "[Polygon]") { clock_t start, finish; @@ -2810,7 +2812,7 @@ void test_polygon_14(void) } -void test_polygon_15(void) +TEST_CASE("Polygon test 15", "[Polygon]") { clock_t start, finish; @@ -3006,7 +3008,7 @@ void test_polygon_15(void) } -void test_polygon_16(void) +TEST_CASE("Polygon test 16", "[Polygon]") { clock_t start, finish; @@ -3034,26 +3036,3 @@ void test_polygon_16(void) /*----------------------------------------------------------------*/ - -int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) -{ - //test_polygon_1(); - //test_polygon_2(); - //test_polygon_3(); - //test_polygon_4(); - //test_polygon_5(); - //test_polygon_6(); - //test_polygon_7(); - //test_polygon_8(); - //test_polygon_9(); - //test_polygon_10(); - //test_polygon_11(); - //test_polygon_12(); - //test_polygon_13(); - //test_polygon_14(); - //test_polygon_15(); - test_polygon_16(); - - return 0; -} - diff --git a/src/libseqarrange/test/seq_test_polygon.hpp b/src/libseqarrange/test/seq_test_polygon.hpp index 4f77968ade..a4badc72da 100644 --- a/src/libseqarrange/test/seq_test_polygon.hpp +++ b/src/libseqarrange/test/seq_test_polygon.hpp @@ -14,54 +14,5 @@ /*----------------------------------------------------------------*/ -/* Polygon test 1 */ -void test_polygon_1(void); - -/* Polygon test 2 */ -void test_polygon_2(void); - -/* Polygon test 3 */ -void test_polygon_3(void); - -/* Polygon test 4 */ -void test_polygon_4(void); - -/* Polygon test 5 */ -void test_polygon_5(void); - -/* Polygon test 6 */ -void test_polygon_6(void); - -/* Polygon test 7 */ -void test_polygon_7(void); - -/* Polygon test 8 */ -void test_polygon_8(void); - -/* Polygon test 9 */ -void test_polygon_9(void); - -/* Polygon test 10 */ -void test_polygon_10(void); - -/* Polygon test 11 */ -void test_polygon_11(void); - -/* Polygon test 12 */ -void test_polygon_12(void); - -/* Polygon test 13 */ -void test_polygon_13(void); - -/* Polygon test 14 */ -void test_polygon_14(void); - -/* Polygon test 15 */ -void test_polygon_15(void); - -/* Polygon test 16 */ -void test_polygon_16(void); - -/*----------------------------------------------------------------*/ #endif /* __SEQ_TEST_POLYGON_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index e93ae639bc..04b7830fe5 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -20,6 +20,10 @@ #include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" +#define CATCH_CONFIG_EXTERNAL_INTERFACES +#define CATCH_CONFIG_MAIN +#include "catch2/catch.hpp" + #include #include "prusaparts.hpp" @@ -76,7 +80,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) std::vector test_polygons; -void test_preprocess_1(void) +TEST_CASE("Preprocessing test 1", "[Sequential Arrangement Preprocessing]") { clock_t start, finish; @@ -109,7 +113,7 @@ void test_preprocess_1(void) } -void test_preprocess_2(void) +TEST_CASE("Preprocessing test 2", "[Sequential Arrangement Preprocessing]") { clock_t start, finish; @@ -326,7 +330,7 @@ void test_preprocess_2(void) } -void test_preprocess_3(void) +TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") { clock_t start, finish; @@ -595,7 +599,7 @@ void test_preprocess_3(void) } -void test_preprocess_4(void) +TEST_CASE("Preprocessing test 4", "[Sequential Arrangement Preprocessing]") { clock_t start, finish; @@ -825,7 +829,7 @@ void test_preprocess_4(void) } -void test_preprocess_5(void) +TEST_CASE("Preprocessing test 5", "[Sequential Arrangement Preprocessing]") { clock_t start, finish; @@ -884,7 +888,7 @@ void test_preprocess_5(void) } -void test_preprocess_6(void) +TEST_CASE("Preprocessing test 6", "[Sequential Arrangement Preprocessing]") { clock_t start, finish; @@ -1121,16 +1125,3 @@ void test_preprocess_6(void) /*----------------------------------------------------------------*/ - -int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) -{ - //test_preprocess_1(); - //test_preprocess_2(); - //test_preprocess_3(); - //test_preprocess_4(); - //test_preprocess_5(); - test_preprocess_6(); - - return 0; -} - diff --git a/src/libseqarrange/test/seq_test_preprocess.hpp b/src/libseqarrange/test/seq_test_preprocess.hpp index ec57751b36..789b4afed2 100644 --- a/src/libseqarrange/test/seq_test_preprocess.hpp +++ b/src/libseqarrange/test/seq_test_preprocess.hpp @@ -14,25 +14,5 @@ /*----------------------------------------------------------------*/ -/* Preprocess test 1 */ -void test_preprocess_1(void); - -/* Preprocess test 2 */ -void test_preprocess_2(void); - -/* Preprocess test 3 */ -void test_preprocess_3(void); - -/* Preprocess test 4 */ -void test_preprocess_4(void); - -/* Preprocess test 5 */ -void test_preprocess_5(void); - -/* Preprocess test 6 */ -void test_preprocess_6(void); - - -/*----------------------------------------------------------------*/ #endif /* __SEQ_TEST_PREPROCESS_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_sequential.cpp b/src/libseqarrange/test/seq_test_sequential.cpp index 6c985c7fab..a58f4e7908 100644 --- a/src/libseqarrange/test/seq_test_sequential.cpp +++ b/src/libseqarrange/test/seq_test_sequential.cpp @@ -19,6 +19,10 @@ #include "libslic3r/Geometry/ConvexHull.hpp" #include "libslic3r/SVG.hpp" +#define CATCH_CONFIG_EXTERNAL_INTERFACES +#define CATCH_CONFIG_MAIN +#include "catch2/catch.hpp" + #include #include "seq_defs.hpp" @@ -69,7 +73,7 @@ Polygon scale_UP(const Polygon &polygon, double x_pos, double y_pos) } -void test_sequential_1(void) +TEST_CASE("Sequential test 1", "[Sequential Arrangement Core]") { printf("Testing sequential scheduling 1 ...\n"); @@ -239,7 +243,7 @@ void generate_random_complex_objects(void) typedef std::basic_string sString; -void test_sequential_2(void) +TEST_CASE("Sequential test 2", "[Sequential Arrangement Core]") { clock_t start, finish; @@ -489,7 +493,7 @@ void generate_random_rotated_complex_objects(void) } -void test_sequential_3(void) +TEST_CASE("Sequential test 3", "[Sequential Arrangement Core]") { clock_t start, finish; @@ -767,7 +771,7 @@ std::vector unreachable_polygons_4 = { }; -void test_sequential_4(void) +TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") { clock_t start, finish; @@ -1228,7 +1232,7 @@ void test_sequential_4(void) } -void test_sequential_5(void) +TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") { clock_t start, finish; @@ -1724,8 +1728,7 @@ void test_sequential_5(void) } - -void test_sequential_6(void) +TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") { clock_t start, finish; @@ -2017,7 +2020,7 @@ void test_sequential_6(void) } -void test_sequential_7(void) +TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") { clock_t start, finish; @@ -2298,16 +2301,3 @@ void test_sequential_7(void) /*----------------------------------------------------------------*/ -int main(int SEQ_UNUSED(argc), char **SEQ_UNUSED(argv)) -{ - // test_sequential_1(); - // test_sequential_2(); - // test_sequential_3(); - // test_sequential_4(); - // test_sequential_5(); - // test_sequential_6(); - test_sequential_7(); - - return 0; -} - diff --git a/src/libseqarrange/test/seq_test_sequential.hpp b/src/libseqarrange/test/seq_test_sequential.hpp index 4ac36d7b5b..13cac6b4f1 100644 --- a/src/libseqarrange/test/seq_test_sequential.hpp +++ b/src/libseqarrange/test/seq_test_sequential.hpp @@ -14,28 +14,5 @@ /*----------------------------------------------------------------*/ -/* Sequential arrangment test 1 */ -void test_sequential_1(void); - -/* Sequential arrangment test 2 */ -void test_sequential_2(void); - -/* Sequential arrangment test 3 */ -void test_sequential_3(void); - -/* Sequential arrangment test 4 */ -void test_sequential_4(void); - -/* Sequential arrangment test 5 */ -void test_sequential_5(void); - -/* Sequential arrangment test 6 */ -void test_sequential_6(void); - -/* Sequential arrangment test 7 */ -void test_sequential_7(void); - - -/*----------------------------------------------------------------*/ #endif /* __SEQ_TEST_SEQUENTIAL_HPP__ */ From 3c40a68f169dba897dd8315ea66b79e88332b3be Mon Sep 17 00:00:00 2001 From: surynek Date: Thu, 28 Nov 2024 17:31:01 +0100 Subject: [PATCH 24/88] Adding consistency tests for automated testing, found bug in progress bar - trying to fix it (almost done). --- src/libseqarrange/src/seq_interface.cpp | 35 ++++++-- src/libseqarrange/src/seq_sequential.cpp | 61 +++++++++----- src/libseqarrange/src/seq_sequential.hpp | 15 ++-- src/libseqarrange/test/seq_test_interface.cpp | 84 +++++++++++++++---- 4 files changed, 138 insertions(+), 57 deletions(-) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 77b2112354..2c5c38de57 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -380,7 +380,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver #endif int progress_objects_done = 0; - int progress_objects_total = objects_to_print.size(); + int progress_object_phases_done = 0; + int progress_object_phases_total = objects_to_print.size() * SEQ_PROGRESS_PHASES_PER_OBJECT; do { @@ -396,7 +397,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver #endif bool optimized; - + + printf("Object phases A1: %d, %d\n", progress_object_phases_done, solvable_objects.size()); optimized = optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(solver_configuration, poly_positions_X, poly_positions_Y, @@ -404,9 +406,10 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver solvable_objects, decided_polygons, remaining_polygons, - progress_objects_done, - progress_objects_total, + progress_object_phases_done, + progress_object_phases_total, progress_callback); + printf("Object phases A2: %d,%d,%d\n", progress_object_phases_done, decided_polygons.size(), remaining_polygons.size()); #ifdef DEBUG { @@ -454,7 +457,16 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); } - progress_objects_done += decided_polygons.size(); + printf("Object phases B: %d\n", progress_object_phases_done); + /* + if (!decided_polygons.empty()) + { + progress_objects_done += decided_polygons.size(); + progress_object_phases_done = (progress_object_phases_done % SEQ_PROGRESS_PHASES_PER_OBJECT) + + progress_objects_done * SEQ_PROGRESS_PHASES_PER_OBJECT; + } + printf("Object phases B1: %d\n", progress_object_phases_done); + */ } else { @@ -771,7 +783,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ #endif int progress_objects_done = 0; - int progress_objects_total = objects_to_print.size(); + int progress_object_phases_done = 0; + int progress_object_phases_total = objects_to_print.size() * SEQ_PROGRESS_PHASES_PER_OBJECT; do { @@ -795,8 +808,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ solvable_objects, decided_polygons, remaining_polygons, - progress_objects_done, - progress_objects_total, + progress_object_phases_done, + progress_object_phases_total, progress_callback); #ifdef DEBUG @@ -845,7 +858,11 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); } - progress_objects_done += decided_polygons.size(); + if (!decided_polygons.empty()) + { + progress_objects_done += decided_polygons.size(); + progress_object_phases_done = progress_objects_done * SEQ_PROGRESS_PHASES_PER_OBJECT; + } } else { diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 2c0cfb2fae..dd0d685864 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -8860,7 +8860,8 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver const ProgressRange &progress_range, std::function progress_callback) { - z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); + printf("Progress range: %d -- %d\n", progress_range.progress_min, progress_range.progress_max); coord_t last_solvable_bounding_box_size = -1; @@ -8874,7 +8875,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver coord_t half_y_min = 0; coord_t half_y_max = box_half_y_max; - int progress_total_estimation = MAX(1,std::log2(half_x_max - half_x_min)); + int progress_total_estimation = MAX(1, std::log2(half_x_max - half_x_min)); int progress = 0; while ((half_x_max - half_x_min) > 1 && (half_y_max - half_y_min) > 1) @@ -9106,7 +9107,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver printf("Printing solver status:\n"); cout << Solver << "\n"; */ - progress_callback(progress_range.progress_min + (progress_range.progress_max - progress_range.progress_min) * progress / progress_total_estimation); + progress_callback(progress_range.progress_min + (progress_range.progress_max - progress_range.progress_min) * progress / progress_total_estimation); if (refined_sat) { @@ -9212,7 +9213,7 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver } #endif - ++progress; + progress = MIN(progress + 1, progress_total_estimation); progress_callback(progress_range.progress_min + (progress_range.progress_max - progress_range.progress_min) * progress / progress_total_estimation); } progress_callback(progress_range.progress_max); @@ -10262,8 +10263,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, - int progress_objects_done, - int progress_total_objects, + int &progress_object_phases_done, + int progress_total_object_phases, std::function progress_callback) { std::vector undecided; @@ -10419,7 +10420,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_object_phases_done)) / progress_total_object_phases); optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, z_context, @@ -10438,8 +10439,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So polygons, unreachable_polygons, presence_assumptions, - ProgressRange((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects, - (SEQ_PROGRESS_RANGE * (decided_polygons.size() + (progress_objects_done + 1))) / progress_total_objects), + ProgressRange((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases, + (SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + (progress_object_phases_done + 1))) / progress_total_object_phases), progress_callback); if (optimized) @@ -10467,11 +10468,10 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases); return true; } - - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases); break; } else @@ -10481,13 +10481,14 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif + ++progress_object_phases_done; remaining_local.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); } missing.push_back(undecided.back()); undecided.pop_back(); --object_group_size; - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases); } std::reverse(remaining_local.begin(), remaining_local.end()); @@ -10534,8 +10535,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So const std::vector &solvable_objects, std::vector &decided_polygons, std::vector &remaining_polygons, - int progress_objects_done, - int progress_total_objects, + int &progress_object_phases_done, + int progress_total_object_phases, std::function progress_callback) { std::vector undecided; @@ -10703,8 +10704,9 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); - + printf("Top call 1\n"); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); + optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, z_context, solver_configuration, @@ -10722,12 +10724,14 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So polygons, unreachable_polygons, presence_assumptions, - ProgressRange((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects, - (SEQ_PROGRESS_RANGE * (decided_polygons.size() + (progress_objects_done + 1))) / progress_total_objects), + ProgressRange((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases, + (SEQ_PROGRESS_RANGE * (progress_object_phases_done + SEQ_PROGRESS_PHASES_PER_OBJECT / 2)) / progress_total_object_phases), progress_callback); + printf("Optimo: %d\n", optimized); if (optimized) { + printf("alpha 1\n"); /* printf("Printing solver status:\n"); cout << z_solver << "\n"; @@ -10742,6 +10746,9 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; dec_values_T[undecided[i]] = local_values_T[undecided[i]]; decided_polygons.push_back(undecided[i]); + + int progress_phase_starter = progress_object_phases_done % SEQ_PROGRESS_PHASES_PER_OBJECT; + progress_object_phases_done += progress_phase_starter > 0 ? SEQ_PROGRESS_PHASES_PER_OBJECT - progress_phase_starter : SEQ_PROGRESS_PHASES_PER_OBJECT; } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); @@ -10751,27 +10758,32 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + printf("Top call 2\n"); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); return true; } - - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + + printf("Top call 3\n"); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); break; } else { + printf("alpha 2\n"); #ifdef DEBUG { printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif + printf("Phase increasing\n"); remaining_local.push_back(undecided.back()); } missing.push_back(undecided.back()); undecided.pop_back(); --object_group_size; - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_objects_done)) / progress_total_objects); + printf("Top call 4\n"); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); } std::reverse(remaining_local.begin(), remaining_local.end()); @@ -10800,12 +10812,15 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So remaining_polygons.push_back(curr_polygon); } } + progress_object_phases_done += SEQ_PROGRESS_PHASES_PER_OBJECT / 2; + printf("Complete exit\n"); return true; } } assert(remaining_polygons.empty()); } assert(remaining_polygons.empty()); + printf("Complete exit 2\n"); return true; } diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index 2a97a022a4..052f0b2dfd 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -55,9 +55,10 @@ namespace Sequential #define SEQ_Z3_SOLVER_TIMEOUT "8000" -const coord_t SEQ_SVG_SCALE_FACTOR = 50000; -const int SEQ_GROUND_PRESENCE_TIME = 32; -const int SEQ_PROGRESS_RANGE = 100; +const coord_t SEQ_SVG_SCALE_FACTOR = 50000; +const int SEQ_GROUND_PRESENCE_TIME = 32; +const int SEQ_PROGRESS_RANGE = 100; +const int SEQ_PROGRESS_PHASES_PER_OBJECT = 2; const int64_t SEQ_RATIONAL_PRECISION = 1000000; const double SEQ_DECIMATION_TOLERANCE = 400000.0; @@ -1598,8 +1599,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, - int progress_objects_done, - int progress_total_objects, + int &progress_object_phases_done, + int progress_total_object_phases, std::function progress_callback = [](int progress){}); bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const SolverConfiguration &solver_configuration, @@ -1609,8 +1610,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So const std::vector &solvable_objects, std::vector &decided_polygons, std::vector &remaining_polygons, - int progress_objects_done, - int progress_total_objects, + int &progress_object_phases_done, + int progress_total_object_phases, std::function progress_callback = [](int progress){}); /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index 9763afbeca..574e5ac74c 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -114,7 +114,7 @@ void save_import_data(const std::string &filename, /*----------------------------------------------------------------*/ - +/* TEST_CASE("Interface test 1", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -128,33 +128,43 @@ TEST_CASE("Interface test 1", "[Sequential Arrangement Interface]") printf("Loading objects ...\n"); std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + REQUIRE(objects_to_print.size() > 0); + printf("Loading objects ... finished\n"); std::vector scheduled_plates; - printf("Scheduling objects for sequential print ...\n"); + printf("Scheduling objects for sequential print ...\n"); + int result = schedule_ObjectsForSequentialPrint(solver_configuration, objects_to_print, scheduled_plates); + REQUIRE(result == 0); if (result == 0) { printf("Object scheduling for sequential print SUCCESSFUL !\n"); printf("Number of plates: %ld\n", scheduled_plates.size()); + REQUIRE(scheduled_plates.size() > 0); for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + REQUIRE(scheduled_plates[plate].scheduled_objects.size() > 0); for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { - cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + REQUIRE(scheduled_object.x >= 0); + REQUIRE(scheduled_object.x <= solver_configuration.x_plate_bounding_box_size * SEQ_SLICER_SCALE_FACTOR); + REQUIRE(scheduled_object.y >= 0); + REQUIRE(scheduled_object.y <= solver_configuration.y_plate_bounding_box_size * SEQ_SLICER_SCALE_FACTOR); } } } else { printf("Something went WRONG during sequential scheduling (code: %d)\n", result); - } + } finish = clock(); @@ -192,19 +202,26 @@ TEST_CASE("Interface test 2", "[Sequential Arrangement Interface]") box_unreachable_zones, scheduled_plates); + REQUIRE(result == 0); if (result == 0) { printf("Object scheduling for sequential print SUCCESSFUL !\n"); printf("Number of plates: %ld\n", scheduled_plates.size()); + REQUIRE(scheduled_plates.size() > 0); for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + REQUIRE(scheduled_plates[plate].scheduled_objects.size() > 0); for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { - cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + REQUIRE(scheduled_object.x >= 0); + REQUIRE(scheduled_object.x <= solver_configuration.x_plate_bounding_box_size * SEQ_SLICER_SCALE_FACTOR); + REQUIRE(scheduled_object.y >= 0); + REQUIRE(scheduled_object.y <= solver_configuration.y_plate_bounding_box_size * SEQ_SLICER_SCALE_FACTOR); } } } @@ -229,7 +246,10 @@ TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") start = clock(); PrinterGeometry printer_geometry; - if (load_printer_geometry("printer_geometry.mk4.txt", printer_geometry) != 0) + int result = load_printer_geometry("printer_geometry.mk4.txt", printer_geometry); + REQUIRE(result == 0); + + if (result != 0) { printf("Printer geometry load error.\n"); return; @@ -237,6 +257,8 @@ TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") printf("x_size: %d\n", printer_geometry.x_size); printf("y_size: %d\n", printer_geometry.y_size); + REQUIRE(printer_geometry.x_size > 0); + REQUIRE(printer_geometry.y_size > 0); for (const auto& convex_height: printer_geometry.convex_heights) { @@ -247,8 +269,8 @@ TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") { cout << "box_height:" << box_height << endl; } - printf("extruder slices:\n"); + REQUIRE(printer_geometry.extruder_slices.size() > 0); for (std::map >::const_iterator extruder_slice = printer_geometry.extruder_slices.begin(); extruder_slice != printer_geometry.extruder_slices.end(); ++extruder_slice) { @@ -290,7 +312,8 @@ TEST_CASE("Interface test 4", "[Sequential Arrangement Interface]") printf("Loading printer geometry ...\n"); int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); - + + REQUIRE(result == 0); if (result != 0) { printf("Cannot load printer geometry (code: %d).\n", result); @@ -304,19 +327,25 @@ TEST_CASE("Interface test 4", "[Sequential Arrangement Interface]") scheduled_plates = schedule_ObjectsForSequentialPrint(solver_configuration, printer_geometry, - objects_to_print); + objects_to_print); printf("Object scheduling for sequential print SUCCESSFUL !\n"); printf("Number of plates: %ld\n", scheduled_plates.size()); + REQUIRE(scheduled_plates.size() > 0); for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + REQUIRE(scheduled_plates[plate].scheduled_objects.size() > 0); for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { - cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + REQUIRE(scheduled_object.x >= 0); + REQUIRE(scheduled_object.x <= printer_geometry.x_size); + REQUIRE(scheduled_object.y >= 0); + REQUIRE(scheduled_object.y <= printer_geometry.y_size); } } @@ -348,6 +377,7 @@ TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") printf("Loading printer geometry ...\n"); int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); + REQUIRE(result == 0); if (result != 0) { printf("Cannot load printer geometry (code: %d).\n", result); @@ -362,19 +392,27 @@ TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") scheduled_plates = schedule_ObjectsForSequentialPrint(solver_configuration, printer_geometry, objects_to_print, - [](int progress) { printf("Progress: %d\n", progress); }); + [](int progress) { printf("Progress: %d\n", progress); + REQUIRE(progress >= 0); + REQUIRE(progress <= 100); }); printf("Object scheduling for sequential print SUCCESSFUL !\n"); printf("Number of plates: %ld\n", scheduled_plates.size()); + REQUIRE(scheduled_plates.size() > 0); for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + REQUIRE(scheduled_plates[plate].scheduled_objects.size() > 0); for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { - cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + REQUIRE(scheduled_object.x >= 0); + REQUIRE(scheduled_object.x <= printer_geometry.x_size); + REQUIRE(scheduled_object.y >= 0); + REQUIRE(scheduled_object.y <= printer_geometry.y_size); } } @@ -388,9 +426,9 @@ TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") bool printable = check_ScheduledObjectsForSequentialPrintability(solver_configuration, printer_geometry, objects_to_print, - scheduled_plates); - + scheduled_plates); printf(" Scheduled/arranged objects are sequentially printable: %s\n", (printable ? "YES" : "NO")); + REQUIRE(printable); printf("Checking sequential printability ... finished\n"); @@ -399,7 +437,7 @@ TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") printf("Testing interface 5 ... finished\n"); } - +*/ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") { @@ -415,6 +453,7 @@ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") printf("Loading objects ...\n"); std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + REQUIRE(objects_to_print.size() > 0); printf("Loading objects ... finished\n"); for (auto& object_to_print: objects_to_print) @@ -426,7 +465,7 @@ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") printf("Loading printer geometry ...\n"); int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); - + REQUIRE(result == 0); if (result != 0) { printf("Cannot load printer geometry (code: %d).\n", result); @@ -441,19 +480,27 @@ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") scheduled_plates = schedule_ObjectsForSequentialPrint(solver_configuration, printer_geometry, objects_to_print, - [](int progress) { printf("Progress: %d\n", progress); }); + [](int progress) { printf("Progress: %d\n", progress); + REQUIRE(progress >= 0); + REQUIRE(progress <= 100); }); printf("Object scheduling for sequential print SUCCESSFUL !\n"); printf("Number of plates: %ld\n", scheduled_plates.size()); + REQUIRE(scheduled_plates.size() > 0); for (unsigned int plate = 0; plate < scheduled_plates.size(); ++plate) { printf(" Number of objects on plate: %ld\n", scheduled_plates[plate].scheduled_objects.size()); + REQUIRE(scheduled_plates[plate].scheduled_objects.size() > 0); for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { - cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; + REQUIRE(scheduled_object.x >= 0); + REQUIRE(scheduled_object.x <= printer_geometry.x_size); + REQUIRE(scheduled_object.y >= 0); + REQUIRE(scheduled_object.y <= printer_geometry.y_size); } } @@ -470,6 +517,7 @@ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") scheduled_plates); printf(" Scheduled/arranged objects are sequentially printable: %s\n", (printable ? "YES" : "NO")); + REQUIRE(printable); printf("Checking sequential printability ... finished\n"); From c8769e9b7024f949e5a6ef880ee2b45033a834c9 Mon Sep 17 00:00:00 2001 From: surynek Date: Sun, 1 Dec 2024 19:06:25 +0100 Subject: [PATCH 25/88] Bug fixes and improvements of progress bar and making test more automated. --- src/libseqarrange/src/seq_interface.cpp | 44 +- src/libseqarrange/src/seq_sequential.cpp | 69 +- src/libseqarrange/src/seq_sequential.hpp | 10 +- src/libseqarrange/src/seq_version.hpp | 2 +- .../test/seq_test_arrangement.cpp | 9 +- src/libseqarrange/test/seq_test_interface.cpp | 6 +- src/libseqarrange/test/seq_test_polygon.cpp | 1022 ++++++++--------- .../test/seq_test_preprocess.cpp | 147 ++- .../test/seq_test_sequential.cpp | 600 ++++------ 9 files changed, 840 insertions(+), 1069 deletions(-) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 2c5c38de57..120ec293af 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -379,9 +379,8 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver } #endif - int progress_objects_done = 0; int progress_object_phases_done = 0; - int progress_object_phases_total = objects_to_print.size() * SEQ_PROGRESS_PHASES_PER_OBJECT; + int progress_object_phases_total = SEQ_MAKE_EXTRA_PROGRESS((objects_to_print.size() * SEQ_PROGRESS_PHASES_PER_OBJECT)); do { @@ -398,7 +397,6 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver bool optimized; - printf("Object phases A1: %d, %d\n", progress_object_phases_done, solvable_objects.size()); optimized = optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(solver_configuration, poly_positions_X, poly_positions_Y, @@ -409,7 +407,6 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver progress_object_phases_done, progress_object_phases_total, progress_callback); - printf("Object phases A2: %d,%d,%d\n", progress_object_phases_done, decided_polygons.size(), remaining_polygons.size()); #ifdef DEBUG { @@ -457,16 +454,6 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); } - printf("Object phases B: %d\n", progress_object_phases_done); - /* - if (!decided_polygons.empty()) - { - progress_objects_done += decided_polygons.size(); - progress_object_phases_done = (progress_object_phases_done % SEQ_PROGRESS_PHASES_PER_OBJECT) - + progress_objects_done * SEQ_PROGRESS_PHASES_PER_OBJECT; - } - printf("Object phases B1: %d\n", progress_object_phases_done); - */ } else { @@ -508,7 +495,9 @@ void schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver scheduled_plates.push_back(scheduled_plate); } - while (!remaining_polygons.empty()); + while (!remaining_polygons.empty()); + + progress_callback(SEQ_PROGRESS_RANGE); #ifdef PROFILE { @@ -782,9 +771,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ } #endif - int progress_objects_done = 0; int progress_object_phases_done = 0; - int progress_object_phases_total = objects_to_print.size() * SEQ_PROGRESS_PHASES_PER_OBJECT; + int progress_object_phases_total = SEQ_MAKE_EXTRA_PROGRESS((objects_to_print.size() * SEQ_PROGRESS_PHASES_PER_OBJECT)); do { @@ -858,11 +846,6 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); } - if (!decided_polygons.empty()) - { - progress_objects_done += decided_polygons.size(); - progress_object_phases_done = progress_objects_done * SEQ_PROGRESS_PHASES_PER_OBJECT; - } } else { @@ -902,7 +885,9 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration &solver_ scheduled_plates.push_back(scheduled_plate); } - while (!remaining_polygons.empty()); + while (!remaining_polygons.empty()); + + progress_callback(SEQ_PROGRESS_RANGE); #ifdef PROFILE { @@ -1099,8 +1084,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration } #endif - int progress_objects_done = 0; - int progress_objects_total = objects_to_print.size(); + int progress_object_phases_done = 0; + int progress_object_phases_total = SEQ_MAKE_EXTRA_PROGRESS((objects_to_print.size() * SEQ_PROGRESS_PHASES_PER_OBJECT)); do { @@ -1124,8 +1109,8 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration solvable_objects, decided_polygons, remaining_polygons, - progress_objects_done, - progress_objects_total, + progress_object_phases_done, + progress_object_phases_total, progress_callback); @@ -1175,7 +1160,6 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration scheduled_plate.scheduled_objects.push_back(ScheduledObject(original_index->second, X, Y)); } - progress_objects_done += decided_polygons.size(); } else { @@ -1215,7 +1199,9 @@ int schedule_ObjectsForSequentialPrint(const SolverConfiguration scheduled_plates.push_back(scheduled_plate); } - while (!remaining_polygons.empty()); + while (!remaining_polygons.empty()); + + progress_callback(SEQ_PROGRESS_RANGE); #ifdef PROFILE { diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index dd0d685864..92907ab452 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -8861,7 +8861,12 @@ bool optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z3::solver std::function progress_callback) { z3::set_param("timeout", solver_configuration.optimization_timeout.c_str()); - printf("Progress range: %d -- %d\n", progress_range.progress_min, progress_range.progress_max); + + #ifdef DEBUG + { + printf("Progress range: %d -- %d\n", progress_range.progress_min, progress_range.progress_max); + } + #endif coord_t last_solvable_bounding_box_size = -1; @@ -10220,8 +10225,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So const std::vector &undecided_polygons, std::vector &decided_polygons, std::vector &remaining_polygons, - int objects_done, - int total_objects, + int progress_object_phases_done, + int progress_total_object_phases, std::function progress_callback) { std::vector > _unreachable_polygons; @@ -10242,8 +10247,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So undecided_polygons, decided_polygons, remaining_polygons, - objects_done, - total_objects, + progress_object_phases_done, + progress_total_object_phases, progress_callback); } @@ -10420,7 +10425,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() + progress_object_phases_done)) / progress_total_object_phases); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, z_context, @@ -10439,8 +10444,10 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So polygons, unreachable_polygons, presence_assumptions, - ProgressRange((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases, - (SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + (progress_object_phases_done + 1))) / progress_total_object_phases), + (progress_object_phases_done < progress_total_object_phases ? + ProgressRange((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases, + (SEQ_PROGRESS_RANGE * (progress_object_phases_done + 1)) / progress_total_object_phases) : + ProgressRange(SEQ_PROGRESS_RANGE, SEQ_PROGRESS_RANGE)), progress_callback); if (optimized) @@ -10459,6 +10466,12 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; dec_values_T[undecided[i]] = local_values_T[undecided[i]]; decided_polygons.push_back(undecided[i]); + + if (progress_object_phases_done < progress_total_object_phases) + { + int progress_phase_starter = progress_object_phases_done % SEQ_PROGRESS_PHASES_PER_OBJECT; + progress_object_phases_done += progress_phase_starter > 0 ? SEQ_PROGRESS_PHASES_PER_OBJECT - progress_phase_starter : SEQ_PROGRESS_PHASES_PER_OBJECT; + } } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); @@ -10468,10 +10481,10 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); return true; } - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); break; } else @@ -10481,14 +10494,17 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif - ++progress_object_phases_done; + if (progress_object_phases_done < progress_total_object_phases) + { + ++progress_object_phases_done; + } remaining_local.push_back(undecided_polygons[curr_polygon + object_group_size - 1]); } missing.push_back(undecided.back()); undecided.pop_back(); --object_group_size; - progress_callback((SEQ_PROGRESS_RANGE * (decided_polygons.size() * SEQ_PROGRESS_PHASES_PER_OBJECT + progress_object_phases_done)) / progress_total_object_phases); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); } std::reverse(remaining_local.begin(), remaining_local.end()); @@ -10704,7 +10720,6 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } #endif - printf("Top call 1\n"); progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); optimized = optimize_ConsequentialWeakPolygonNonoverlappingBinaryCentered(z_solver, @@ -10724,14 +10739,14 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So polygons, unreachable_polygons, presence_assumptions, - ProgressRange((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases, - (SEQ_PROGRESS_RANGE * (progress_object_phases_done + SEQ_PROGRESS_PHASES_PER_OBJECT / 2)) / progress_total_object_phases), + (progress_object_phases_done < progress_total_object_phases ? + ProgressRange((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases, + (SEQ_PROGRESS_RANGE * (progress_object_phases_done + 1)) / progress_total_object_phases) : + ProgressRange(SEQ_PROGRESS_RANGE, SEQ_PROGRESS_RANGE)), progress_callback); - printf("Optimo: %d\n", optimized); if (optimized) { - printf("alpha 1\n"); /* printf("Printing solver status:\n"); cout << z_solver << "\n"; @@ -10747,8 +10762,11 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So dec_values_T[undecided[i]] = local_values_T[undecided[i]]; decided_polygons.push_back(undecided[i]); - int progress_phase_starter = progress_object_phases_done % SEQ_PROGRESS_PHASES_PER_OBJECT; - progress_object_phases_done += progress_phase_starter > 0 ? SEQ_PROGRESS_PHASES_PER_OBJECT - progress_phase_starter : SEQ_PROGRESS_PHASES_PER_OBJECT; + if (progress_object_phases_done < progress_total_object_phases) + { + int progress_phase_starter = progress_object_phases_done % SEQ_PROGRESS_PHASES_PER_OBJECT; + progress_object_phases_done += progress_phase_starter > 0 ? SEQ_PROGRESS_PHASES_PER_OBJECT - progress_phase_starter : SEQ_PROGRESS_PHASES_PER_OBJECT; + } } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); @@ -10758,31 +10776,29 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { - printf("Top call 2\n"); progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); return true; } - - printf("Top call 3\n"); progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); break; } else { - printf("alpha 2\n"); #ifdef DEBUG { printf("Remaining polygon: %d\n", curr_polygon + object_group_size - 1); } #endif - printf("Phase increasing\n"); + if (progress_object_phases_done < progress_total_object_phases) + { + ++progress_object_phases_done; + } remaining_local.push_back(undecided.back()); } missing.push_back(undecided.back()); undecided.pop_back(); --object_group_size; - printf("Top call 4\n"); progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); } @@ -10812,15 +10828,12 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So remaining_polygons.push_back(curr_polygon); } } - progress_object_phases_done += SEQ_PROGRESS_PHASES_PER_OBJECT / 2; - printf("Complete exit\n"); return true; } } assert(remaining_polygons.empty()); } assert(remaining_polygons.empty()); - printf("Complete exit 2\n"); return true; } diff --git a/src/libseqarrange/src/seq_sequential.hpp b/src/libseqarrange/src/seq_sequential.hpp index 052f0b2dfd..07d4da5cd9 100644 --- a/src/libseqarrange/src/seq_sequential.hpp +++ b/src/libseqarrange/src/seq_sequential.hpp @@ -51,14 +51,18 @@ namespace Sequential #define SEQ_INTERSECTION_REPULSION_MIN "-0.01" #define SEQ_INTERSECTION_REPULSION_MAX "1.01" #define SEQ_TEMPORAL_ABSENCE_THRESHOLD "-16" -#define SEQ_TEMPORAL_PRESENCE_THRESHOLD "16" +#define SEQ_TEMPORAL_PRESENCE_THRESHOLD "16" -#define SEQ_Z3_SOLVER_TIMEOUT "8000" +#define SEQ_Z3_SOLVER_TIMEOUT "8000" const coord_t SEQ_SVG_SCALE_FACTOR = 50000; const int SEQ_GROUND_PRESENCE_TIME = 32; const int SEQ_PROGRESS_RANGE = 100; -const int SEQ_PROGRESS_PHASES_PER_OBJECT = 2; +const int SEQ_PROGRESS_PHASES_PER_OBJECT = 4; +const int SEQ_PROGRESS_EXTRA_PHASES = 4 * SEQ_PROGRESS_PHASES_PER_OBJECT; +const double SEQ_PROGRESS_EXTRA_FACTOR = 1.15; + +#define SEQ_MAKE_EXTRA_PROGRESS(x) (((int)((x) * SEQ_PROGRESS_EXTRA_FACTOR / SEQ_PROGRESS_PHASES_PER_OBJECT)) * SEQ_PROGRESS_PHASES_PER_OBJECT) const int64_t SEQ_RATIONAL_PRECISION = 1000000; const double SEQ_DECIMATION_TOLERANCE = 400000.0; diff --git a/src/libseqarrange/src/seq_version.hpp b/src/libseqarrange/src/seq_version.hpp index 2cb62d53a9..e8bc06c6ee 100644 --- a/src/libseqarrange/src/seq_version.hpp +++ b/src/libseqarrange/src/seq_version.hpp @@ -2,6 +2,6 @@ #define __SEQ_VERSION_HPP__ -#define SEQ_SEQUENTIAL_BUILD "193" +#define SEQ_SEQUENTIAL_BUILD "200" #endif /* __SEQ_VERSION_HPP__ */ diff --git a/src/libseqarrange/test/seq_test_arrangement.cpp b/src/libseqarrange/test/seq_test_arrangement.cpp index acb022d6ae..a297f95cf3 100644 --- a/src/libseqarrange/test/seq_test_arrangement.cpp +++ b/src/libseqarrange/test/seq_test_arrangement.cpp @@ -298,14 +298,12 @@ public: , high_Obj1_y(space_vars[7]) , high_Obj1_t(time_vars[3]) { - printf("alpha 1\n"); BoolVar low_Obj1_present = expr(*this, low_Obj1_t >= 0); BoolVar low_Obj2_present = expr(*this, low_Obj2_t >= 0); BoolVar low_Obj3_present = expr(*this, low_Obj3_t >= 0); BoolVar high_Obj1_present = expr(*this, high_Obj1_t >= 0); //BoolVar low_Obj1_above_high_Obj1 = expr(*this, low_Obj1_t >= high_Obj1_t); - printf("alpha 2\n"); BoolVarArgs objects_present(4); objects_present[0] = low_Obj1_present; objects_present[1] = low_Obj2_present; @@ -318,7 +316,7 @@ public: IntVar kine_Obj1_x(kine_vars[0]); IntVar kine_Obj1_y(kine_vars[1]); - printf("alpha 3\n"); + kine_widths[0] = kine_width; kine_heights[0] = kine_height; @@ -338,7 +336,6 @@ public: heights[2] = low_Obj3_height; heights[3] = high_Obj1_height; //heights[3] = kine_height; - printf("alpha 4\n"); IntVarArgs Xs(4); Xs[0] = low_Obj1_x; @@ -353,10 +350,8 @@ public: Ys[2] = low_Obj3_y; Ys[3] = high_Obj1_y; //Ys[3] = kine_Obj1_y; - printf("alpha 5\n"); nooverlap(*this, Xs, widths, Ys, heights/*, objects_present*/); - printf("alpha 6\n"); rel(*this, low_Obj1_t >= low_Obj2_t + low_Obj2_duration || low_Obj2_t >= low_Obj1_t + low_Obj1_duration); rel(*this, low_Obj1_t >= low_Obj3_t + low_Obj3_duration || low_Obj3_t >= low_Obj1_t + low_Obj1_duration); @@ -393,12 +388,10 @@ public: rel(*this, high_Obj1_t < 10); rel(*this, high_Obj1_x == 0); - printf("alpha 7\n"); branch(*this, space_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); branch(*this, time_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); branch(*this, kine_vars, INT_VAR_SIZE_MIN(), INT_VAL_MIN()); - printf("alpha 8\n"); }; SimpleSequentialProblem(SimpleSequentialProblem &s) diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index 574e5ac74c..c148c76907 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -114,7 +114,7 @@ void save_import_data(const std::string &filename, /*----------------------------------------------------------------*/ -/* + TEST_CASE("Interface test 1", "[Sequential Arrangement Interface]") { clock_t start, finish; @@ -246,7 +246,7 @@ TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") start = clock(); PrinterGeometry printer_geometry; - int result = load_printer_geometry("printer_geometry.mk4.txt", printer_geometry); + int result = load_printer_geometry("printers/printer_geometry.mk4.txt", printer_geometry); REQUIRE(result == 0); if (result != 0) @@ -437,7 +437,7 @@ TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") printf("Testing interface 5 ... finished\n"); } -*/ + TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") { diff --git a/src/libseqarrange/test/seq_test_polygon.cpp b/src/libseqarrange/test/seq_test_polygon.cpp index 56f0e10d6e..10b39fd294 100644 --- a/src/libseqarrange/test/seq_test_polygon.cpp +++ b/src/libseqarrange/test/seq_test_polygon.cpp @@ -48,7 +48,6 @@ using namespace Sequential; /*----------------------------------------------------------------*/ - TEST_CASE("Polygon test 1", "[Polygon]") { printf("Testing polygon 1 ...\n"); @@ -60,6 +59,7 @@ TEST_CASE("Polygon test 1", "[Polygon]") Point point = polygon_1[i]; printf("%d,%d\n", point.x(), point.y()); } + REQUIRE(polygon_1.size() > 0); printf("Testing polygon 1 ... finished\n"); } @@ -89,6 +89,8 @@ TEST_CASE("Polygon test 2", "[Polygon]") printf("hull %d: %d,%d\n", i, point.x(), point.y()); } + REQUIRE(hull_1.size() > 0); + if (hull_1.size() >= 2) { const Point &point_1 = hull_1[0]; @@ -125,14 +127,19 @@ TEST_CASE("Polygon test 2", "[Polygon]") } }; - bool ins1 = is_inside(point_1); + bool ins1 = is_inside(point_1); printf("%s\n", ins1 ? "yes" : "no"); + REQUIRE(ins1); + bool ins2 = is_inside(point_2); - printf("%s\n", ins2 ? "yes" : "no"); + printf("%s\n", ins2 ? "yes" : "no"); + REQUIRE(ins2); + bool ins3 = is_inside(point_1 + point_2); - printf("%s\n", ins3 ? "yes" : "no"); + printf("%s\n", ins3 ? "yes" : "no"); + bool ins4 = is_inside(point_1 - point_2); - printf("%s\n", ins4 ? "yes" : "no"); + printf("%s\n", ins4 ? "yes" : "no"); } } @@ -205,16 +212,22 @@ TEST_CASE("Polygon test 3", "[Polygon]") T_parameters[3], lines[3]); - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif + bool sat = false; switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } @@ -233,11 +246,17 @@ TEST_CASE("Polygon test 3", "[Polygon]") { break; } - } + } + REQUIRE(sat); z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif finish = clock(); @@ -246,36 +265,39 @@ TEST_CASE("Polygon test 3", "[Polygon]") { printf("Variable:%s ", z_model[i].name().str().c_str()); - cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; - double value = z_model.get_const_interp(z_model[i]).as_double(); + #ifdef DEBUG + { + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + + printf("value: %.3f\n", value); - printf("value: %.3f\n", value); - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); break; - } - default: - { + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); break; - } - } - */ + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + } + #endif } printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); @@ -351,10 +373,13 @@ TEST_CASE("Polygon test 4", "[Polygon]") printf("Printing smt status:\n"); cout << z_solver.to_smt2() << "\n"; + bool sat = false; + switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } @@ -373,7 +398,8 @@ TEST_CASE("Polygon test 4", "[Polygon]") { break; } - } + } + REQUIRE(sat); z3::model z_model(z_solver.get_model()); printf("Printing model:\n"); @@ -391,8 +417,8 @@ TEST_CASE("Polygon test 4", "[Polygon]") printf("value: %.3f\n", value); - //cout << float(z_model[i]) << "\n"; - /* + cout << float(z_model[i]) << "\n"; + switch (z_model.get_const_interp(z_model[i]).bool_value()) { case Z3_L_FALSE: @@ -415,7 +441,6 @@ TEST_CASE("Polygon test 4", "[Polygon]") break; } } - */ } printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); @@ -486,16 +511,22 @@ TEST_CASE("Polygon test 5", "[Polygon]") Y_positions[1], poly_lines[3]); - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif + bool sat = false; switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } @@ -514,11 +545,16 @@ TEST_CASE("Polygon test 5", "[Polygon]") { break; } - } + } + REQUIRE(sat); z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif finish = clock(); @@ -527,36 +563,39 @@ TEST_CASE("Polygon test 5", "[Polygon]") { printf("Variable:%s ", z_model[i].name().str().c_str()); - cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; - double value = z_model.get_const_interp(z_model[i]).as_double(); + #ifdef DEBUG + { + cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; + double value = z_model.get_const_interp(z_model[i]).as_double(); + + printf("value: %.3f\n", value); - printf("value: %.3f\n", value); - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); break; - } - default: - { + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } } - } - */ + #endif } printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); @@ -607,16 +646,22 @@ TEST_CASE("Polygon test 6", "[Polygon]") Y_positions[1], polygon_1); - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif + bool sat = false; switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } @@ -635,54 +680,61 @@ TEST_CASE("Polygon test 6", "[Polygon]") { break; } - } + } + REQUIRE(sat); z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif finish = clock(); printf("Printing interpretation:\n"); for (unsigned int i = 0; i < z_model.size(); ++i) { - printf("Variable:%s ", z_model[i].name().str().c_str()); - + printf("Variable:%s ", z_model[i].name().str().c_str()); cout << z_model.get_const_interp(z_model[i]).as_double() << "\n"; - double value = z_model.get_const_interp(z_model[i]).as_double(); z3::expr valo_1 = z_model.get_const_interp(z_model[i]); z3::expr deco_1 = expr(z_context.real_const("deco_1")); z3::expr lino_1 = (valo_1 * deco_1 == 0); + + #ifdef DEBUG + { + printf("value: %.3f\n", value); - printf("value: %.3f\n", value); - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); break; - } - default: - { + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } } - } - */ + #endif } printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); @@ -755,16 +807,22 @@ TEST_CASE("Polygon test 7", "[Polygon]") Y_positions[1], polygon_2); - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif + bool sat = false; switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } @@ -783,11 +841,17 @@ TEST_CASE("Polygon test 7", "[Polygon]") { break; } - } + } + REQUIRE(sat); z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif finish = clock(); @@ -820,51 +884,60 @@ TEST_CASE("Polygon test 7", "[Polygon]") poly_2_pos_y = value; } + #ifdef DEBUG + { + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + } + #endif - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); - break; - } - default: - { - break; - } - } - */ } printf("Positions: %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y); - /* - for (int i = 0; i < 2; ++i) - { - double value = X_positions[i].as_double(); - printf("Orig X: %.3f\n", value); + #ifdef DEBUG + { + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); - value = Y_positions[i].as_double(); - printf("Orig Y: %.3f\n", value); + value = Y_positi ons[i].as_double(); + printf("Orig Y: %.3f\n", value); + } } - */ + #endif SVG preview_svg("polygon_test_7.svg"); -// preview_svg.draw(polygon_1); -// preview_svg.draw(polygon_2); + #ifdef DEBUG + { + preview_svg.draw(polygon_1); + preview_svg.draw(polygon_2); + } + #endif preview_svg.Close(); @@ -960,11 +1033,6 @@ TEST_CASE("Polygon test 8", "[Polygon]") z3::solver z_solver(z_context); - /* - introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); - introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); - */ - introduce_PolygonOutsidePolygon(z_solver, z_context, X_positions[0], @@ -974,17 +1042,6 @@ TEST_CASE("Polygon test 8", "[Polygon]") Y_positions[1], polygon_2); - /* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[1], - Y_positions[1], - polygon_2, - X_positions[0], - Y_positions[0], - polygon_1); - */ - introduce_PolygonLineNonIntersection(z_solver, z_context, X_positions[0], @@ -1003,17 +1060,6 @@ TEST_CASE("Polygon test 8", "[Polygon]") Y_positions[2], polygon_3); - /* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[2], - Y_positions[2], - polygon_3, - X_positions[1], - Y_positions[1], - polygon_2); - */ - introduce_PolygonLineNonIntersection(z_solver, z_context, X_positions[1], @@ -1032,17 +1078,6 @@ TEST_CASE("Polygon test 8", "[Polygon]") Y_positions[2], polygon_3); -/* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[2], - Y_positions[2], - polygon_3, - X_positions[0], - Y_positions[0], - polygon_1); -*/ - introduce_PolygonLineNonIntersection(z_solver, z_context, X_positions[0], @@ -1052,12 +1087,16 @@ TEST_CASE("Polygon test 8", "[Polygon]") Y_positions[2], polygon_3); - - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif int last_solvable_decision_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y; @@ -1072,7 +1111,7 @@ TEST_CASE("Polygon test 8", "[Polygon]") assume_DecisionBox(X_positions[2], Y_positions[2], decision_box_size, decision_box_size, decision_box_assumptions); bool sat = false; - + switch (z_solver.check(decision_box_assumptions)) { case z3::sat: @@ -1102,8 +1141,13 @@ TEST_CASE("Polygon test 8", "[Polygon]") if (sat) { z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif printf("Printing interpretation:\n"); for (unsigned int i = 0; i < z_model.size(); ++i) @@ -1144,48 +1188,55 @@ TEST_CASE("Polygon test 8", "[Polygon]") { break; } - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) + + #ifdef DEBUG { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); break; - } - default: - { + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } } - } - */ + #endif + } finish = clock(); + REQUIRE(last_solvable_decision_box_size > 0); + printf("Solvable decision box: %d\n", last_solvable_decision_box_size); printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y); - /* - for (int i = 0; i < 2; ++i) - { - double value = X_positions[i].as_double(); - printf("Orig X: %.3f\n", value); + #ifdef DEBUG + { + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); - value = Y_positions[i].as_double(); - printf("Orig Y: %.3f\n", value); + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); } - */ + #endif SVG preview_svg("polygon_test_8.svg"); @@ -1262,11 +1313,6 @@ TEST_CASE("Polygon test 9", "[Polygon]") z3::solver z_solver(z_context); - /* - introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); - introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); - */ - introduce_PolygonOutsidePolygon(z_solver, z_context, X_positions[0], @@ -1275,16 +1321,6 @@ TEST_CASE("Polygon test 9", "[Polygon]") X_positions[1], Y_positions[1], polygon_2); -/* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[1], - Y_positions[1], - polygon_2, - X_positions[0], - Y_positions[0], - polygon_1); -*/ introduce_PolygonLineNonIntersection(z_solver, z_context, @@ -1303,16 +1339,7 @@ TEST_CASE("Polygon test 9", "[Polygon]") X_positions[2], Y_positions[2], polygon_3); -/* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[2], - Y_positions[2], - polygon_3, - X_positions[1], - Y_positions[1], - polygon_2); -*/ + introduce_PolygonLineNonIntersection(z_solver, z_context, X_positions[1], @@ -1330,16 +1357,6 @@ TEST_CASE("Polygon test 9", "[Polygon]") X_positions[2], Y_positions[2], polygon_3); -/* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[2], - Y_positions[2], - polygon_3, - X_positions[0], - Y_positions[0], - polygon_1); -*/ introduce_PolygonLineNonIntersection(z_solver, z_context, @@ -1350,12 +1367,16 @@ TEST_CASE("Polygon test 9", "[Polygon]") Y_positions[2], polygon_3); - - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y; @@ -1400,8 +1421,13 @@ TEST_CASE("Polygon test 9", "[Polygon]") if (sat) { z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif printf("Printing interpretation:\n"); for (unsigned int i = 0; i < z_model.size(); ++i) @@ -1442,48 +1468,54 @@ TEST_CASE("Polygon test 9", "[Polygon]") { break; } - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) + + #ifdef DEBUG { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); break; - } - default: - { + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } } - } - */ + #endif } finish = clock(); + REQUIRE(last_solvable_bounding_box_size > 0); printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y); - /* - for (int i = 0; i < 2; ++i) - { - double value = X_positions[i].as_double(); - printf("Orig X: %.3f\n", value); + #ifdef DEBUG + { + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); - value = Y_positions[i].as_double(); - printf("Orig Y: %.3f\n", value); + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } } - */ + #endif SVG preview_svg("polygon_test_9.svg"); @@ -1577,103 +1609,21 @@ TEST_CASE("Polygon test 10", "[Polygon]") polygons.push_back(polygon_3); polygons.push_back(polygon_4); - /* - introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); - introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); - */ - - /* - for (int i = 0; i < 3; ++i) - { - for (int j = i + 1; j < 4; ++j) - { - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[i], - Y_positions[i], - polygons[i], - X_positions[j], - Y_positions[j], - polygons[j]); - } - } - */ - -/* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[0], - Y_positions[0], - polygons[0], - X_positions[2], - Y_positions[2], - polygons[2]); - - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[0], - Y_positions[0], - polygons[0], - X_positions[1], - Y_positions[1], - polygons[1]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[0], - Y_positions[0], - polygons[0], - X_positions[3], - Y_positions[3], - polygons[3]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[1], - Y_positions[1], - polygons[1], - X_positions[3], - Y_positions[3], - polygons[3]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[1], - Y_positions[1], - polygons[1], - X_positions[2], - Y_positions[2], - polygons[2]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[2], - Y_positions[2], - polygons[2], - X_positions[3], - Y_positions[3], - polygons[3]); -*/ - -/* - introduce_PolygonWeakNonoverlapping(z_solver, - z_context, - X_positions, - Y_positions, - polygons); -*/ introduce_PolygonStrongNonoverlapping(z_solver, z_context, X_positions, Y_positions, polygons); - - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; @@ -1683,7 +1633,6 @@ TEST_CASE("Polygon test 10", "[Polygon]") { z3::expr_vector bounding_box_assumptions(z_context); - //assume_BedBoundingBox(X_positions, Y_positions, polygons, bounding_box_size, bounding_box_size, bounding_box_assumptions); assume_BedBoundingBox(X_positions[0], Y_positions[0], polygons[0], bounding_box_size, bounding_box_size, bounding_box_assumptions); assume_BedBoundingBox(X_positions[1], Y_positions[1], polygons[1], bounding_box_size, bounding_box_size, bounding_box_assumptions); assume_BedBoundingBox(X_positions[2], Y_positions[2], polygons[2], bounding_box_size, bounding_box_size, bounding_box_assumptions); @@ -1720,8 +1669,13 @@ TEST_CASE("Polygon test 10", "[Polygon]") if (sat) { z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif printf("Printing interpretation:\n"); for (unsigned int i = 0; i < z_model.size(); ++i) @@ -1770,35 +1724,41 @@ TEST_CASE("Polygon test 10", "[Polygon]") { break; } - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) + + #ifdef DEBUG { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); break; - } - default: - { + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } } - } - */ + #endif + } finish = clock(); + REQUIRE(last_solvable_bounding_box_size > 0); + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, @@ -1809,16 +1769,18 @@ TEST_CASE("Polygon test 10", "[Polygon]") poly_4_pos_x, poly_4_pos_y); - /* - for (int i = 0; i < 2; ++i) - { - double value = X_positions[i].as_double(); - printf("Orig X: %.3f\n", value); + #ifdef DEBUG + { + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); - value = Y_positions[i].as_double(); - printf("Orig Y: %.3f\n", value); + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } } - */ + #endif SVG preview_svg("polygon_test_10.svg"); @@ -1912,96 +1874,21 @@ TEST_CASE("Polygon test 11", "[Polygon]") polygons.push_back(polygon_3); polygons.push_back(polygon_4); - /* - introduce_DecisionBox(z_solver, X_positions[0], Y_positions[0], 200, 200); - introduce_DecisionBox(z_solver, X_positions[1], Y_positions[1], 200, 200); - */ - - /* - for (int i = 0; i < 3; ++i) - { - for (int j = i + 1; j < 4; ++j) - { - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[i], - Y_positions[i], - polygons[i], - X_positions[j], - Y_positions[j], - polygons[j]); - } - } - */ - -/* - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[0], - Y_positions[0], - polygons[0], - X_positions[2], - Y_positions[2], - polygons[2]); - - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[0], - Y_positions[0], - polygons[0], - X_positions[1], - Y_positions[1], - polygons[1]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[0], - Y_positions[0], - polygons[0], - X_positions[3], - Y_positions[3], - polygons[3]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[1], - Y_positions[1], - polygons[1], - X_positions[3], - Y_positions[3], - polygons[3]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[1], - Y_positions[1], - polygons[1], - X_positions[2], - Y_positions[2], - polygons[2]); - - introduce_PolygonOutsidePolygon(z_solver, - z_context, - X_positions[2], - Y_positions[2], - polygons[2], - X_positions[3], - Y_positions[3], - polygons[3]); -*/ - introduce_PolygonWeakNonoverlapping(z_solver, z_context, X_positions, Y_positions, polygons); - - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; @@ -2012,7 +1899,6 @@ TEST_CASE("Polygon test 11", "[Polygon]") printf("BB: %d\n", bounding_box_size); z3::expr_vector bounding_box_assumptions(z_context); - //assume_BedBoundingBox(X_positions, Y_positions, polygons, bounding_box_size, bounding_box_size, bounding_box_assumptions); assume_BedBoundingBox(X_positions[0], Y_positions[0], polygons[0], bounding_box_size, bounding_box_size, bounding_box_assumptions); assume_BedBoundingBox(X_positions[1], Y_positions[1], polygons[1], bounding_box_size, bounding_box_size, bounding_box_assumptions); assume_BedBoundingBox(X_positions[2], Y_positions[2], polygons[2], bounding_box_size, bounding_box_size, bounding_box_assumptions); @@ -2048,8 +1934,13 @@ TEST_CASE("Polygon test 11", "[Polygon]") if (sat) { z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif printf("Printing interpretation:\n"); for (unsigned int i = 0; i < z_model.size(); ++i) @@ -2156,13 +2047,17 @@ TEST_CASE("Polygon test 11", "[Polygon]") if (refined_sat) { - z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + z3::model z_model(z_solver.get_model()); + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif for (unsigned int i = 0; i < z_model.size(); ++i) { - //printf("Variable:%s ", z_model[i].name().str().c_str()); double value = z_model.get_const_interp(z_model[i]).as_double(); if (z_model[i].name().str() == "x_pos-0") @@ -2223,35 +2118,41 @@ TEST_CASE("Polygon test 11", "[Polygon]") { break; } - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) + + #ifdef DEBUG { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); break; - } - default: - { + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } } - } - */ + #endif + } finish = clock(); + REQUIRE(last_solvable_bounding_box_size > 0); + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); printf("Positions: %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f\n", poly_1_pos_x, poly_1_pos_y, @@ -2262,16 +2163,18 @@ TEST_CASE("Polygon test 11", "[Polygon]") poly_4_pos_x, poly_4_pos_y); - /* - for (int i = 0; i < 2; ++i) - { - double value = X_positions[i].as_double(); - printf("Orig X: %.3f\n", value); + #ifdef DEBUG + { + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); - value = Y_positions[i].as_double(); - printf("Orig Y: %.3f\n", value); + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } } - */ + #endif SVG preview_svg("polygon_test_11.svg"); @@ -2332,6 +2235,7 @@ TEST_CASE("Polygon test 12", "[Polygon]") polygons); finish = clock(); + REQUIRE(optimized); if (optimized) { @@ -2421,10 +2325,6 @@ TEST_CASE("Polygon test 13", "[Polygon]") string_map dec_var_names_map; - /* - z3::params z_parameters(z_context); - z_parameters.set("timeout", 1000); - */ Z3_global_param_set("timeout", "8000"); z3::solver z_solver(z_context); @@ -2458,6 +2358,7 @@ TEST_CASE("Polygon test 13", "[Polygon]") polygons); finish = clock(); + REQUIRE(optimized); if (optimized) { @@ -2601,11 +2502,7 @@ TEST_CASE("Polygon test 14", "[Polygon]") vector X_values; vector Y_values; - string_map dec_var_names_map; - - /* - Z3_global_param_set("timeout", "8000"); - */ + string_map dec_var_names_map; z3::solver z_solver(z_context); @@ -2805,6 +2702,8 @@ TEST_CASE("Polygon test 14", "[Polygon]") { printf("Polygon optimization FAILED.\n"); } + + REQUIRE(optimized); } printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); @@ -2856,10 +2755,6 @@ TEST_CASE("Polygon test 15", "[Polygon]") polygons.push_back(polygon_1); polygons.push_back(polygon_2); - /* - polygons.push_back(polygon_3); - polygons.push_back(polygon_4); - */ for (unsigned int index = 0; index < polygons.size(); ++index) { polygon_index_map.push_back(index); @@ -2867,11 +2762,6 @@ TEST_CASE("Polygon test 15", "[Polygon]") vector poly_positions_X; vector poly_positions_Y; - - /* - poly_positions_X.resize(polygons.size()); - poly_positions_Y.resize(polygons.size()); - */ do { @@ -2986,7 +2876,7 @@ TEST_CASE("Polygon test 15", "[Polygon]") { printf("Polygon optimization FAILED.\n"); } - getchar(); + REQUIRE(optimized); vector next_polygons; @@ -3026,13 +2916,15 @@ TEST_CASE("Polygon test 16", "[Polygon]") polygons.push_back(polygon_4); double area = calc_PolygonUnreachableZoneArea(polygon_1, polygons); + REQUIRE(area > 0.0); printf("Polygons area: %.3f\n", area); finish = clock(); printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); printf("Testing polygon 16 ... finished\n"); -} +} + /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/test/seq_test_preprocess.cpp b/src/libseqarrange/test/seq_test_preprocess.cpp index 04b7830fe5..f119ff69f9 100644 --- a/src/libseqarrange/test/seq_test_preprocess.cpp +++ b/src/libseqarrange/test/seq_test_preprocess.cpp @@ -95,6 +95,7 @@ TEST_CASE("Preprocessing test 1", "[Sequential Arrangement Preprocessing]") scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); test_polygons.push_back(scale_down_polygon); } + REQUIRE(!test_polygons.empty()); for (unsigned int i = 0; i < test_polygons.size(); ++i) { @@ -102,10 +103,7 @@ TEST_CASE("Preprocessing test 1", "[Sequential Arrangement Preprocessing]") Polygon display_polygon = scale_UP(test_polygons[i], 1000, 1000); preview_svg.draw(display_polygon, "blue"); preview_svg.Close(); - getchar(); - } - - + } finish = clock(); printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); @@ -164,6 +162,7 @@ TEST_CASE("Preprocessing test 2", "[Sequential Arrangement Preprocessing]") remaining_polygons); printf("----> Optimization finished <----\n"); + REQUIRE(optimized); if (optimized) { @@ -184,21 +183,27 @@ TEST_CASE("Preprocessing test 2", "[Sequential Arrangement Preprocessing]") { for (unsigned int i = 0; i < decided_polygons.size(); ++i) { - /* - printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); - for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + #ifdef DEBUG { - printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); - } - */ -// for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) - { - /* - for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) { - printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); } - */ + } + #endif + + for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) + { + #ifdef DEBUG + { + for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + { + printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + } + } + #endif + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -291,10 +296,10 @@ TEST_CASE("Preprocessing test 2", "[Sequential Arrangement Preprocessing]") else { printf("Polygon optimization FAILED.\n"); - } - finish = clock(); + } + finish = clock(); + printf("Intermediate time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); - getchar(); vector next_polygons; vector next_unreachable_polygons; @@ -350,14 +355,13 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") nozzle_unreachable_polygons.clear(); extend_PolygonConvexUnreachableZone(solver_configuration, - PRUSA_PART_POLYGONS[p], - SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S, - nozzle_unreachable_polygons); + PRUSA_PART_POLYGONS[p], + SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S, + nozzle_unreachable_polygons); + REQUIRE(nozzle_unreachable_polygons.size() > 0); SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S[j], "lightgrey"); @@ -373,7 +377,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); preview_svg.Close(); - getchar(); } { @@ -383,12 +386,10 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") PRUSA_PART_POLYGONS[p], SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S, nozzle_unreachable_polygons); + REQUIRE(nozzle_unreachable_polygons.size() > 0); SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_NOZZLE_LEVEL_MK3S[j], "lightgrey"); @@ -404,7 +405,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "red"); preview_svg.Close(); - getchar(); } { @@ -414,11 +414,10 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") PRUSA_PART_POLYGONS[p], SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S, extruder_unreachable_polygons); + REQUIRE(extruder_unreachable_polygons.size() > 0); SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S[j], "lightgrey"); @@ -434,7 +433,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "green"); preview_svg.Close(); - getchar(); } { @@ -444,12 +442,10 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") PRUSA_PART_POLYGONS[p], SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S, extruder_unreachable_polygons); + REQUIRE(extruder_unreachable_polygons.size() > 0); SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_EXTRUDER_LEVEL_MK3S[j], "lightgrey"); @@ -465,7 +461,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "magenta"); preview_svg.Close(); - getchar(); } { @@ -475,11 +470,10 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") PRUSA_PART_POLYGONS[p], SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S, hose_unreachable_polygons); - + REQUIRE(hose_unreachable_polygons.size() > 0); + SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S[j], "lightgrey"); @@ -495,7 +489,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "yellow"); preview_svg.Close(); - getchar(); } { @@ -505,12 +498,10 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") PRUSA_PART_POLYGONS[p], SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S, hose_unreachable_polygons); + REQUIRE(hose_unreachable_polygons.size() > 0); SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_HOSE_LEVEL_MK3S[j], "lightgrey"); @@ -526,7 +517,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "orange"); preview_svg.Close(); - getchar(); } { @@ -536,11 +526,10 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") PRUSA_PART_POLYGONS[p], SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S, gantry_unreachable_polygons); + REQUIRE(gantry_unreachable_polygons.size() > 0); SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S[j], "lightgrey"); @@ -556,7 +545,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "grey"); preview_svg.Close(); - getchar(); } { @@ -566,12 +554,10 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") PRUSA_PART_POLYGONS[p], SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S, gantry_unreachable_polygons); + REQUIRE(gantry_unreachable_polygons.size() > 0); SVG preview_svg("preprocess_test_3.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - - for (unsigned int j = 0; j < SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S.size(); ++j) { preview_svg.draw(SEQ_UNREACHABLE_POLYGON_GANTRY_LEVEL_MK3S[j], "lightgrey"); @@ -587,7 +573,6 @@ TEST_CASE("Preprocessing test 3", "[Sequential Arrangement Preprocessing]") preview_svg.draw(PRUSA_PART_POLYGONS[p], "black"); preview_svg.Close(); - getchar(); } } @@ -611,7 +596,7 @@ TEST_CASE("Preprocessing test 4", "[Sequential Arrangement Preprocessing]") std::vector polygons; std::vector > unreachable_polygons; - for (int i = 0; i < 12/*PRUSA_PART_POLYGONS.size()*/; ++i) + for (int i = 0; i < 12; ++i) { Polygon scale_down_polygon; scaleDown_PolygonForSequentialSolver(PRUSA_PART_POLYGONS[i], scale_down_polygon); @@ -663,6 +648,7 @@ TEST_CASE("Preprocessing test 4", "[Sequential Arrangement Preprocessing]") remaining_polygons); printf("----> Optimization finished <----\n"); + REQUIRE(optimized); if (optimized) { @@ -683,21 +669,25 @@ TEST_CASE("Preprocessing test 4", "[Sequential Arrangement Preprocessing]") { for (unsigned int i = 0; i < decided_polygons.size(); ++i) { - /* + #ifdef DEBUG + { printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) { printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); } - */ +} + #endif for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { - /* + #ifdef DEBUG + { for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) { printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); } - */ + #endif + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]][j], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -793,7 +783,6 @@ TEST_CASE("Preprocessing test 4", "[Sequential Arrangement Preprocessing]") } finish = clock(); printf("Intermediate time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); - getchar(); vector next_polygons; vector > next_unreachable_polygons; @@ -844,16 +833,14 @@ TEST_CASE("Preprocessing test 5", "[Sequential Arrangement Preprocessing]") for (unsigned int i = 0; i < PRUSA_PART_POLYGONS.size(); ++i) { - Polygon simplified_polygon; + Polygon simplified_polygon, scale_down_polygon; decimate_PolygonForSequentialSolver(solver_configuration, PRUSA_PART_POLYGONS[i], simplified_polygon, - false); - /* - scaleDown_PolygonForSequentialSolver(solver_configuration, PRUSA_PART_POLYGONS[i], scale_down_polygon); - polygons.push_back(scale_down_polygon); - + false); + REQUIRE(simplified_polygon.size() > 0); + std::vector convex_level_polygons; convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); convex_level_polygons.push_back(PRUSA_PART_POLYGONS[i]); @@ -868,17 +855,15 @@ TEST_CASE("Preprocessing test 5", "[Sequential Arrangement Preprocessing]") SEQ_UNREACHABLE_POLYGON_CONVEX_LEVELS_MK3S, SEQ_UNREACHABLE_POLYGON_BOX_LEVELS_MK3S, scale_down_unreachable_polygons); + REQUIRE(scale_down_unreachable_polygons.size() > 0); unreachable_polygons.push_back(scale_down_unreachable_polygons); - */ + SVG preview_svg("preprocess_test_5.svg"); - //preview_svg.draw(PRUSA_PART_POLYGONS[p], "blue"); - preview_svg.draw(simplified_polygon, "lightgrey"); preview_svg.draw(PRUSA_PART_POLYGONS[i], "blue"); preview_svg.Close(); - getchar(); } finish = clock(); @@ -958,6 +943,7 @@ TEST_CASE("Preprocessing test 6", "[Sequential Arrangement Preprocessing]") remaining_polygons); printf("----> Optimization finished <----\n"); + REQUIRE(optimized); if (optimized) { @@ -978,21 +964,25 @@ TEST_CASE("Preprocessing test 6", "[Sequential Arrangement Preprocessing]") { for (unsigned int i = 0; i < decided_polygons.size(); ++i) { - /* - printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); - for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) - { - printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + #ifdef DEBUG + { + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } } - */ + #endif for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { - /* - for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) - { - printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + #ifdef DEBUG + { + for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + { + printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + } } - */ + #endif Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]][j], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -1088,7 +1078,6 @@ TEST_CASE("Preprocessing test 6", "[Sequential Arrangement Preprocessing]") } finish = clock(); printf("Intermediate time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); - getchar(); vector next_polygons; vector > next_unreachable_polygons; diff --git a/src/libseqarrange/test/seq_test_sequential.cpp b/src/libseqarrange/test/seq_test_sequential.cpp index a58f4e7908..53fa2bf531 100644 --- a/src/libseqarrange/test/seq_test_sequential.cpp +++ b/src/libseqarrange/test/seq_test_sequential.cpp @@ -89,8 +89,6 @@ TEST_CASE("Sequential test 1", "[Sequential Arrangement Core]") z3::expr c(z_context.real_const("cf")); z3::expr d(z_context.real_const("df")); - -// z3::expr lhs(!x || y); z3::expr lhs(x || y); z3::expr rhs(implies(x, y)); z3::expr final(lhs == rhs); @@ -108,7 +106,7 @@ TEST_CASE("Sequential test 1", "[Sequential Arrangement Core]") z3::expr ef1((c > 3 && d < 6) && c < d); z3::solver z_solver(z_context); - //z_solver.add(!final); + z_solver.add(final2); z_solver.add(final5); z_solver.add(ef1); @@ -119,10 +117,12 @@ TEST_CASE("Sequential test 1", "[Sequential Arrangement Core]") printf("Printing smt status:\n"); cout << z_solver.to_smt2() << "\n"; + bool sat = false; switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } @@ -141,6 +141,7 @@ TEST_CASE("Sequential test 1", "[Sequential Arrangement Core]") break; } } + REQUIRE(sat); z3::model z_model(z_solver.get_model()); printf("Printing model:\n"); @@ -161,28 +162,6 @@ TEST_CASE("Sequential test 1", "[Sequential Arrangement Core]") { printf(" value: FALSE\n"); } - /* - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); - break; - } - default: - { - break; - } - } - */ } printf("Testing sequential scheduling 1 ... finished\n"); @@ -296,16 +275,6 @@ TEST_CASE("Sequential test 2", "[Sequential Arrangement Core]") gantry_rights.push_back(expr(z_context.real_const(name_R.c_str()))); } -// z3::expr lhs(!x || y); - /* - z3::expr final(lhs == rhs); - - z3::expr lhs1(a); - z3::expr rhs1(b); - z3::expr final2(lhs1 == rhs1); - - z3::expr ef1((c > 3 && d < 6) && c < d); - */ z3::solver z_solver(z_context); for (int i = 0; i < complex_Obj_count; ++i) @@ -370,24 +339,28 @@ TEST_CASE("Sequential test 2", "[Sequential Arrangement Core]") } } - - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif + bool sat = false; switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } case z3::unsat: { printf(" UNSATISFIABLE\n"); - return; break; } case z3::unknown: @@ -399,53 +372,65 @@ TEST_CASE("Sequential test 2", "[Sequential Arrangement Core]") { break; } - } + } + REQUIRE(!sat); - z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + #ifdef DEBUG + { + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif finish = clock(); - - for (unsigned int i = 0; i < z_model.size(); ++i) - { - printf("Variable:%s\n", z_model[i].name().str().c_str()); - - printf("Printing interpretation:\n"); - cout << z_model.get_const_interp(z_model[i]) << "\n"; - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); - break; - } - default: - { - break; - } - } - */ - } - for (int i = 0; i < complex_Obj_count; ++i) + #ifdef DEBUG { - //double val; - //printf("%s\n", z_model.get_const_interp(z_model[i]).get_string().c_str()); - } + for (unsigned int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s\n", z_model[i].name().str().c_str()); + + printf("Printing interpretation:\n"); + cout << z_model.get_const_interp(z_model[i]) << "\n"; + + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + } + } + #endif + + #ifdef DEBUG + { + for (int i = 0; i < complex_Obj_count; ++i) + { + double val; + printf("%s\n", z_model.get_const_interp(z_model[i]).get_string().c_str()); + } + } + #endif printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); printf("Testing sequential scheduling 2 ... finished\n"); @@ -648,23 +633,28 @@ TEST_CASE("Sequential test 3", "[Sequential Arrangement Core]") } } - printf("Printing solver status:\n"); - cout << z_solver << "\n"; + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif + bool sat = false; switch (z_solver.check()) { case z3::sat: { + sat = true; printf(" SATISFIABLE\n"); break; } case z3::unsat: { printf(" UNSATISFIABLE\n"); - return; break; } case z3::unknown: @@ -676,53 +666,65 @@ TEST_CASE("Sequential test 3", "[Sequential Arrangement Core]") { break; } - } + } + REQUIRE(sat); - z3::model z_model(z_solver.get_model()); - printf("Printing model:\n"); - cout << z_model << "\n"; + #ifdef DEBUG + { + z3::model z_model(z_solver.get_model()); + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif finish = clock(); - - for (unsigned int i = 0; i < z_model.size(); ++i) - { - printf("Variable:%s\n", z_model[i].name().str().c_str()); - - printf("Printing interpretation:\n"); - cout << z_model.get_const_interp(z_model[i]) << "\n"; - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); - break; - } - default: - { - break; - } - } - */ - } - for (int i = 0; i < complex_Obj_count; ++i) + #ifdef DEBUG { - //double val; - //printf("%s\n", z_model.get_const_interp(z_model[i]).get_string().c_str()); - } + for (unsigned int i = 0; i < z_model.size(); ++i) + { + printf("Variable:%s\n", z_model[i].name().str().c_str()); + + printf("Printing interpretation:\n"); + cout << z_model.get_const_interp(z_model[i]) << "\n"; + + cout << float(z_model[i]) << "\n"; + + switch (z_model.get_const_interp(z_model[i]).bool_value()) + { + case Z3_L_FALSE: + { + printf(" value: FALSE\n"); + break; + } + case Z3_L_TRUE: + { + printf(" value: TRUE\n"); + break; + } + case Z3_L_UNDEF: + { + printf(" value: UNDEF\n"); + break; + } + default: + { + break; + } + } + } + } + #endif + + #ifdef DEBUG + { + for (int i = 0; i < complex_Obj_count; ++i) + { + double val; + printf("%s\n", z_model.get_const_interp(z_model[i]).get_string().c_str()); + } + } + #endif printf("Time: %.3f\n", (finish - start) / (double)CLOCKS_PER_SEC); printf("Testing sequential scheduling 3 ... finished\n"); @@ -810,7 +812,6 @@ TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") } z3::set_param("parallel.enable", "true"); - //Z3_global_param_set("threads", "4"); z3::solver z_solver(z_context); vector polygons; @@ -833,14 +834,16 @@ TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") polygons, unreachable_polygons); introduce_TemporalOrdering(z_solver, z_context, T_times, 16, polygons); - - printf("Printing solver status:\n"); - cout << z_solver << "\n"; - /* - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; - */ + #ifdef DEBUG + { + printf("Printing solver status:\n"); + cout << z_solver << "\n"; + + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif int last_solvable_bounding_box_size = -1; double poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; @@ -894,10 +897,13 @@ TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") if (sat) { z3::model z_model(z_solver.get_model()); - /* - printf("Printing model:\n"); - cout << z_model << "\n"; - */ + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif printf("Printing interpretation:\n"); for (unsigned int i = 0; i < z_model.size(); ++i) @@ -1013,7 +1019,6 @@ TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") if (refined) { - printf("alpha 1\n"); switch (z_solver.check(bounding_box_assumptions)) { case z3::sat: @@ -1038,19 +1043,25 @@ TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") break; } } - printf("alpha 2: %d\n", (int)refined_sat); if (refined_sat) { z3::model z_model(z_solver.get_model()); - /* - printf("Printing model:\n"); - cout << z_model << "\n"; - */ + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif for (unsigned int i = 0; i < z_model.size(); ++i) { - //printf("Variable:%s ", z_model[i].name().str().c_str()); + #ifdef DEBUG + { + printf("Variable:%s ", z_model[i].name().str().c_str()); + } + #endif double value = z_model.get_const_interp(z_model[i]).as_double(); if (z_model[i].name().str() == "x_pos-0") @@ -1147,35 +1158,11 @@ TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") { break; } - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); - break; - } - default: - { - break; - } - } - */ } finish = clock(); + REQUIRE(last_solvable_bounding_box_size > 0); + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); printf("Final spatio-temporal positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", @@ -1192,16 +1179,18 @@ TEST_CASE("Sequential test 4", "[Sequential Arrangement Core]") _poly_4_pos_y, _time_4_t); - /* - for (int i = 0; i < 2; ++i) - { - double value = X_positions[i]; - printf("Orig X: %.3f\n", value); + #ifdef DEBUG + { + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i]; + printf("Orig X: %.3f\n", value); - value = Y_positions[i]; - printf("Orig Y: %.3f\n", value); + value = Y_positions[i]; + printf("Orig Y: %.3f\n", value); + } } - */ + #endif SVG preview_svg("sequential_test_4.svg"); @@ -1270,10 +1259,8 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") T_times.push_back(expr(z_context.real_const(name.c_str()))); } - z3::solver z_solver(z_context); - + z3::solver z_solver(z_context); Z3_global_param_set("parallel.enable", "false"); - //Z3_global_param_set("threads", "4"); vector polygons; polygons.push_back(polygon_1); @@ -1304,10 +1291,12 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") printf("Printing solver status:\n"); cout << z_solver << "\n"; - /* - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; - */ + #ifdef DEBUG + { + printf("Printing smt status:\n"); + cout << z_solver.to_smt2() << "\n"; + } + #endif int last_solvable_bounding_box_size = -1; Rational poly_1_pos_x, poly_1_pos_y, poly_2_pos_x, poly_2_pos_y, poly_3_pos_x, poly_3_pos_y, poly_4_pos_x, poly_4_pos_y; @@ -1357,10 +1346,13 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") { z3::model z_model(z_solver.get_model()); - /* - printf("Printing model:\n"); - cout << z_model << "\n"; - */ + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif + printf("Printing interpretation:\n"); for (unsigned int i = 0; i < z_model.size(); ++i) { @@ -1422,21 +1414,6 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") } } - /* - _poly_1_pos_x = poly_1_pos_x; - _poly_1_pos_y = poly_1_pos_y; - _time_1_t = time_1_t; - _poly_2_pos_x = poly_2_pos_x; - _poly_2_pos_y = poly_2_pos_y; - _time_2_t = time_2_t; - _poly_3_pos_x = poly_3_pos_x; - _poly_3_pos_y = poly_3_pos_y; - _time_3_t = time_3_t; - _poly_4_pos_x = poly_4_pos_x; - _poly_4_pos_y = poly_4_pos_y; - _time_4_t = time_4_t; - */ - printf("Times: %.3f, %.3f, %.3f, %3f\n", time_1_t.as_double(), time_2_t.as_double(), @@ -1492,7 +1469,6 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") if (refined) { - printf("alpha 1\n"); switch (z_solver.check(bounding_box_assumptions)) { case z3::sat: @@ -1517,15 +1493,17 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") break; } } - printf("alpha 2: %d\n", (int)refined_sat); if (refined_sat) { z3::model z_model(z_solver.get_model()); - /* - printf("Printing model:\n"); - cout << z_model << "\n"; - */ + + #ifdef DEBUG + { + printf("Printing model:\n"); + cout << z_model << "\n"; + } + #endif for (unsigned int i = 0; i < z_model.size(); ++i) { @@ -1629,35 +1607,10 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") { break; } - - //cout << float(z_model[i]) << "\n"; - /* - switch (z_model.get_const_interp(z_model[i]).bool_value()) - { - case Z3_L_FALSE: - { - printf(" value: FALSE\n"); - break; - } - case Z3_L_TRUE: - { - printf(" value: TRUE\n"); - break; - } - case Z3_L_UNDEF: - { - printf(" value: UNDEF\n"); - break; - } - default: - { - break; - } - } - */ } finish = clock(); - + REQUIRE(last_solvable_bounding_box_size > 0); + printf("Solvable bounding box: %d\n", last_solvable_bounding_box_size); printf("Final spatio-temporal positions: %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f], %.3f, %.3f [%.3f]\n", @@ -1674,16 +1627,20 @@ TEST_CASE("Sequential test 5", "[Sequential Arrangement Core]") _poly_4_pos_y.as_double(), _time_4_t.as_double()); - /* - for (int i = 0; i < 2; ++i) - { - double value = X_positions[i].as_double(); - printf("Orig X: %.3f\n", value); - value = Y_positions[i].as_double(); - printf("Orig Y: %.3f\n", value); + #ifdef DEBUG + { + for (int i = 0; i < 2; ++i) + { + double value = X_positions[i].as_double(); + printf("Orig X: %.3f\n", value); + + value = Y_positions[i].as_double(); + printf("Orig Y: %.3f\n", value); + } } - */ + #endif + SVG preview_svg("sequential_test_5.svg"); @@ -1745,28 +1702,6 @@ TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") vector polygon_index_map; vector decided_polygons; - /* - polygons.push_back(polygon_1); - unreachable_polygons.push_back(unreachable_polygon_1); - polygons.push_back(polygon_2); - unreachable_polygons.push_back(unreachable_polygon_2); - polygons.push_back(polygon_3); - unreachable_polygons.push_back(unreachable_polygon_3); - polygons.push_back(polygon_4); - unreachable_polygons.push_back(unreachable_polygon_4); - */ - -/* - polygons.push_back(polygon_1); - unreachable_polygons.push_back(polygon_1); - polygons.push_back(polygon_2); - unreachable_polygons.push_back(polygon_2); - polygons.push_back(polygon_3); - unreachable_polygons.push_back(polygon_3); - polygons.push_back(polygon_4); - unreachable_polygons.push_back(polygon_4); -*/ - polygons.push_back(polygon_1); unreachable_polygons.push_back(unreachable_polygon_1); polygons.push_back(polygon_2); @@ -1812,15 +1747,17 @@ TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") polygons.push_back(polygon_4); unreachable_polygons.push_back(unreachable_polygon_4); - /* - for (int j = 0; j < unreachable_polygons_1.size(); ++j) + #ifdef DEBUG { - for (int k = 0; k < unreachable_polygons_1[j].points.size(); ++k) + for (int j = 0; j < unreachable_polygons_1.size(); ++j) { - printf(" Ppxy: %d, %d\n", unreachable_polygons_1[j].points[k].x(), unreachable_polygons_1[j].points[k].y()); + for (int k = 0; k < unreachable_polygons_1[j].points.size(); ++k) + { + printf(" Ppxy: %d, %d\n", unreachable_polygons_1[j].points[k].x(), unreachable_polygons_1[j].points[k].y()); + } } } - */ + #endif for (unsigned int index = 0; index < polygons.size(); ++index) { @@ -1831,11 +1768,6 @@ TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") vector poly_positions_Y; vector times_T; - /* - poly_positions_X.resize(polygons.size()); - poly_positions_Y.resize(polygons.size()); - */ - do { decided_polygons.clear(); @@ -1850,16 +1782,8 @@ TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") polygon_index_map, decided_polygons, remaining_polygons); + REQUIRE(optimized); - /* - bool optimized = optimize_SubglobalPolygonNonoverlapping(solver_configuration, - poly_positions_X, - poly_positions_Y, - polygons, - polygon_index_map, - decided_polygons, - remaining_polygons); - */ printf("----> Optimization finished <----\n"); if (optimized) @@ -1867,7 +1791,6 @@ TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") printf("Polygon positions:\n"); for (unsigned int i = 0; i < decided_polygons.size(); ++i) { - // printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); printf(" [%d] %.3f, %.3f (%.3f)\n", decided_polygons[i], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double(), times_T[decided_polygons[i]].as_double()); } printf("Remaining polygons: %ld\n", remaining_polygons.size()); @@ -1882,17 +1805,19 @@ TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") { for (unsigned int i = 0; i < decided_polygons.size(); ++i) { - /* - printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); - for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + #ifdef DEBUG { - printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } } - */ + #endif + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); - //if (decided_polygons[i] != 2) { preview_svg.draw(display_unreachable_polygon, "lightgrey"); } @@ -1984,7 +1909,6 @@ TEST_CASE("Sequential test 6", "[Sequential Arrangement Core]") { printf("Polygon optimization FAILED.\n"); } - getchar(); vector next_polygons; vector next_unreachable_polygons; @@ -2053,11 +1977,6 @@ TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") polygons.push_back(polygon_3); unreachable_polygons.push_back(unreachable_polygons_3); -/* - polygons.push_back(polygon_4); - unreachable_polygons.push_back(unreachable_polygons_4); -*/ - polygons.push_back(polygon_1); unreachable_polygons.push_back(unreachable_polygons_1); polygons.push_back(polygon_2); @@ -2067,43 +1986,17 @@ TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") polygons.push_back(polygon_4); unreachable_polygons.push_back(unreachable_polygons_4); -/* - polygons.push_back(polygon_1); - unreachable_polygons.push_back(unreachable_polygons_1); - polygons.push_back(polygon_2); - unreachable_polygons.push_back(unreachable_polygons_2); - polygons.push_back(polygon_3); - unreachable_polygons.push_back(unreachable_polygons_3); - polygons.push_back(polygon_4); - unreachable_polygons.push_back(unreachable_polygons_4); - - polygons.push_back(polygon_1); - unreachable_polygons.push_back(unreachable_polygons_1); - polygons.push_back(polygon_2); - unreachable_polygons.push_back(unreachable_polygons_2); - polygons.push_back(polygon_3); - unreachable_polygons.push_back(unreachable_polygons_3); - polygons.push_back(polygon_4); - unreachable_polygons.push_back(unreachable_polygons_4); - - polygons.push_back(polygon_1); - unreachable_polygons.push_back(unreachable_polygons_1); - polygons.push_back(polygon_2); - unreachable_polygons.push_back(unreachable_polygons_2); - polygons.push_back(polygon_3); - unreachable_polygons.push_back(unreachable_polygons_3); - polygons.push_back(polygon_4); - unreachable_polygons.push_back(unreachable_polygons_4); -*/ - /* - for (int j = 0; j < unreachable_polygons_1.size(); ++j) + #ifdef DEBUG { - for (int k = 0; k < unreachable_polygons_1[j].points.size(); ++k) + for (int j = 0; j < unreachable_polygons_1.size(); ++j) { - printf(" Ppxy: %d, %d\n", unreachable_polygons_1[j].points[k].x(), unreachable_polygons_1[j].points[k].y()); + for (int k = 0; k < unreachable_polygons_1[j].points.size(); ++k) + { + printf(" Ppxy: %d, %d\n", unreachable_polygons_1[j].points[k].x(), unreachable_polygons_1[j].points[k].y()); + } } } - */ + #endif for (unsigned int index = 0; index < polygons.size(); ++index) { @@ -2114,11 +2007,6 @@ TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") vector poly_positions_Y; vector times_T; - /* - poly_positions_X.resize(polygons.size()); - poly_positions_Y.resize(polygons.size()); - */ - do { decided_polygons.clear(); @@ -2133,6 +2021,7 @@ TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") polygon_index_map, decided_polygons, remaining_polygons); + REQUIRE(optimized); printf("----> Optimization finished <----\n"); @@ -2155,21 +2044,27 @@ TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") { for (unsigned int i = 0; i < decided_polygons.size(); ++i) { - /* - printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); - for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + #ifdef DEBUG { - printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + printf("----> %.3f,%.3f\n", poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); + for (int k = 0; k < polygons[decided_polygons[i]].points.size(); ++k) + { + printf(" xy: %d, %d\n", polygons[decided_polygons[i]].points[k].x(), polygons[decided_polygons[i]].points[k].y()); + } } - */ + #endif + for (unsigned int j = 0; j < unreachable_polygons[decided_polygons[i]].size(); ++j) { - /* - for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + #ifdef DEBUG { - printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + for (int k = 0; k < unreachable_polygons[decided_polygons[i]][j].points.size(); ++k) + { + printf(" Pxy: %d, %d\n", unreachable_polygons[decided_polygons[i]][j].points[k].x(), unreachable_polygons[decided_polygons[i]][j].points[k].y()); + } } - */ + #endif + Polygon display_unreachable_polygon = scale_UP(unreachable_polygons[decided_polygons[i]][j], poly_positions_X[decided_polygons[i]].as_double(), poly_positions_Y[decided_polygons[i]].as_double()); @@ -2263,7 +2158,6 @@ TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") { printf("Polygon optimization FAILED.\n"); } - getchar(); vector next_polygons; vector > next_unreachable_polygons; @@ -2299,5 +2193,5 @@ TEST_CASE("Sequential test 7", "[Sequential Arrangement Core]") } -/*----------------------------------------------------------------*/ +/*----------------------------------------------------------------*/ From 1f721a3ce2175265871788bdf91eb2221f52c030 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 5 Dec 2024 12:52:01 +0100 Subject: [PATCH 26/88] slicer side: account for multibeds, bed size and instances --- src/libslic3r/MultipleBeds.hpp | 1 + src/slic3r/GUI/ArrangeHelper.cpp | 35 ++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/MultipleBeds.hpp b/src/libslic3r/MultipleBeds.hpp index 8f58e98f3a..1b3fccbe78 100644 --- a/src/libslic3r/MultipleBeds.hpp +++ b/src/libslic3r/MultipleBeds.hpp @@ -86,6 +86,7 @@ public: void update_build_volume(const BoundingBoxf& build_volume_bb) { m_build_volume_bb = build_volume_bb; } + Vec2d get_bed_size() const { return m_build_volume_bb.size(); } Vec2d bed_gap() const; Vec2crd get_bed_gap() const; void ensure_wipe_towers_on_beds(Model& model, const std::vector>& prints); diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index e2f4cf96ff..48141d99a1 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -2,6 +2,7 @@ #include "libslic3r/Model.hpp" #include "libslic3r/TriangleMesh.hpp" +#include "libslic3r/MultipleBeds.hpp" #include @@ -33,8 +34,8 @@ static Sequential::PrinterGeometry get_printer_geometry() { { { -12000000, -350000000 }, {250000000, -350000000 }, {250000000, -82000000 }, { -12000000, -82000000} } } }); Sequential::PrinterGeometry out; - out.x_size = 250000000; - out.y_size = 210000000; + out.x_size = scaled(s_multiple_beds.get_bed_size().x()); + out.y_size = scaled(s_multiple_beds.get_bed_size().y()); for (const ExtruderSlice& slice : slices) { (slice.shape_type == CONVEX ? out.convex_heights : out.box_heights).emplace(slice.height); out.extruder_slices.insert(std::make_pair(slice.height, slice.polygons)); @@ -58,14 +59,16 @@ static std::vector get_objects_to_print(const Model& // Now collect all objects and projections of convex hull above respective heights. std::vector objects; for (const ModelObject* mo : model.objects) { - const ModelInstance* mi = mo->instances.front(); - objects.emplace_back(Sequential::ObjectToPrint{int(mo->id().id), false, scaled(mo->instance_bounding_box(0).size().z()), {}}); - for (double height : heights) { - auto tr = Transform3d::Identity(); - Vec3d offset = mi->get_offset(); - tr.translate(Vec3d(-offset.x(), -offset.y(), 0.)); - Polygon pgn = its_convex_hull_2d_above(mo->mesh().its, tr.cast(), height); - objects.back().pgns_at_height.emplace_back(std::make_pair(scaled(height), pgn)); + size_t inst_id = 0; + const TriangleMesh& raw_mesh = mo->raw_mesh(); + for (const ModelInstance* mi : mo->instances) { + objects.emplace_back(Sequential::ObjectToPrint{int(inst_id == 0 ? mo->id().id : mi->id().id), inst_id + 1 < mo->instances.size(), + scaled(mo->instance_bounding_box(inst_id).size().z()), {}}); + for (double height : heights) { + Polygon pgn = its_convex_hull_2d_above(raw_mesh.its, mi->get_matrix_no_offset().cast(), height); + objects.back().pgns_at_height.emplace_back(std::make_pair(scaled(height), pgn)); + } + ++inst_id; } } return objects; @@ -100,13 +103,15 @@ void arrange_model_sequential(Model& model) // Save the move data from this file to move_data_all. size_t bed_idx = 0; for (const Sequential::ScheduledPlate& plate : plates) { + Vec3d bed_offset = s_multiple_beds.get_bed_translation(bed_idx); // Iterate the same way as when exporting. for (ModelObject* mo : model.objects) { - ModelInstance* mi = mo->instances.front(); - const ObjectID& oid = mo->id(); - auto it = std::find_if(plate.scheduled_objects.begin(), plate.scheduled_objects.end(), [&oid](const auto& md) { return md.id == oid.id; }); - if (it != plate.scheduled_objects.end()) { - mi->set_offset(Vec3d(unscaled(it->x) + bed_idx * 300, unscaled(it->y), mi->get_offset().z())); + for (ModelInstance* mi : mo->instances) { + const ObjectID& oid = (mi == mo->instances.front() ? mo->id() : mi->id()); + auto it = std::find_if(plate.scheduled_objects.begin(), plate.scheduled_objects.end(), [&oid](const auto& md) { return md.id == oid.id; }); + if (it != plate.scheduled_objects.end()) { + mi->set_offset(Vec3d(unscaled(it->x) + bed_offset.x(), unscaled(it->y) + bed_offset.y(), mi->get_offset().z())); + } } } for (const Sequential::ScheduledObject& object : plate.scheduled_objects) From d1afa5b5d868ddd0c96aed47e7f5519b2778c1ee Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 9 Dec 2024 18:00:38 +0100 Subject: [PATCH 27/88] Big object bug fix. --- src/libseqarrange/src/seq_sequential.cpp | 118 +++++++---------------- 1 file changed, 33 insertions(+), 85 deletions(-) diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 92907ab452..94fc7662c3 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -9413,7 +9413,7 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration dec_values_Y[undecided[i]] = local_values_Y[undecided[i]]; decided_polygons.push_back(undecided[i]); } - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; } @@ -9441,7 +9441,7 @@ bool optimize_SubglobalPolygonNonoverlapping(const SolverConfiguration } else { - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; } @@ -9550,13 +9550,6 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration undecided.clear(); - /* - for (unsigned int i = 0; i < object_group_size; ++i) - { - undecided.push_back(curr_polygon + i); - } - */ - for (int i = object_group_size - 1; i >= 0; --i) { undecided.push_back(curr_polygon + i + remaining_polygon); @@ -9645,15 +9638,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration if (optimized) - { - /* - printf("Printing solver status:\n"); - cout << z_solver << "\n"; - - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; - */ - + { for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; @@ -9662,8 +9647,8 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration decided_polygons.push_back(undecided[i]); } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; } @@ -9691,7 +9676,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlapping(const SolverConfiguration } else { - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; } @@ -9895,15 +9880,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi if (optimized) - { - /* - printf("Printing solver status:\n"); - cout << z_solver << "\n"; - - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; - */ - + { for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; @@ -9912,8 +9889,8 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi decided_polygons.push_back(undecided[i]); } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; } @@ -9941,7 +9918,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingCentered(const SolverConfi } else { - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; } @@ -10052,13 +10029,6 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve undecided.clear(); - /* - for (unsigned int i = 0; i < object_group_size; ++i) - { - undecided.push_back(curr_polygon + i); - } - */ - for (int i = 0; i < object_group_size; ++i) { undecided.push_back(curr_polygon + i); @@ -10148,15 +10118,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve if (optimized) - { - /* - printf("Printing solver status:\n"); - cout << z_solver << "\n"; - - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; - */ - + { for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; @@ -10165,8 +10127,8 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve decided_polygons.push_back(undecided[i]); } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; } @@ -10194,7 +10156,7 @@ bool optimize_SubglobalSequentialPolygonNonoverlappingBinaryCentered(const Solve } else { - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; @@ -10451,15 +10413,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So progress_callback); if (optimized) - { - /* - printf("Printing solver status:\n"); - cout << z_solver << "\n"; - - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; - */ - + { for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; @@ -10475,15 +10429,16 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - if (polygons.size() - curr_polygon > (unsigned int)object_group_size) - { - curr_polygon += object_group_size; - } - else + if (curr_polygon + solver_configuration.object_group_size >= polygons.size()) { + std::reverse(remaining_local.begin(), remaining_local.end()); + remaining_polygons.insert(remaining_polygons.end(), remaining_local.begin(), remaining_local.end()); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); - return true; + return true; } + curr_polygon += solver_configuration.object_group_size; + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); break; } @@ -10524,7 +10479,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { - if (polygons.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) + if (curr_polygon + solver_configuration.object_group_size < polygons.size()) { curr_polygon += solver_configuration.object_group_size; @@ -10746,15 +10701,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So progress_callback); if (optimized) - { - /* - printf("Printing solver status:\n"); - cout << z_solver << "\n"; - - printf("Printing smt status:\n"); - cout << z_solver.to_smt2() << "\n"; - */ - + { for (unsigned int i = 0; i < undecided.size(); ++i) { dec_values_X[undecided[i]] = local_values_X[undecided[i]]; @@ -10770,15 +10717,15 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } augment_TemporalSpread(solver_configuration, dec_values_T, decided_polygons); - if (solvable_objects.size() - curr_polygon > (unsigned int)object_group_size) - { - curr_polygon += object_group_size; - } - else + if (curr_polygon + solver_configuration.object_group_size >= solvable_objects.size()) { + std::reverse(remaining_local.begin(), remaining_local.end()); + remaining_polygons.insert(remaining_polygons.end(), remaining_local.begin(), remaining_local.end()); + progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); return true; - } + } + curr_polygon += solver_configuration.object_group_size; progress_callback((SEQ_PROGRESS_RANGE * progress_object_phases_done) / progress_total_object_phases); break; } @@ -10810,6 +10757,7 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So printf("Build: %.3f\n", build_cumul); } #endif + if (!optimized) { @@ -10819,8 +10767,8 @@ bool optimize_SubglobalConsequentialPolygonNonoverlappingBinaryCentered(const So } else { - if (solvable_objects.size() - curr_polygon > (unsigned int)solver_configuration.object_group_size) - { + if (curr_polygon + solver_configuration.object_group_size < solvable_objects.size()) + { curr_polygon += solver_configuration.object_group_size; for (; curr_polygon < solvable_objects.size(); ++curr_polygon) From dc7ea52d884718ae314c7066cce321a3d447ea15 Mon Sep 17 00:00:00 2001 From: surynek Date: Tue, 10 Dec 2024 00:42:43 +0100 Subject: [PATCH 28/88] External files for tests are no longer needed, everything is moved as text to the source. --- src/libseqarrange/src/seq_utilities.cpp | 91 ++-- src/libseqarrange/src/seq_utilities.hpp | 21 +- .../src/sequential_decimator.cpp | 2 +- src/libseqarrange/src/sequential_prusa.cpp | 14 +- src/libseqarrange/test/seq_test_interface.cpp | 399 +++++++++++++++++- 5 files changed, 477 insertions(+), 50 deletions(-) diff --git a/src/libseqarrange/src/seq_utilities.cpp b/src/libseqarrange/src/seq_utilities.cpp index 2f8aea3dcb..2532714370 100644 --- a/src/libseqarrange/src/seq_utilities.cpp +++ b/src/libseqarrange/src/seq_utilities.cpp @@ -37,10 +37,12 @@ namespace Sequential /*----------------------------------------------------------------*/ -bool find_and_remove(std::string& src, const std::string& key) +bool find_and_remove(std::string &src, const std::string &key) { size_t pos = src.find(key); - if (pos != std::string::npos) { + + if (pos != std::string::npos) + { src.erase(pos, key.length()); return true; } @@ -48,17 +50,37 @@ bool find_and_remove(std::string& src, const std::string& key) } -std::vector load_exported_data(const std::string& filename) +std::vector load_exported_data_from_file(const std::string &filename) +{ + std::ifstream in(filename); + + if (!in) + { + throw std::runtime_error("NO EXPORTED FILE WAS FOUND"); + } + + return load_exported_data_from_stream(in); +} + + +std::vector load_exported_data_from_text(const std::string &data_text) +{ + std::istringstream iss(data_text); + + return load_exported_data_from_stream(iss); +} + + +std::vector load_exported_data_from_stream(std::istream &data_stream) { std::vector objects_to_print; - std::ifstream in(filename); - if (!in) - throw std::runtime_error("NO EXPORTED FILE WAS FOUND"); std::string line; - while (in) { - std::getline(in, line); + while (data_stream) + { + std::getline(data_stream, line); + if (find_and_remove(line, "OBJECT_ID")) { objects_to_print.push_back(ObjectToPrint()); objects_to_print.back().id = std::stoi(line); @@ -83,20 +105,38 @@ std::vector load_exported_data(const std::string& filename) } } return objects_to_print; -} +} -int load_printer_geometry(const std::string& filename, PrinterGeometry &printer_geometry) +int load_printer_geometry_from_file(const std::string &filename, PrinterGeometry &printer_geometry) { std::ifstream in(filename); - if (!in) - throw std::runtime_error("NO PRINTER GEOMETRY FILE WAS FOUND"); - std::string line; - - Polygon *current_polygon = NULL; - while (in) { - std::getline(in, line); + if (!in) + { + throw std::runtime_error("NO PRINTER GEOMETRY FILE WAS FOUND"); + } + + return load_printer_geometry_from_stream(in, printer_geometry); +} + + +int load_printer_geometry_from_text(const std::string &geometry_text, PrinterGeometry &printer_geometry) +{ + std::istringstream iss(geometry_text); + + return load_printer_geometry_from_stream(iss, printer_geometry); +} + + +int load_printer_geometry_from_stream(std::istream &geometry_stream, PrinterGeometry &printer_geometry) +{ + Polygon *current_polygon = NULL; + std::string line; + + while (geometry_stream) + { + std::getline(geometry_stream, line); if (find_and_remove(line, "POLYGON_AT_HEIGHT")) { @@ -167,19 +207,21 @@ int load_printer_geometry(const std::string& filename, PrinterGeometry &printer_ printer_geometry.y_size = y_size; } } - return 0; + return 0; } - -void save_import_data(const std::string &filename, - const std::map &scheduled_polygons, - const map &original_index_map, - const vector &poly_positions_X, - const vector &poly_positions_Y) + +void save_import_data_to_file(const std::string &filename, + const std::map &scheduled_polygons, + const map &original_index_map, + const vector &poly_positions_X, + const vector &poly_positions_Y) { std::ofstream out(filename); if (!out) + { throw std::runtime_error("CANNOT CREATE IMPORT FILE"); + } for (const auto& scheduled_polygon: scheduled_polygons) { @@ -191,7 +233,6 @@ void save_import_data(const std::string &filename, Y); const auto& original_index = original_index_map.find(scheduled_polygon.second); -// out << original_index_map[scheduled_polygon.second] << " " << X << " " << Y << endl; out << original_index->second << " " << X << " " << Y << endl; } } diff --git a/src/libseqarrange/src/seq_utilities.hpp b/src/libseqarrange/src/seq_utilities.hpp index 76b95bb8b4..8a453b7163 100644 --- a/src/libseqarrange/src/seq_utilities.hpp +++ b/src/libseqarrange/src/seq_utilities.hpp @@ -25,16 +25,21 @@ namespace Sequential { -bool find_and_remove(std::string& src, const std::string& key); -std::vector load_exported_data(const std::string& filename); +bool find_and_remove(std::string &src, const std::string &key); -int load_printer_geometry(const std::string& filename, PrinterGeometry &printer_geometry); +std::vector load_exported_data_from_file(const std::string &filename); +std::vector load_exported_data_from_text(const std::string &data_text); +std::vector load_exported_data_from_stream(std::istream &data_stream); + +int load_printer_geometry_from_file(const std::string& filename, PrinterGeometry &printer_geometry); +int load_printer_geometry_from_text(const std::string& geometry_text, PrinterGeometry &printer_geometry); +int load_printer_geometry_from_stream(std::istream& geometry_stream, PrinterGeometry &printer_geometry); -void save_import_data(const std::string &filename, - const std::map &scheduled_polygons, - const map &original_index_map, - const vector &poly_positions_X, - const vector &poly_positions_Y); +void save_import_data_to_file(const std::string &filename, + const std::map &scheduled_polygons, + const map &original_index_map, + const vector &poly_positions_X, + const vector &poly_positions_Y); /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/src/sequential_decimator.cpp b/src/libseqarrange/src/sequential_decimator.cpp index 53025e1e45..17f65c7808 100644 --- a/src/libseqarrange/src/sequential_decimator.cpp +++ b/src/libseqarrange/src/sequential_decimator.cpp @@ -169,7 +169,7 @@ int decimate_Polygons(const CommandParameters &command_parameters) start = clock(); SolverConfiguration solver_configuration; - std::vector objects_to_print = load_exported_data(command_parameters.input_filename); + std::vector objects_to_print = load_exported_data_from_file(command_parameters.input_filename); std::vector decimated_polygons; std::vector > unreachable_polygons; diff --git a/src/libseqarrange/src/sequential_prusa.cpp b/src/libseqarrange/src/sequential_prusa.cpp index 8097a66208..7924c443f4 100644 --- a/src/libseqarrange/src/sequential_prusa.cpp +++ b/src/libseqarrange/src/sequential_prusa.cpp @@ -195,7 +195,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) if (!command_parameters.printer_filename.empty()) { printf(" Loading printer geometry ...\n"); - int result = load_printer_geometry(command_parameters.printer_filename, printer_geometry); + int result = load_printer_geometry_from_file(command_parameters.printer_filename, printer_geometry); if (result != 0) { @@ -206,7 +206,7 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) printf(" Loading printer geometry ... finished\n"); } - std::vector objects_to_print = load_exported_data(command_parameters.input_filename); + std::vector objects_to_print = load_exported_data_from_file(command_parameters.input_filename); std::vector polygons; std::vector > unreachable_polygons; @@ -459,11 +459,11 @@ int solve_SequentialPrint(const CommandParameters &command_parameters) + command_parameters.output_filename.substr(suffix_position, command_parameters.output_filename.length()); } - save_import_data(output_filename, - scheduled_polygons, - original_index_map, - poly_positions_X, - poly_positions_Y); + save_import_data_to_file(output_filename, + scheduled_polygons, + original_index_map, + poly_positions_X, + poly_positions_Y); string svg_filename; diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index c148c76907..d34f9316c9 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -40,6 +40,386 @@ using namespace Sequential; /*----------------------------------------------------------------*/ +const std::string arrange_data_export_text = "OBJECT_ID131\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +OBJECT_ID66\n\ +TOTAL_HEIGHT10000000\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +OBJECT_ID44\n\ +TOTAL_HEIGHT10000000\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 11999992\n\ +POINT17000000 15999992\n\ +POINT-17000000 15999992\n\ +POINT-21000000 11999992\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 3999992\n\ +POINT-21000000 3999992\n\ +POLYGON_AT_HEIGHT18000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +OBJECT_ID88\n\ +TOTAL_HEIGHT10000000\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +OBJECT_ID77\n\ +TOTAL_HEIGHT10000000\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000008\n\ +POINT17000000 16000008\n\ +POINT-17000000 16000008\n\ +POINT-21000000 12000008\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +OBJECT_ID120\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -15999992\n\ +POINT21000000 -15999992\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -15999992\n\ +POINT21000000 -15999992\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-21000000 -15999992\n\ +POINT21000000 -15999992\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-21000000 -15999992\n\ +POINT21000000 -15999992\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +OBJECT_ID99\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +OBJECT_ID151\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +OBJECT_ID162\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-30189590 -16000000\n\ +POINT30189576 -16000000\n\ +POINT30189576 12000000\n\ +POINT24439178 16000000\n\ +POINT-24439194 16000000\n\ +POINT-30189590 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-30189590 -16000000\n\ +POINT30189576 -16000000\n\ +POINT30189576 12000000\n\ +POINT26286238 14715178\n\ +POINT24439178 16000000\n\ +POINT-24439194 16000000\n\ +POINT-28342532 13284822\n\ +POINT-30189590 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-30189590 -16000000\n\ +POINT30189576 -16000000\n\ +POINT30189576 4000000\n\ +POINT-30189590 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-30189590 -16000000\n\ +POINT30189576 -16000000\n\ +POINT30189576 4000000\n\ +POINT-30189590 4000000\n\ +OBJECT_ID192\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000000 16000000\n\ +POINT-21000000 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-21000000 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +OBJECT_ID203\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000000 -15999999\n\ +POINT21000000 -15999999\n\ +POINT21000000 12000002\n\ +POINT17000000 16000002\n\ +POINT-17000000 16000002\n\ +POINT-21000000 12000002\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000000 -15999999\n\ +POINT21000000 -15999999\n\ +POINT21000000 12000002\n\ +POINT17000000 16000002\n\ +POINT-17000000 16000002\n\ +POINT-21000000 12000002\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-21000000 -15999999\n\ +POINT21000000 -15999999\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-21000000 -15999999\n\ +POINT21000000 -15999999\n\ +POINT21000000 4000000\n\ +POINT-21000000 4000000\n\ +OBJECT_ID223\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-20999998 -16000000\n\ +POINT21000004 -16000000\n\ +POINT21000004 12000000\n\ +POINT17000004 16000000\n\ +POINT-16999998 16000000\n\ +POINT-20999998 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-20999998 -16000000\n\ +POINT21000004 -16000000\n\ +POINT21000004 12000000\n\ +POINT17000004 16000000\n\ +POINT-16999998 16000000\n\ +POINT-20999998 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-20999998 -16000000\n\ +POINT21000004 -16000000\n\ +POINT21000004 4000000\n\ +POINT-20999998 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-20999998 -16000000\n\ +POINT21000004 -16000000\n\ +POINT21000004 4000000\n\ +POINT-20999998 4000000\n\ +OBJECT_ID234\n\ +TOTAL_HEIGHT62265434\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-21000002 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000002 16000000\n\ +POINT-21000002 12000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-21000002 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 12000000\n\ +POINT17000000 16000000\n\ +POINT-17000002 16000000\n\ +POINT-21000002 12000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-21000002 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000002 4000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-21000002 -16000000\n\ +POINT21000000 -16000000\n\ +POINT21000000 4000000\n\ +POINT-21000002 4000000\n\ +"; + +const std::string printer_geometry_mk4_compatibility_text = "X_SIZE250000000\n\ +Y_SIZE210000000\n\ +CONVEX_HEIGHT0\n\ +CONVEX_HEIGHT2000000\n\ +BOX_HEIGHT18000000\n\ +BOX_HEIGHT26000000\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-500000 -500000\n\ +POINT500000 -500000\n\ +POINT500000 500000\n\ +POINT-500000 500000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-1000000 -21000000 \n\ +POINT37000000 -21000000\n\ +POINT37000000 44000000\n\ +POINT-1000000 44000000\n\ +POLYGON_AT_HEIGHT2000000\n\ +POINT-40000000 -45000000\n\ +POINT38000000 -45000000\n\ +POINT38000000 20000000\n\ +POINT-40000000 20000000\n\ +POLYGON_AT_HEIGHT18000000\n\ +POINT-350000000 -23000000\n\ +POINT350000000 -23000000\n\ +POINT350000000 -35000000\n\ +POINT-350000000 -35000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-12000000 -350000000\n\ +POINT9000000 -350000000\n\ +POINT9000000 -39000000\n\ +POINT-12000000 -39000000\n\ +POLYGON_AT_HEIGHT26000000\n\ +POINT-12000000 -350000000\n\ +POINT250000000 -350000000\n\ +POINT250000000 -82000000\n\ +POINT-12000000 -82000000\n\ +"; + + +const std::string printer_geometry_mk4_text = "X_SIZE250000000\n\ +Y_SIZE210000000\n\ +CONVEX_HEIGHT0\n\ +CONVEX_HEIGHT3000000\n\ +BOX_HEIGHT11000000\n\ +BOX_HEIGHT13000000\n\ +POLYGON_AT_HEIGHT0\n\ +POINT-500000 -500000\n\ +POINT500000 -500000\n\ +POINT500000 500000\n\ +POINT-500000 500000\n\ +POLYGON_AT_HEIGHT3000000\n\ +POINT-1000000 -21000000\n\ +POINT37000000 -21000000\n\ +POINT37000000 44000000\n\ +POINT-1000000 44000000\n\ +POLYGON_AT_HEIGHT3000000\n\ +POINT-40000000 -45000000\n\ +POINT38000000 -45000000\n\ +POINT38000000 20000000\n\ +POINT-40000000 20000000\n\ +POLYGON_AT_HEIGHT11000000\n\ +POINT-350000000 -23000000\n\ +POINT350000000 -23000000\n\ +POINT350000000 -35000000\n\ +POINT-350000000 -35000000\n\ +POLYGON_AT_HEIGHT13000000\n\ +POINT-12000000 -350000000\n\ +POINT9000000 -350000000\n\ +POINT9000000 -39000000\n\ +POINT-12000000 -39000000\n\ +POLYGON_AT_HEIGHT13000000\n\ +POINT-12000000 -350000000\n\ +POINT250000000 -350000000\n\ +POINT250000000 -82000000\n\ +POINT-12000000 -82000000\n\ +"; + + /* static bool find_and_remove(std::string& src, const std::string& key) { @@ -127,7 +507,7 @@ TEST_CASE("Interface test 1", "[Sequential Arrangement Interface]") solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; printf("Loading objects ...\n"); - std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + std::vector objects_to_print = load_exported_data_from_text(arrange_data_export_text); REQUIRE(objects_to_print.size() > 0); printf("Loading objects ... finished\n"); @@ -185,7 +565,7 @@ TEST_CASE("Interface test 2", "[Sequential Arrangement Interface]") solver_configuration.decimation_precision = SEQ_DECIMATION_PRECISION_HIGH; printf("Loading objects ...\n"); - std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + std::vector objects_to_print = load_exported_data_from_text(arrange_data_export_text); std::vector > convex_unreachable_zones; std::vector > box_unreachable_zones; @@ -246,7 +626,7 @@ TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") start = clock(); PrinterGeometry printer_geometry; - int result = load_printer_geometry("printers/printer_geometry.mk4.txt", printer_geometry); + int result = load_printer_geometry_from_text(printer_geometry_mk4_text, printer_geometry); REQUIRE(result == 0); if (result != 0) @@ -257,6 +637,7 @@ TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") printf("x_size: %d\n", printer_geometry.x_size); printf("y_size: %d\n", printer_geometry.y_size); + REQUIRE(printer_geometry.x_size > 0); REQUIRE(printer_geometry.y_size > 0); @@ -305,13 +686,13 @@ TEST_CASE("Interface test 4", "[Sequential Arrangement Interface]") solver_configuration.object_group_size = 4; printf("Loading objects ...\n"); - std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + std::vector objects_to_print = load_exported_data_from_text(arrange_data_export_text); printf("Loading objects ... finished\n"); PrinterGeometry printer_geometry; printf("Loading printer geometry ...\n"); - int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); + int result = load_printer_geometry_from_text(printer_geometry_mk4_compatibility_text, printer_geometry); REQUIRE(result == 0); if (result != 0) @@ -369,13 +750,13 @@ TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") solver_configuration.object_group_size = 4; printf("Loading objects ...\n"); - std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + std::vector objects_to_print = load_exported_data_from_text(arrange_data_export_text); printf("Loading objects ... finished\n"); PrinterGeometry printer_geometry; printf("Loading printer geometry ...\n"); - int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); + int result = load_printer_geometry_from_text(printer_geometry_mk4_compatibility_text, printer_geometry); REQUIRE(result == 0); if (result != 0) @@ -452,7 +833,7 @@ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") solver_configuration.object_group_size = 4; printf("Loading objects ...\n"); - std::vector objects_to_print = load_exported_data("arrange_data_export.txt"); + std::vector objects_to_print = load_exported_data_from_text(arrange_data_export_text); REQUIRE(objects_to_print.size() > 0); printf("Loading objects ... finished\n"); @@ -464,7 +845,7 @@ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") PrinterGeometry printer_geometry; printf("Loading printer geometry ...\n"); - int result = load_printer_geometry("../printers/printer_geometry.mk4.compatibility.txt", printer_geometry); + int result = load_printer_geometry_from_text(printer_geometry_mk4_compatibility_text, printer_geometry); REQUIRE(result == 0); if (result != 0) { From c9b3f29c5ba07e5de63d056eeee4e41e004c0c67 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 9 Dec 2024 10:00:58 +0100 Subject: [PATCH 29/88] Added progress bar and cancellation into UI, seq arrange is now executed from the main toolbar --- resources/localization/list.txt | 1 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/ArrangeHelper.cpp | 46 +++++++++++++++------ src/slic3r/GUI/ArrangeHelper.hpp | 28 ++++++++++++- src/slic3r/GUI/GLCanvas3D.cpp | 13 +----- src/slic3r/GUI/Jobs/SeqArrangeJob.cpp | 57 +++++++++++++++++++++++++++ src/slic3r/GUI/Jobs/SeqArrangeJob.hpp | 30 ++++++++++++++ src/slic3r/GUI/Plater.cpp | 11 +++++- 8 files changed, 162 insertions(+), 26 deletions(-) create mode 100644 src/slic3r/GUI/Jobs/SeqArrangeJob.cpp create mode 100644 src/slic3r/GUI/Jobs/SeqArrangeJob.hpp diff --git a/resources/localization/list.txt b/resources/localization/list.txt index 1e3f94b9f8..849aff0267 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -79,6 +79,7 @@ src/slic3r/GUI/GUI_Preview.cpp src/slic3r/GUI/HintNotification.cpp src/slic3r/GUI/ImGuiWrapper.cpp src/slic3r/GUI/Jobs/ArrangeJob2.cpp +src/slic3r/GUI/Jobs/SeqArrangeJob.cpp src/slic3r/GUI/Jobs/EmbossJob.cpp src/slic3r/GUI/Jobs/PlaterWorker.hpp src/slic3r/GUI/Jobs/RotoptimizeJob.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 878c154c57..739b6032bb 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -250,6 +250,8 @@ set(SLIC3R_GUI_SOURCES GUI/Jobs/PlaterWorker.hpp GUI/Jobs/ArrangeJob2.hpp GUI/Jobs/ArrangeJob2.cpp + GUI/Jobs/SeqArrangeJob.hpp + GUI/Jobs/SeqArrangeJob.cpp GUI/Jobs/CreateFontNameImageJob.cpp GUI/Jobs/CreateFontNameImageJob.hpp GUI/Jobs/CreateFontStyleImagesJob.cpp diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 48141d99a1..69e42afc06 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -6,7 +6,6 @@ #include -#include "libseqarrange/seq_interface.hpp" namespace Slic3r { @@ -79,17 +78,36 @@ static std::vector get_objects_to_print(const Model& void arrange_model_sequential(Model& model) { - Sequential::PrinterGeometry printer_geometry = get_printer_geometry(); - Sequential::SolverConfiguration solver_config = get_solver_config(printer_geometry); - std::vector objects = get_objects_to_print(model, printer_geometry); - - // Everything ready - let libseqarrange do the actual arrangement. - std::vector plates = - Sequential::schedule_ObjectsForSequentialPrint( - solver_config, - printer_geometry, - objects); + SeqArrange seq_arrange(model); + seq_arrange.process_seq_arrange([](int) {}); + seq_arrange.apply_seq_arrange(model); +} + + +SeqArrange::SeqArrange(const Model& model) +{ + m_printer_geometry = get_printer_geometry(); + m_solver_configuration = get_solver_config(m_printer_geometry); + m_objects = get_objects_to_print(model, m_printer_geometry); + +} + + + +void SeqArrange::process_seq_arrange(std::function progress_fn) +{ + m_plates = + Sequential::schedule_ObjectsForSequentialPrint( + m_solver_configuration, + m_printer_geometry, + m_objects, progress_fn); +} + + + +void SeqArrange::apply_seq_arrange(Model& model) const +{ // Extract the result and move the objects in Model accordingly. struct MoveData { Sequential::ScheduledObject scheduled_object; @@ -102,7 +120,7 @@ void arrange_model_sequential(Model& model) // Now iterate through all the files, read the data and move the objects accordingly. // Save the move data from this file to move_data_all. size_t bed_idx = 0; - for (const Sequential::ScheduledPlate& plate : plates) { + for (const Sequential::ScheduledPlate& plate : m_plates) { Vec3d bed_offset = s_multiple_beds.get_bed_translation(bed_idx); // Iterate the same way as when exporting. for (ModelObject* mo : model.objects) { @@ -130,6 +148,10 @@ void arrange_model_sequential(Model& model) + + + + bool check_seq_printability(const Model& model) { Sequential::PrinterGeometry printer_geometry = get_printer_geometry(); diff --git a/src/slic3r/GUI/ArrangeHelper.hpp b/src/slic3r/GUI/ArrangeHelper.hpp index 953babe43e..f602cefddb 100644 --- a/src/slic3r/GUI/ArrangeHelper.hpp +++ b/src/slic3r/GUI/ArrangeHelper.hpp @@ -1,11 +1,37 @@ #ifndef slic3r_Arrange_Helper_hpp #define slic3r_Arrange_Helper_hpp -class Model; +#include "libseqarrange/seq_interface.hpp" + + namespace Slic3r { + + class Model; + void arrange_model_sequential(Model& model); bool check_seq_printability(const Model& model); + + + // This is just a helper class to collect data for seq. arrangement, running the arrangement + // and applying the results to model. It is here so the processing itself can be offloaded + // into a separate thread without copying the Model or sharing it with UI thread. + class SeqArrange { + public: + explicit SeqArrange(const Model& model); + void process_seq_arrange(std::function progress_fn); + void apply_seq_arrange(Model& model) const; + + private: + // Following three are inputs, filled in by the constructor. + Sequential::PrinterGeometry m_printer_geometry; + Sequential::SolverConfiguration m_solver_configuration; + std::vector m_objects; + + // This is the output, filled in by process_seq_arrange. + std::vector m_plates; + }; + } #endif // slic3r_Arrange_Helper_hpp \ No newline at end of file diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4848105926..1b07ecb7e8 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2223,23 +2223,14 @@ void GLCanvas3D::render() { // This is just temporary pipe to export data to the separate arrange algorithm // and importing the result back. TESTING ONLY !!! - ImGui::Begin("TESTING ONLY (arrange)"); - if (ImGui::Button("Do sequential arrange")) { - arrange_model_sequential(wxGetApp().plater()->model()); - reload_scene(true, true); - wxGetApp().obj_list()->update_after_undo_redo(); - } - static auto time_start = std::chrono::high_resolution_clock::now(); auto time_now = std::chrono::high_resolution_clock::now(); int time_limit_s = 1; static bool last_res = 0; bool valid = std::chrono::duration_cast(time_now - time_start).count() < time_limit_s; - ImGui::Text(""); - ImGui::Separator(); - ImGui::Text(""); - if (ImGui::Button("Test:")) { + ImGui::Begin("TESTING ONLY (arrange)"); + if (ImGui::Button("Test seq printability:")) { last_res = check_seq_printability(wxGetApp().plater()->model()); time_start = std::chrono::high_resolution_clock::now(); } diff --git a/src/slic3r/GUI/Jobs/SeqArrangeJob.cpp b/src/slic3r/GUI/Jobs/SeqArrangeJob.cpp new file mode 100644 index 0000000000..663096712f --- /dev/null +++ b/src/slic3r/GUI/Jobs/SeqArrangeJob.cpp @@ -0,0 +1,57 @@ +#include "SeqArrangeJob.hpp" + +#include "slic3r/GUI/ArrangeHelper.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/Plater.hpp" + + + + +namespace Slic3r { namespace GUI { + + +SeqArrangeJob::SeqArrangeJob(const Model& model) +{ + m_seq_arrange.reset(new SeqArrange(model)); +} + + +void SeqArrangeJob::process(Ctl& ctl) +{ + class SeqArrangeJobException : std::exception {}; + + try { + m_seq_arrange->process_seq_arrange([&](int progress) { + ctl.update_status(progress, _u8L("Arranging for sequential print")); + if (ctl.was_canceled()) + throw SeqArrangeJobException(); + } + ); + } catch (const SeqArrangeJobException&) { + // The task was canceled. Just make sure that the progress notification disappears. + ctl.update_status(100, ""); + } +} + + + +void SeqArrangeJob::finalize(bool canceled, std::exception_ptr&) +{ + // If the task was cancelled, the stopping exception was already caught + // in 'process' function. Let any other exception propagate further. + if (! canceled) { + m_seq_arrange->apply_seq_arrange(wxGetApp().model()); + wxGetApp().plater()->canvas3D()->reload_scene(true, true); + wxGetApp().obj_list()->update_after_undo_redo(); + } + m_seq_arrange.reset(); +} + + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Jobs/SeqArrangeJob.hpp b/src/slic3r/GUI/Jobs/SeqArrangeJob.hpp new file mode 100644 index 0000000000..8ae2a284e2 --- /dev/null +++ b/src/slic3r/GUI/Jobs/SeqArrangeJob.hpp @@ -0,0 +1,30 @@ +#ifndef SEQARRANGEJOB_HPP +#define SEQARRANGEJOB_HPP + +#include "Job.hpp" + +namespace Slic3r { + +class Model; + + +class SeqArrange; + +namespace GUI { + + +class SeqArrangeJob : public Job +{ +public: + explicit SeqArrangeJob(const Model& model); + virtual void process(Ctl &ctl) override; + virtual void finalize(bool /*canceled*/, std::exception_ptr&) override; + +private: + std::unique_ptr m_seq_arrange; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // ARRANGEJOB2_HPP diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5184d4d708..dbc6ce0c62 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -106,6 +106,7 @@ #include "ConfigWizardWebViewPage.hpp" #include "Jobs/RotoptimizeJob.hpp" +#include "Jobs/SeqArrangeJob.hpp" #include "Jobs/SLAImportJob.hpp" #include "Jobs/SLAImportDialog.hpp" #include "Jobs/NotificationProgressIndicator.hpp" @@ -7151,9 +7152,15 @@ void Plater::arrange() ArrangeSelectionMode::Full }; + const bool sequential = p->config->has("complete_objects") && p->config->opt_bool("complete_objects"); + if (p->can_arrange()) { - auto &w = get_ui_job_worker(); - arrange(w, mode); + if (sequential) + replace_job(this->get_ui_job_worker(), std::make_unique(this->model())); + else { + auto& w = get_ui_job_worker(); + arrange(w, mode); + } } } From 33aa425b4f256e3f9111e4a2e617937c04f9d929 Mon Sep 17 00:00:00 2001 From: surynek Date: Fri, 13 Dec 2024 02:14:52 +0100 Subject: [PATCH 30/88] Bounding box calculation in the sequential_decimator tool for hand-tailored extruder model construction. --- .../src/sequential_decimator.cpp | 23 ++++++++++++------- src/slic3r/GUI/Plater.cpp | 2 ++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/libseqarrange/src/sequential_decimator.cpp b/src/libseqarrange/src/sequential_decimator.cpp index 17f65c7808..62d9381896 100644 --- a/src/libseqarrange/src/sequential_decimator.cpp +++ b/src/libseqarrange/src/sequential_decimator.cpp @@ -64,14 +64,14 @@ void print_ConcludingMessage(void) void print_Help(void) { printf("Usage:\n"); - printf("sequential_prusa [--input-file=]\n"); - printf(" [--output-file=]\n"); - printf(" [--tolerance=]\n"); - printf(" [--x-pos= (in mm)]\n"); - printf(" [--y-pos= (in mm)]\n"); - printf(" [--x-nozzle= (in coord_t)]\n"); - printf(" [--y-nozzle= (in coord_t)]\n"); - printf(" [--help]\n"); + printf("sequential_decimator [--input-file=]\n"); + printf(" [--output-file=]\n"); + printf(" [--tolerance=]\n"); + printf(" [--x-pos= (in mm)]\n"); + printf(" [--y-pos= (in mm)]\n"); + printf(" [--x-nozzle= (in coord_t)]\n"); + printf(" [--y-nozzle= (in coord_t)]\n"); + printf(" [--help]\n"); printf("\n"); printf("\n"); printf("Defaults: --input-file=arrange_data_export.txt\n"); @@ -215,6 +215,13 @@ int decimate_Polygons(const CommandParameters &command_parameters) { cout << " " << point.x() << " " << point.y() << endl; } + + BoundingBox bounding_box = get_extents(shift_polygon); + + cout << " BB" << endl; + cout << " " << bounding_box.min.x() << " " << bounding_box.min.y() << endl; + cout << " " << bounding_box.max.x() << " " << bounding_box.max.y() << endl; + cout << endl; } if (command_parameters.output_filename != "") diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index dbc6ce0c62..91010be3f7 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -139,6 +139,8 @@ #include "PresetArchiveDatabase.hpp" #include "BulkExportDialog.hpp" +#include "ArrangeHelper.hpp" + #ifdef __APPLE__ #include "Gizmos/GLGizmosManager.hpp" #endif // __APPLE__ From bd8d230ca9a7a9e56d0620f9f5436776558bcdf3 Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 20 Jan 2025 19:19:21 +0100 Subject: [PATCH 31/88] Fine tuned bounding box for hose in the simplified model for MK4. --- src/slic3r/GUI/ArrangeHelper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 69e42afc06..fc70a6d518 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -27,10 +27,10 @@ static Sequential::PrinterGeometry get_printer_geometry() { std::vector slices; slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, - { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); + { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, {350000000, -23000000 }, {350000000, -35000000 }, {-350000000, -35000000 } } } }); slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -12000000, -350000000 }, { 9000000, -350000000 }, { 9000000, -39000000 }, { -12000000, -39000000 } }, - { { -12000000, -350000000 }, {250000000, -350000000 }, {250000000, -82000000 }, { -12000000, -82000000} } } }); + { { -12000000, -250000000 }, {300000000, -250000000 }, {300000000, -82000000 }, { -12000000, -82000000} } } }); Sequential::PrinterGeometry out; out.x_size = scaled(s_multiple_beds.get_bed_size().x()); From 9b09b111940fcc644c93daffe925a9057a1ae18a Mon Sep 17 00:00:00 2001 From: surynek Date: Tue, 21 Jan 2025 02:23:44 +0100 Subject: [PATCH 32/88] Added simplified geometrical model for the MK3S printer. --- src/slic3r/GUI/ArrangeHelper.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index fc70a6d518..5001da44bd 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -24,6 +24,7 @@ static Sequential::PrinterGeometry get_printer_geometry() { }; // Just hardcode MK4 geometry for now. + /* std::vector slices; slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, @@ -31,7 +32,20 @@ static Sequential::PrinterGeometry get_printer_geometry() { slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, {350000000, -23000000 }, {350000000, -35000000 }, {-350000000, -35000000 } } } }); slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -12000000, -350000000 }, { 9000000, -350000000 }, { 9000000, -39000000 }, { -12000000, -39000000 } }, { { -12000000, -250000000 }, {300000000, -250000000 }, {300000000, -82000000 }, { -12000000, -82000000} } } }); + */ + + // Geometry (simplified head model) for the MK3S printer + std::vector slices; + slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } , + { { -30000000, -12000000 }, { -14000000, -12000000 }, { -14000000, 2000000 }, { -30000000, 2000000 } } } }); + slices.push_back(ExtruderSlice{ 2000000, CONVEX, { { { -20000000, -38000000 }, { 44000000, -38000000 }, { 44000000, 18000000 }, { -20000000, 18000000 } } } }); + slices.push_back(ExtruderSlice{ 6000000, CONVEX, { { { -34000000, -43000000 }, { 37000000, -43000000 }, { 37000000, 16000000 }, { -34000000, 16000000 } }, + { { -45000000, 9000000 }, { 37000000, 9000000 }, { 37000000, 69000000 }, { -45000000, 69000000 } } } }); + slices.push_back(ExtruderSlice{11000000, BOX, { { { -8000000, -82000000 }, { 8000000, -82000000 }, { 8000000, -36000000 }, { -8000000, -36000000 } }, + { { -8000000, -82000000 }, { 250000000, -82000000 }, { 250000000, -300000000 }, { -8000000, -300000000 } } } }); + slices.push_back(ExtruderSlice{11000000, BOX, { { { -300000000, -35000000 }, { 300000000, -35000000 }, { 300000000, -21000000 }, { -300000000, -21000000 } } } }); + Sequential::PrinterGeometry out; out.x_size = scaled(s_multiple_beds.get_bed_size().x()); out.y_size = scaled(s_multiple_beds.get_bed_size().y()); From 4c84e303bbe35f47eeaee6dc8749c27ca156b369 Mon Sep 17 00:00:00 2001 From: surynek Date: Tue, 21 Jan 2025 02:29:53 +0100 Subject: [PATCH 33/88] Commented out geometry for MK3S so that MK4 geometry is still active. --- src/slic3r/GUI/ArrangeHelper.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 5001da44bd..209bf8f8f8 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -23,8 +23,7 @@ static Sequential::PrinterGeometry get_printer_geometry() { }; - // Just hardcode MK4 geometry for now. - /* + // Just hardcode MK4 geometry for now. std::vector slices; slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, @@ -32,10 +31,10 @@ static Sequential::PrinterGeometry get_printer_geometry() { slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, {350000000, -23000000 }, {350000000, -35000000 }, {-350000000, -35000000 } } } }); slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -12000000, -350000000 }, { 9000000, -350000000 }, { 9000000, -39000000 }, { -12000000, -39000000 } }, { { -12000000, -250000000 }, {300000000, -250000000 }, {300000000, -82000000 }, { -12000000, -82000000} } } }); - */ - + // Geometry (simplified head model) for the MK3S printer + /* std::vector slices; slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } , { { -30000000, -12000000 }, { -14000000, -12000000 }, { -14000000, 2000000 }, { -30000000, 2000000 } } } }); @@ -45,7 +44,7 @@ static Sequential::PrinterGeometry get_printer_geometry() { slices.push_back(ExtruderSlice{11000000, BOX, { { { -8000000, -82000000 }, { 8000000, -82000000 }, { 8000000, -36000000 }, { -8000000, -36000000 } }, { { -8000000, -82000000 }, { 250000000, -82000000 }, { 250000000, -300000000 }, { -8000000, -300000000 } } } }); slices.push_back(ExtruderSlice{11000000, BOX, { { { -300000000, -35000000 }, { 300000000, -35000000 }, { 300000000, -21000000 }, { -300000000, -21000000 } } } }); - + */ Sequential::PrinterGeometry out; out.x_size = scaled(s_multiple_beds.get_bed_size().x()); out.y_size = scaled(s_multiple_beds.get_bed_size().y()); From 757760b12fd842ecb2221cd07580915e90239281 Mon Sep 17 00:00:00 2001 From: surynek Date: Tue, 21 Jan 2025 20:27:56 +0100 Subject: [PATCH 34/88] Corrected height for gantry. --- src/slic3r/GUI/ArrangeHelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 209bf8f8f8..e22da31724 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -43,7 +43,7 @@ static Sequential::PrinterGeometry get_printer_geometry() { { { -45000000, 9000000 }, { 37000000, 9000000 }, { 37000000, 69000000 }, { -45000000, 69000000 } } } }); slices.push_back(ExtruderSlice{11000000, BOX, { { { -8000000, -82000000 }, { 8000000, -82000000 }, { 8000000, -36000000 }, { -8000000, -36000000 } }, { { -8000000, -82000000 }, { 250000000, -82000000 }, { 250000000, -300000000 }, { -8000000, -300000000 } } } }); - slices.push_back(ExtruderSlice{11000000, BOX, { { { -300000000, -35000000 }, { 300000000, -35000000 }, { 300000000, -21000000 }, { -300000000, -21000000 } } } }); + slices.push_back(ExtruderSlice{17000000, BOX, { { { -300000000, -35000000 }, { 300000000, -35000000 }, { 300000000, -21000000 }, { -300000000, -21000000 } } } }); */ Sequential::PrinterGeometry out; out.x_size = scaled(s_multiple_beds.get_bed_size().x()); From 89758e9832ca131713100783f34cbc1a761beebb Mon Sep 17 00:00:00 2001 From: surynek Date: Wed, 22 Jan 2025 01:18:00 +0100 Subject: [PATCH 35/88] Added test of objects outside plate in sequential printability test + various debugging. --- src/libseqarrange/src/seq_interface.cpp | 22 +++- src/libseqarrange/src/seq_preprocess.cpp | 63 ++++++++-- src/libseqarrange/src/seq_preprocess.hpp | 4 +- src/libseqarrange/src/seq_sequential.cpp | 144 ++++++++++++++++++++++- src/slic3r/GUI/ArrangeHelper.cpp | 12 +- 5 files changed, 222 insertions(+), 23 deletions(-) diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index 120ec293af..e8872c80b2 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -177,7 +177,7 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration std::vector > unreachable_polygons; std::map flat_index_map; - + for (unsigned int i = 0; i < objects_to_print.size(); ++i) { std::vector convex_level_polygons; @@ -210,8 +210,8 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration scale_down_unreachable_polygons); unreachable_polygons.push_back(scale_down_unreachable_polygons); - polygons.push_back(scale_down_object_polygon); - } + polygons.push_back(scale_down_object_polygon); + } for (const auto& scheduled_plate: scheduled_plates) { @@ -228,6 +228,22 @@ bool check_ScheduledObjectsForSequentialPrintability(const SolverConfiguration { const auto& flat_index = flat_index_map.find(scheduled_object.id)->second; + assert(!objects_to_print[flat_index].pgns_at_height.empty()); + + if (!check_PolygonPositionWithinPlate(solver_configuration, + SEQ_SLICER_SCALE_FACTOR, + scheduled_object.x, + scheduled_object.y, + objects_to_print[flat_index].pgns_at_height[0].second)) + { + #ifdef DEBUG + { + printf("Object placed outside plate.\n"); + } + #endif + return false; + } + plate_polygons.push_back(polygons[flat_index]); plate_unreachable_polygons.push_back(unreachable_polygons[flat_index]); diff --git a/src/libseqarrange/src/seq_preprocess.cpp b/src/libseqarrange/src/seq_preprocess.cpp index 528ed9f0ca..f2c265c27f 100644 --- a/src/libseqarrange/src/seq_preprocess.cpp +++ b/src/libseqarrange/src/seq_preprocess.cpp @@ -694,7 +694,7 @@ void prepare_ExtruderPolygons(const SolverConfiguration &solver bool extra_safety) { for (unsigned int j = 0; j < object_to_print.pgns_at_height.size(); ++j) - { + { coord_t height = object_to_print.pgns_at_height[j].first; if (!object_to_print.pgns_at_height[j].second.points.empty()) @@ -780,14 +780,14 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration std::vector &unreachable_polygons) { std::vector > scaled_unreachable_polygons; - + for (unsigned int i = 0; i < extruder_convex_level_polygons.size(); ++i) { std::vector scaled_level_unreachable_polygons; extend_PolygonConvexUnreachableZone(solver_configuration, polygon, extruder_convex_level_polygons[i], - scaled_level_unreachable_polygons); + scaled_level_unreachable_polygons); scaled_unreachable_polygons.push_back(scaled_level_unreachable_polygons); } @@ -826,19 +826,18 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration { std::vector > scaled_unreachable_polygons; assert(extruder_convex_level_polygons.size() == convex_level_polygons.size()); - + for (unsigned int i = 0; i < extruder_convex_level_polygons.size(); ++i) { - std::vector scaled_level_unreachable_polygons; - extend_PolygonConvexUnreachableZone(solver_configuration, - convex_level_polygons[i], - extruder_convex_level_polygons[i], - scaled_level_unreachable_polygons); - scaled_unreachable_polygons.push_back(scaled_level_unreachable_polygons); + std::vector scaled_level_unreachable_polygons; + extend_PolygonConvexUnreachableZone(solver_configuration, + convex_level_polygons[i], + extruder_convex_level_polygons[i], + scaled_level_unreachable_polygons); + scaled_unreachable_polygons.push_back(scaled_level_unreachable_polygons); } - assert(extruder_box_level_polygons.size() == box_level_polygons.size()); - + for (unsigned int i = 0; i < extruder_box_level_polygons.size(); ++i) { std::vector scaled_level_unreachable_polygons; @@ -884,6 +883,21 @@ bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration return true; } +bool check_PolygonPositionWithinPlate(const SolverConfiguration &solver_configuration, coord_t x, coord_t y, const Slic3r::Polygon &polygon) +{ + BoundingBox polygon_box = get_extents(polygon); + + if (x + polygon_box.min.x() < 0 || x + polygon_box.max.x() > solver_configuration.x_plate_bounding_box_size) + { + return false; + } + if (y + polygon_box.min.y() < 0 || y + polygon_box.max.y() > solver_configuration.y_plate_bounding_box_size) + { + return false; + } + return true; +} + bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon) { @@ -905,6 +919,31 @@ bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration } +bool check_PolygonPositionWithinPlate(const SolverConfiguration &solver_configuration, coord_t scale_factor, coord_t x, coord_t y, const Slic3r::Polygon &polygon) +{ + BoundingBox polygon_box = get_extents(polygon); + + #ifdef DEBUG + { + printf("x: %d,%d\n", polygon_box.min.x() + x, polygon_box.max.x() + x); + printf("y: %d,%d\n", polygon_box.min.y() + y, polygon_box.max.y() + y); + printf("X: %d\n", solver_configuration.x_plate_bounding_box_size * scale_factor); + printf("Y: %d\n", solver_configuration.y_plate_bounding_box_size * scale_factor); + } + #endif + + if (x + polygon_box.min.x() < 0 || x + polygon_box.max.x() > solver_configuration.x_plate_bounding_box_size * scale_factor) + { + return false; + } + if (y + polygon_box.min.y() < 0 || y + polygon_box.max.y() > solver_configuration.y_plate_bounding_box_size * scale_factor) + { + return false; + } + return true; +} + + /*----------------------------------------------------------------*/ bool check_PolygonConsumation(const std::vector &polygons, const std::vector &consumer_polygons) diff --git a/src/libseqarrange/src/seq_preprocess.hpp b/src/libseqarrange/src/seq_preprocess.hpp index 0aacdcb616..9cab9a7f6d 100644 --- a/src/libseqarrange/src/seq_preprocess.hpp +++ b/src/libseqarrange/src/seq_preprocess.hpp @@ -194,8 +194,10 @@ void prepare_UnreachableZonePolygons(const SolverConfiguration std::vector &unreachable_polygons); bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration, const Slic3r::Polygon &polygon); +bool check_PolygonPositionWithinPlate(const SolverConfiguration &solver_configuration, coord_t x, coord_t y, const Slic3r::Polygon &polygon); + bool check_PolygonSizeFitToPlate(const SolverConfiguration &solver_configuration, coord_t scale_factor, const Slic3r::Polygon &polygon); - +bool check_PolygonPositionWithinPlate(const SolverConfiguration &solver_configuration, coord_t scale_factor, coord_t x, coord_t y, const Slic3r::Polygon &polygon); /*----------------------------------------------------------------*/ diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index 94fc7662c3..ef9208869e 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -9,6 +9,7 @@ */ /*================================================================*/ +#include #include #include "seq_defs.hpp" @@ -6238,6 +6239,147 @@ bool check_PointsOutsidePolygons(const std::vector const std::vector &polygons, const std::vector > &unreachable_polygons) { + #ifdef DEBUG + { + printf("Levels U %d,%d\n", unreachable_polygons[0].size(), unreachable_polygons[1].size()); + + int c = 0; + string svg_filename = "collision_checking.svg"; + SVG checking_svg(svg_filename); + + for (unsigned int i = 0; i < polygons.size() - 1; ++i) + { + Polygon display_polygon = polygons[i]; + + for (unsigned int j = 0; j < display_polygon.points.size(); ++j) + { + display_polygon.points[j] = Point(SEQ_SVG_SCALE_FACTOR * (display_polygon.points[j].x() + dec_values_X[i].as_double()), + SEQ_SVG_SCALE_FACTOR * (display_polygon.points[j].y() + dec_values_Y[i].as_double())); + } + + string color; + + switch(c % 8) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + } + checking_svg.draw(display_polygon, color); + ++c; + } + for (unsigned int i = 1; i < unreachable_polygons.size(); ++i) + { + for (unsigned int k = 0; k < unreachable_polygons[i].size(); ++k) + { + Polygon display_polygon = unreachable_polygons[i][k]; + + for (unsigned int j = 0; j < display_polygon.points.size(); ++j) + { + display_polygon.points[j] = Point(SEQ_SVG_SCALE_FACTOR * (display_polygon.points[j].x() + dec_values_X[i].as_double()), + SEQ_SVG_SCALE_FACTOR * (display_polygon.points[j].y() + dec_values_Y[i].as_double())); + } + + string color; + + switch(c % 8) + { + case 0: + { + color = "green"; + break; + } + case 1: + { + color = "blue"; + break; + } + case 2: + { + color = "red"; + break; + } + case 3: + { + color = "grey"; + break; + } + case 4: + { + color = "cyan"; + break; + } + case 5: + { + color = "magenta"; + break; + } + case 6: + { + color = "yellow"; + break; + } + case 7: + { + color = "black"; + break; + } + case 8: + { + color = "indigo"; + break; + } + } + checking_svg.draw(display_polygon, color); + ++c; + } + } + checking_svg.Close(); + } + #endif + if (!polygons.empty()) { for (unsigned int i = 0; i < polygons.size() - 1; ++i) @@ -6354,7 +6496,7 @@ bool check_PointsOutsidePolygons(const std::vector printf("X[i]: %.3f, Y[i]: %.3f, X[j]: %.3f, Y[j]: %.3f\n", dec_values_X[i].as_double(), dec_values_Y[i].as_double(), dec_values_X[j].as_double(), dec_values_Y[j].as_double()); printf("Outside 2: %.3f\n", outside); } - #endif + #endif if (outside > -EPSILON) { diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index e22da31724..9bcbe716e9 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -25,12 +25,12 @@ static Sequential::PrinterGeometry get_printer_geometry() { // Just hardcode MK4 geometry for now. std::vector slices; - slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); - slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, - { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); - slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, {350000000, -23000000 }, {350000000, -35000000 }, {-350000000, -35000000 } } } }); - slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -12000000, -350000000 }, { 9000000, -350000000 }, { 9000000, -39000000 }, { -12000000, -39000000 } }, - { { -12000000, -250000000 }, {300000000, -250000000 }, {300000000, -82000000 }, { -12000000, -82000000} } } }); + slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); + slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, + { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); + slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, { 350000000, -23000000 }, { 350000000, -35000000 }, {-350000000, -35000000 } } } }); + slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -13000000, -84000000 }, { 11000000, -84000000 }, { 11000000, -38000000 }, { -13000000, -38000000 } }, + { { 11000000, -300000000 }, { 300000000, -300000000 }, { 300000000, -84000000 }, { 11000000, -84000000 } } } }); // Geometry (simplified head model) for the MK3S printer From dc8c53e82eac26c95a8546c8e6eeec1d55431d10 Mon Sep 17 00:00:00 2001 From: surynek Date: Wed, 22 Jan 2025 23:55:24 +0100 Subject: [PATCH 36/88] Hacked height calculation when making object slices for sequential scheduling. --- src/slic3r/GUI/ArrangeHelper.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 9bcbe716e9..69f59e88ea 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -77,7 +77,9 @@ static std::vector get_objects_to_print(const Model& objects.emplace_back(Sequential::ObjectToPrint{int(inst_id == 0 ? mo->id().id : mi->id().id), inst_id + 1 < mo->instances.size(), scaled(mo->instance_bounding_box(inst_id).size().z()), {}}); for (double height : heights) { - Polygon pgn = its_convex_hull_2d_above(raw_mesh.its, mi->get_matrix_no_offset().cast(), height); + // It seems that zero level in the object instance is mi->get_offset().z(), however need to have bed as zero level, + // hence substracting mi->get_offset().z() from height seems to be an easy hack + Polygon pgn = its_convex_hull_2d_above(raw_mesh.its, mi->get_matrix_no_offset().cast(), height - mi->get_offset().z()); objects.back().pgns_at_height.emplace_back(std::make_pair(scaled(height), pgn)); } ++inst_id; From e4bc8ccbf226cc3379e8cdc742709b7b03742a2d Mon Sep 17 00:00:00 2001 From: surynek Date: Wed, 22 Jan 2025 23:56:55 +0100 Subject: [PATCH 37/88] Minor change of debug code. --- src/libseqarrange/src/seq_sequential.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libseqarrange/src/seq_sequential.cpp b/src/libseqarrange/src/seq_sequential.cpp index ef9208869e..2fc057fdc0 100644 --- a/src/libseqarrange/src/seq_sequential.cpp +++ b/src/libseqarrange/src/seq_sequential.cpp @@ -6247,7 +6247,7 @@ bool check_PointsOutsidePolygons(const std::vector string svg_filename = "collision_checking.svg"; SVG checking_svg(svg_filename); - for (unsigned int i = 0; i < polygons.size() - 1; ++i) + for (unsigned int i = 0; i < polygons.size(); ++i) { Polygon display_polygon = polygons[i]; @@ -6310,7 +6310,7 @@ bool check_PointsOutsidePolygons(const std::vector checking_svg.draw(display_polygon, color); ++c; } - for (unsigned int i = 1; i < unreachable_polygons.size(); ++i) + for (unsigned int i = 0; i < unreachable_polygons.size(); ++i) { for (unsigned int k = 0; k < unreachable_polygons[i].size(); ++k) { From 8f89b038afd93cc5186d3d14919d988fdbc46fa3 Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 27 Jan 2025 13:20:08 +0100 Subject: [PATCH 38/88] Commented on non-empty requirement of the nozzle level polygon in PrinterGeometry. --- src/libseqarrange/include/libseqarrange/seq_interface.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index aa09fa4210..7eb14e3fd7 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -36,10 +36,12 @@ struct PrinterGeometry { coord_t x_size; coord_t y_size; - + + // at least height 0 (corresponding to nozzle) must be present in convex_height std::set convex_heights; std::set box_heights; - + + // , at least one polygon must be present for height 0 std::map > extruder_slices; int convert_Geometry2PlateBoundingBoxSize(void) const; From a9116ea4fdeef96d456a70c9365ded60289b8297 Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 27 Jan 2025 17:36:00 +0100 Subject: [PATCH 39/88] Changed the PrinterGeometry structure to accommodate polygonal bed shape. --- .../include/libseqarrange/seq_interface.hpp | 10 +++-- src/libseqarrange/src/seq_interface.cpp | 29 +++++++++++--- src/libseqarrange/src/seq_utilities.cpp | 17 ++++---- src/libseqarrange/test/seq_test_interface.cpp | 39 +++++++++++-------- src/slic3r/GUI/ArrangeHelper.cpp | 7 ++++ 5 files changed, 68 insertions(+), 34 deletions(-) diff --git a/src/libseqarrange/include/libseqarrange/seq_interface.hpp b/src/libseqarrange/include/libseqarrange/seq_interface.hpp index 7eb14e3fd7..c6c5df4c9a 100644 --- a/src/libseqarrange/include/libseqarrange/seq_interface.hpp +++ b/src/libseqarrange/include/libseqarrange/seq_interface.hpp @@ -34,8 +34,7 @@ namespace Sequential struct PrinterGeometry { - coord_t x_size; - coord_t y_size; + Slic3r::Polygon plate; // at least height 0 (corresponding to nozzle) must be present in convex_height std::set convex_heights; @@ -44,8 +43,7 @@ struct PrinterGeometry // , at least one polygon must be present for height 0 std::map > extruder_slices; - int convert_Geometry2PlateBoundingBoxSize(void) const; - void convert_Geometry2PlateBoundingBoxSize(int &X_bounding_box_size, int &Y_bounding_box_size) const; + bool convert_Geometry2PlateBounds(int &x_bounding_box_size, int &y_bounding_box_size, Slic3r::Polygon &plate_bounding_polygon) const; }; @@ -75,8 +73,12 @@ struct SolverConfiguration int bounding_box_size_optimization_step; int minimum_bounding_box_size; + int x_plate_bounding_box_size; int y_plate_bounding_box_size; + + Slic3r::Polygon plate_bounding_polygon; + int max_refines; int object_group_size; diff --git a/src/libseqarrange/src/seq_interface.cpp b/src/libseqarrange/src/seq_interface.cpp index e8872c80b2..5647a39a35 100644 --- a/src/libseqarrange/src/seq_interface.cpp +++ b/src/libseqarrange/src/seq_interface.cpp @@ -75,16 +75,33 @@ const coord_t SEQ_PRUSA_XL_GANTRY_LEVEL = 26000000; /*----------------------------------------------------------------*/ -int PrinterGeometry::convert_Geometry2PlateBoundingBoxSize(void) const +bool PrinterGeometry::convert_Geometry2PlateBounds(int &x_plate_bounding_box_size, int &y_plate_bounding_box_size, Slic3r::Polygon &plate_bounding_polygon) const { - return MAX(x_size / SEQ_SLICER_SCALE_FACTOR, y_size / SEQ_SLICER_SCALE_FACTOR); -} + coord_t x_size, y_size; + BoundingBox plate_box = get_extents(plate); + + x_size = plate_box.max.x() - plate_box.min.x(); + y_size = plate_box.max.y() - plate_box.min.y(); -void PrinterGeometry::convert_Geometry2PlateBoundingBoxSize(int &x_plate_bounding_box_size, int &y_plate_bounding_box_size) const -{ x_plate_bounding_box_size = x_size / SEQ_SLICER_SCALE_FACTOR; y_plate_bounding_box_size = y_size / SEQ_SLICER_SCALE_FACTOR; + + coord_t plate_box_area = x_size * y_size; + + if (plate.area() != plate_box_area) + { + for (unsigned int i = 0; i < plate.points.size(); ++i) + { + plate_bounding_polygon.points.insert(plate_bounding_polygon.points.begin() + i, Point(plate.points[i].x() / SEQ_SLICER_SCALE_FACTOR, + plate.points[i].y() / SEQ_SLICER_SCALE_FACTOR)); + } + // non-rectangular plate is currently not supported + assert(false); + + return false; + } + return true; } @@ -150,7 +167,7 @@ double SolverConfiguration::convert_DecimationPrecision2Tolerance(DecimationPrec void SolverConfiguration::setup(const PrinterGeometry &printer_geometry) { - printer_geometry.convert_Geometry2PlateBoundingBoxSize(x_plate_bounding_box_size, y_plate_bounding_box_size); + printer_geometry.convert_Geometry2PlateBounds(x_plate_bounding_box_size, y_plate_bounding_box_size, plate_bounding_polygon); } diff --git a/src/libseqarrange/src/seq_utilities.cpp b/src/libseqarrange/src/seq_utilities.cpp index 2532714370..ec43304ba5 100644 --- a/src/libseqarrange/src/seq_utilities.cpp +++ b/src/libseqarrange/src/seq_utilities.cpp @@ -132,7 +132,10 @@ int load_printer_geometry_from_text(const std::string &geometry_text, PrinterGeo int load_printer_geometry_from_stream(std::istream &geometry_stream, PrinterGeometry &printer_geometry) { Polygon *current_polygon = NULL; - std::string line; + std::string line; + + coord_t x_size = -1; + coord_t y_size = -1; while (geometry_stream) { @@ -193,20 +196,20 @@ int load_printer_geometry_from_stream(std::istream &geometry_stream, PrinterGeom std::stringstream ss(line); std::string val; ss >> val; - coord_t x_size = std::stoi(val); - - printer_geometry.x_size = x_size; + x_size = std::stoi(val); } else if (find_and_remove(line, "Y_SIZE")) { std::stringstream ss(line); std::string val; ss >> val; - coord_t y_size = std::stoi(val); - - printer_geometry.y_size = y_size; + y_size = std::stoi(val); } } + assert(x_size > 0 && y_size > 0); + + printer_geometry.plate = { {0, 0}, {x_size, 0}, {x_size, y_size}, {0, y_size} }; + return 0; } diff --git a/src/libseqarrange/test/seq_test_interface.cpp b/src/libseqarrange/test/seq_test_interface.cpp index d34f9316c9..7f9c381f61 100644 --- a/src/libseqarrange/test/seq_test_interface.cpp +++ b/src/libseqarrange/test/seq_test_interface.cpp @@ -634,12 +634,8 @@ TEST_CASE("Interface test 3", "[Sequential Arrangement Interface]") printf("Printer geometry load error.\n"); return; } - - printf("x_size: %d\n", printer_geometry.x_size); - printf("y_size: %d\n", printer_geometry.y_size); - REQUIRE(printer_geometry.x_size > 0); - REQUIRE(printer_geometry.y_size > 0); + REQUIRE(printer_geometry.plate.points.size() == 4); for (const auto& convex_height: printer_geometry.convex_heights) { @@ -723,10 +719,13 @@ TEST_CASE("Interface test 4", "[Sequential Arrangement Interface]") for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; - REQUIRE(scheduled_object.x >= 0); - REQUIRE(scheduled_object.x <= printer_geometry.x_size); - REQUIRE(scheduled_object.y >= 0); - REQUIRE(scheduled_object.y <= printer_geometry.y_size); + + BoundingBox plate_box = get_extents(printer_geometry.plate); + + REQUIRE(scheduled_object.x >= plate_box.min.x()); + REQUIRE(scheduled_object.x <= plate_box.max.x()); + REQUIRE(scheduled_object.y >= plate_box.min.y()); + REQUIRE(scheduled_object.y <= plate_box.max.y()); } } @@ -790,10 +789,13 @@ TEST_CASE("Interface test 5", "[Sequential Arrangement Interface]") for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; - REQUIRE(scheduled_object.x >= 0); - REQUIRE(scheduled_object.x <= printer_geometry.x_size); - REQUIRE(scheduled_object.y >= 0); - REQUIRE(scheduled_object.y <= printer_geometry.y_size); + + BoundingBox plate_box = get_extents(printer_geometry.plate); + + REQUIRE(scheduled_object.x >= plate_box.min.x()); + REQUIRE(scheduled_object.x <= plate_box.max.x()); + REQUIRE(scheduled_object.y >= plate_box.min.y()); + REQUIRE(scheduled_object.y <= plate_box.max.y()); } } @@ -878,10 +880,13 @@ TEST_CASE("Interface test 6", "[Sequential Arrangement Interface]") for (const auto& scheduled_object: scheduled_plates[plate].scheduled_objects) { cout << " ID: " << scheduled_object.id << " X: " << scheduled_object.x << " Y: " << scheduled_object.y << endl; - REQUIRE(scheduled_object.x >= 0); - REQUIRE(scheduled_object.x <= printer_geometry.x_size); - REQUIRE(scheduled_object.y >= 0); - REQUIRE(scheduled_object.y <= printer_geometry.y_size); + + BoundingBox plate_box = get_extents(printer_geometry.plate); + + REQUIRE(scheduled_object.x >= plate_box.min.x()); + REQUIRE(scheduled_object.x <= plate_box.max.x()); + REQUIRE(scheduled_object.y >= plate_box.min.y()); + REQUIRE(scheduled_object.y <= plate_box.max.y()); } } diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 69f59e88ea..ec83db3489 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -46,8 +46,15 @@ static Sequential::PrinterGeometry get_printer_geometry() { slices.push_back(ExtruderSlice{17000000, BOX, { { { -300000000, -35000000 }, { 300000000, -35000000 }, { 300000000, -21000000 }, { -300000000, -21000000 } } } }); */ Sequential::PrinterGeometry out; + + /* out.x_size = scaled(s_multiple_beds.get_bed_size().x()); out.y_size = scaled(s_multiple_beds.get_bed_size().y()); + */ + coord_t plate_x_size = scaled(s_multiple_beds.get_bed_size().x()); + coord_t plate_y_size = scaled(s_multiple_beds.get_bed_size().y()); + out.plate = { { 0, 0 }, { plate_x_size, 0}, { plate_x_size, plate_y_size }, { 0, plate_y_size } }; + for (const ExtruderSlice& slice : slices) { (slice.shape_type == CONVEX ? out.convex_heights : out.box_heights).emplace(slice.height); out.extruder_slices.insert(std::make_pair(slice.height, slice.polygons)); From 43963d0bd6b572c15083303a99fce3f5a8ed1539 Mon Sep 17 00:00:00 2001 From: surynek Date: Mon, 27 Jan 2025 20:42:18 +0100 Subject: [PATCH 40/88] Added printer geometry for Original Prusa Mini+ (commented out so that MK4 is still active). --- src/slic3r/GUI/ArrangeHelper.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index ec83db3489..8d150d601b 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -23,7 +23,7 @@ static Sequential::PrinterGeometry get_printer_geometry() { }; - // Just hardcode MK4 geometry for now. + // Just hardcode geometry (simplified head model) for the Original Prusa MK4. std::vector slices; slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, @@ -33,7 +33,7 @@ static Sequential::PrinterGeometry get_printer_geometry() { { { 11000000, -300000000 }, { 300000000, -300000000 }, { 300000000, -84000000 }, { 11000000, -84000000 } } } }); - // Geometry (simplified head model) for the MK3S printer + // Geometry (simplified head model) for the Original Prusa MK3S+ printer /* std::vector slices; slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } , @@ -45,6 +45,20 @@ static Sequential::PrinterGeometry get_printer_geometry() { { { -8000000, -82000000 }, { 250000000, -82000000 }, { 250000000, -300000000 }, { -8000000, -300000000 } } } }); slices.push_back(ExtruderSlice{17000000, BOX, { { { -300000000, -35000000 }, { 300000000, -35000000 }, { 300000000, -21000000 }, { -300000000, -21000000 } } } }); */ + + // Geometry (simplified head model) for the Original Prusa Mini+ printer + /* + std::vector slices; + slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } }, + { { 24000000, -3000000 }, { 35000000, -3000000 }, { 35000000, 10000000 }, { 24000000, 10000000 } }, + { { -5000000, 4000000 }, { 5000000, 4000000 }, { 5000000, 18000000 }, { -5000000, 18000000 } } } }); + slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -16000000, -44000000 }, { 37000000, -44000000 }, { 37000000, 31000000 }, { -16000000, 31000000 } } } }); + slices.push_back(ExtruderSlice{ 10000000, CONVEX, { { { -10000000, -88000000 }, { 10000000, -88000000 }, { 10000000, -38000000 }, { -10000000, -38000000 } }, + { { -17000000, -44000000 }, { 43000000, -44000000 }, { 43000000, 33000000 }, { -17000000, 33000000 } } } }); + slices.push_back(ExtruderSlice{ 22000000, BOX, { { {-200000000, -28000000 }, { 200000000, -28000000 }, { 200000000, -14000000 }, { -200000000, -14000000 } } } }); + slices.push_back(ExtruderSlice{100000000, BOX, { { {-200000000, -200000000 }, { 10000000, -200000000 }, { 10000000, 10000000 }, { -200000000, 10000000 } } } }); + */ + Sequential::PrinterGeometry out; /* From 0c3b4ec99a45ddea547a3151c7d31f49c51b4b39 Mon Sep 17 00:00:00 2001 From: surynek Date: Tue, 28 Jan 2025 00:24:37 +0100 Subject: [PATCH 41/88] Added simplified model for the Prusa Original XL printer (commented out so MK4 is still active). --- src/slic3r/GUI/ArrangeHelper.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 8d150d601b..1a1a1af0e3 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -31,7 +31,6 @@ static Sequential::PrinterGeometry get_printer_geometry() { slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, { 350000000, -23000000 }, { 350000000, -35000000 }, {-350000000, -35000000 } } } }); slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -13000000, -84000000 }, { 11000000, -84000000 }, { 11000000, -38000000 }, { -13000000, -38000000 } }, { { 11000000, -300000000 }, { 300000000, -300000000 }, { 300000000, -84000000 }, { 11000000, -84000000 } } } }); - // Geometry (simplified head model) for the Original Prusa MK3S+ printer /* @@ -58,6 +57,20 @@ static Sequential::PrinterGeometry get_printer_geometry() { slices.push_back(ExtruderSlice{ 22000000, BOX, { { {-200000000, -28000000 }, { 200000000, -28000000 }, { 200000000, -14000000 }, { -200000000, -14000000 } } } }); slices.push_back(ExtruderSlice{100000000, BOX, { { {-200000000, -200000000 }, { 10000000, -200000000 }, { 10000000, 10000000 }, { -200000000, 10000000 } } } }); */ + + // Geometry (simplified head model) for the Original Prusa XL printer + /* + std::vector slices; + slices.push_back(ExtruderSlice{0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); + slices.push_back(ExtruderSlice{2000000, CONVEX, { { { -10000000, -47000000 }, { 34000000, -47000000 }, { 34000000, 16000000 }, { -10000000, 16000000 } }, + { { -34000000, 13000000 }, { 32000000, 13000000 }, { 32000000, 67000000 }, { -34000000, 67000000 } } } }); + slices.push_back(ExtruderSlice{23000000, CONVEX, { { { -42000000, 11000000 }, { 32000000, 11000000 }, { 32000000, 66000000 }, { -42000000, 66000000 } }, + { { -33000000, -37000000 }, { 43000000, -37000000 }, { 43000000, 18000000 }, { -33000000, 18000000 } }, + { { -13000000, -68000000 }, { 47000000, -68000000 }, { 47000000, -30000000 }, { -13000000, -30000000 } } } }); + slices.push_back(ExtruderSlice{19000000, BOX, { { { -400000000, 24000000 }, { 400000000, 24000000 }, { 400000000, 50000000 }, { -400000000, 50000000 } } } }); + slices.push_back(ExtruderSlice{180000000, BOX, { { { -400000000, -400000000 }, { 400000000, -400000000 }, { 400000000, 10000000 }, { -400000000, 10000000 } } } }); + slices.push_back(ExtruderSlice{220000000, BOX, { { { -400000000, -400000000 }, { 400000000, -400000000 }, { 400000000, 400000000 }, { -400000000, 400000000 } } } }); + */ Sequential::PrinterGeometry out; @@ -100,7 +113,7 @@ static std::vector get_objects_to_print(const Model& for (double height : heights) { // It seems that zero level in the object instance is mi->get_offset().z(), however need to have bed as zero level, // hence substracting mi->get_offset().z() from height seems to be an easy hack - Polygon pgn = its_convex_hull_2d_above(raw_mesh.its, mi->get_matrix_no_offset().cast(), height - mi->get_offset().z()); + Polygon pgn = its_convex_hull_2d_above(raw_mesh.its, mi->get_matrix_no_offset().cast(), height - mi->get_offset().z()); objects.back().pgns_at_height.emplace_back(std::make_pair(scaled(height), pgn)); } ++inst_id; From 456a8a0a35191331fbd9bcded7a88fa95d7b8ddb Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 15 Jan 2025 13:51:09 +0100 Subject: [PATCH 42/88] Comment-out sequential arrange tests for now --- src/libseqarrange/CMakeLists.txt | 51 +++++++++++++------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/src/libseqarrange/CMakeLists.txt b/src/libseqarrange/CMakeLists.txt index b134ae13a5..fc74199422 100644 --- a/src/libseqarrange/CMakeLists.txt +++ b/src/libseqarrange/CMakeLists.txt @@ -1,10 +1,3 @@ -cmake_minimum_required(VERSION 3.10) -cmake_minimum_required(VERSION 3.10) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED True) -set(CMAKE_CXX_EXTENSIONS False) - find_package(Z3 REQUIRED) slic3r_remap_configs("z3::libz3" RelWithDebInfo Release) @@ -13,41 +6,37 @@ include(Catch) add_library(libseqarrange STATIC src/seq_interface.cpp src/seq_preprocess.cpp src/seq_sequential.cpp src/seq_utilities.cpp) target_include_directories(libseqarrange PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange) -target_link_libraries(libseqarrange libslic3r z3::libz3) +target_link_libraries(libseqarrange PUBLIC libslic3r PRIVATE z3::libz3) add_executable(sequential_arrange src/sequential_prusa.cpp) target_include_directories(sequential_arrange PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange) -target_link_libraries(sequential_arrange libseqarrange) +target_link_libraries(sequential_arrange PRIVATE libseqarrange) add_executable(sequential_decimator src/sequential_decimator.cpp) target_include_directories(sequential_decimator PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange) -target_link_libraries(sequential_decimator libseqarrange) +target_link_libraries(sequential_decimator PRIVATE libseqarrange) -# The tests - separate executables for now. +# Tests - commented out for now -# Commented-out for now - depends on Gecode -# add_executable(seq_test_arrangement test/seq_test_arrangement.cpp) -# target_link_libraries(seq_test_arrangement libseqarrange) +#add_executable(seq_test_polygon test/seq_test_polygon.cpp test/prusaparts.cpp) +#target_link_libraries(seq_test_polygon PRIVATE Catch2::Catch2 libseqarrange) +#target_include_directories(seq_test_polygon PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") -add_executable(seq_test_polygon test/seq_test_polygon.cpp test/prusaparts.cpp) -target_link_libraries(seq_test_polygon Catch2::Catch2 libseqarrange) -target_include_directories(seq_test_polygon PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") +#add_executable(seq_test_sequential test/seq_test_sequential.cpp) +#target_link_libraries(seq_test_sequential PRIVATE libseqarrange) +#target_include_directories(seq_test_sequential PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") -add_executable(seq_test_sequential test/seq_test_sequential.cpp) -target_link_libraries(seq_test_sequential libseqarrange) -target_include_directories(seq_test_sequential PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") +#add_executable(seq_test_preprocess test/seq_test_preprocess.cpp test/prusaparts.cpp) +#target_link_libraries(seq_test_preprocess PRIVATE libseqarrange) +#target_include_directories(seq_test_preprocess PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") -add_executable(seq_test_preprocess test/seq_test_preprocess.cpp test/prusaparts.cpp) -target_link_libraries(seq_test_preprocess libseqarrange) -target_include_directories(seq_test_preprocess PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") +#add_executable(seq_test_interface test/seq_test_interface.cpp) +#target_link_libraries(seq_test_interface PUBLIC libseqarrange) +#target_include_directories(seq_test_interface PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") -add_executable(seq_test_interface test/seq_test_interface.cpp) -target_link_libraries(seq_test_interface libseqarrange) -target_include_directories(seq_test_interface PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/include/libseqarrange") - -add_test(seq_test_polygon seq_test_polygon) -add_test(seq_test_preprocess seq_test_preprocess) -add_test(seq_test_sequential seq_test_sequential) -add_test(seq_test_interface seq_test_interface) +#add_test(seq_test_polygon seq_test_polygon) +#add_test(seq_test_preprocess seq_test_preprocess) +#add_test(seq_test_sequential seq_test_sequential) +#add_test(seq_test_interface seq_test_interface) From f7c29a7007fc837181a4ed99517ce83cc3c19dc7 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 16 Jan 2025 13:56:04 +0100 Subject: [PATCH 43/88] Raise z to clear all already printed objects when sequential printing is active --- src/libslic3r/GCode.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index b54e13c3ce..6c27390ea4 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1278,6 +1278,8 @@ void GCodeGenerator::_do_export(Print& print, GCodeOutputStream &file, Thumbnail file.write(m_label_objects.maybe_stop_instance()); const double last_z{this->writer().get_position().z()}; file.write(this->writer().travel_to_z_force(last_z, "ensure z position")); + const double travel_z = std::max(last_z, double(m_max_layer_z)); + file.write(this->writer().travel_to_z_force(travel_z, "ensure z position to clear all already printed objects")); const Vec3crd from{to_3d(*this->last_position, scaled(this->m_last_layer_z))}; const Vec3crd to{0, 0, scaled(this->m_last_layer_z)}; file.write(this->travel_to(from, to, ExtrusionRole::None, "move to origin position for next object", [](){return "";})); From 20550049a839a0df72db7634e7a8710274251ace Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 16 Jan 2025 15:23:11 +0100 Subject: [PATCH 44/88] Sequential printability test applied to active bed only --- src/slic3r/GUI/ArrangeHelper.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 1a1a1af0e3..530a0d0d25 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -209,9 +209,18 @@ bool check_seq_printability(const Model& model) // FIXME: This does not consider plates, non-printable objects and instances. Sequential::ScheduledPlate plate; - for (ModelObject* mo : model.objects) { - ModelInstance* mi = mo->instances.front(); - plate.scheduled_objects.emplace_back(mo->id().id, scaled(mi->get_offset().x()), scaled(mi->get_offset().y())); + for (const ModelObject* mo : model.objects) { + int inst_id = -1; + for (const ModelInstance* mi : mo->instances) { + ++inst_id; + + auto it = s_multiple_beds.get_inst_map().find(mi->id()); + if (it == s_multiple_beds.get_inst_map().end() || it->second != s_multiple_beds.get_active_bed()) + continue; + + Vec3d offset = s_multiple_beds.get_bed_translation(s_multiple_beds.get_active_bed()); + plate.scheduled_objects.emplace_back(inst_id == 0 ? mo->id().id : mi->id().id, scaled(mi->get_offset().x() - offset.x()), scaled(mi->get_offset().y() - offset.y())); + } } return Sequential::check_ScheduledObjectsForSequentialPrintability(solver_config, printer_geometry, objects, std::vector(1, plate)); From dad053d3585b92c4cc599b57e79ab4aab741ef70 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 22 Jan 2025 12:15:38 +0100 Subject: [PATCH 45/88] Moved extruder_clearance_radius and height into Printer Settings --- src/libslic3r/Preset.cpp | 6 +++--- src/slic3r/GUI/ConfigManipulation.cpp | 4 ---- src/slic3r/GUI/Tab.cpp | 8 ++++---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 79a7524c53..5ff7364e5c 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -497,8 +497,8 @@ static std::vector s_Preset_print_options { "support_material_buildplate_only", "support_tree_angle", "support_tree_angle_slow", "support_tree_branch_diameter", "support_tree_branch_diameter_angle", "support_tree_branch_diameter_double_wall", "support_tree_top_rate", "support_tree_branch_distance", "support_tree_tip_diameter", - "dont_support_bridges", "thick_bridges", "notes", "complete_objects", "extruder_clearance_radius", - "extruder_clearance_height", "gcode_comments", "gcode_label_objects", "output_filename_format", "post_process", "gcode_substitutions", "perimeter_extruder", + "dont_support_bridges", "thick_bridges", "notes", "complete_objects", + "gcode_comments", "gcode_label_objects", "output_filename_format", "post_process", "gcode_substitutions", "perimeter_extruder", "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", "ooze_prevention", "standby_temperature_delta", "interface_shells", "extrusion_width", "first_layer_extrusion_width", "perimeter_extrusion_width", "external_perimeter_extrusion_width", "infill_extrusion_width", "solid_infill_extrusion_width", @@ -556,7 +556,7 @@ static std::vector s_Preset_printer_options { "max_print_height", "default_print_profile", "inherits", "remaining_times", "silent_mode", "machine_limits_usage", "thumbnails", "thumbnails_format", - "nozzle_high_flow" + "nozzle_high_flow", "extruder_clearance_radius", "extruder_clearance_height" }; static std::vector s_Preset_sla_print_options { diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 70c187107c..04b9e44ca3 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -388,10 +388,6 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) for (auto el : { "ironing_type", "ironing_flowrate", "ironing_spacing", "ironing_speed" }) toggle_field(el, has_ironing); - bool have_sequential_printing = config->opt_bool("complete_objects"); - for (auto el : { "extruder_clearance_radius", "extruder_clearance_height" }) - toggle_field(el, have_sequential_printing); - bool have_ooze_prevention = config->opt_bool("ooze_prevention"); toggle_field("standby_temperature_delta", have_ooze_prevention); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d5c268be42..ca6df4ec6f 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1694,10 +1694,6 @@ void TabPrint::build() page = add_options_page(L("Output options"), "output+page_white"); optgroup = page->new_optgroup(L("Sequential printing")); optgroup->append_single_option_line("complete_objects", "sequential-printing_124589"); - line = { L("Extruder clearance"), "" }; - line.append_option(optgroup->get_option("extruder_clearance_radius")); - line.append_option(optgroup->get_option("extruder_clearance_height")); - optgroup->append_line(line); optgroup = page->new_optgroup(L("Output file")); optgroup->append_single_option_line("gcode_comments"); @@ -2817,6 +2813,10 @@ void TabPrinter::build_fff() optgroup->append_single_option_line("variable_layer_height"); optgroup->append_single_option_line("prefer_clockwise_movements"); + optgroup = page->new_optgroup(L("Sequential printing limits")); + optgroup->append_single_option_line("extruder_clearance_radius"); + optgroup->append_single_option_line("extruder_clearance_height"); + const int gcode_field_height = 15; // 150 const int notes_field_height = 25; // 250 page = add_options_page(L("Custom G-code"), "cog"); From 8c49efbf67c2cace9a400dcbba5daee8b498d43a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 21 Jan 2025 14:33:20 +0100 Subject: [PATCH 46/88] Geometry for seq arrange is loaded from external file --- .../data/printer_gantries/geometries.txt | 99 ++++++++++ src/slic3r/GUI/ArrangeHelper.cpp | 171 ++++++++++++++---- src/slic3r/GUI/ArrangeHelper.hpp | 7 +- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- src/slic3r/GUI/Jobs/SeqArrangeJob.cpp | 4 +- src/slic3r/GUI/Jobs/SeqArrangeJob.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 4 +- 7 files changed, 246 insertions(+), 43 deletions(-) create mode 100644 resources/data/printer_gantries/geometries.txt diff --git a/resources/data/printer_gantries/geometries.txt b/resources/data/printer_gantries/geometries.txt new file mode 100644 index 0000000000..5362014d63 --- /dev/null +++ b/resources/data/printer_gantries/geometries.txt @@ -0,0 +1,99 @@ +{ + "printers": [ + { + "printer_notes_regex": ".*PRINTER_MODEL_MK4.*", + "gantry_model_filename": "prusa3d_mk4_gantry.stl", + "slices": [ + { + "height": "0", + "type": "convex", + "polygons": [ + "-5,-5;5,-5;5,5;-5,5" + ] + }, + { + "height": "3", + "type": "convex", + "polygons": [ + "-10,-21;37,-21;37,44;-10,44", + "-40,-45;38,-45;38,20;-40,20" + ] + }, + { + "height": "11", + "type": "box", + "polygons": [ + "-350,-23;350,-23;350,-35;-350,-35" + ] + }, + { + "height": "13", + "type": "box", + "polygons": [ + "-13,-84;11,-84;11,-38;-13,-38", + "11,-300;300,-300;300,-84;11,-84" + ] + } + ] + }, + { + "printer_notes_regex": ".*PRINTER_MODEL_MK3.*", + "gantry_model_filename": "prusa3d_mk3_gantry.stl", + "slices": [ + { + "height": "0", + "type": "convex", + "polygons": [ + "-5,-5;5,-5;5,5;-5,5", + "-30,-12;-14,-12;-14,2;-30,2" + ] + }, + { + "height": "2", + "type": "convex", + "polygons": [ + "-20,-38;44,-38;44,18;-20,18" + ] + }, + { + "height": "6", + "type": "convex", + "polygons": [ + "-34,-43;37,-43;37,16;-34,16", + "-45,9;37,9;37,69;-45,69" + ] + }, + { + "height": "11", + "type": "box", + "polygons": [ + "-8,-82;8,-82;8,-36;-8,-36", + "-8,-82;250,-82;250,-300;-8,-300" + ] + }, + { + "height": "17", + "type": "box", + "polygons": [ + "-300,-35;300,-35;300,-21;-300,-21" + ] + } + ] + }, + { + "printer_notes_regex": ".*PRINTER_MODEL_MINI.*", + "gantry_model_filename": "prusa3d_mini_gantry.stl", + "slices": "" + }, + { + "printer_notes_regex": ".*PRINTER_MODEL_XL.*", + "gantry_model_filename": "prusa3d_xl_gantry.stl", + "slices": "" + }, + { + "printer_notes_regex": ".*PRINTER_MODEL_CORE.*", + "gantry_model_filename": "prusa3d_coreone_gantry.stl", + "slices": "" + } + ] +} diff --git a/src/slic3r/GUI/ArrangeHelper.cpp b/src/slic3r/GUI/ArrangeHelper.cpp index 530a0d0d25..b5f5699376 100644 --- a/src/slic3r/GUI/ArrangeHelper.cpp +++ b/src/slic3r/GUI/ArrangeHelper.cpp @@ -3,15 +3,19 @@ #include "libslic3r/Model.hpp" #include "libslic3r/TriangleMesh.hpp" #include "libslic3r/MultipleBeds.hpp" +#include "libslic3r/PresetBundle.hpp" #include +#include "boost/regex.hpp" + namespace Slic3r { -static Sequential::PrinterGeometry get_printer_geometry() { +static Sequential::PrinterGeometry get_printer_geometry(const DynamicPrintConfig& config) +{ enum ShapeType { BOX, CONVEX @@ -23,31 +27,35 @@ static Sequential::PrinterGeometry get_printer_geometry() { }; - // Just hardcode geometry (simplified head model) for the Original Prusa MK4. + std::vector> printers_geometries; + std::vector> printers_regexps; std::vector slices; + + // Just hardcode geometry (simplified head model) for the Original Prusa MK4. slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); slices.push_back(ExtruderSlice{ 3000000, CONVEX, { { { -10000000, -21000000 }, { 37000000, -21000000 }, { 37000000, 44000000 }, { -10000000, 44000000 } }, { { -40000000, -45000000 }, { 38000000, -45000000 }, { 38000000, 20000000 }, { -40000000, 20000000 } } } }); slices.push_back(ExtruderSlice{ 11000000, BOX, { { {-350000000, -23000000 }, { 350000000, -23000000 }, { 350000000, -35000000 }, {-350000000, -35000000 } } } }); slices.push_back(ExtruderSlice{ 13000000, BOX, { { { -13000000, -84000000 }, { 11000000, -84000000 }, { 11000000, -38000000 }, { -13000000, -38000000 } }, { { 11000000, -300000000 }, { 300000000, -300000000 }, { 300000000, -84000000 }, { 11000000, -84000000 } } } }); - + printers_geometries.emplace_back(slices); + printers_regexps.push_back({ ".*PRINTER_MODEL_MK4.*", "prusa3d_mk4_gantry.stl" }); + slices = {}; + // Geometry (simplified head model) for the Original Prusa MK3S+ printer - /* - std::vector slices; - slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } , - { { -30000000, -12000000 }, { -14000000, -12000000 }, { -14000000, 2000000 }, { -30000000, 2000000 } } } }); - slices.push_back(ExtruderSlice{ 2000000, CONVEX, { { { -20000000, -38000000 }, { 44000000, -38000000 }, { 44000000, 18000000 }, { -20000000, 18000000 } } } }); - slices.push_back(ExtruderSlice{ 6000000, CONVEX, { { { -34000000, -43000000 }, { 37000000, -43000000 }, { 37000000, 16000000 }, { -34000000, 16000000 } }, + slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } , + { { -30000000, -12000000 }, { -14000000, -12000000 }, { -14000000, 2000000 }, { -30000000, 2000000 } } } }); + slices.push_back(ExtruderSlice{ 2000000, CONVEX, { { { -20000000, -38000000 }, { 44000000, -38000000 }, { 44000000, 18000000 }, { -20000000, 18000000 } } } }); + slices.push_back(ExtruderSlice{ 6000000, CONVEX, { { { -34000000, -43000000 }, { 37000000, -43000000 }, { 37000000, 16000000 }, { -34000000, 16000000 } }, { { -45000000, 9000000 }, { 37000000, 9000000 }, { 37000000, 69000000 }, { -45000000, 69000000 } } } }); slices.push_back(ExtruderSlice{11000000, BOX, { { { -8000000, -82000000 }, { 8000000, -82000000 }, { 8000000, -36000000 }, { -8000000, -36000000 } }, { { -8000000, -82000000 }, { 250000000, -82000000 }, { 250000000, -300000000 }, { -8000000, -300000000 } } } }); slices.push_back(ExtruderSlice{17000000, BOX, { { { -300000000, -35000000 }, { 300000000, -35000000 }, { 300000000, -21000000 }, { -300000000, -21000000 } } } }); - */ + printers_geometries.emplace_back(slices); + printers_regexps.push_back({ ".*PRINTER_MODEL_MK3.*", "prusa3d_mk3s_gantry.stl" }); + slices = {}; // Geometry (simplified head model) for the Original Prusa Mini+ printer - /* - std::vector slices; slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } }, { { 24000000, -3000000 }, { 35000000, -3000000 }, { 35000000, 10000000 }, { 24000000, 10000000 } }, { { -5000000, 4000000 }, { 5000000, 4000000 }, { 5000000, 18000000 }, { -5000000, 18000000 } } } }); @@ -56,32 +64,127 @@ static Sequential::PrinterGeometry get_printer_geometry() { { { -17000000, -44000000 }, { 43000000, -44000000 }, { 43000000, 33000000 }, { -17000000, 33000000 } } } }); slices.push_back(ExtruderSlice{ 22000000, BOX, { { {-200000000, -28000000 }, { 200000000, -28000000 }, { 200000000, -14000000 }, { -200000000, -14000000 } } } }); slices.push_back(ExtruderSlice{100000000, BOX, { { {-200000000, -200000000 }, { 10000000, -200000000 }, { 10000000, 10000000 }, { -200000000, 10000000 } } } }); - */ + printers_geometries.emplace_back(slices); + printers_regexps.push_back({ ".*PRINTER_MODEL_MINI.*", "prusa3d_mini_gantry.stl" }); + slices = {}; + // Geometry (simplified head model) for the Original Prusa XL printer - /* - std::vector slices; slices.push_back(ExtruderSlice{0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); slices.push_back(ExtruderSlice{2000000, CONVEX, { { { -10000000, -47000000 }, { 34000000, -47000000 }, { 34000000, 16000000 }, { -10000000, 16000000 } }, { { -34000000, 13000000 }, { 32000000, 13000000 }, { 32000000, 67000000 }, { -34000000, 67000000 } } } }); slices.push_back(ExtruderSlice{23000000, CONVEX, { { { -42000000, 11000000 }, { 32000000, 11000000 }, { 32000000, 66000000 }, { -42000000, 66000000 } }, { { -33000000, -37000000 }, { 43000000, -37000000 }, { 43000000, 18000000 }, { -33000000, 18000000 } }, { { -13000000, -68000000 }, { 47000000, -68000000 }, { 47000000, -30000000 }, { -13000000, -30000000 } } } }); - slices.push_back(ExtruderSlice{19000000, BOX, { { { -400000000, 24000000 }, { 400000000, 24000000 }, { 400000000, 50000000 }, { -400000000, 50000000 } } } }); - slices.push_back(ExtruderSlice{180000000, BOX, { { { -400000000, -400000000 }, { 400000000, -400000000 }, { 400000000, 10000000 }, { -400000000, 10000000 } } } }); - slices.push_back(ExtruderSlice{220000000, BOX, { { { -400000000, -400000000 }, { 400000000, -400000000 }, { 400000000, 400000000 }, { -400000000, 400000000 } } } }); - */ + slices.push_back(ExtruderSlice{19000000, BOX, { { { -400000000, 24000000 }, { 400000000, 24000000 }, { 400000000, 50000000 }, { -400000000, 50000000 } } } }); + slices.push_back(ExtruderSlice{180000000, BOX, { { { -400000000, -400000000 }, { 400000000, -400000000 }, { 400000000, 10000000 }, { -400000000, 10000000 } } } }); + slices.push_back(ExtruderSlice{220000000, BOX, { { { -400000000, -400000000 }, { 400000000, -400000000 }, { 400000000, 400000000 }, { -400000000, 400000000 } } } }); + printers_geometries.emplace_back(slices); + printers_regexps.push_back({ ".*PRINTER_MODEL_XL.*", "prusa3d_xl_gantry.stl" }); + slices = {}; - Sequential::PrinterGeometry out; - /* - out.x_size = scaled(s_multiple_beds.get_bed_size().x()); - out.y_size = scaled(s_multiple_beds.get_bed_size().y()); - */ - coord_t plate_x_size = scaled(s_multiple_beds.get_bed_size().x()); - coord_t plate_y_size = scaled(s_multiple_beds.get_bed_size().y()); - out.plate = { { 0, 0 }, { plate_x_size, 0}, { plate_x_size, plate_y_size }, { 0, plate_y_size } }; - + double bed_x = s_multiple_beds.get_bed_size().x(); + double bed_y = s_multiple_beds.get_bed_size().y(); + + + { + // JUST FOR DEBUGGING: Dump slices into JSON. + int printer_id = 0; + boost::property_tree::ptree pt; + boost::property_tree::ptree printers_array; + for (const auto& printer : printers_geometries) { + boost::property_tree::ptree printer_node; + printer_node.put("printer_notes_regex", printers_regexps[printer_id][0]); + printer_node.put("gantry_model_filename", printers_regexps[printer_id++][1]); + boost::property_tree::ptree slices_array; + for (const auto& slice : printer) { + boost::property_tree::ptree slice_node; + slice_node.put("height", unscaled(slice.height)); + slice_node.put("type", slice.shape_type == BOX ? "box" : "convex"); + + boost::property_tree::ptree polygons_array; + for (const auto& polygon : slice.polygons) { + boost::property_tree::ptree polygon_node; + std::string s; + for (auto& pt : polygon.points) + s += std::to_string(int(unscaled(pt.x()))) + "," + std::to_string(int(unscaled(pt.y()))) + ";"; + s.pop_back(); + polygon_node.put("", s); // "" for array elements + polygons_array.push_back(std::make_pair("", polygon_node)); + } + slice_node.add_child("polygons", polygons_array); + slices_array.push_back(std::make_pair("", slice_node)); + } + printer_node.add_child("slices", slices_array); + printers_array.push_back(std::make_pair("", printer_node)); + } + pt.add_child("printers", printers_array); + boost::property_tree::write_json("out.txt", pt); + } + + + + + slices = {}; + const std::string printer_notes = config.opt_string("printer_notes"); + { + if (! printer_notes.empty()) { + try { + std::ifstream in(resources_dir() + "/data/printer_gantries/geometries.txt"); + boost::property_tree::ptree pt; + boost::property_tree::read_json(in, pt); + for (const auto& printer : pt.get_child("printers")) { + slices = {}; + std::string printer_notes_match = printer.second.get("printer_notes_regex"); + boost::regex rgx(printer_notes_match); + if (! boost::regex_match(printer_notes, rgx)) + continue; + + for (const auto& obj : printer.second.get_child("slices")) { + ExtruderSlice slice; + slice.height = scaled(obj.second.get("height")); + std::string type_str = obj.second.get("type"); + slice.shape_type = type_str == "box" ? BOX : CONVEX; + for (const auto& polygon : obj.second.get_child("polygons")) { + Polygon pgn; + std::string pgn_str = polygon.second.data(); + boost::replace_all(pgn_str, ";", " "); + boost::replace_all(pgn_str, ",", " "); + std::stringstream ss(pgn_str); + while (ss) { + double x = 0.; + double y = 0.; + ss >> x >> y; + if (ss) + pgn.points.emplace_back(Point::new_scale(x, y)); + } + if (! pgn.points.empty()) + slice.polygons.emplace_back(std::move(pgn)); + } + slices.emplace_back(std::move(slice)); + } + break; + } + } + catch (const boost::property_tree::json_parser_error&) { + // Failed to parse JSON. slices are empty, fallback will be used. + } + } + if (slices.empty()) { + // Fallback to primitive model using radius and height. + coord_t r = scaled(std::max(0.1, config.opt_float("extruder_clearance_radius"))); + coord_t h = scaled(std::max(0.1, config.opt_float("extruder_clearance_height"))); + slices.push_back(ExtruderSlice{ 0, CONVEX, { { { -5000000, -5000000 }, { 5000000, -5000000 }, { 5000000, 5000000 }, { -5000000, 5000000 } } } }); + slices.push_back(ExtruderSlice{ 1000000, BOX, { { { -r, -r }, { r, -r }, { r, r }, { -r, r } } } }); + slices.push_back(ExtruderSlice{ h, BOX, { { { -scaled(bed_x), -r }, { scaled(bed_x), -r }, { scaled(bed_x), r }, { -scaled(bed_x), r}}}}); + } + } + + + // Convert the read data so libseqarrange understands them. + Sequential::PrinterGeometry out; + out.plate = { { 0, 0 }, { scaled(bed_x), 0}, {scaled(bed_x), scaled(bed_y)}, {0, scaled(bed_y)}}; for (const ExtruderSlice& slice : slices) { (slice.shape_type == CONVEX ? out.convex_heights : out.box_heights).emplace(slice.height); out.extruder_slices.insert(std::make_pair(slice.height, slice.polygons)); @@ -125,18 +228,18 @@ static std::vector get_objects_to_print(const Model& -void arrange_model_sequential(Model& model) +void arrange_model_sequential(Model& model, const DynamicPrintConfig& config) { - SeqArrange seq_arrange(model); + SeqArrange seq_arrange(model, config); seq_arrange.process_seq_arrange([](int) {}); seq_arrange.apply_seq_arrange(model); } -SeqArrange::SeqArrange(const Model& model) +SeqArrange::SeqArrange(const Model& model, const DynamicPrintConfig& config) { - m_printer_geometry = get_printer_geometry(); + m_printer_geometry = get_printer_geometry(config); m_solver_configuration = get_solver_config(m_printer_geometry); m_objects = get_objects_to_print(model, m_printer_geometry); @@ -201,9 +304,9 @@ void SeqArrange::apply_seq_arrange(Model& model) const -bool check_seq_printability(const Model& model) +bool check_seq_printability(const Model& model, const DynamicPrintConfig& config) { - Sequential::PrinterGeometry printer_geometry = get_printer_geometry(); + Sequential::PrinterGeometry printer_geometry = get_printer_geometry(config); Sequential::SolverConfiguration solver_config = get_solver_config(printer_geometry); std::vector objects = get_objects_to_print(model, printer_geometry); diff --git a/src/slic3r/GUI/ArrangeHelper.hpp b/src/slic3r/GUI/ArrangeHelper.hpp index f602cefddb..c9b1983df6 100644 --- a/src/slic3r/GUI/ArrangeHelper.hpp +++ b/src/slic3r/GUI/ArrangeHelper.hpp @@ -8,9 +8,10 @@ namespace Slic3r { class Model; + class DynamicPrintConfig; - void arrange_model_sequential(Model& model); - bool check_seq_printability(const Model& model); + void arrange_model_sequential(Model& model, const DynamicPrintConfig& config); + bool check_seq_printability(const Model& model, const DynamicPrintConfig& config); // This is just a helper class to collect data for seq. arrangement, running the arrangement @@ -18,7 +19,7 @@ namespace Slic3r { // into a separate thread without copying the Model or sharing it with UI thread. class SeqArrange { public: - explicit SeqArrange(const Model& model); + explicit SeqArrange(const Model& model, const DynamicPrintConfig& config); void process_seq_arrange(std::function progress_fn); void apply_seq_arrange(Model& model) const; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1b07ecb7e8..a81687918a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2231,7 +2231,7 @@ void GLCanvas3D::render() ImGui::Begin("TESTING ONLY (arrange)"); if (ImGui::Button("Test seq printability:")) { - last_res = check_seq_printability(wxGetApp().plater()->model()); + last_res = check_seq_printability(wxGetApp().plater()->model(), *m_config); time_start = std::chrono::high_resolution_clock::now(); } ImGui::SameLine(); diff --git a/src/slic3r/GUI/Jobs/SeqArrangeJob.cpp b/src/slic3r/GUI/Jobs/SeqArrangeJob.cpp index 663096712f..5cd54a9403 100644 --- a/src/slic3r/GUI/Jobs/SeqArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/SeqArrangeJob.cpp @@ -13,9 +13,9 @@ namespace Slic3r { namespace GUI { -SeqArrangeJob::SeqArrangeJob(const Model& model) +SeqArrangeJob::SeqArrangeJob(const Model& model, const DynamicPrintConfig& config) { - m_seq_arrange.reset(new SeqArrange(model)); + m_seq_arrange.reset(new SeqArrange(model, config)); } diff --git a/src/slic3r/GUI/Jobs/SeqArrangeJob.hpp b/src/slic3r/GUI/Jobs/SeqArrangeJob.hpp index 8ae2a284e2..9a1ae5f5a6 100644 --- a/src/slic3r/GUI/Jobs/SeqArrangeJob.hpp +++ b/src/slic3r/GUI/Jobs/SeqArrangeJob.hpp @@ -16,7 +16,7 @@ namespace GUI { class SeqArrangeJob : public Job { public: - explicit SeqArrangeJob(const Model& model); + explicit SeqArrangeJob(const Model& model, const DynamicPrintConfig& config); virtual void process(Ctl &ctl) override; virtual void finalize(bool /*canceled*/, std::exception_ptr&) override; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 91010be3f7..2b06c03944 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -625,7 +625,7 @@ Plater::priv::priv(Plater* q, MainFrame* main_frame) : q(q) , main_frame(main_frame) , config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({ - "bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance", + "bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "extruder_clearance_height", "skirts", "skirt_distance", "brim_width", "brim_separation", "brim_type", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", "wipe_tower", "wipe_tower_width", "wipe_tower_brim_width", "wipe_tower_cone_angle", "wipe_tower_extra_spacing", "wipe_tower_extra_flow", "wipe_tower_extruder", "extruder_colour", "filament_colour", "material_colour", "max_print_height", "printer_model", "printer_notes", "printer_technology", @@ -7158,7 +7158,7 @@ void Plater::arrange() if (p->can_arrange()) { if (sequential) - replace_job(this->get_ui_job_worker(), std::make_unique(this->model())); + replace_job(this->get_ui_job_worker(), std::make_unique(this->model(), *p->config)); else { auto& w = get_ui_job_worker(); arrange(w, mode); From c6cee75ee3e40f01219b659aeac544368bc53df9 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 24 Jan 2025 10:41:42 +0100 Subject: [PATCH 47/88] Rendering of extruder model in Preview --- .../data/printer_gantries/geometries.txt | 2 +- .../prusa3d_coreone_gantry.stl | Bin 0 -> 1734784 bytes .../printer_gantries/prusa3d_mini_gantry.stl | Bin 0 -> 1084484 bytes .../printer_gantries/prusa3d_mk3s_gantry.stl | Bin 0 -> 1312684 bytes .../printer_gantries/prusa3d_mk4_gantry.stl | Bin 0 -> 2524884 bytes .../printer_gantries/prusa3d_xl_gantry.stl | Bin 0 -> 4910284 bytes src/slic3r/GUI/GCodeViewer.cpp | 31 ++++++--- src/slic3r/GUI/GCodeViewer.hpp | 3 +- src/slic3r/GUI/GLCanvas3D.cpp | 63 ++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 2 + 10 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 resources/data/printer_gantries/prusa3d_coreone_gantry.stl create mode 100644 resources/data/printer_gantries/prusa3d_mini_gantry.stl create mode 100644 resources/data/printer_gantries/prusa3d_mk3s_gantry.stl create mode 100644 resources/data/printer_gantries/prusa3d_mk4_gantry.stl create mode 100644 resources/data/printer_gantries/prusa3d_xl_gantry.stl diff --git a/resources/data/printer_gantries/geometries.txt b/resources/data/printer_gantries/geometries.txt index 5362014d63..75777b1603 100644 --- a/resources/data/printer_gantries/geometries.txt +++ b/resources/data/printer_gantries/geometries.txt @@ -38,7 +38,7 @@ }, { "printer_notes_regex": ".*PRINTER_MODEL_MK3.*", - "gantry_model_filename": "prusa3d_mk3_gantry.stl", + "gantry_model_filename": "prusa3d_mk3s_gantry.stl", "slices": [ { "height": "0", diff --git a/resources/data/printer_gantries/prusa3d_coreone_gantry.stl b/resources/data/printer_gantries/prusa3d_coreone_gantry.stl new file mode 100644 index 0000000000000000000000000000000000000000..e8e0294078dcb3ae0ad8312ae50a36a01993c470 GIT binary patch literal 1734784 zcmZ^s1y~hZ+lChg1|}F-h~0?Tu=lK)EjB1BHg+p%`Fy2g06Nv$0UI6%nrt(y2A_Sed=Dv>`k5a8rL3vok*cwM$4})V zDatj1$!x9b!);1w-{}Hjq{_51K3DGWPWf`llM`9bzET&tR%TI!c1dS9#OUka98yk{ zYiqOgTd7aW9;Ymu)ZTV7U84TT>##E5SQ}1^czsBVKK#L-Q5_YXMcN0d78N!Cmhqd$G5NRY`u{# z6GH;6#`~w})kv%olg}V*XRPeo#(8R~mId@Pep~dU-^og3k*+qRHxJVE)48rHO<#BA z#HvcI^|BK^r4HjK3k0SLX#t{9 z{acO78%&YFd_z4#COaZ@YyC;unJ0VbJ->~5f%nOZOZ9d_d7vjkn%pX?&n?wonjN-U zMgmI>^$5|l#w>4)zxHWW%b83iU*4^>%+AAgVA6B+$M%`T_?bQ@Ld^x0?EnpCLgFIM6`wlh4%|n0KrLS`CQL=KbW>*{1v-@{a9;CmjJbh%;-R_lx z^)qhiCHK-31OiiqG$Esp)za?_$*;wQJL#pIhbjB7Co2O>bh06V+Jy9t8=x;f{!9(q zzpjafdrvC%(fvf{sEHOxgMP@9m8lQL={$C|NmQ=e#9wn(5S zLZ-iXrG|S{W*fYANfzEy58^%bj&fO`XK;ZQoSD~>T&H5SHpzD^{&NmMPwiqudS$*P z`iSTeyRHgOQhDOZe%KD4a1+)R%u0v0qQ-}k#2^oH`zdpKYI?aE6E9j|n3b~7V zgrs;3(pNn!u9b5eO)E}Vt3UpptSo((RUp!OI3ssk_0(BtSTjq@3kC4a{tK!{am#Cpi4Ojdr@&mz&MDA@+;Xd@ zm(1#^^*dHve{y}O((XaBvP#Y=#DUtp7Y!b$Tc$Z{t)}}^B+~j?7l9^Z%;Pb7)(bw` z-Qc0rW79xo=+|W4p0f(&fu4BpGy60<-yp&=d01KbBI%|y;w>tUmjP;^CqgnLmC%#F z7n9_fF#>_*j5MELbqJsv(lypfE$$-^Xw^a~eJNRalQFAMGfo1mh!_rhfO5>bzgQWIf@+#D<@%uNT4S|J|^d2U4oaftKVK|nD0oSCql06 zo2MR>f?4_3?=-YRTC63Zr>aY&a6c*KUHgIUPCr9`MD5D`gXfenk-n)bq=l!GmF0bFrG9SR{;YDRg)fi%WVW7C zXsPbHJbPLyvF!I%<$k7`{~*#l5n^@o);e2P=p^E%YG@!aBHdMGXJl1@Cgj(Z;*z{< zhE5)Drv~x8@fD@qX`fW9G$PFtA$g1T(#W^fEV^}^{7>S0$Y~|6ok;T$r|)JfNvxv< z<=Bu)n^qeLb@FMsOi@x$@<8R{~{_rJgy8qRb8O@y#3u>$@6)f z9O|)@8NST+Y_xNeF#c|86B5w)loow-zI^^psQypF>=}^e>+`TOx>@G<#Q1EsbK|oa z6CvCDv;QZ78Ya#A-EvK2@;1n~K>k+pw_oR!%&Mkze%QyBcU6)SGVh1dYg#{E6O)uD z&yFa+_x9thR+b9TZRrYWJ$7{#i1$U$D|gTRQmXp*6KKA6p4w2)b$+&Qx(C7X+xrm? z_a#4+u`~MFHrJc)n6Oh*F23%=`@{%Gn#SB=Ht~m2ehc}Z-=s;zcB1iohY{bjz;ry0Dr-uzme&hwQ?1=}Q)BNd zVnbRa{8uMQrGv+)6PC5sW4@eIS~_&)+W;rq>6j#C?1mqTwwu^uJYPuagz;q}(n;We(+Q_v)+7dkZXW){8qBEZe0$6Ku?4OhBc%QTJK=J`^QK)I->@9B4kI^ z^3ufk#q3havJ^*QB+wHfSBH<0t4|#+O{+gtm;un%jg?O2;*_8t*@W2uA*cFHldD)p zY7OU}r>KsEsPUuWEV<<42iEXgu?&f^Cz>fCIpdTrM{?VcCgghe8uG1r9n{<7jx)>? zB+wHfORlb@BLW zkS65*meKUUq)2N!Pj?+_0}|+oko`XoS=+b2tmW;#Si@Zo^oukh<&`LDc>6h8`WjbN zj1UR*L`dTHj5N=r{MzDM-vt7#o^O7oxBGZV*)+yz9~G0wNRIWnS?QXqBrIFh6N$Lp zrKK~c+p~-V-)bu|2P;{hBr7X3bhY7b6z)Nu8Y|jq1K(Rpdx9FMO-SdKk0jrFn^>*n3KaL-kU(wT zUzHv&Cl?;7jY=3T><*^&3?b0B8#}_W&kM;J>sFVNJ9m}Q7ZRvVi2njv9=$e)_9CD( z#W;{aPkbLPc$RD_=p+?;7|Zv_(jrgm6T84@5W-Vc`Kh-&!h5xP_VXQvd4dFb;>6mO zw0Gz+%jgDEbR^Px=WZ|>bm1DU!UO1?vIi`s&Xv@$Y>_}ugmemzvo4#Ptoe>ys^Jbc zrV437Mh;pfS%%Eh^g1{iga|1?PlTLHai&AR6x2SA#L*zchE{2#L3{PlU{zu#!3_WU{`fFhwBJdd_Y(qzS3%+JJ8Ez0vRE zoN79j6cVWYUp=+x7wP}%sY8U6r1inZInMvzQ}Z4NPAb#-U8C;)|2=gZAxA~x)0Y=| z#R56}ALo4KFxF~UMn6y%&JIl7H84++jWuTs|9h=X9$aJbtrxO;ksSW}?!HtE!an_} za^Am4>Ru1hX~f7vGqkOTnC#xcFV)H<(68~i!+;mc=aPm-%AP>W$aQ5Bd}{@zro=p{ zHuTK1X4EF6-Mv_A@u>U>drwqKB}`w2U!+ZKLZ&@$C$%|yPDvLzI>E5=$oESrH{eg? zc>11p;@+sr74<=(oVHkNdx0=gVpjJ9z4GD%BHe^KJ(F_)M1OhV232v zZI-&CPdk^N?=Y~T{;VpI0Zu%Q&eKlFspfwZEi%UPn-%?1tX4r0m%;) zpDV`hN9(3@m|<=F`@Of3!z)*;@QAH2M%3U!p|Ce02hiU>Z#^j z$FMR|)s%Sri!eR$U7RwTOd?eyr;BlN*e{h>dPG(F-RP70*@&q`A)}Uft;qYI#MYFD zN@S8q6EgJR0tcoF{bC$x8h3Jg3WWLOpOKsK@mb%LVbc8Ear$Gm1WP+5>6BW|W=^M_ z;~0H=+r*golCe|t_uYP3a4v#YSWbl8XjhWux>O(`>(-XqKQ*xYO+7+ZOgtw2K3~+~ z_O&QA{TlZfuwJ1jLV8(_X#q{g=uJ*^U}-DiHUfd3_${Q&>->r@oa}J@c!S~16O0LO z*%0FWxSICJDPuyeVJECe;G7C+-lFX7)nT=7I;Iv(rg$p|3G~GK-O5|7d)*p4+P?AB zk-(Uc=5ef;j%(VrW+nBY@HrF-%mvir zHF17Yvi=qYnyF_kco^+WBw4S zd1ba|B*e(WvZ>OdO9{IBSPy9DIaAw*sbRK{Kj*bO<`rN;EMG!+V62qZ*8UJUewZ{N zu3b;WZyLT^&om;3gnL%#7gI>ck!H=LtqTe|7Jn-V?L13rs!R>k=6ikhXKG2#HS~`0 zfzZw~3xug>oLci%TOh_SOFX|#*6I?&dkdICyrV(L%2{4o@|O$=(InA|L|VIZ`Nv6h zgQON}-yAm`{vPKj-YG!>JrUBN{Z{Kw-p;GM^3;(?tBILyNb{b$<#cs`lkAASQ9rev zn`NHXqWG!)|K``m`T4b}tL?ixZ`R)=mJ$fG5+fhii)t}F+!G%6sh(PQ&G8O3jCy5i z^V9H!XQbgxuj!V$L8*1uB+^=HX6PA=J()GjH)`$`?z5hjC8>4SBrq3{=A-k0>}r=j zGZU014$Y`PX3aptNR{b{&l6YAl3veuN>GjuN^R#Rfw_w`-#vd&&RTHi!Gt?4J_s!e zYl&EQqsJ7nv~5=}VTo5?fxsL^nx|?{Rq0F7mU>ds3CEu}{>*VOCNU0U^nY~tp5!0# zDgmDupUv5eL7SiX45`dV=}X0_ddG9BK%f-FGItam-zJL zCp28cm|yMfV9b_`f2D8s)r*IT1X`gUzsWIqsPyilO|JC0x^RwT%y;Xy$z<#BlDA+! z*S`MK*)}no(P~$o9I76*G>~f@Y?yiy_cA-b<-5%|D@r5uzfYZv6Cpx+HyEkz>Df?z zIkb^%J~7U@3?h5yOtzA>yQO|MJXPQ)TReyZ9i{D|iu~QT`ag*IjtZZgZMCcYAxxU@ z(C;}WEgZR9?|M+GV@7MtIgPwB$6e#^X)~F-AM2@8%2U1g$$t|#>oaM7mRiHjIyRw! zJfU?%9Z#x^S-+8zOG z(@~SkD00oG)nq&qG&PL8GFB6(-Z|Tz)-+~)Ja?_lyET+&4QiCSx-)YT3G|d&Nyvsg zz3Y7a_?(}%rf_MXi-~_O5fhluPQ$%d8D(WqdYcBINawYTA|L-gP#| z59KRJ)332AN=v)(*<6wFR8^Q`@%p175C(0QInw-0IHuzNRxC!exUMyG)cAYaD)qz7 z)dGPldb8Bbd^1XukSptL1`%rHn(+h))G)OPaT)O(ZVsgF6#SD;Bci0gWW&Gl&#*Fg zIgHPkDpQ+}&O>_|tt9o|KZz&L7(Wel`bSNC9+XaqBkg{HsAt~l;4NxebwL9O)G$-a z>+V@G4)acdkwPR)PyFWD&JRLfnR^)qVeXe0pUr&~LjH29CX}F227lT_nw3HPDRX0W z7dfy0e-fydrm;Ovj03Ik&V+d{hquA>YXuE#gGigHC1lQw>H_iPnabDweNsye^Uc&F zdW1MfcQ%Mnqna2`kT9)`zniJ$>)K~_AysH))(nG4EAx;Vl5F@l z{-L_@*~}l~vq=-OHs@1QBh+|;H3K6zQ_K6^v$Y(56!<90#|(3C$@pxxZ5(|Fsnsk- zAj};)v@$*$ksD(dAs_q({3n5W=9oxG@zsC*Z!g2}g&Me@Xwv*<&63Uuf5#E}Pr^)z z@pmKgq)Emtiyv!`>lnFtAI7jUZ=s zc7rg>iID9dYW=5%nRbIPX+oA)*(Jn*R#@g~_Y?C}I%=jWHFEQb;TH+BjuBF*^)i!4 zjT|+QHp_;8uc)w-5Qkag3=PbMw8)PhcBYqC{E$iCP*t3lnDxr|E}1!(F!uD@7U#Pk zxqiu{{d!KM%|DILX+1;Q42O_ihh69!<)=)BFSDlk`m=|eR_19l4t_VvClmcJo)hWk zaKiNaZ{p9)$ry3k_+(;F{t*10CC&}gcD9YbnaYv@J5`)Wn@1U+(`IC8p7_pr zp8cAcDx61|dghpDwnx6RO>;5tfj{NY0vRNcz!}*e4TI);eUJ9BydOLgzHaR&8IhYM zi1)~hzni5=$k>AAWk2ST;N7o=9SOV%hBR-rK9Zh4qstMehXqx%GUn~(uBu3s&+AI1 zE-ptBE7W8EByjK5r1`y!ws{mkk8DRg{C6;84PeA!?5pEFGQ3~Ld!LVP?8Av{M*MEJ0hWzaxju-X%ZGJq7~E(Ia;8bw?BUhE)m%=1YgFb+&1U)?=!Nqc^c zW1rTy>mq`urEwX9c_Wg6?R82y!*qhjP~Yac@P^~k}xZO*{LC7VEC zN{}YxWxyADVu8CpW!_QV6aU$JGtLCDJg}Sy33ooEO)D2HMbB|bt*_>O5~dw#zM8n6 z$jZ19UD>bkRHfY*H`|1;l?-;=!uXGEpl2~6>BR` z5BX>lQu24JH8ikn_)KP|Ztq(qyL|bxT_A*90Gi*k9N1K^QOM>f=QK|md~g9R{AK~| zFfmrS9GaWP${Kb1>$@^&>I!X@*Ad!iT&%*^YV|TYR=GXXS8ol|ka#pEmUd|VQ!3H^ zyFl}~PtjZShf|Q_oqec=zEC69V+@;EWIbKy^n+`Z$TXw&l?op5U!pp&6DwQL*|VNf z|FN+O>Y*ooO4h;K9$F|NK5_Y84T-UXpVPfvYtgNpMVgT3^F91lr!QeIvxl(SR~oUN zGoRBPePR`)MUCA9GD%&!v{S~7Dx-Drd8x4+U#Q>R?*f6I2w5Kz<9DTKeEjfl-!y!J ze)|ks%p#I!(cs}m?k43NDpyE+tUsEiTG0ygMzWcXtlQM8@BzC zmG0|nXteV=?RRTY?RfpZ#PA6cL*i$@wn%&0sL=OeC4z^As_5YO{$`;JKJ z$4d%hLQjOe^*E_d`&d}1w!m3J0`m=NLT=joJC>YRHY%RUkL@`Np2#`>vp#Nc`xT z!xEI?NL;Nx6)9RF?H!Pnb-Qph)f1nKK5WTcO9eQxWwB^zg?`V@Dn%zY|H#%4HsT0N zD(P42Lm$h#%T?L2do^jR32`iNTC9RrNb{ThL-x~W$Lc#u3@9uGCw8EppFUtiv;I&} z4{82Qq!JnI4?gbq{h6Z>#q=V9o(QQY6;PUGF6L;^&Tkz|7qrd9hpj~tE?-M~xNb|n^bdsfP z_2PaDM-HJ#U`$B!+-;aw8Spl<;+fxBLjwI`KhJAPi|^Dcf1onAV0sDrD5OQ=cS$e1 z>pEtC;P4X45%o3&w zTNkE~kn}NG?0)O!#d$>!W#|j*D|+I$kb*sRr#6k1Ev+UCJp=YcsKbWv* z_>mG6)zJ!DFd-3TXVJQWZIz3w7fUz-poW;LqkG=O&)>h^^5scmp-;r#2leyXNsIdVk1I%an=RX+gcHeydz5`TNpn zfk03EI}M+|GD2_BagnnH4fI>1-B?yAAiun~-bo($#%>+i&YKPBl|`r7tOKrkQdc5Z zS$;!CE2R0ojP$oPJ=+cH7*RvJ_@RW=GP9^W`f!YlDM6aACR)_9TyWlC51+h_ZXCyN zd-v@m`<7TM5a@}2%hY#|gQf+Z=F#d+24p`qIY5G%bXY*HTDTR zo~Hq=_uN;G?{Y&%E2Mc}G9)|A^Xm~!dGBFAor}?;xzo#sxAJ#qKuk#U_u|x>93P!! zwf(`$Q$id_peI5sAl?RS+6TO zWlEgnEo*MbXoWN(a}PhFxyVBLSLO{?<#Hi;@B18d9IscXhcvId?HzHazSppvvwosz zg>+Ct6S>BjZL}J1H+;<*l|)%R`tWi$*g{@y7HBP z?CP%ZH)OOzn!oYHww-?A>w}cS8||aCtF-Z=S8Pb3wKD1<%}-_e4YtzYi}q@Fc2KlJ zy2i*N@}aS%b)#((GVa=Ty76Ebi)`Q~p%wa#t8#$;bs?Sp*~zH8m9lzL_n>dub@%@4 zSC1@m{L8HRvkW(7v_hKC^w;^)OFiS+n@e5P^(Q_{KO&0g_I)uj>LJb7&c~xH{wHRt zC-!ZpNMPELCZy@aEc6(2*ZY1rD4`-Vjm5uMxG`F5%*nIZxb&QO9Nb|jnapmLdHJK3C&TAG$;(V7NJurDU z8+Svb`TP3%B(t>vky=?>1{Fs&q(zO3rTyY>JZlqwy8B*=evv>=gyg$8U+ehxhc(yD zyfTipNQ=bKJ}dOcTQ0L#8S6_(Ty8KyAJ%Y#bf;~08ENBPFBkO8^=8WbvwK<53h9K~ z`E_NDxBO;6I$n3B!+Z7lja_x`L?;XSLi*04K>l55#{Me%liwyPntWQ@wREk-)S0o6fBG zRjPZ(xwAo)JLw(Q5*e+K<}E5@xt@PpA)S0^YZcLNS=t>2kDR7NYL`Ci`|%EtDa#I8B_60ER&pf(|SV(+LM^JdkX?XIVx z6>6Y1A-i7`kH3*V+^^`U4??{{8f!iw=etg}FO6%-dNweNzuer9WR&Vhm`q!jh`pfdm zWQ<89J~Uq|ZA zZ4qikt7`!T`0e!$`mMOivPje`@PxK+J(r!{(=i^O&_TImI=rUdvtN1{wfUZY&LGKo zdLVn=`ZYrWTNl!N=kBDRe7W~KHnT!{6`x>^iW-@AAC|l17^O!yYAXZtK+MIvpRe>Ur#k;q8%R{Q3JoHKW*F310{;FC$;N6PaX zCTo>Sul$Eb!vSyT-K3=~`h1KZ5_*PExyGI#t=k1x8EHapzuX~tDEgKN&tj0&|4V`VMrHFW0(9W&hiD)IfT&lwF?d(OSNI z*{Hh}Dl;iZ`!Y0RtJ|z@R8IQydI$MIG?CE?Y5sN2^DE@gdPQX79^!`@NaXmEO?C`x zE&u7MYfYUj%{ekoZgMGu9j#DLB>MDMC@B?6AJpw5;}cwkp*EjWx74J}7x&5f@`ZNv ziv)V&Evohs`^!%0)WVKy!m0>Y7NW*I-}6%8g^y*n^|7FlRQ4HbIisg+^aiNM_w+yY z(T>jUKr1fHsG}98P#n*9nil&+PeB6-+@;_xDnlc6 zY|U!c&fb&t;fF41Z>GPb&HagtdRR968$6w;y-<(z)?0IrG9*g)M6=%e;^^&?BF)Qu zNjCdK5@_*Tno&R3vl+ENxl3=K`Av})HAZA_E{$GPL@xN~97Cc>`ES+{p5LYQ%M1A- z&2PPY3$z}|^2L(3QHY>{e#KTB7nRleb<0{ysr_#Hi~P4}#fky6O>H8ho=9Z){+_14 z|B%|89|@^K8dJz`M<0J;buYTf@7~wBI`&IQh#Hq}D%M(+n_I?yJj{?dSm_;Y+`h2( z$%V*B6SA;nP3yHzL+zb*JrW2UaggTcIQ8Drn`QS%ZLY6p=nJjRv`a@SJbwkc{GLo3t}i4XZF&i5Pb;5_A634fhF1O0Uf25gMoA^# zulq+FDGy8dz1b3Tc)^<2DiUoXzG*?5LNtRwn%|QNNYV=BpG{Y}v=!PQ=8s5Bd)9#2 zFJGpiFE%i2so07{qQEd`z2)$YG(7(Wfj}!o zz(nm`HX>sR#Z;v~zQ&Sa@!q&;C&L5+*JnucU7T-^S^8#unb+f;Y*_9?%(?s~_UzPe zih80(LW`xA1>3t?7J1wf2-HBDkmh^JvF8J4u%1pm1p@tI4du6SmshekoYBH^GhW*nK9#LO2Rg=Im^E40HNaYeIZen@a#O9{<^)UGnoGjf7HZ&XiN67} zM=5n$&8n>akKR@!D#TD0o77exlHMXCO~{Onk(SI#6Rr7}oPvhA+P*xcu8cGxxgX3| zA2(Im&|lxI_yl(&M2+m0QmX&^gY3%V04uKOkw8y`{9GC#)vsKX{n~z4(7<&qdg8xt z;9AYH`^gaX#gdbjbL$6aK@aNd7k%5vNQfF?aVeGxzi+E=dR0-;7ZRqYZ}0l@)dV5# zRrzm7)F9Ebs`vafOIu?J(7!erE~6FF{G5|(SbuSiZlVSf=!uYW@hKK(PIMnA5@=Crp`tt+$1PL)!=Wox9CoZ|P^RH&8NT3z&iWresIzT)t8j&9`{a(7$ zM95t;CL`DRdmuAav$VN2M7;dsWMqlp$*5s*@HoRYvVYS|muyARhJm z13dETNMIaD^S3~;&GxhLineu&W<>(q3etph$ZOL|{dlWcGx|%o`+-(S6Y{E55o?1t zqvJ!DW)t?jai<8^>ik?S$7DA4PK;J*V;zS3xVQrya?)Slx59&;M_uQ+J0sD9rR;0K zo@|)Oa6h`*swHfER5jfibwfs)|0+rN6Lrb5k!)V~QsOB95a@~Tp1bi|P7@nDNZ0Cq z=nFL*$HH0kky^UEek#A|6nO6uE8Ae4W5~Q%6|L~pK_r6adpm;9hd7>YTV+8FwCeEH zQxDB?m(@69X!!USV6wdqi|yB&;u9oVO>ou|s>QO!nPzfg!q>%)*be)3{p}Mw<|68$ zCqB#g-NGR|Md{PaS~Mik$~}vsFI~carzp`#)qu#_EPb{aTA_lqC_X_#OjTIh$&U4t z^2=`~_Lfis=?fuM^oT|qX}br8MswF*?At0QDX2^picgTZxwf!gBSU4HxuOxdbE$cb zN|oQqj}o?Oc#4dA=!vg{^MtYr`|n8oUNvTDg|v9?d|0QB1`{eNp&kJeTA|-!&n~i* znBwxbb4DCm-7>6M#{#rKneh~#AhCV+Ja#xCr<^6L5yzr(E{^I~+AG`J)z;$6c4YGk z_{z0c-jGobJrUA_eA7zItV^x;DhlW4NQ>vr1(KHQwa+qLrXLNL&H-UVc*J4PJi^aB#fIh9^{Uzy?)BreSeqYapw zJfN;o9wkn@C^dR@Rl4SFuiY*n-o+o~hs^(}w+gK|I_W+O<&(9y&7Aw)VDvEof zMG{(}-(LQT+}-j{dYD=sS(GrEFs~?ex-p;P6C`|wddMBZPfL%yj5y9%S1YGa5XJM$ zG7V3vQ4c-wx3L#qNOK)~B}KLDBisW(T0GmHF?yMzUG1;`ij9%b3jKbIEh~>+sj
    pHoJ9*}Z>_a?H;v*GB*Zv|?pd#7u9(Zwy!ZtTPpVN5J@LDPiOZ<_TxT}DPes`}$9K*g_s8^dtEOF@sicgR@-6*5n zYvLC6sjN{RL(V%XOX^N>yzjO|!!ZN(&=Y^N(XV$>@}+_7WK;`=XV^%fC;oMK>8-@7 z?{G}mwok$*=oiNlKK1E((a-mKH2YaPly0w;m(k&c^!qhtDrki?A<1*xSc;`Rzgrtg z(F$pCG$?svxpiww1D10_h>%xj3yq`w>$vHya?Dha=663PevxjdIar>Obp!%)6ltR` zNk^}AJE1q)d`?AQXjS!CfOIRgkbWoKW?mle*T12zCpYV14H`*kwWHY)+HAu&7It!z zA`-{7ne1x!Sp8>kD+x8ws%CIBf5&iE-RIFJuHk-bp8fp14C?cp%jw*+F;dF=bL^DQ zW(BQ~=8*@E)8D+)^{@<6HOxiSLzklNQ_J7zkU5j%ZTK$cGARSYQ5f~m6F;fmwU9-h z4$$HPPYQDeB+wIozi5rC`q9I`>C|>dBz%H?y}LW(qE=y^>r0c*=<5`rwlGkr%32KNX7<;=r_v#I_pawIh$S zD8BC|s5p9|o=7}--(9WZzKk9pdWquLhXi`!y9VADvhNG$8&c~?Y8i+`kLo34|2zw1@_UMe8fcZF*cDoI)gAsD zh(-wxd{o!csnZ>c6gh{YRo(aF>Hd+6QZ@cTI8BzFPgj(;=NKx)fmT1S=ap-C`qFn7 zjq(^eA)nRzevWu~W;jK^XoWQYWe4_F9^$`WzV*7ThNBn8gfw5P9S@_KN7ti^t=EKk z2@>duzy0EQyi6(<)(&~MmGBAr{nElsJ~c>ToiZ7DW$j$oN;WUE++z!=^yC=rl=Yly zv;(w4ny=6M-;~R=NM!MsifGu^q8`%xZml|q{@N0v`2hbQ*EtOintNZjmB->8a^Oz5idMc-t_67|{Bf)??0;f6;v2e(a%s zd4{v2aOZ&%`od^Yo6o7oRM+2-oQ~ehD`@xx3GD6ow`=+ruv|`hYnk|btUO0{&YgIV41d&c9Qvb8})oL;&8*Yo1C}idt{dE;LRyEN#oBC7CUCcM6`7cP8 zF3!IEh+q$Amk|iGI@%KmI3++seb;k5(<&gp=4u3TBl zSvQ{*&jFD@Pkf(xwU^eWQ4zIfQ%yK!N52>ozs2hIP_n-zVb6>6vTa08Q; zQY-`P;l%PVnT$KCQhb7hI1bLYPE*ns?k-R4XcPKfT%RG$PxUj`RNnTP!P3p}(Xgk+ z5ddlarb63Oe*dYJ;x(!oLtkixa}@qsoENU@!rn8~bDs;#XoV|Ck(e^Cqndg1dOxqN zmxVPa(wIX2_SV)p)QPqqm=!ng~JXBPZE^}FNRr~ZTv*m+y+vE_=kCS5e`T5OLpJaPs*_^t^pQ)Qph z>#|)Ndh0NC)IP-LSADuX){^s8rTr6^SobfQ#cFr$L)(UJ6$tdiTW!81eY?{gd1mjg zD*8f=DfbwwSk8_9dF#-%FhzP;d=eefZ;lp_FodSNypkr}KBS;u^u&LE@O>6(^sV3Y z^XB5(@mY<_wxR|SXOd!RnR+wiDG4LgZ&~-!9v=JEzh)m$P!DN-O17*tZFF>;lycy{dYX-- zRcJrjA!MIGpeO!q*?~k!d0SDh7#5^XA2o-b88w)#TX#@FD^cTB^T|}cy<01OsF?b^ z@HQGV<-Y2kce_BKC;mGY0p3cJ{?GKlO_L>jf__h5DMK4?+ra+hRYc-Yxp$vpdO}#T zC9!NF`t99TX5$6KB&=cPseC#T(@XF$tmUp5RpP=6nzVo$XCy)IdhuKsA%F~&S zt{chD#kEU)f>ucLcjFRgwspcIeM*_E+VIPJv|kf;vNeGR6x2hSD>V7&Tf0s(w)|%q z4dXxpJ@Fa9x7NDfq)Yn#{+HF#C#JI*`6jcRg%2udC2BOE#Iy`aer$8-&v>*#dcd#W z+L;pT*oE9Xcz+fA`m7%LBa`D-jgnThLcf?Jyl1#l!m<3#2tBfBg6c9Zj;)%!$2x%> zRFD>lp%J<^bC|0Z(C?6?j2gun)h)ylBligedgAZDqQQ=gS8D3zFCVtz6ZDJyN^1Fq z8vhOPxh~-oBnCfU!78sS{C8insPS#R%bULPftNir>}ydEJ@M}q)$GPjzI`wC?6tv; zR!F}extr~&QA0X1Vmr^>qXp`+$Ah;@wVW$k@d*+*N)Xbc?*MkN-CV85_b3$!%s15L z=e2c)u-3=!tIaYmweIY`iCr%5!R-0ADoCIweq!=h1GXXW0QRB69D%@^fi&MW@HwwP zZR^HnS<2dre%Q?h%kffq-_{E1i5gXY{nnpcEy&2~9kr3Dm}3(=UbQTi^P#ejD5osdMie~)PUxfzqF z*U2%|s3oW;62TTvKmQs<lpYoE76?L26bnVc}88qqbQ2zUttrgT0 ziF`GKd=DNv;=AtUCaqb&o^%uat}VzZ66lG)*ExuP(;=~)e*RW{^;r7i^vr{O{4JH8 z6togGdb}ARxt{Z4_GgzgB>HOM+PiW4*k3NK1)ASBY_&-ai%ike)y*g&fqqxev(k}| zv24LaBd_`em7w*Hw_}^y`bjv}q7~BoJw-K~SGtOd?TcimUFii0LgR{#NVU3uhS~ zN3fKY9TlWSqVMMY+QszW`P+<^YDi$ei!^^f!@!;Tr0V1JxG$;|3G|EoJRuoJoz{wV z+pVpwJw?K3(F$q)?u0g-^lV|bSY*==ewY%}Lz>T!kDu}TGUKz~o7HX%iJn8}TXU|Q z%`R7HE#v|pou{qzTbSS9??ma`{JQ|*Y|+UW?LnT_3KHmvmwEcp@wUlc7Wa?SG_=CH zE9TW$ms#;4FW1(76ZKwbA4s4l{tf9p`4SS^2ibxr9I@h)D`)D`GuwPv*yu>&dV$L2Z7Tk?spjNjL_C0adh^2{az`XFd<<`Uq20>AW`8)cUJv!X4;^W z5l5LrzkR3m?;PK){4rtVL_PGx&+dY~>75csnR}N!w9)|&wrI<0`fg~H4gI1X-&=Y< z&(?6u701hC?h^V!0$UoNe*c)ve7YTVceJVRU7C@y8?l zM*EgvIB!Ee^u))(Chl?jNRZ!^byGDY&`NCQHq}8>I(@cW*pQXho^*&Uo-ti3GB(PF zDZv!-H#*$?r9|y2V+(#$)QWzQ!1l;@SoZkQJ0FHq_gPn^kGZBZOY}6Bi))}2(mZ!H zo2~Sm`L=3P3P`Ad1ojyGJG@=oX_0w5=tP$TQsmpysvLNj-Qq0=3DhQJ{NlOv-iO#xo0add^syn0spW6SFWXUH6duglOG5+= zq`i*KVW-(pzHT>u(|dpJMUKWBo6EVoFSnu<`n8{qVU;&mru)Yjy-&S-c6xPYnC2g; z3web#LnLPD5stfRKE-w~R^7E|C@Z~nHs6ivV?#ZW7`(E!elhVl9h>WgkSe5IZ>(ir z4{PyNsu4$A!eGaA?*U4>&r_^ug?_7KBdlkhcv@hX5l8>ajr@iLJ&7A#c$F2OAc5_l zkf<+L^z5J4D{C5#(0rs9*2am4QsY29^hAhnr8#WcuD0^Cq4PAfLRyR?;_-2sqv#gp z&AS~Iv_iivp5>!EFYW$24xfpQVoO!57*~2kb|H?yDmA5QYj@LAyzdf;;;fMJyXZWn zOH)}Je0Cc3Dl#ZF4%8Egp3~3Jb+;{YO4Yh{v_ksqkQ&r=YQ*2=aeMqEW&hNv%A1qr z>}Z94&C}&S(XgKHG0tS-E&fV1JpyB@99@+E04(eknKFxOo$w5 zF^*anDk|S|6@+cwFEj!YaYp%uvF-< z%N<`{wNkNHLp_lw5;BjLJJU!{ZsH_Fj`YeA4)uDet$+7d4>qonFGbFF%(fJ^pcVSX zKA*pptF2voa%BVU8*oQLD;y0(B4qh*-Q(i|$ET5Z{7?g}u%G9<=Wchk5n)H^gKg<4 zYG7WW9-n2ntz=`yH`On%%%GtL_ReDD{xA4DKWkX^u>Dag<|tYPw+yB)^yz=+6`yB> z^8b-w>q-f&Jbo6H)QD55RwB{;PG5QJ_wy{@`kR6VT8Z__@NfLfcHxPHPml=I4$u}) z3;iQix%M8hpcSU-Uqq@#bfzJe%Q@E3isd^}qjjR*|4+1QcUi)I2?_MXN43{am2N+3 z$w{`xRy@r>D^X+S%jrs+vYnN<&4Y#W4?J%{n%`mRvQKHyyfFPW)~24_u$!JgUzxY_ z>^9UBHB!UorI;_Y2SY2Q@jQY5#z^HAie5I+@oC>MD_Wsn%xS(;6c(sVsWQTGs?%93 z`a)VH+Q0B;vk&NwZE3idN{?`Qrgr>th$~&xrHEDX;Fj zJd{OWdN0g<&J6pE+F zJu{ZnANlyp7oBCHCZd&Cugo|~g*6b)qtFUzzOF5`RDZKI zdvDiA9>~eC)uNTy`&8?3P;ODhU2nZC55;~L`!4akHnwaf`RS8fvaQZ}E9MW<;%WHq z4~=D)UPPYd(^Z&-;~0fy!{1L`<^g+pFGQF3j~C`XxE>UHhK8-3^aTUM)n`4f3Ug81 zhrziWukG(o9Nt+je|-3l84|7_a2AfUb3!iF9K?zf2fN+yl0e`d3DW$wddFtc#mkG? zwD`FauCS0mZT^;liRvvvXylTKtjXOK60YcQm5Ma~{zup- zd)rSzY}et=!agQ5K1dUzJe;AvEVHW)aLgr4=trlvSg)KGUk(zz|$q9 z`T6y}y<}_47KvW%{Y6IUGxR4Cbd9U))*ER z>Q0xL%Clijm94v`O1TS+)vtzSO4Yd6rmEg&kbA1tsN@jcIVtPk#OQEcDSmjbB9AH{ z5a*+O{*SQp4vSi8+jvw|6a;M8D|Qi4Q4!f>vNr4u8#e5{*JE9=D+*#)RO|?XT|wAn zf{Li9*p9t7?7g>d63)s!$Maqvf52Ys^Ly@R`eZVh(EG=W{z0?%39ksI+4H5!a~{Mg zsDXYlrv>4B)lFK*sjK8&`>u*uYDn|M+E-=NJatZphbud)&mynV8mk{t)7#x-SiM{H zr8$c>E@dMb*6}T!ZO*Ck={Ig zj{a3rC#KYRrYQ5=rIXjgR3uOXX|_9|!*#3Bq>NN<*eOl}{o02trA1DjqKCo{FpUF4 z-IYFdu8NcLJyZ8Rok!Ew-l43gnw1(9w5y60~ZRuQ?sF?iwAvAdW>9sr42EBF)kP7Y`K)j1Xz|Y~QtflEwe7 zxYK{L@_PGMb)H8Kt=idmf;6w;(>q#BsrFR#cs)ZE(<;!w@xSQ%`CAEUAkCg7bFM9& zZ|W$0`>rZTpcQJf6Xl`?O07?g6059hqOKjCh3-C4Sc`MpNs#7=H%GUNSLY8A7mTe* zQ{)o#!HHs8^u&!^R7kV?AE&&f#r=NzI=*Y9pa%LKU-PvptShP2i)YU{38{;nrL8WP zO(*KJXKX7j2`aVfqdGl z%jx9nGk*o^DAGJJvTPzh1MA>eP3lyt8yR1?vyeJaHj!N%H;tT6uD@AtDlJRqR7MdVAZ&e>C={&L>&CJID*Z zcT%v%AUy)109Vr@X0C;T=qk~`2iW!~QfL?qB^Y`Jf$w_w=@fzl zMuoJ^p3N6mH6&Qh7~vmL8Q6`-`3a7~sDav<8rfK_$F_|Gddeicrn+%a;b@5wW)jgc z**OAdGDv3<-;ZV^*tRjk|Bk9ty95adw8A+`rbfQAV+giwj0$r-lUUvJm4pQPMcN=N z`tMaA@^I-u0zI)k!j)?IUb!>f=lRz}n&ZktTK+>mZBLtxB%)}0+PHj8?en~iB&*X2 zDhJinqPyyEc4#vuq5k>y-4l0KyvGsP&m+y=?If2>JTmCM@4U15G@M!BIEXac$+4-M z@0wx@P1D9iQzXy|qh+h-_v*-dYVV-CD~igkhs9~9t~Ir(OZE}$SFi=Mou$hc$!#0X z*UB9`D!o2*_&_jPI8>^P!W->T? z;fW7Rn@YVmyi+{WSE<+zucX0BdgjbYax1Gb9&v)53^yG~b;zzBJbeYvZes=oiMxOR?Hd<#U;DZONE zs9iKcn%A)ZnUHvQMm{y`#fcn&R#?Z_8rjPI_4{{gr#$LoPth;-I2a)t{;!`@26m~a zc0AQlnRVd|?ex5!R86yCbExfa9^?p26CYKs)rFL-{SGKU)e$|rqSxZPJ! z1O1{W);OZ&2pO;c(D_v2>?T?iSTz|;0X1^`XYdaDo zaPgaodBaC(A!ne|$#{|oA$!$stL!D?{Yf6Ya= zT~}kr3BoPU;;%CSgFFDFfcWlv)rbJtjKr75Q zL11rlmD7VGwW2FMxwR#vc_PcYBI4rfuFAkmyT!#>lIXAJXX%@Do5-;fcWCo2=`?Z4 zRn)BxY(oDRpqrfy}r4^b$Tu2J{`2<9hX<=Nf1h0Z$}FE>_~?T#o6BG z^K^dBo3xH^PcABqRuJSRS%|~Dax|jt+;}9=FCW$ZvrD9t{irJV*N=~>euKLEJ)o&C z{bVH26MIhhvomS^!8M!5n+&N@krqDY>|0~md)mq&i)O!bu8cHK#O`G8+^Bn5r8y^C=jVJ& zRi`Z4(=zE??qaU9-3jqM$mKw1IweOoWyjTzG<V$8Pmk4gKmE*HI0r{@64!Y z#afMJj@s;r^}nl<)%&-p&p(wl-8lS-raZORZj~y+X`nXS7v8ck*}KIOqjFj}?_x3CnM+0auR@4VH7_Aj$55vzSACuOKKsk2S6IN+4;K%7Lmu*mMUpORwp2V8b}L*x~8HW za<-`IzHAXkV7?(O2=QV+IhLFyo-6lSw?;grGwf<=XI9UZkw9&>FT7Baylw0fxq&&0 zgoN*qQ`9F+*53bMJsgyiAnd%|S{`$Fyu7QOpRz8mMoZ0ZpjlGp%1EFmL5L2MO(CW+ z%8A{<3bq66qxe4YR?%%8HjvL!pMn!g9#(9cCaS+_E+e$#_pyUk-y?X{-E zTa+^X&t{fo+G{)F_s{_EvkDS%VPDkyb%G57X|~C`Q5kLc@pj_uux4V*W;to$t}6{+ zNT4TH9^YNHL7(%>MV@p}kXU)FF?Id8$Iw8Uo!9sC9i7rllrNrHCN3S(pMJS^z|cSf zJ+b}NRqaVy*2?mt&C3-eW^P_YJCE66XdunbVhwhqR?kgzusMKYKUle270qFC480an zTweCkO?%vKB~^OlWMkC%$cO5g*)?d{UZW`XA4s4lc9mNCyx2Y5LrQJ7fW2KRvu8j8 zJqg0u)g`6(^G8W3&3AA_LY$YDE$|$@Qm3$tG~2)1Umz2rdXRy>_8d{+fwxxf+-*92 zvb~HnJIlMMJ2`z}19`5vQfvoEV6^Ovt zEe&uBQ-Z5ipmpbuQgjU@&=Wf$c4wMQy&P%Dl`ljj+@}_&$=m)?bq%E1{u1A-c6Bn=Q4KaU{cWm%S?`=)CHfb10qdyo;z#)wSuGmCoy9<_Pp82z7h= zscz?Ts=aq5a|HJ1s3!e7I|xJx89=BqQ8s;YO{ype^wyA&Kt?K zusR%p{W;R?o%gl7Q}?kkG;LH?N%ebAz5BIN7Oku%t8b>#tu@#?QctP^TGYpPjiZM1bSlkAOm-*ckUinyQU^{L|E)b+UMn9 zTIf(Qj%GEn$ucSD^d(Zet_rys?5Ig29I5-ovN95=&EAl=wjmjt{}LISbqGg1S+kD4 z5pM-;pWU0IS;|ZIAvu4=k+$PYN}&;Xv<(mQ)9%B3WF%0Vy#cI14bAhkn^|bIJF(B| z^@?YUv*dd+CHou~QK#$C?5$svY zBd}&*go5Bw!IgUEUql~_x~yVtKmxS|VQO4U@=M!DF8URu*}c59TT9Q^aK$Jze4S$S0TlW9u8@?>m?zEmOH;u-u!K`lC;?>joO*r z&_Dt`u~nQYle8P*!Sc_5gCY`#XXYaV%Z3^~HPUQ!o_$<9=+asC8B^UuT+Az(&){sOTQ;|SV>`i7>Dv_>FW|5;IBEj)IvQsT>->Otvx!ZGsV>_EIm3koM zT-}@O7_^Y!bp{gXiOqdniiia~7F#!$h~S8sZ7XYSZttMg#ODNQ_Js7?9_oy5E7X7v zYYASHA%WVgXZU7EXGKn-S>0-I1kS>cW@l5)lW5iVE9t#aJ0+ZXA%WVN>sP_~tP;*3 zamLEekpE#U)3U4~II~2n=!t9Su*eqw%&BcE_X=d;2(&7bb3Of$xb$Dd?vKG7ff1q} zOZfzQxwWaPT(erdh`w;Xi_x+@+t1IETgUs7hA-MG*w@zSvWf0GGt+2YNV7LD*7{4@ zaDJIods_h$5@?0mY^;4Ika7#m(No20zI*rWn5D&>xwmUwJqaBB(8-NrPG4Fw4En6 z5v19@?Z7Qs`2r z*7P+}qy?eH-#aw*R}_s%dz6UlpAM59>8w1T=$>Jl2-1R(P~@i8|9Bi-^<{{H1X`gs zJM}buhIV_z7VUF%TM-Fd3q?IaC`28S%t51)gx(IOY-d+eFUx2xZyk%=ajLsEG2BOc zQr99k8SSopi1*Pdr%|@P`|!3y(zhw2lYEC~w<3X7v3*z4GxJ7kZ`rxx>`B)8y`*FJ z+E6*F3mF(2M!g60()6*``(q__RIy%KJ8z3T_WXABaMSk2|JgnID~R?fFo&Q9 z66lG&$Ao5SkaBQ&l0ZjU>p50X`+o}5^!e_KgV)H10SncgF_gSNa*a5-1goJn^x5m8 zlUW*M{klAkFZFA;E^H=d(sq1%Lw%l5a{suyHrMr&F_YPL zl+~O{o|=B$#@^7qZYG_|6yrnYas*moz6rv|m|p7E&h5yfC7sxHOy*p@Ps4jk>l`u0 zwe$RP!>QlhP~$T@J*nVg)urG}GXLmYit~0P(32qKp5b6VmVdPQY*HO7&ggF*U^_iW zNF@F^CFqImz&`F^Zn|QWIl4m`Q`)6Nq{3~H=rscg^u*TmeH)VIJ)%gkkW6Y<4kuZI z3KG4{(Q5SI$4Y_hF~EY#+WA}&CU=qyP1>oRhK`%=yw=v2I}z| z`-;1n&+hY(h4eECNT3y_kDc&$&7Q8G7cN;EPp*$w4ex)LG}GHRv>dxW<7fK84{obd zM$V9g9>f>t=V*mAyEgFXLZ=`9DhVW;H?9bw9)Eq_c0vxC!*8u5O!`(AXOKvsCpLQ> zP?NU#by^Z4N_*ov6iN zfMvs%VCbkHbnvb)BG8WYk-%$p{`!2su%G%nw;_VPt1l90g?fU}wAVUKK2}>6ia+3@ z!btcQ)#6Hzq~W=~X5Ki<$iJQK32)^2&kVr(=}bC# z_d>P(?l}Y_K>|GqLeJ9WlH%FwW}MnK0moD%(38NH4az0W@vW{2^h7)oXoYEF=Pd<# z$dSozNpG*lvsrlN90%tKIA0NjPS)!3rY>$ts~@U~ILkl+J+XO7-_~;0!LR6@Z6h=s zWsqj0r8*~|{XeseHT@gN?^fNVvo`kP2(-cxj=iHQiJfQ3?mcf@*@fUJjP-R{;&7UC zPv}3Rvs=4G>al>Cq}s1J1V>~f&=Z@NB()`bJbFtG(*ua-j5uJbyYf zh)BH_O5fJ8GKaYu66lGQV8)Lnf4Rak-XFk7_;lEaTTAv3TzPFC(duUG`_PIn5Bpptt())1 zB)T=aCgR;_ROf$fW&!Sw^+|S3nxgR72c0#_Xo3877NACR$eVGDdRUtV6^P& z?wM0!E%q*9Q?KF zHBg(~?TeUYivKdh+N!ueM_`RXnmrXCD~KtU^}f+Btn9inb3X${$VW9iT@V{TB8tW2 zCgb%v))Lecgy8I>taGxhv?ed8E#tL566lGY0`;-3xaUw~Q^B|I367~4As?0B*mb7A zoR=xXmc8IKusx!lAYA&s&*VF=dg7Rc4G8XAKn>Iugh!)ynttvmCH6Q|mEejH(mZi^ zeHGK8(SMuf?ytbD8sJ(FdJ=^CHQmIQv5Q2r&u)%DD_*0`@%HMAu=nEVh;(iR0#lB; z&eq}TWL3&9nr!;%Gm+q$1zPbdMHL?Qu!hdgCOXcT$`NRVX<{oZ0pqML!F@!(VUb)q zP>&~Gcr?puG=L zx@6`}f-^lN_%g5Ep%JOFB#In!N~U;Cj@SLTcEa9-nWrZyI7cJnOWooKwBpxGY<+d* zErm7Qg@7wJNZah$?iati>}|=JJ1da>ZzAd%rML?LHIOzmEc)*+FKTO;TGab*jgQAi zQQU=q8mMh(7{6+Vo}hSd3pG&NFt+Hw_gC9bah8hr($JGZ7{B6P7S@nJt3NahqW7bD zoCe+#M7>Ony)6QgaD5L`jyb}v?o!mmMm^42-<uUUecffhb>qb9 zY%f&i+BBw#*RUKao!~g&pf&VHL5@Hx%xU)Aw)K{&e%QLi+3v?E?v%r*Fj{s#!@Y4< z_ZtAZ2fO=3$k(4E&hh~Ahuhs!Ix+UBp%hnDRn)hX7Jmg(-#5om>Z z$lmDLKajp-@A^Gi?>1Kxk-+r_w)^vdOivBoMyC{_9D#n3X6udz9+U9l(`ab9cFI+D z;M9YrYuO6R6}j!FF0@_KjmB!r_1T0jEwRA(%?zr-$H-RT8whCv|B z6R9tYkiob1klXG>tVp1hwQyh75`zBGNQ%rYhpo;-o#xh3yl45dJFb%q4YW#m)qx)E z+43Kvqvt)6-lv7MVL}B{+lVf7Yg7H3D>BkNvEW%3n*YfYGVnoUVneT4w10s<27xqB zJiOUiG(TP8yY2K0rQm&6DsKp-d)EE!;?+o|v8bcM7Fa?S|}LQLmd@ z#dDzzO`S?T;fM}eY5F#2d;0PjPqXu{CVGowPZUv#R`19W=(qUl%9K9dLBH>4#55+~ zX)b;{xk~YMbx{jX?aJ;??4sI9vy2h)gwM8EQ@z1Ml=y)Y)!oHr(3vf^(8LvlBhV9j zvqP;x)@?2|l{F<=DoCJJ%Yw71fACKBq@bR1rD`|jRc}eT^?j)_bI>Y!z19MH=p2!e z<_V9ZW@Vhak5cf-c8)+Rlk;j?a@ZQ0V}_pccLTa9U8l{pu9|1Z5oqPvB!XJj1kv=t zI?=;1Oudm{Cnx1xFE*1W(1Xn?(40LR${rn;(qpB)jk?tHRUJAhsnS37s)_wPsmrc- z67jyaQu{)fm&BuGJN+8A$U)+UBEVzepQ|{>u_xzPcm@&!k7o z>#cU4jCy})7}&Ld0}}QhsDX5*M#7mZBKA>8peKW{=)c*+I1&<=qey2GT6#qZ`&uN> zlR+52oE|NbKD=8`UEG!#DaTy+@01T~J)0vicBC^kip|I&&F?Xh2AcHR?V?L4_< zPg9T_n%MDKF^)hh?1Kg2TECKsB^%qBBI@Vj2(-c;mEDh88X(2j9z=)sj!(pX5Zemo z8@m&iK1=$tJdv)qTkMMjT4AoU{wn2*QtDw3I^kiW75hP?dBW-!Ovex2LO-wBWI_V1 z_}mS4s7$Ai@}c{8ukgj56KS5P>DrSP^P8(W{jyrIe?^)nM)l67T~n?~C4MXrkw7cH z?$#ean|85RB*#*F5}%D(LG6mSqNcSCWTbf_$x)<{t1QI#`XQX*z%cx+b|HKKV zUolG*w8DCYdTbn=AEKxohl)XwF)G$2B+wJPy1SJ}DLcBim?Qe3f&^M&wCu^3J9hD-g0VvmJBO52p(O0gL+)YNbk zm3)fIsK*nPYIhSi)w`tB=s8+hKY1@L5W9#rn_NXknkW2+JX24z=WFS+*CxjlN9|Fk zTI}4j>N3*FM-NfYEA#2R_r5Huhv9YUU*U6Ti8J1$cH^<3NA-^Uv(mc^Wysnxf z>9~4DE5#9L^=kAs+W5>^TCb5l-yK=IMPjQxj_QuS>p23ge6OvbJwdbeyh?q)kl8pm`h8#c}Zb*Sstxiyd$0ctUA;1m=mb>%Jaq=nzl;BGC-Oqc2B9VzAhe~*z9sH@kpK& zI%Mhxb*fZe?ltrX9lXVjom%E8Z>xBOo_cptol&6{(}=8;Pi<26fY|!nJ#mWr6C zCyigk6X=PZhnx_jENWa(igYU}UdwiyK8$NXQ@eX|8t93=)#~|uW$E@P@l2gqC2Gwn zT0Jr+&AP^yBa#YTq2Ei?q$7L!u&6wJBa}REa!KS$HU+=Ibf7kS%WyFPy`9y=N!;x|~^(Gz=$?(Rlwb=MrG`3!O)X^Zt zshP9bCU|`POuyx1B+wIk>q7eoWnF9+abOL_7r((0L{DrtZdZ3D>}oURW3#LTTMk+w zEeOS|uF9m`4q_WWJAy3-X`YCfkxv?4W2@9X+AJY~^_6cQ35U(n#06>6%1aA40{tS* z-b6Fltjc?%)rRN#NEiv`6{d-unYqWJeyypfCpQ(Bu-zeno&@1Zu!HoY?@FoknA$3; zW1HvG@qWQ*srRoRlIPW}9D%(k(ropkcun=laElu7W`UX+uP@gRVz0zbzxdift#>V2 zy*IS4im_vw&=Y$%dBvmF#i^;HzvY~YzAzGukevsRYnifNx~U9}e!&rF#cQ~@Y?B(+ zc(2rO$l{AL3mnP5e_KqywDO=&?PS)M^iOgoduOO>`lJ;JNT3ytyKG&wOBoU|E>WdL z&YEyGfizDvU6CT4{Scylt`Nu(XoWKl_TG%i6-bwF%Srd4MF{p8*q30M*jis7XEL&J zM-n*Rk?XI}3TJ2Rt%wDmOOx)6B}4N}pxF1J9#3qHT`rYa_f4vP)65ZQg|jm@MkQ>v z`q&LtzCM`55om?8GxlUy)2qtuwT^1{Tw zpP$$*E_<}m)GDcsh~Hodq9;LkaWh5=j!U=pE#RP}zPv$u)jdgb59}m2eSe*9S#*;< zU)@*U6n>AEDV0tS&T7JH`>F2l#Dd+Mi-$ZHD)>#stxxH}0e9)cw`LhVu_udf9us@# zZl%|?JhEuPG1;}0oMstm_MGtH?oy7)Mb#H8@~UWsdK*%H(gHUewfwzWu&5qQ z$wyaSnN45!s!5;I+FEJHo78`7Ga2bNeRFCavs|3V$m1b!}<{IHE(e+-pTk0%1`Dv}2WW|JXX2}ht6UxMe^ynX#G7wP2mtP*M*3n{O;U0=&i zqU|jg%Tr66^&y$I9Wqcak52aLHtTsY;_4R>BSD%cr1$02HCb<2lb4?q@f*x5^u*>2 z16!$<F_ z|NZhpN{7h~+O)z)*~y@tHxO%cFnh(S&wq>6xfLOe5q&Rh3qb^=)y; zPpojO&3EQ&`uJOWP6Iu$cJ2_ZqId@rx>J<}y+AQLKK= z8R4|kTDw|*G4<|M1;1%rzKk~dXaxN_t%;1D*vMIJv*O`USSoAzVLkh(gjQ_*avJiW zi;M(%V$ZnCh191{CP`y&RZ@^ZE3C)tK4;rCCcErO;`k=bMEnNpE_z~f(K{QhGjrxJ zyVLnAR;$e}b`98&_MD}6;vshkS732ZB^&edSi z9%s?&{qDfh^A(?-B}H243l|kyp*CA*xVc|BT)C)NX=)Zu0|`DV&7+(3X6Oj(@n&%n z)@p1MyoL~7#5Z){o`iCN4>$s?P>(%p8Q~#~?6zC_>%vY6+W}f(F0fjn+!UXU8z|Ka z8_j7Tfu7ho6Wt|MsIfy$93CiP4}j%?5whoN_f%C)sms+0#aeO%T464*9&WIQbZ6!_ zsrcm|3dV~qm5*vo#WB+3AwQ&Vo3^S*U@wX^n^`t)p*EnAs^wQB6=TOVVUNMCIfpb< zQ;Y0Wzoz!(2(-#fQ(soE;&+Wv_T~r>>n3HTXoZnrgzR3|uO*7({2NNy($7^S(2Cb+ zowq)5kH4XYw%wJ8GYg#ilv(HPB;?FU~)Z=82$>Kc$vV zT}bUZ_5}M3>`VBuR{Zu<^780L`reIIu~$QyC&m^pOgx?sAUB58VJBE;_MB+N&#$b5 zD@oLHMCv;&lw$viG*8s+zFEBETgBw#yNM&v3g=paFtdD&8g=)zTEM$4HzPwmo~Yqa zUODe@TG^P@qG0ag{E8>MT9%MH7M`Z|t^CS_R!H;Zkuum*tl1&AdQqz=;+zU;p71Gq zN6cTSmJ*mtkdQzttTAi{gzHerEzLnK?q)CHoC;~4u-Z)*uLqtI$3%vS_zjjIdSd%` zXZ4Wo4~eq6H7dZ?+wams{mxO3m``MT+3VEl-35AMpp#7ZKBSkrrqjRNo)C8J%#POZ zvhz`wQ{%&O3sh1YvHz_v(mg zohg~N#DoM|4ZD|JbC1rWt$SZUA8{`Gs0seN)X0Se2oh*TyMCodUT4=nlH!br?Xg=m zx64Hf_d7tO+Lg5HM-S`mL`Iq?0^6SPy)`zMx@7)xjzBA0d6ZhBuP25&S)`VsImxlc ztw`)aH|^&6b=247Dx)4xY`XJF8t>nnxV9+D5om>_$xb~zO4K8hN=S|7XOYk^>e+g` zu0sm5sQO=cqa^Po)=7~iCHw|cj-J?hN%Tp4i#Zoqbf{+U`R?hPo@pD*x)!x6U$&@or9KJuVcC`FWT7BUsf&_YEM7XAW-}6F@bX@U!hFtu6 zHckUQu@Yo6WWU;#r7x#4XUK=V@^gf3JE+qJa&^G?tY%6o!&g?Y%H=j`I5=D01Ja@BHGkqEk1QCn3gj#|In z;%Ij7?xUlck1iG~rXN$#3h9ZHs%mF$@1(WbykYIUgV03TYbhZ$NPVo}H}~?D)auq< zLH}xzRYp(j{KSX@O617G(xcJs6|_RS?2iiClYZ-HakE}aN`7sptV=B@ja(RD!upCd zPpmlKM;WrBx_IS#N0V*b-q5eW?>V(z!_gDFQ{69{Dn2+V&g%5WguamGiIn3l6IWDU zByM9XUsxM39hh%|P&QWsX~2q0Qmvzle$Ny2+JIJk3HJOkTl_pKR2q;*CDcHIuUEsn ztyXuOo~`aJnJ!_i#;DMfAiTW1SWVA;Qg!^ff+H{&kY>-mw)K#NMc<^-cYY`sFV_D!mduF_NW=;ZHs*pwmWPSm?pN4Y#sdqrFm;0Jpsn!mPeJw`F6YW|itGDHr)VeA^N1zp79xILu($Cpm>cLvBBF;t7 ziZ73D!rx+4w>C<@bEicd_0bATla0=&cZogK4W>%(T8sD%mIr!b`^f5+r)@^>5O=O` zuN?3XAqReX7$>}0oaVDP#U!$mLM$ZII*SCneruc>A_#NZ<)D_hhGI&5fdnKPdW8^= zhou>9AxN`b7F`|az-#^0I@)j(5-<1kC0&=*V&|7w2-57$q!ERwYxc!z|7lH>+uJ%3 zOJGCeloKS-6FbM@!3?#x!#dUPvFA%AIPu-w1*PdSXu~^p2K3t{6zOt*<2^k+o`j`m1YOBPyf?;fA_NswUT`Z3YR} zZ&Fiw{+qv{fdqQe%Om6GS;at#wV_S>Nb+$~MMHzHi8jI`&uWU_An|V0anfwn45O{s z>;<7>X$yP)BeNAD{oll>!B!RX9W^l8OpT*YM$)m3D-o~Rqv^lf-G6K3D*8hW9L?Uc z@+HAYE$Z>PYf}ldx>F=DDx_`pZ2rD)55+P-`oA^8f-cZq0T$|gJ=};23G|eyak5V+ zZ5y$aUiBSg)l-i2e-lF46WYGYGgbd~UDz`}7J~Wq-+5K@@GXu=o7RHvJl4g?>H7=1 zDw|W67@sqv`q?vuBhU))Ae9v&oILS_}4(*Rxw|x9h&7`e(Kmr&=5>JK&i5dZ)sk*2s(s3DgsW^veE8>HYd> zdVFYQ^V?+ROxgB1L*suF8Brmje`d4S;Lr3<&FpkbwD8+khE*nEi}qyAP(}=`97p~7 z98;(6RDP#WC(z24jtt^N)2*~%IcM#C)AF2Eg(BhfMV=r{r)}ktL2OxvW17baEq&8Jf=>)HC1jCAZMT1fP|5hVKl z)ka>s^Nae#DTFKu;jL`FLglImIY=*$M=50rI+;(+>OzM-Zma1jN17-4mM&|` z*`Sc(J8C+?vPA+tv9lANmQn1#Pg7QooW#`#Xc%tPSWF^NpRwdOWXM*FRG9G^KO(2d(&8GA=m3Qnh?Z zYyA=P2x?$`MLl-?F`~ec7yY8mdONq(#DDi6SdagILa)0vPx@zezG%N=>Mi#;QY2cT z`zDrAW)6Q#bPZe0`1k0;&dc!1&UVdxCM%)@4GCLnb;72R(fb6je&j{4LC7}Z-;vnp zjM^U8>zLZ8vJn+Q0x#jZzaBQo-8-^2}C*>Xl- zqS+$RQ)??t{j;q+GBlLOFEMqk1aXl2vOAiA~KN?a>C%PX6g*K8@&{a$-?fvgP} zY?O_yo$LQ+duul)6SwT{vNfVHN7!Q5{UR+0)dw7tHo3=9WrspH{k7HiTCowvxMXV| zx?fv+%+O#X8d=9iwx&A-&DPiIevv>=Ok+W1^Y9B{MtS^KBzlhiE2>Pwf`sie5*g+3 zh}GNh{>P*zQ3~Dt=m%-lXuYaOW$Ul>*!jF#&+09!za);;T_n(okE%@5t)yu=XL(ig z@?0N|QQ68Vqb4S=OD4%#+~xR)#=ldj$BTqbFM~*B^_JB})*1y1s@p#6v@P0^u=OZi9TXw6}JnY#c|Rm8~XbXfz*Dpuzcm(MfurXw%SBZi^55KP@8?*A(*gS6A4nejN|4ywf!i?PY?{iGb#pZE#I}|Pw zw6eAN41&!=7&R>wRqbqifhk z(Tx7euH{yGuYxhNCimCSG3`pLhl#!146idvJ=^)z?CSb{W9WO-!Y;936l zNr5Z66HEtcAk9|pe6lvMcU+QDul`ASN=n=a@#&_J1v5YXcFi)i(ONa z^l;+ulkujex_r38Hmd#VOdvH5o+3Ri&r}aqizG;3gzTC#-$UxtyRqhfCRDRo{kyjF8tuj0 zTIc%Rw6y309D&yy*jCs{o~*pz?`Efk{ww8cL#~smp26&FON)%!Y=->2T2jqt*J*(* zUnNY(e-RnE8+|6bc4m+>U8&rrXoXSn8bk75)H>Z8E4Lb!KgoNho4US-ezv+rMgl#t zH*L6G(@LD0Ew8IpizBf2L7JU@5$t&6#m1H9JM(W6n}!}Q`o;9IQ)nM&Ig&+KVb=2s z3EO9*Y#`qRp=!IvnzhGk(*5or*=D6{px?YjwyC{0+D<*4>bzd`xvp>haIz8(_X8 zfxQyDE7Sg(B-fllN_LBuF-I|W^u+e{JwGiCou5&aj&;fW7YHo1yNs8ptT zl?F(l6(5yeXN{j=pFMa-0q;lr`)tl1yS+|WHppw)kC*lj*$ z#rp$j^{=}!HksF-4*?F_;l}U{NJX)-pyL?8+}*mky_^I>^}(flu4AIWKKc? zBmD2E!rsi&1}6@te`WDBH1K{4(wQ1N<}T+5v_kDn;%4w`iW(({Eu)>f?-KP~Ks|PE z#YG}PUaC4TL{rcTSN?h8ZKV!`RE<=hPbn@TfotJNv$yKLXhi%bOq5beM<^H-66lHT zN&Vb`Y?*mLT4kvyA%W}PNVAc1>mliG=T}n1mE0=k2@>duy$5UiQmJgRNH%zSOGx0I z2Bg`&yK#HP)B|P6l?TTZtPMz@C$^8QO+&Tpui9k)f=Ut+cn1S%cABp11og(OtmI^i zO$ydgB+wJvWpVP7`XFMrRQlF(E7mw9&=Wh&aYzALIOc+s<--XP3B1RKG~2PYwx0IO zZkx5VeFybUXkocn6+yc{JJvjCT_NLhS&!Z3lY3p|6VWPrU*Ik_GPwnGqQR@WS|3eX zZ@QRLME0!GS(`B@#yl=-QRB0s#+uO+yCq!X9$j6%x|M$Ksx}KQV)*SfGlsL`H5SI# zpkMn7iMg)sR8Rx`q9;~@4sW&mkKYwL=`_}rx|IU2=Q!0?=`GzJ(T}|YWKLTky`t8(dNk~N*bT9CG0e#CwANUTH| zMs4RPGtxX!GqtrMuI*vE;!%^no-G-%pTDz%BhV8o^Lb@S$F!x^a&|x2J>eFHM!}&` zX0+lpcGPs2R?ewq?daT|Zp-a&Xw*6yW!^oyneln~>?kvOVtMt@nS3le%X-E8CUvUj zZ)mhucq?AxV5#2Hx9*P;`k$-DX`o;9#OhU(LnQtewffH2=v>#XhQ_gwXfs;z8h706 zi2uOa)>nnxDSaMj#J;5EPIKL&U5wA&7e$-V6H7rx>U})q@ z*kwkV*Z3koCf6R=OYI&y(YHNb5xqyQd3m?_!1Ane&vGq@mcGxNYx^^zfA(X2Fx!Rn z@G!~RXMxgkZX-IVT`nU}s%1OC5$K8S3UiuAZtUqKw$8tRBMzI285%xs4|231Yzqq{ zV|R{G4i#TTi%%(MXr#?LWJUtD+1Wc)Zb*y0pNKa%{NRWmbNvhr>K@0@?EI1~PSS%T zzmx^zvuFu%?J~;t=^--`sLjs(_-vy0e5hEbS{g-S)Ba(G#@9RtIhyVAUf7*BY|&Mj zW51tXxHa0)I5g^j842{ncFOjRp&mnJvCiG;91+<#$k3=%eJ@9|CtnUz8rCmZSzLVp zov+O_GzOI0V@3kC+1rOIeWcOuPsE}!+LbkR$Xy~!gxwW%&Cv2(Y+ATzUTE=%153_99%?Cc_x8Ya!|d0rQDmPyhryC@mHCukn&8L zC-ju3v6Qc6DMtdW23)F$DPLVh9GTi(4IO;LI=1nk-zhhX1LOszb{hGUtJt{znex9N z<(V{3r1f1O30>w`L$A+ZDbFO(Dxu%vl=Nubq$OMM{aWWW}2;@b$dYP~JuU!A+k{_kUrdR4`ziF~NHp7QHvk6&%&c5!+u z&}&Ix-}+LUyFTh0HK&3ES~ZC2E{|Kf=N}>>da7i}+fPh*+(WE&w3EE&uAai{W~6z7 zTp^N6PkX7_=G9gt(5hX<4szW!zw0jTQUCS&SyF39#ni#GiM%~MLj!4^aG5blcHNLw zHTUq-X3{ru`qL13yk(wwPSGspv`ek!!Fd*&H&lHo>z_SO&Sfbte7%osnUY()^`#s~ zyepN(tkc$-i#eLTCoVR(R(yX>X>9&3TCbtEsBR^nn{Q5CIoJ5SzsnqRwhAk$uCZ&` z9Hv2&t80Oa9n?EtJ8}eCeRO+a5Zk{jU__gcX4<%QOBH|Z5Rp3N&~%O070;UcIONoH zzemQMF$Z;gVi4u$Twp}!0t2;Xn~O?4r#Z--?_D$^kv?2BBh3@5k{slDo4u`zSGJaS zzrAPVRk2-{%@r=(GxBG4^kwsm<)4htPSq|ljgkE;$T_aB79Fz=kf%9*H3(fDX`V={ zeuR*o{eACz=r1ksJk!fwCnm!q?FT+!VG3FX!s zMxT=VKjLY2C7iN_cKftK@vUIth?-fQ3_|L#*o-tw$LzcG(Kc79c-U~#HSL+AM|Epc zh#3jgX3y|W`9wOezMnJh zCDkcy&vArQ`PgL>I>>nfpBfrvUZdndn zi6ZyX4UPVfc$yK3Tj+#aD-;VW4XyfcWO{;6i9SyVIb(sHL=rNEHkWKWy-MpWlE zoi-zZo-)c~+eW@T^!8yZkGl@Rzsn=7mfk+}7IkMnUmiMPD-YeuRvsBGN-vMF!F+k> z?E^Jz<)M3Gqk)Sb8G4W}51q)&-T54y(LSsT`SQ@)2NJgO&^=|8$6}YxTzTk3W{&c7 zM*Dd4jV}+Ku;s4aK9J66AM2v|^3dA{61MWtJ!RB(a=ACxU+L|`)?ZzZKl{7C%BbxY z*-#uZAY~O2g0nN3>EGd6%B|5O|JW0Qb%ds)qeDQ4`=|uDfa?2cRrh8r4Ro@2k^~GjJ zC{=T7Qznd1_jTz&d#>^^uKTvzZ!#mz6GJy&qNYzrpj+Li85&{T)|ipziH?&OkT*_;rFm*z4GFYL@Lp|bm~yXY8m}vbk%6TLsa*;^ zrjI-}7#hb$Y%n9u6J4ghB0=}3N^_3Ja0FVpb=_lViKZ{~<%e z+HS8IX`T=^Kb7Wf-6BTB21^~MmS&^D5xHgGD05eP7i0Xm;2UEOdhBHU|EiO|GI1w1 z7pW03R$Vp2iM^>Qlh7h-8AP{NksQrhR8b-w9P?fD-t=Btmsc`;6?qV8Mgl#tRvSKA zz28z)BiA-$ZyC!ZqR;j$sJBY~cnhR zyr{fs{~4pCl23=2t@kr#9N}9QnU{?}%jkXbxJ{ufcMI=5F2AjpSK8*M$wlc^gBbTN zm?O{=8waO!B!@$OD1(;@W+Y}T*JsQ7`CwAsQ{`cD4j_FD(Z^9Ad^6T@GeX@rd%F*l|%bgraXR3V`&o9uF99c3nR^$sa zBZ1m%=W^U5`R%xO%9cZg>2m|b+zz0cN-kPXHB`Yf+ME3 zd1Pqlxr=m0?)DfQAbQRHMLO3@H#GFzMFO?i9Pap2?MnU~N@~bd35fwmGc=<1oaN|@ zc0RJ6q8xu#RNh!^t5Hkzc5bV?dOKfJev?r)neAMtpI35irv0vodOJq~J!Q1>Hj95K zF07r~YMf5A@ULq4)!RAJ8SPvSekRst?R>>@CnGAoog;ysGTM1u_jF~L58;Twl%K}c zq~6Yv&S>YwYkwAh=1Wp0e0DZ8^mdK}YO|i2{m_?riT)SY6BdU>7%K()9A}%GG<7jn z5ZL>kSeffT-UX`>{V%RYAc3BAJN6FrRh5bUcR;a>)re+mL(FLPr^YDr5`71@VEg8@ z<2i0E13l?>f>7Ks{0{=HY@RaHF*LR|VW6ec^~c7Vg`V2%`>z_G&lH*SuXP_?qwon| zoe*$c1XoyW8hW(49n0N;U)g)y+1tSW$x(gv4Cz0Ka_OzfzlnXXf{pUfS6h(Q?btIp z2MQ4V@6H$5j5RAgg_tIO{Ytm&_^>|V=tQ0|Ds>pXFV7GOh-V6 zt$z?`g=x|~vlB@^E;a~TRC+D3mFB-|Oa^hI%29*Bx`YI_8-uX?A75u3A4Si-{h=*T zpg?hoOR?e(?d}*>+}(;h6ev)%OK~sm(Be+9LS=U{xKrHSDVSjrqi8imblGytatr3s1?6O?uCq#u1p4sgeD6 z21CPo!)7yrn2PzqYh;@{($GkHx17#tpth+Y=gDq(grnlJKWiAXYMnRFQ+qmd89v>- zzVMIdZvE;RS2$KjIyrG}axH_fY-jKNkv|t3`7VlD_}?4=^Y4#U)v6d*I1ht9S#QN` zUc)4Ovu`x6tTJKu8OzQ3_oO?xDk?S^ffgcdY8-ri)F4=WweBwzaMXhJuvDn)(lLAb~fvPi&T%8qUz+9mG3pS{44W zhG7-HXQChIpGjN^`C(YKRXlC@QDol&ZeA2~GKun^Jq-=3OxT zZyFj6D=$(}FS*9O4tWiY9Wm@}`;;=?cOR#L+NQ>e)h2;&znmVttDD4_9A>|3wN&<$ zv1&=)8yEj;U8kbhw<7i@Sl=$QUnH#B$5LUtVd?01uSm8>H&0-y66gokD=Y=ms$1vUCbJ6jwR*Ubn-l+(Rp;yGQ!VLE9am8U zwM`BCjtK^f1l~2IP2&2miUwh|J89pA|Jpe#x8zn`pHe0nfvK>qm>LBdnonKSz*N|7 zOrl87EQW?v`&eIsexQFQQU0Hq24U4*_AEjIb25o>SKYYw!3a#1L|ad_h(>3UX;^w} zoRCCV?c-|XRfDkF9qUW56q0*>by-ovDkLlo-Y3hd@U=f=<`EJ}mYn~u#z>XfcW3tJ zefdr@`$fX487viAC zH{GM)c;jvRT8jB95||TR+m$no*5dPI=b0VbIAY=035Ldir}H?Po{D&LmC|9Vm)$G> zWRAf33#92jMYelN!{!7AaWUaK?FaWLZY6n|t}!V-QLeowM7-K#pT1`AB}3!Y+(Z=# z)TZx(_opi%9cQ>U?OVqYI4_2@Ae3)?MUlPsiP2|j=r|XK1ZvZ=`nE~0*`t(mN&l@n z&h>rm+0?in9U7lkaTd=ktKwzWCuAxasZSYD$GGRLtdPK*OwT=swHDj--lxZuo@Efs zb0jb)x|c=T4N8f#<+Oa&zi|Z4w<2wNKB&o6F$?t^=U9DY}WRcjZcbS+`j4i_FpybAgk?2U`}Rj-~DB>bAI$Tj)*95)zDzI9ci<+ zFQ4vZkIpxlBXCw8X|uM6{}UzZ`&QCgk~F7}1X|1b1G)#VR}Pu|mib+ZT5?DU(DriQ zRWik7GyZ*N*4=;lk|!S?CL{1G3IA1w<=rf%n9;+b27dEEnxz+nzHiw+$MmGGe*Fyf z%@=p6_{{@pmQE06U8HNg=pQ676>76|f{-KKCu2?q3H;uIdM2^;Mk|?JA%XcG-qqBw zwlUeu%BuEb?U4{J3TdXhkic;Q>QQ3+PwjR2C$7ldW9TV+NuJ}_2WdK8S0Y|})%;(v z_vtelsw06pQH`TE?P#N$uI{hh2ogBIPsKJTGZXX{3CxKC3x-ScI+xHw z!m@J&z8fG-iM3m##_B8aSzw%oH4X{XrgMpLg1n@_D%ZX9*IiiSkieWM(L|E7zJ22g zdRjn30^bdhW}ee^qs6ixWWTA7r8T}@DQgfz{5Gga zCnJP$x3@FGfsxkuH5_S{vmm@0=3!Wc1b(AO+9X=^dTMB(RcHx*wKfRHQ&Q1 zMijx=9dRmJX!^02#znI$jA=&#{WCREy?LL^53~fojGM%&nC^xj5s@K==l5^WS^}kz zjBq?E(ZSHbn0B-Ztu-|~6Fu2IceJi?%JBBP?VyST=4296-GdAbRL3Z9wALUTwq0IE zy~6MENMKH;#-5XI2616fCBt*y;zv}pFu7HgN-QX}MN=pjaLoPNF67!!H)+NaXEjC_gm#K1aQVuN%tsw2%4KVvc~^~fDb?XiO+ zFjc0Q6^6$9E*jNvKX^o5QgNX6kJ}m}(FX@1T;G&VTteqgG^JzWhA z{rX|5G1Ir5T>O4Psa4u*GTt?$dE)fu_R^b{b+udj?#Nh|kmiXq!K+>0vqws~OQu(l zz*JLfXEm%UJ)T)LAWw0!?e1nR^m=*)+a1z8(KE3y*|y1Da?Cp*BY~+-xE++)SB|`! z+3a+x9#crfq7(M7rI&LArdqbNwLvWZm_Ui3sOu!v+ND~y6E|h-qfn10UR_Qg-{f-A z?*5H90#n_)a>9sP%hW4|YD7C8k_IKKXgT*6k+IiDJ)U?Q`ht8cQ&|cqzDhy@Q(alc!aG+pMnf)Sx5r#;!bo9)L*X3mPi+-Rb4}G>9 zZ_t`FxgX*-{PjTHZV zR~&dH13?WWFef?+&$pD2G^w@XD_3y@&JH3?2RsLBk=ZxOO5-ZuAm||ys7>Adv`H-N zh8}6^$Kq7-{DiIIgJH1*?=2FjO*O{G%V*oB)$-li&Jj4Lk2L*e(0jdn zX3=D^>#SA;+XND*&F&lBC*``?mtbTb#)9*)=Zu(_(@$o<_}-6na$?)(D#-{;#Ye=m zyiX?v8U#k>p;f5I($jZHpMf&_MFOM8k!I-x;qgPWheJQml9{pWJJlY=c6Py^z9cL* zr_4y47eP8XQC&B!vep~0_;$1ktz|jWJ>_4PmDz9BGPewM_5};|l54E* zq6X%RH0?o4r_>#dvS`E}tDz-H^VIYIn|uHBjegNJGGonbvD~E$1T~Proao9IXDt#j zHl?d3?HSNsBrqp72hf=$`V;4ZRPQ;$nhR%l6KU#hMsGQ&S{>)Qk^2eWTWiLgeI-Sj z_9Yuq$psSW8k6C%9D%9OTDn@c!+KfpsACVD(~4jXM-9}bapBS?xkRnr&Zz|(afJ0X zi>+fpn%y@+_+Fu+%ziP}(Q0>W9fQ^8&2xded z6U&*NenJY#>=);zF;#Mn&V|i!32IoamaTk1J(e?_FDYhvjvAP+Rk}&zk|%%0B^Zr~ z8mMh*9DQSYjx+J7mt5nQ~|W5=L0<{BN51 z>n+c(&-W#)##t?ueThZd9G3*e@O=p*Fcn``Y?L7v=KB)XI#GkKCDC;^$%$usaeWCR ztiFVO6Goc(LC<);$-m>UNMh@KfUQxp-bKtcaf}$_V~$Jk>znn?!RX|~&_Cl6BrugV ziZWN~F%6$T;}VPoMypVdr5A+ZIm{6N64twcu?7#;#F|8bKjRX#3N5k5a7p8migD(+ z1iwxqot${_XIx^9o!PhqtwL)}t7iNemsq1z_9R2SG&w0)3*-^BhY_6On(%VTAS0!6GG*Hb*jgDF2Sb?jREAANAwh zCUNp0{vC%A);kA_nnc%m=ybS-2 z!&)a2d`%oRvOo>u=j(E$D5>e2%v}RobUVvME8}hgg7EHrp&FyQWgm^C|m>M zjWG@xSNhXC`0Bh^=~qcIziz=AUXMfRJi{C%$Mvf!(mX+T5YPiQ+qIM_dU3lHU=%#k z^chw0DJi?uLzBHF{hx%H%FHQ=c&jkZQ+TVJ`I`TO8dgM-6&?M*2~1^Pvz%CbdsiXMh__=p z*8i~RChMA|Li&FZr|2FjNkq~$i>EhZ=>M}yv23?i53qaAt}Q)AGh6;QfvGI3OycVA z-#X*iFN@j4wE%2y5oQT1UGsVp)j)#%k4czoi7c8YX!Z`K@$~nU8rJ_Rvn5k?mH5whqOtoYd+Q> zFfUAn{uzYB{YV~Wm4GYykxoVkFBVre{J<|fXcby(TD7WD?qnL6Z}QS5Ps|f4PyaI;>T( zYy~JrptopBgFao0jkv6On zia&c|)GO4$eDPbMN#yO?#JC^m2ky3jKAFVOCm9U_H85ZN=4ldgk!OTnIdEk)0|_i$)H8{0i&7Y#<8uO|O0g~&grmqnBeKRAUs+EUOqHyb zI6U3W=pFp_kG5l}n^wJw2sW(3(!~-*3r(V{?=Qo1j1WOOIdQ?im{Cj6Dl9j&(A2nA zp^QPG2Ih-pXqMHk2F(ouBP&n?wN0YKvKfZwR=Z<;3C31qp$N z{mwGRh*kTqCNcsoOm0>G?A462vhrdCrb0c_s+5_x5O#$G#^$4*NsO<(#_-%~2dteV zfjJq3u_#E}Cl3A;i9Q}Js7Sju60V+s9nAc3jS zCu6-c_vU4d=+Rs2+Ps5wz4QM`uvCorpW|KQ&CAp<*KM<&h?SeA!R{&K%XSfB*jx_y)lf|J7Yb;@c-0D_xw8urydIcK@w68Dn~smIkvhxm7RrG-HIrDifm(!j79bOT}`g^Okcj zu>0|6t)=-Ej~b}W($SqMLcbXVt3Rf_vsCmcnIDd7bLtaDB7w7xNV9Z;WAj^yunUV| z-s0>a&Kk0GH2$NLX_ckUJVyd^GKn2e8xwkEv~%VMBXC9#X_J_FG}gH1Sh`4{wn?;X zw=5Zf_W)^=7_i=q*+zS@tgL_kuSE%0Z06gY^*^kvuzZjAYP!_c1}NxMz^MBPNUzhm@WhuKy3(A_|PVppo|j zh#-vMEEzK3xBTqIO2ZHHny&0wjWb1paEK$&C!`GrjK9AB9`Ik^$2_<04ZG%v0%fyl zn~vTkB`St1_&-QsiI^I<7vxrc{!abh%;w*v`dYq#xIOCtU^6{ruP&2?PK6PCygMK zuym0?YiZ=pirUVZwL(bRuD&vsdve08F@n&i`FlyQ-A$mqmSn0&8FdLQL0S;zwkjaH z&R0s1dma>#z&+xTHt#tr*%TcYN@n?>hIO4(3N#d_cxrK79$&d(#qyjVJdMQLpLsOL z$U1hW#@_?$u3cAgC-DEQBJ|3E1lpeT@7SVZwoMl?FWki(Ei^P7>~Hr0YbD%I9aAA~ z5XN84`VEqBS8=3qCvYRNgZ-Uz3>MZLW&FQvNAjO<}z=-UGgt1U2+c=)L@t^T+Fne@fRRFkh?-v}PCqJ@=o&X8;oH2=e|k~VDl9kt zgbL=znPs1xou)74G%yufCfv0065e++Z;fQp;ofSFDZrZEeq~}K^ow`Bm?vU!5!}VL-R_3G~ zQ=uOA!IT(YR&#h95$8fp&YR(iT)ddDst@t|<(|2#+9^jy$? zi|b0Cv|}pN!+wR%^L1aQ$zSq|Pn%3|A%Ur|?=n4i&|0ED884zb(mX*uaeO^HlQ56) zq_?_ppXrJ-Oj@QxF`rz05D8NZ{F5NSj36w08-+!jr`?-{e-c7$3z52NIY{3GZR}F}0St zyB%FIGGQGf{wu43o%g6{6>*iNT5$hvvh)^W|nBeF3>8>7cFGz==<6i^Pc0mT}WU~ z2H^PMK9R61B+x>n=??ro(&$?j&^IIJ3<=8wS4Hz0K_|D8F3q-z9jDZkk-!z?NYhBC z-W$oQ@Z+wfqnFEA8<4=9=zjXk+L4k?SBQ60tmg<^M~^f;`z-piR;N-*E%U6`GPVgM zP+JgwAKC5t(fYc$VE;{yz+DQEru&Li43vWxo^mZ7`bNh70}0foHzB^eoIU+y@vvti zN8m0FNYncfxKVENG0gRotnnK2PQHiMV55(_t!a`Szo)$m=|h{%WIygd9ec{ zG88?ey?wMZq5Hq%QpkWZ?9uS9gp?Wn!M|rwd&23 zF%?>Z7SdIEHJXyd$+>JZHreIU1&bIOzb5UbJLQ))u7hIssFfUkhQ@Y(rcvOgrxw{@ zhCTDcxiYFFf!5L;ftvV}QeKyB-2#S71NY`O^1YZ4tvVg%*|L{T?NZnGGf%1AH)0pn z$bZ$1R37B#eDS%6{O;dEhI&VOKhQ$ns#BNel6!YIIKOn+=)&`T@l;(r#a9qU)+;~#jyVa!*7=o4-*NSvhkUPa zrvu}Ow|K%Xee-ITjzm}g75^;HEsnrccxo_xc1&*}*Sk8=dGL&v>sj9(hP@lx@~3U$ zDV%iQ=z68)XVa$oH@u%q!ZSIM#?w6o;mW=|^7lR2oI=5C8lElc1!t%7XMo;r;x9K# zxMZ7oA+M(lXK(?;FgZYy!51b1dJ5}1=9>@ILoOB~~8 zo4L=y^*(qSF`oNNS4aES)RuN%>nv4r9(QIjTEY_pM%(2K3yV6JSKll7#+oPI7M-|D z?IW1y%r4&-tzLc_WVD;ACs>PmTE|!ZlI308=ml3KOojBarDpA^urQhuhu^f3$7i4A zT;0dv#Q(us!q+Pz-IRkoTLh5GKRFFd#g8(k)hs1%Yvp5$_)uFy4J6Q7`ZZ(yH|1lN zo9v8S1^);03-K|N$F6Qp_K>v}&qGNPE%WAgzCp9WY~m=k^fC>AYu zee%dTrkYE}{v1>B8smGXm3tp3X5TU_8%LlX(o{p(CGYRO$LaZeqm0i9)Z;Z;HG3%e zPjBWdXV1$$qwwj2IngmgKVLa>mx<1x)AS5Cc#>f%USoCH@zQZW!M6CSFGt`r5o!A7 zm9m*ExP>{N&8(o{GYa*1jr{%-#EEwg0T;wa#tNJQaKvAQTUV!zmj1Ac2-3Z4#$fn`MPhWVDcfo-^inr~HN=SYNS@p|+_}^i(Z_z>x*&@uLjJ__t_c z#AV%e{x z?;4i0sgZlhRKqGH(5K{{*M3#Rh)_TRQ=y)rA)L*TpIIf~(-JMgQZNX|S+`Hg2-HK` zAOt^;-OLXMYGA%tZl*?o(!Y$li_bpPz?@9tW;3HEI`Bz`1mS!@PF-N0TKD zQqwWqh*q=g^M8BG=X%VQ7;&=kKGOV3YV~hAiI^!KcY1s%qXpjF$q`J$O2w|*JaCZ~ z-BMAFs~M&_-M{72ZqAu%5P5bH(%#L~u=IGMus+LKZe}jLOSQnU|2Qr z<9af>hL_<})R)a~!BCT5NWb!nsWiq?3rFm8-e3lv_@`&untB@Mh8iZxZ-*ggjU|SO>IT>tU za_<-CIp*7K#YxhwYcxsxz%)`Vj87O`I8s{G@hwMSs@^-UlCuXlk#Y?fF*-*^=hHU< z^4M_)IRaBLy^Gh^kd?%X693E}@BHpB%0(B18H9D$m>-r;Jkg+u2f3Gaw$`X}pp2Ge zS-w`g;}%cSUd^peom57?xOykq{kkaCNLMKr8MQA!uBi5w#~r;y8ZD+X>F2#vq13A_|O4|~+o6Op~k@yVtQc;g5 z3e2YaSnO+UKjxy#it0DeZg+|&T_)sIG1Y^@wdF6the?`Prg6J@n0(;iH7U+r;|SD4 zS`eI1w@CNWR}g=E^B^-P9wK3V_mKAQ(yBU=Hy?>g^Q9>7sZ>n0zvFSzc-|&5{2uG!q#xt#FEWpntG2DmX&`|)3Bvr>eY9?gbEU@NMwBJpsVyZ1c!E)9`Ye~sA`6+Sl>jaNLbFWr%b_Fm zQxRp=Dz;+s()bbj_Z2eLDCOB(t5PmNEA1(Ysn6z+Yiu8^H@>5&Nb`j6ma1B{edRSJ zbe>pZQEPc->(&jj?mYwZmA;86X7E>YiWCr(B9O~AdO$RSuUP&s9x$)bB@5A=+0=B zPr2mR=UsimGDtx$UemK7L-f;HTY3sx63r8@G9Gs|+n$p|XBxs0m?|Npq;khCR1bg9 zftGHS&wX8aTK3e^_p2ZU9?q%Q8V%LQ-R_{G9#2f@a@cvIT!L$F`34gH&#R`2;=6c= zzSOUiiaF6a%lG5$M^jGGn$>P2VJf75@9wHxtrViWr|C$o%A~EccaPhsU6|2R!v8^{ z+v`5cuKOeO{?po1;z&>i@%gtauDu7Yi-*fQlx!iQB!? zN#0MrHLo6mJ^kRF%CPw%`mQDwRit_1aMeC~LWz;$)HdtoDT`hyRa-=obNh#=BTB!Z zv)rNjvHFA6x_Mt4*Y&Rtr>k&Y@p=R>yVrdG!C2zRIg&7sc?D zQ#rzK^94iW>%AcyP2W(vPEu}uf9}eW|Gk`}?Ri6E+pXa$5~xjQYiU`vl17UCJFl1X z*UwF?vU-NZLt}ilU=<0}Hp}W!w!30&T2@HBZnw|S zU}c3gom;BouYCCx>dH98O-V6jzoGGBVu*?a<|GK$X<3PXmDQ?2j}^=IS&JViR#`3D z{f|PYMQK?T&&`)rpFwvx!YV746WwQ$)~hLhl@%i_+p9gj&C!BTYj!5N*`rl>62+Q;L`eTk3gdVi4n*Zj@>T;Ur9AT9e%gJm}LYxfk*0T$wx}C>`4-hY<$aE@S`^F4^t?rJ zzC|&@Y9GvV)T28B(-w99uNKuN_8*S0S`^Dk5H96B?<_Fztn1paqxSMkrz*4MDAKiH zHq~wGBBj&HHKf<&+-iwaQA*-JQ6zWzLbUfeTj`lSxb`hqqpfT0J|6Yt^oOEIfeS^| zZ4u+-!B5tZQauW)F*kS07am5D+rxY)QL1c=xHMA+*P*<7ovzhOl(Wqv>DbvvO?!0_ zZS&Ej&zqd8qv~R#{okCPof0wc1$nUkKx=fRfq1U&d(yc?sQ%+xb@l0>OJrw}VBO2D zsOnqmKK=J#-KS6$N)%gKRvv#Q4_P*On%KM0eR7Nv@81^Y2+WCoAKaH${`YcK(sNFC z35i*?mXqQcgLQlR%p5HUe(O5Pvmd*Wm0w)aj6>mMe9=(d73`@ZfjQC9tCCI5kaiVW zTKYCe42zD@ZuARH{$QR;rA2U*xC4M#Y}K9Y~o5{)}?O+lKT5Yx4X z6yd)?%e!;3?AR|UvxQ|VqYOtJy%j-Ef(q7$-@D1t z^s7v!yV}&CHsr{L=5mPd5#>3(gCpB~P>?`v8kdo0y0#$wa&7K9FOK+>W3Qocqtrhf zO?SoXbVl2|GK}Qd`AR|!Pv?1qcs#^iMVj`BG2;oLW1r!*s>!>Wd{A!thU)*8%0