From 7f9b1b908a7e1def2d7629bc34207bc1b640db36 Mon Sep 17 00:00:00 2001 From: utkabobr Date: Sun, 2 Mar 2025 22:05:22 +0300 Subject: [PATCH] Auto-orientation --- app/CMakeLists.txt | 2 + app/build.gradle | 4 +- .../components/bed_menu/OrientationMenu.java | 32 +- .../ru/ytkab0bp/slicebeam/slic3r/Model.java | 4 + .../ru/ytkab0bp/slicebeam/slic3r/Native.java | 1 + app/src/main/jni/bbl/Orient.cpp | 74 ++++- app/src/main/jni/bbl/bbl_utils.hpp | 49 +++ app/src/main/jni/slicebeam/beam_native.cpp | 7 + .../res/drawable/menu_orientation_auto_28.xml | 27 ++ app/src/main/res/values-ru/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + icons/menu_orientation_auto_28.ai | 312 ++++++++++++++++++ 12 files changed, 499 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/drawable/menu_orientation_auto_28.xml create mode 100644 icons/menu_orientation_auto_28.ai diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 960deda..c3b2b39 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -22,6 +22,8 @@ add_compile_options(-fsigned-char) # Suppress all warnings add_definitions(-w) add_definitions(-DNDEBUG) +add_definitions(-DSLIC3R_VERSION=${SLIC3R_VERSION}) +add_definitions(-DSLIC3R_BUILD_ID=${SLIC3R_BUILD_ID}) set(jni_imports ${CMAKE_SOURCE_DIR}/src/main/jniImports) set(jni_libs ${CMAKE_SOURCE_DIR}/src/main/jniLibs) diff --git a/app/build.gradle b/app/build.gradle index a7a1c80..4e03d6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { cmake { arguments '-DANDROID_STL=c++_shared', '-DANDROID_PLATFORM=21', '-DCMAKE_BUILD_TYPE=Release', // Disabling this results in drastically degradation of slicing times on debug builds - "-DSLIC3R_VERSION=${defaultConfig.versionName}", - "-DSLIC3R_BUILD_ID=${defaultConfig.versionCode}" + "-DSLIC3R_VERSION=\"${defaultConfig.versionName}\"", + "-DSLIC3R_BUILD_ID=\"${defaultConfig.versionCode}\"" } } } diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/components/bed_menu/OrientationMenu.java b/app/src/main/java/ru/ytkab0bp/slicebeam/components/bed_menu/OrientationMenu.java index b5f4b4f..acfcc80 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/components/bed_menu/OrientationMenu.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/components/bed_menu/OrientationMenu.java @@ -19,6 +19,8 @@ import android.widget.TextView; import androidx.core.content.ContextCompat; +import com.google.android.material.snackbar.Snackbar; + import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -61,6 +63,20 @@ public class OrientationMenu extends ListBedMenu { SliceBeam.EVENT_BUS.fireEvent(new NeedSnackbarEvent(R.string.MenuOrientationArrangeFinished)); }).setEnabled(fragment.getGlView().getRenderer().getModel() != null), new SpaceItem(portrait ? ViewUtils.dp(8) : 0, portrait ? 0 : ViewUtils.dp(8)), + new BedMenuItem(R.string.MenuOrientationAutoOrient, R.drawable.menu_orientation_auto_28).setEnabled(hasSelection()).onClick(view -> { + if (fragment.getGlView().getRenderer().resetFlattenMode()) { + fragment.getGlView().requestRender(); + ((BedMenuItem) adapter.getItems().get(3)).isChecked = false; + adapter.notifyItemChanged(3); + } + + int i = fragment.getGlView().getRenderer().getSelectedObject(); + fragment.getGlView().getRenderer().getModel().autoOrient(i); + fragment.getGlView().getRenderer().invalidateGlModel(i); + fragment.getGlView().requestRender(); + + SliceBeam.EVENT_BUS.fireEvent(new NeedSnackbarEvent(R.string.MenuOrientationAutoOrientDone, Snackbar.LENGTH_SHORT)); + }), new BedMenuItem(R.string.MenuOrientationFlatten, R.drawable.menu_orientation_flatten_28).setEnabled(hasSelection()).setCheckable((buttonView, isChecked) -> { fragment.getGlView().getRenderer().setInFlattenMode(isChecked); fragment.getGlView().requestRender(); @@ -68,16 +84,16 @@ public class OrientationMenu extends ListBedMenu { new BedMenuItem(R.string.MenuOrientationPosition, R.drawable.menu_orientation_position_28).setEnabled(hasSelection()).onClick(v -> { if (fragment.getGlView().getRenderer().resetFlattenMode()) { fragment.getGlView().requestRender(); - ((BedMenuItem) adapter.getItems().get(2)).isChecked = false; - adapter.notifyItemChanged(2); + ((BedMenuItem) adapter.getItems().get(3)).isChecked = false; + adapter.notifyItemChanged(3); } fragment.showUnfoldMenu(new PositionMenu(), v); }), new BedMenuItem(R.string.MenuOrientationRotation, R.drawable.menu_orientation_rotation_28).setEnabled(hasSelection()).onClick(v -> { if (fragment.getGlView().getRenderer().resetFlattenMode()) { fragment.getGlView().requestRender(); - ((BedMenuItem) adapter.getItems().get(2)).isChecked = false; - adapter.notifyItemChanged(2); + ((BedMenuItem) adapter.getItems().get(3)).isChecked = false; + adapter.notifyItemChanged(3); } fragment.showUnfoldMenu(new RotationMenu(), v); }) @@ -86,8 +102,8 @@ public class OrientationMenu extends ListBedMenu { @EventHandler(runOnMainThread = true) public void onFlattenModeReset(FlattenModeResetEvent e) { - ((BedMenuItem) adapter.getItems().get(2)).isChecked = false; - adapter.notifyItemChanged(2); + ((BedMenuItem) adapter.getItems().get(3)).isChecked = false; + adapter.notifyItemChanged(3); } @EventHandler(runOnMainThread = true) @@ -95,7 +111,7 @@ public class OrientationMenu extends ListBedMenu { ((BedMenuItem) adapter.getItems().get(0)).setEnabled(fragment.getGlView().getRenderer().getModel() != null); adapter.notifyItemChanged(0); - for (int i = 2; i <= 4; i++) { + for (int i = 2; i <= 5; i++) { BedMenuItem item = (BedMenuItem) adapter.getItems().get(i); item.setEnabled(hasSelection()); if (item.isCheckable) { @@ -107,7 +123,7 @@ public class OrientationMenu extends ListBedMenu { @EventHandler(runOnMainThread = true) public void onSelectionChanged(SelectedObjectChangedEvent e) { - for (int i = 2; i <= 4; i++) { + for (int i = 2; i <= 5; i++) { BedMenuItem item = (BedMenuItem) adapter.getItems().get(i); item.setEnabled(hasSelection()); if (item.isCheckable) { diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Model.java b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Model.java index 313e5fb..229ced6 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Model.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Model.java @@ -147,6 +147,10 @@ public class Model { return list; } + public void autoOrient(int i) { + Native.model_auto_orient(pointer, i); + } + public GCodeProcessorResult slice(String configPath, String gcodePath, SliceListener listener) throws Slic3rRuntimeError { return new GCodeProcessorResult(Native.model_slice(pointer, configPath, gcodePath, listener)); } diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Native.java b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Native.java index 0dd245c..9a1751b 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Native.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Native.java @@ -71,6 +71,7 @@ class Native { static native void model_rotate(long ptr, int i, double x, double y, double z); static native void model_flatten_rotate(long ptr, int i, long surfacePtr); static native long[] model_create_flatten_planes(long ptr, int i); + static native void model_auto_orient(long ptr, int i); static native long model_slice(long ptr, String configPath, String path, SliceListener listener) throws Slic3rRuntimeError; static native void model_release(long ptr); diff --git a/app/src/main/jni/bbl/Orient.cpp b/app/src/main/jni/bbl/Orient.cpp index df81310..2ebbf56 100644 --- a/app/src/main/jni/bbl/Orient.cpp +++ b/app/src/main/jni/bbl/Orient.cpp @@ -5,6 +5,7 @@ #include #include #include "bbl_utils.hpp" +#include "libslic3r/AABBMesh.hpp" #if defined(_MSC_VER) && defined(__clang__) #define BOOST_NO_CXX17_HDR_STRING_VIEW @@ -196,7 +197,61 @@ namespace Slic3r { return best_orientation.cast(); } + #define BBOX_OFFSET 2.0 + void preprocess() { + float m_sample_interval = 0.5; + AABBMesh indexed_mesh(mesh->its, true); + BoundingBoxf3 bbox = mesh->bounding_box(); + bbox.offset(BBOX_OFFSET); + + std::vector properties(mesh->its.indices.size()); + std::unordered_set hit_face_indices; + + // x-axis rays + for (double y = bbox.min.y(); y < bbox.max.y(); y += m_sample_interval) { + for (double z = bbox.min.z(); z < bbox.max.z(); z += m_sample_interval) { + auto hit_result = indexed_mesh.query_ray_hit({ bbox.min.x(), y, z }, { 1.0, 0.0, 0.0 }); + if (hit_result.is_hit()) + hit_face_indices.insert(hit_result.face()); + + hit_result = indexed_mesh.query_ray_hit({ bbox.max.x(), y, z }, { -1.0, 0.0, 0.0 }); + if (hit_result.is_hit()) + hit_face_indices.insert(hit_result.face()); + } + } + + // y-axis rays + for (double x = bbox.min.x(); x < bbox.max.x(); x += m_sample_interval) { + for (double z = bbox.min.z(); z < bbox.max.z(); z += m_sample_interval) { + auto hit_result = indexed_mesh.query_ray_hit({ x, bbox.min.y(), z }, { 0.0, 1.0, 0.0 }); + if (hit_result.is_hit()) + hit_face_indices.insert(hit_result.face()); + + hit_result = indexed_mesh.query_ray_hit({ x, bbox.max.y(), z }, { 0.0, -1.0, 0.0 }); + if (hit_result.is_hit()) + hit_face_indices.insert(hit_result.face()); + } + } + + // z-axis rays + for (double x = bbox.min.x(); x < bbox.max.x(); x += m_sample_interval) { + for (double y = bbox.min.y(); y < bbox.max.y(); y += m_sample_interval) { + auto hit_result = indexed_mesh.query_ray_hit({ x, y, bbox.min.z() }, { 0.0, 0.0, 1.0 }); + if (hit_result.is_hit()) + hit_face_indices.insert(hit_result.face()); + + hit_result = indexed_mesh.query_ray_hit({ x, y, bbox.max.z() }, { 0.0, 0.0, -1.0 }); + if (hit_result.is_hit()) + hit_face_indices.insert(hit_result.face()); + } + } + + for (size_t facet_idx : hit_face_indices) { + uint32_t vol_facet_idx = facet_idx; + properties[vol_facet_idx].type = EnumFaceTypes::eExteriorAppearance; + } + int count_apperance = 0; { int face_count = mesh->facets_count(); @@ -211,7 +266,7 @@ namespace Slic3r { normals.row(i) = face_normals[i]; normals_quantize.row(i) = quantize_vec3f(face_normals[i]); areas(i) = area; - // TODO: Fix this // is_apperance(i) = (its.get_property(i).type == EnumFaceTypes::eExteriorAppearance); + is_apperance(i) = (properties[i].type == EnumFaceTypes::eExteriorAppearance); count_apperance += (is_apperance(i) == 1); } } @@ -585,12 +640,17 @@ namespace Slic3r { auto m = obj->mesh(); AutoOrienter orienter(&m); Vec3d orientation = orienter.process(); - Vec3d axis; - double angle; - Geometry::rotation_from_two_vectors(orientation, {0, 0, 1}, axis, angle, nullptr); - - obj->rotate(angle, axis); - obj->ensure_on_bed(); + orientation *= -1; + ModelVolumePtrs ptrs = obj->volumes; + for (int i = 0, c = ptrs.size(); i < c; i++) { + auto vol = ptrs[i]; + const Geometry::Transformation& old_transform = vol->get_transformation(); + const Vec3d tnormal = orientation; + const Transform3d rotation_matrix = Transform3d(Eigen::Quaterniond().setFromTwoVectors(tnormal, -Vec3d::UnitZ())); + vol->set_transformation(old_transform.get_offset_matrix() * rotation_matrix * old_transform.get_matrix_no_offset()); + } + obj->invalidate_bounding_box(); + obj->ensure_on_bed(false); } void orient(ModelInstance *instance) { diff --git a/app/src/main/jni/bbl/bbl_utils.hpp b/app/src/main/jni/bbl/bbl_utils.hpp index 593c966..938a525 100644 --- a/app/src/main/jni/bbl/bbl_utils.hpp +++ b/app/src/main/jni/bbl/bbl_utils.hpp @@ -11,6 +11,55 @@ typedef enum { eMaxNumFaceTypes }EnumFaceTypes; +struct FaceProperty +{ // triangle face property + EnumFaceTypes type; + double area; + // stl_normal normal; + + std::string to_string() const + { + std::string str; + // skip normal type facet to improve performance + if (type > eNormal && type < eMaxNumFaceTypes) { + str += std::to_string(type); + if (area != 0.f) + str += " " + std::to_string(area); + } + return str; + } + + void from_string(const std::string& str) + { + std::string val_str, area_str; + do { + if (str.empty()) + break; + + this->type = (EnumFaceTypes)std::atoi(str.c_str()); + if (this->type <= eNormal || this->type >= eMaxNumFaceTypes) + break; + + size_t type_end_pos = str.find(" "); + if (type_end_pos == std::string::npos) { + this->area = 0.f; + return; + } + + area_str = str.substr(type_end_pos + 1); + if (!area_str.empty()) + this->area = std::atof(area_str.c_str()); + else + this->area = 0.f; + return; + } while (0); + + this->type = eNormal; + this->area = 0.f; + } +}; + + namespace Slic3r { namespace Geometry { void rotation_from_two_vectors(Vec3d& from, Vec3d to, Vec3d& rotation_axis, double& phi, Matrix3d* rotation_matrix) { diff --git a/app/src/main/jni/slicebeam/beam_native.cpp b/app/src/main/jni/slicebeam/beam_native.cpp index 61dc6a8..ab99764 100644 --- a/app/src/main/jni/slicebeam/beam_native.cpp +++ b/app/src/main/jni/slicebeam/beam_native.cpp @@ -12,6 +12,7 @@ #include "libslic3r/Arrange.hpp" #include "libslic3r/AABBMesh.hpp" #include "libslic3r/Geometry/ConvexHull.hpp" +#include "bbl/Orient.hpp" #include "Viewer.hpp" #include "GLModel.hpp" @@ -810,6 +811,12 @@ extern "C" { return arr; } + JNIEXPORT void JNICALL Java_ru_ytkab0bp_slicebeam_slic3r_Native_model_1auto_1orient(JNIEnv* env, jclass, jlong ptr, jint i) { + ModelRef* model = (ModelRef*) (intptr_t) ptr; + ModelObject* obj = model->model.objects[i]; + orientation::orient(obj); + } + JNIEXPORT jlong JNICALL Java_ru_ytkab0bp_slicebeam_slic3r_Native_model_1slice(JNIEnv* env, jclass, jlong ptr, jstring configPath, jstring path, jobject listener) { try { ModelRef* model = (ModelRef*) (intptr_t) ptr; diff --git a/app/src/main/res/drawable/menu_orientation_auto_28.xml b/app/src/main/res/drawable/menu_orientation_auto_28.xml new file mode 100644 index 0000000..105f410 --- /dev/null +++ b/app/src/main/res/drawable/menu_orientation_auto_28.xml @@ -0,0 +1,27 @@ + + + + + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f47d9ae..3192a30 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -51,6 +51,8 @@ Расст. модели Модели расставлены. Поверхн. + Автомат.\nОриент. + Выровнено автоматически. Позиция X Y diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 706e58f..8e37ca7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,6 +53,8 @@ Arrange models Models arranged. Surface + Auto\nOrient. + Aligned automatically. Position X Y diff --git a/icons/menu_orientation_auto_28.ai b/icons/menu_orientation_auto_28.ai new file mode 100644 index 0000000..74045c9 --- /dev/null +++ b/icons/menu_orientation_auto_28.ai @@ -0,0 +1,312 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[18 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator 26.0 (Windows) + 2025-03-02T18:57:28+04:00 + 2025-03-02T18:57:29+03:00 + 2025-03-02T18:57:29+03:00 + + + + 256 + 200 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAyAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kAVOwHU4q8j/MP/nJ78s/J8klnDctr2rR1BtNOKvGjDtLc E+mvuF5MO4xV8/ea/wDnMT8z9Vd00SO08v2x+wYoxc3AHg0s4ZD81jGKvL9Y/M78xdZZjqfmbU7p WqfSa6mEYr1pGrBB9AxVjcsss0hkldpJG+07ksTQU3JxVVtL++s39SzuZbZ9jyhdkNR03UjxxVl2 hfnZ+bGhsh0/zVqHBPsQ3ExuohvWgjuPVT8MVeueTf8AnNPzTaOkHmzSbfVLbo13Z1trgDuxQ84n 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 0JA5MdzQbDFX/9k= + + + + 1 + False + False + + 28.000000 + 28.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Группа образцов по умолчанию + 0 + + + + AIRobin + Document + application/pdf + + + menu_orientation_auto_28 + + + proof:pdf + xmp.did:8d4c0f02-4e5f-b449-b9b5-42a23062d8ad + uuid:2197a981-78df-4626-afb9-534f0a3da9de + xmp.did:168629f1-6584-be49-b004-e2812021ffde + + uuid:e4361f9a-7db9-48cd-9dbf-a71cbf7c8a2d + xmp.did:d1842da9-2268-0b47-92ca-2cd7ffbcea02 + xmp.did:168629f1-6584-be49-b004-e2812021ffde + proof:pdf + + + + + saved + xmp.iid:168629f1-6584-be49-b004-e2812021ffde + 2024-09-01T21:55:24+03:00 + Adobe Illustrator 25.2 (Windows) + / + + + saved + xmp.iid:8d4c0f02-4e5f-b449-b9b5-42a23062d8ad + 2025-03-02T18:57:27+03:00 + Adobe Illustrator 26.0 (Windows) + / + + + + Adobe PDF library 16.03 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/Properties<>>>/Thumb 22 0 R/TrimBox[0.0 0.0 28.0 28.0]/Type/Page>> endobj 20 0 obj <>stream +HUn1 +t.(z\ +EC?`@CCJ?H$!Gݷ{5nt?oL=*^BЩzd!!eIлԋNz~@'l ȖO +BC#YYLHR|V)%,aJD~C!-;@It-)̀T +  ddPk̲ wtsmPiz< ~}rOS1\ mܤd#͈߫zդ`uEZiKb(\0lZ-U=) nQBЮaY:#bȤg--VEklsʣ̣Z=>y͗2fXk g-. +lrK%Pd";="H"*BZ>(ʬ6=ɱДǡ{CXZIGr-SkmL M71Zbx`B8shgF FP-qmJ Z1z8x?H3Xyȓ'0 +endstream endobj 22 0 obj <>stream +8;Xp,SH/cl!Xo&=:][a~> +endstream endobj 23 0 obj [/Indexed/DeviceRGB 255 24 0 R] endobj 24 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 18 0 obj <9 1)/Type/OCG/Usage 26 0 R>> endobj 25 0 obj [/View/Design] endobj 26 0 obj <>>> endobj 21 0 obj <> endobj 7 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 26.0.1 +%%For: (YTKAB0BP) () +%%Title: (menu_orientation_flatten_28.ai) +%%CreationDate: 3/2/2025 6:57 PM +%%Canvassize: 16383 +%%BoundingBox: 2 4 27 24 +%%HiResBoundingBox: 2 4.5 26.125 23.125 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 731 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Совмещение]) +%AI3_Cropmarks: 0 0 28 28 +%AI3_TemplateBox: 13.5 14.5 13.5 14.5 +%AI3_TileBox: -274.00000667572 -396.819976806641 301.999969482422 424.939993858337 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: -47.3052631578948 56.3578947368415 31.6666666666667 0 8181.6 8180.28947368421 3242 1919 18 0 0 78 150 1 0 0 1 1 0 1 1 0 1 +%AI17_Alternate_Content +%AI9_OpenToView: -47.3052631578948 56.3578947368415 31.6666666666667 3242 1919 18 0 0 78 150 1 0 0 1 1 0 1 1 0 1 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 16 0 obj <>stream +%AI24_ZStandard_Data(/XENʜkELd-(1S]"%Y6<C +D_ߟFJRJɫtU]EanQ B0:Smr(ïLn suW4ILve29Ų9Ųps帕Lmcq++_ ~m0Y,"p$ b86a.hk ck^ vp~;Y~i1٥c/-mnpv㘎!jKW98ĵnel ao8esHumc Wۘ!lYX'p.rBo!?VQ[sUzΪI3rLwUn<Uѵs :,c9k0y0e 6~?\ƽ9^j l;^[u_zj\ɛWyK^D"N] v]`7. "C=zU\ܾgLVmu8VVaXlz1 ^o]óu +ͺ&{ƼuVWf=ooeo5*,j<{&<<Z%}e,Vcۮr,IMۮM[E%i&ə{juWFS2Wm՘^zzP5.׹AoO$3mm>rL[EY5N=Y~ZUd(^g${9iS;`+toy.ydf*Mf]UoYڮ/]-i+U4 m+VcM6XCAg[]ma4PW񙶊p<1޾F*uIƶf@{gY'{ceEU8U,س&{[u#ҼbufcZ&s[\~ ꂗ>"6@ՙ:1*묋<8ՕyvAgIV].Xg[YgDI^%F+b}YZ<%r̙yy,"SSJ(d%buV-m^Bq.ĄbPVV<<= <%x:`]ydiɲKIwC{c9d?IOɽP'&O' Ʊ'1x+N%<`w*u`G]v ^7$&B05ގ$D B6DP+@",`ǁv6!"*  vE +Г~s[ Iuy+PT<֣I[yoy$^g5UG^q,CpZ[;Ǻ{{ۿt'ApZQ3wm$'GrNsq1mZrNI:3fԾ/*I䟓|l.x2qm[uWWmKO_{${K{>v-Fj+XM6 N;<[β$+꿷[do}uo◶r"[cH`V #${koq[}o鱷8רּ'e+DL`wHB\{ek*I EegKKn^O}VyvW%Qh➗.I޺ K36N_$ZSK`eUfnΪsWmn{޽y]zc]z#pwo_қ%w=$}ųE+{[kƾfwwrڪy[WTNG*g]ʫi^kzv#ӳ*;X<=VpF^P'9% Cuy]\qGIi4KҶKE9B"F(!ᒑEF?pCr,eyø4%dJ+CVcWIJYzgȵr-CR6uBYՙ;:@'#uB'&WZH>:?f_JO +3C %H`0D$ިƕҎ+iC!XL%]1 8z.8zn1@3K(@"5O\x̉`kᯕVUjaSۣ St.>O֪ .P|f^ |ʯuKRJ#=C:;AC/u\` 90q5ZW) 9 qpCQ:A]X}\0<%eǺե:SjlBq,ҍptqp ZJ +SG% 8[ ob#AɲP }45,l;_B! +m 19r+ 3/l+#sLJS`+_B^ anDlZm:r1F*J!2L>fof 54R|* LQBy˓ \1SY +jk A;>&ƵrT3(=^[ΊHN^ԢS׊8ɆT ꕰDy"]Gc̄4]HAv$>U.p~JY B3S 8% M"|kB!nK(8L?AZ〡,Rò&bh(L;Xf\O)oGkL*|'~Qt [_cx$.vǘ\>iRـG2=R:AnY@$ՀY>K/$Yxn'8A(LUYLHB(#,xˢ0qa2' Ch.\mēR8`.B~ZB4iL,a_Bq06Ӥ pnОQ-!ݑ_ 8i>O"1 +&"O8@ Nk$骄 2,"i*'A@G47Fi3Xn;쿄bAY|D'[aN z؜8&,74pQPŌi0t.) +f~,7?ALM"S +80=o8\+eH2TK(tꥠ p<0%4 CRerE;8,0.fޑ=FAnxK+eX|6KP/;W\ +6YNQՎɑbs=T(?c^2ډq6Ҁ4ΗP,p1ڿLnQe⇇d$ॴbd%1B0SyZKٱ\ d M@ +]u:&ёjx'L vC'=VZib[I%?Ast?AL(TlQ'( ;Eٷr !,! +:Z(bES M?,2NAhZ'+3 Y_ZY+9>MVgGXQ?/u2F S09+2R҈a| 3 aZL2r T֜ ҝ!0sÍQjrsS5qsIDّTi -a96RuSR~=FY|<#FEEG51l#ne !K(,Qh$쥦ۗPgSvibQXWc~9<+&$mZLDMQѪWYW+_BQx%Z!OZ ed2mVyB'qk/x "Xƅn 4NDH%Q8w$jG'[T(:V(E\eŠOI/*^:ɔD[0}LG5鋤BW +T( hڥF CSط\M L-鐃! 8:AYJ:g@8h~3Ζ/jHҀ}tHaz؀}t&?pg*j_BQDmn*z*A:D<# GG4: K3Q^1~jGcLAqK($z#Eybᗡk$IpF Yplf ITGY>=@xIRXxqʪ Z<vrhMI!ճɋ:RtݺXBN,Zľ%Bȣ-Xг4FY/g$:N>˭D$L*d3C,%-6LQޖf(I!j R#&,M1_B y& #\/2.0\N;4l: @4 aALW΍`wZn!A[#/}Ҋ1 40"C3*e> LkZ]ji \%2I-I2qFt%spEMV>G4 \&3Ŷ(m٣bQMl]$yZqXfِr,ɱF,ku@a[.YůԆX06M36M36-J7$ SrJBTJ2QSzb+Ī#++ћ荇}K])0}`/,Pd Ƃ0}.Y0 93!g:8zhcp3gD0燜A 4k៽*^ |ιsNS/Hg +))-Jd?JI ^xqQ` TVvyBjl[tTegi1*4&G,RȾH9$q$I4rkoz$dM_~wh$;3ǽZ]q?~߻6K46MIrsrÿ]feXIӓ^җMmV0v nK(VMB~+xKFMϯ P,;d#Bdo7n$9i#wu^wq!O(D^7;'yɿ}9d}8vR{3Ks뒇u/K4yߡ5^R2k^9C/]9z=\,~o$ɲ=?ne 7|s#/qǒ/Kr| K܏$7[fXz֥7.h_3, +Wc[k˿ISs+nܛܦ/IkMˑ_n$M󛣹MM^ۓ㨷dB!~[/#ɹ66柇{ߗH,Mo җ܏$M,=4w?vPZ"_BqJA:T/OPpqJ7Pv8xA6EK0ɛbNYfw0 a) LK(D +X< OԎnduK@ /5,[ gH Eb;VvdLi&9U$FxAeϐ:ʄ-(8UP9p>]|XA?, f0`[I`ۤ{iQ/`O04g'kJ:.Zw|;6 3f: qũA#%9)K(䆸5꟠fQQ%nG ( tT V6bO̙~tB*JE.xRW&4`K*:B9bbD"3X' ؓ@> G˭.9]fo[08Fl } cs8VG08dtZ0!ap/DA1J&t@X2 +f4xpA3CAɣ ,D2ɀ:m +HBeII, j̦lHIQi ʺƞw +'z %8+ irI1 EH L EɜɝSl]0g:zOPVޢ| ϖ~QbȮV~K!%:ِ]! $~[͢.U#)AΆy?A_=~'a`~P郌KbR:ߩcÇp887膆#{5q;?a3G5FDI-l5 FQ+"驅Oad[\'/֌(t6%k1ђmJE 1!(uQ6뒺Z;pt%eP7x95'%EJ%bj1h&Vl^/L@/ +e!sj,!0#ZOb'8UK\-[c p,v nt.kd+^[4Sӱ4bfffdI0EN:.TBL02"I8(X (( +2B+@.ȝt5|Xø @Ս^c !Lthԯ גKCg}wGʅRkxbjn 5&KI^wA` +/γq8 {#nREBK0!L}{t3&qsbb Y it!lnFo VR&u#ܯZO]X)eX3lu6} /` Z= rݷ֡H}/-٠)_=>CUg+=?jÆU4\Ib+W/FsycHƳ EZ $UЁ$w`u#o$R ,4z57HqK;JJ:Ј%0ݢS (H+ux[$PJ2x(/vdadSCSJeoK c!_%6Ⱥ$yltiG"dEv&uuALYR]8/K0}Op,R +U:߁MD T +zYFG'}iUj2oXB_@g%Ma1\`Κ$ \^N$uB@OrB4j0y, +15p8pYg+T儞?HR@ TH'4@A ȷ66 AO0Gwv{wpo(ڴIgԀInPz0bZAg gC%] +TUsn(nD +jx(  9$#@ S3P-L/BeeR,C +q7g!eK9 S53Sc"Y(Ⲍ.7+юPV@;z,rOHef'A%]r1.Qt +Z}U"oqgEԢ6OЕt5- +rh3>%cz7c%M]섽R#~\1 Y[n3q6Կ*JQ·fn4Y{P$.I!'T^养[̓~^ٖEѹ2=nZ p5RB'2Po8fAC79@|RּAq=>`x ~X$S𓡱j @ܗ:y*m3z2O4 +DˤHJw{FȕihcZsUz۫@*3!22^K" V.,;W{G.` I{/Cn4;p?(aݎtBxןQ<4A8L#RNIuZG׸pG\DI1 9ǹNB O=^ч>w](q M=^."]I=E0Ϊq K +;_::U*i 1"-2]%3Hq5R'YCajX$ o_Y9bhWmjIʤdxI8Y_V1@ߚUBՉy3}_btZg1}κ5m ͙`Db˘roGG՚&JEI66TK <82p-r"cNhXoF8Yt˿gk h7<E-ܙg4uk ]cQ۱Wx>5=h6Rށp[kߊC*T>#L^9СMcEx=5ٷ=q MwL] w.@LIWK6`%;@L"$Ⱥ:rPr p&`z<`ʲ-׬>FFu:H &e\|ĕ=AC3A;*,=QBc@] 7',/d!8:5Oc5Vrq6`צ F@Ba,jNqL=?AլW +F1M36*5g@Act$7y3%7XʒLDXT4X$%o62#IRJUQz/_:Y ] (>mQD(7{+=6xIr|m2cAJSWT/eCilNj\Z N*K)l8Y/v"=*%A0E+ +G@@&؇8wPP +D 8߆䚔Iܦhҽ왭j-tC@H XD1fmzP+5n/zKu)rd۱zbmO'3?%w2/~v@`D~JٛZ!y޵O"_CIC8H[&V +sȴt&}e[vk u:v,j8ϰG XG_yO L;@:@;j⍩eHuާ[._7ooZe_H (8+ SsIfi4"ЀGCc{e~gVl|AjVu m ])wN*,r,?Vdn_KGC\ Vd +@$QVK:Rb ~eVƑ"n~rIJ=,UNH* + 2fc?ӓ!.lT7L RB+T讚1lBayXm +@Et%DniުĔ 8jGԜyGlt%MW֖j]%p0wJggPӲ.)i!2hal#dQB'S @pWE*ktMK pI,9bRc]>b :ӤڃMdQQV1)1R7.pTȒusiR<;9'2Ťā |CLi54Iyc@ )aޗwۋ6sk-5rHD.?|!S-𚬈l=3 JGTO}r!ݽTDdu596T}_eʽ1mrZJta?Os/ޣ璷 CtJd1Sdsm*^o%gהoȱSD+Ip;n+mm/䐚.`\M0 Dw}ɜQ0IJ+P?-{)#ẅ́=DK8&5-Gtp1ցZl1GԴcաQ۽ .F̲KRR Mb'xoˌpͮ7dtʵK8؏gVϒx8AU-%k%.5) \@7u]lK0+8DEEu=M$D?1vqm;[Y_h. #vOK՛\G;>;8,C\Q>}k /Fjc +Z"Į $^F,QrOq"MDgL-8A{`W@{cJ!OIPm(WT,G\_"qD$!v *Z;''0|2 yҜ%Ļۆ'B?ivnpIB<`8N# $6uc+d鄘>nxCLiVANKd̦޴PB XpЙ' TF]f9z lإ> C:F9;L}AO ݊kR,NM%O%?\+vi/Zem1MU9g\P;!S aJ78PwM|ukE밎ms0qSa gu*萩!ʨֆ} &1‡-t۲h;sV2WkvN n|Q=ߗC1r3YZ@^ցbq8kخl)ԉш@x-n$Br(#|D ^COz<t5xi&,PA?iC0xD#(|FXtA'LuC( ꩒&%XŽ4&rJ]y 4[Wv +8 +!gjG"η;Lt>nO~qZe@~+G5B,N^)~+ruCƥ0ɼ|9Ԑ|QDX§fg3"Q_K+/Fw#tоc+D 3v췊E?oFBFssPf;5jd"ɖ0fJ]4 LBZ4|7z.k".YAma^ 켉NxIkӌ$ +-ӷTPvn &* G'~X% +lԟGxk]x0l )tbϪnҀZސBS%Xː6-ј]No71 r^C"=4aZt1kD@'k)"ECro>{ fry ?8xnb=:>5y6S2t9Hs3m򛵊SnVI3;M]f6ow윸ǤGBᄧ߆B? da7$\ e fE*+#3N0](]^JhY~|{/GߩM…H 7<fH;Y转,w HA^2CU[ا߭|H%s`0>b !W7lg,M8Ѩ]+{E4s>FDXx+ML' Չ-OU{-r5~t%:k ïX{QMi#@x{jc[y+эC=h}>ߞN(ٽ '̽qZ7V_:хri0R4aU24x3^Hrӝ"$pC@)& +Bo#Y4IYC ")цTï*a#j. $S+lt❬f]Z틊F8։;pی^MQ=ĿkZ7&7\)hI_#-@ZE$:Ahx;JH`-Kvd+8) En3ޜ;GQ2o"ցM #L"; #+KHa#*q_PuD~K\ 5@84uZ6;m&=p Y˞ R8A&.AtPOńŮc?2u'43bd# i)#2OB2PzeCޝ d JvdOB,11Qzl"K!g5m)&"W&ڽ--g5Ot 2ߛ"1Pǖɝ"!B ݯDRQooHmrJR<ˇ]ԑ;ŢNs>. [6eb÷ʒja +o4rp?H3#&ːbM胰*0=M%E%y$F?di,Ksb; ]2ltb3Pʼ>D~pDk-|vx}iI枥]*[etNz,3ZeTbU9bq`SS|#_{]vv)L+㾗 y}l>b 4&ɭTg H|ULw~vpT*0~SoAפC/)?,/YPƶ|f>RfāS죁 >-cm;Cv6`SMvɯ&rzCU"Q.A\*n uJus~r*Yt1 {u5݇2Pee4 ů23S֗FlK/%_Jvɰ)#j:3zGY_NVwYNΟk~1[yF +l < HaU5U1Cd/ EQ%@>k OQ!8 kAg_-#W!* cdZ@7QG *?@ q[t5}\6JZ%DJ?I0g `يYw\C b(&z);BJ:I.D>rK"|߭^2~b^M 'ִaE}ⅣM{HJvO7uidHe9) hAw1 Х '%" ,[.tPV*0?N8h`S^0 [wN<mh'(<*˔l!N D̐[Qݻacv*eeUi1҇<.mnZZy$:|l>Bj•<)})vr59сP4^W`vlȐ38+*A-tu,Ś;^u>PaVh$b'_sH_c"c"zr +E~F YWp}hr %vFVXXs‘ ܚ_ G4},Xw@thDBӺX7`gi7/Jomێv@C?ih0t"N(9~B#հSs!c[}lnO0PFA-240Zdo01ZꉋjlM%BQsӋb3(]ER ƍ+8UۜqpSƆΓj(38%|,@J2u=$r =S쑺. 1,ל1Qj D4n!0uTgcN|šaW0(@eXHz8Dˆ%߉4Ϩ8Nd&m?c@~#EWnS~L%*%κ* ݌ɳ奇ҁu,pj-%T\gey2j zúp.C.B5%lwIHenk&ƌlkoe7}?LUZCplӾ +hF9>q!u;ۙ`0D.u4ul Ԧ9NJNGtv1Q{ǁ0o7s\S闔&/Ay1 \ohH\ri U!9+>.srP +~m! KVe0=@$C]7mpͺ"Vy♞o)wIiր}eY#9 o%| w6 na$CjjDiF(ڇ8Y8?eG*T#FVd/ G,ܹUe -@ (/JA1!'EVTZՋIsla7ٜѷ7ms}=~hTKdfp& YĉS7(^թF6P>x _9)Aob?dBQ>cߠױtc[航مˬ؂ +qx<ףⱸwt4I#qUN~U+sZ|0Gy# 黋$І W3!\p|X1FCna:IhkO%s#gX%&+׊Yɉ8倖\xKKNpQ8]#i*-⯆m/d|cZc[׉XM=[zLfwg`գ0lPsBVdv A 9`<L˷˹ X?V5G+ܢ&FREbjҪO*{s]"X~Jy(uu!#6&& g'yGS%S:iښ?Up=x 7@6±.B0bHD}S҂rqBRͷsn$ΈAAh۫nd*{L$"zx5yӚ+7>ev-m\_|r]Dy$41a'_@ˋqۛg%cަG*;y!;g}ޫX7\gPƷLBBntB )q biڽ0̙]/Fm+5]oy\wJ^E2mH%wD`0FD5rm[670]&z"vL( +& 'b*sE.<FfTdi;pfn(7kHb+`!NR@z&Vigo߿*"AC큮 mzt{mކAOaO$KH* p0&H^L _5;D#>}eyIByn=>ijB|O+(6q,#HfX_eȘwkۘGai<Uũ#~@i:+ͺ +W=/&KX ݺ}YL袑 [&B>Y$E7bZpByYㄜ՝g'j1=0#0 'fjd ?mj$Y@I>4} Ȏ$0zUO̢F 6, /nNUO0:UΛ/KB[ h7qYi^9Eol| J~e"(m5s<Bzq!U},\ Kt:Fygf)ZױyRͦѨ$ә`wUIvTbL/>I{,4 OU3V>5Y^ +GJC Zj\I/2kD"Huڭ-FI4; J}Q2 o{Z5HⅳTA:{ Vk"]j&5NW$U(5-z+~(bD{*7do<ظ"GmlYDk iQ Ȍ#`ذY2ߓN-؂%LJ*tR9#i&j1B f^~SbGZV +K[,:=d]^4+/3lDەK8L~@1QRmW\,}T컝Vq􀈫UNLv: Ě4T"äaEf52SvF ;'w-My$pDu"BEhF7BpbvRkG(G1rs/+yZrǟXpY_.4Iݐ +%7Ѽ\'ha0;o0=r̀Oo++X?4왼deZ]Lt^Z'1 +Yuhu9nM/!^0gb>V,Wzg{LZYaߒT5&twݯ}VĻ%Ŏer򁜗-LV"N@$%/S6JYo| +6WX;ېFWfHI|-nRGt*Y @^bf}RH.a!f[n*!)8aɩM!-)j }{ s`)72>p@4N{ 1<=c?k$nvg +!e ؔ [k좬 $2koP稬ٻ KVU<ó{~.z یmcGyEr#K,i)UܒU>k1ٟKM\K_ +_DiHXgy0Xog(u;w#ՀM/ͪM +endstream endobj 19 0 obj [18 0 R] endobj 27 0 obj <> endobj xref +0 28 +0000000004 65535 f +0000000016 00000 n +0000000147 00000 n +0000020616 00000 n +0000000000 00000 f +0000020667 00000 n +0000000000 00000 f +0000022743 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000022816 00000 n +0000022957 00000 n +0000024513 00000 n +0000000000 00000 f +0000022436 00000 n +0000051675 00000 n +0000021014 00000 n +0000022630 00000 n +0000021714 00000 n +0000021874 00000 n +0000021922 00000 n +0000022514 00000 n +0000022545 00000 n +0000051700 00000 n +trailer +<<380EE47B1C085441B2A75537C99564F5>]>> +startxref +51902 +%%EOF