ThreeDTool


NameThreeDTool JSON
Version 0.0.4 PyPI version JSON
download
home_pagehttps://github.com/OnisOris/ThreeDTool
SummaryThis module is needed to work in geometric primitives.
upload_time2024-08-26 12:43:03
maintainerNone
docs_urlNone
authorOnisOris
requires_python>=3.10
licenseNone
keywords 3d math geometry
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ThreeDTool


This module is needed to work with mathematical structures such as plane, line, 
triangles and other polygons, polyhedron.

Этот модуль необходим для работы с математическими структурами, такими как плоскость, линия, 
треугольники и другие многоугольники, многогранники.

An example of using the library is here:

Пример использования библиотеки здесь:

https://github.com/OnisOris/5X3D-slicer

# Пример применения модуля

## Установка последней версии ThreeDTool с github.com
Ставим модуль с помощью команды ниже с github.


```python
!pip install git+https://github.com/OnisOris/ThreeDTool
```

  
## Анализ положения квадратов
Создадим два квадрата с вершинами [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]  и [[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]].

Они находятся в одной плоскости и пересекаются. Найдем точки пересечения.


```python
import ThreeDTool as tdt
import numpy as np

# Первый прямоугольник состоит из четырех вершин
pol1 = tdt.Polygon(np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]))

# Второй прямоугольник состоит тоже из четырех вершин

pol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])

# Создадим объект многоугольника, чтобы его можно было отобразить на графике
pol2 = tdt.Polygon(pol2)

# Функция для нахождения пересечений прямоугольников, возвращающая точки
points = pol1.points_from_polygon_polygon_intersection(pol2)

# Создадим объект класс обертку для точек, в него нужно помещать матрицу
# nx3, где n - количество точек
points = tdt.Points(points, s=20, color='red')

# Создадим объект Dspl, который кушает объекты с реализованным методом show(ax)
# и отображает эти объекты, когда применяем метод show к объекту Dspl
dp0 = tdt.Dspl([pol1, pol2, points])

# Отобразим наш график
dp0.show()
```


![alt text](readme_files/1.png "Title")

Для изучения данной функции повернем один из прямоугольников.


```python
# Попробуем его покрутить в пространстве по оси [1, 1, 1] на угол в 30 градусов
axis = [1, 1, 1]

# Переопределим вершины прямоугольника
pol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])

# Поворот прямоугольника
pol2 = tdt.rot_v(pol2, np.pi/6,  axis)

# Создадим объект многоугольника, чтобы его можно было отобразить на графике
pol2 = tdt.Polygon(pol2)

# Найдем точки пересечения многоугольников
points = pol1.points_from_polygon_polygon_intersection(pol2)
line_s = tdt.Line_segment(point1=points[0], point2=points[1])

# Ось попробуем отобразить с помощью класса Fvec, который хранит в себе координату и вектор вида:
# [x, y, z, px, py, pz]
axis = tdt.Fvec([0, 0, 0], axis)
axis.length = 0.5

# Создадим объект класс обертку для точек, в него нужно помещать матрицу nx3,
# где n - количество точек
points = tdt.Points(points, s=20, color='red')

# Создадим объект Dspl, который кушает объекты с реализованным методом show(ax)
# и отображает эти объекты, когда применяем метод show к объекту Dspl
dp = tdt.Dspl([pol1, pol2, points, line_s, axis])
# Далее мы можем настраивать разные ракурсы графика, eval - угол наклона, axim -
# азимут (Угол между горизонтальной плоскостью меридиана и вертикальной
# плоскостью наблюдаемого объекта)
dp.ax.view_init(elev=40, azim=90)

# Отобразим наш график
dp.show()

```


    
![alt text](readme_files/2.png "Title")
    


Как мы можем видеть, прямоугольники пересеклись в области, указанной синей линией. Красная стрелка показывает ось поворота квадрата, который был до этого в плоскости.


```python
# Для повторного отображения необходимо воспользоваться методом
# create_subplot3D()
dp.create_subplot3D()
dp.ax.view_init(elev=80, azim=90)
dp.show()
```


    
![alt text](readme_files/3.png "Title")
    



```python
dp.create_subplot3D()
dp.ax.view_init(elev=00, azim=90)
dp.show()
```


    
![alt text](readme_files/4.png "Title")
    
# Создание отрезков
Создадим первый отрезок.




```python
import ThreeDTool as tdt
seg = tdt.Line_segment(point1=[-1, 9, -1], point2=[2, 12, 2])
dp = tdt.Dspl([seg])
dp.show()
```


    
![png](readme_files/5.png)
    


Создадим второй отрезок.


```python
seg2 = tdt.Line_segment(point1=[-200, -190, 0], point2=[200, 210, 0])
# Поменяем цвет линии
seg2.color = 'red'
dp2 = tdt.Dspl([seg2])
dp2.show()
```


    
![png](readme_files/6.png)
    


Найдем точку пересечения отрезков.


```python
point_inters = tdt.Points(tdt.point_from_segment_segment_intersection(seg, seg2), s=30, color='green')
point_inters.xyz
```




    array([ 0., 10.,  0.])



Изобразим отрезки и их пересечение.


```python
dp3 = tdt.Dspl([seg, seg2, point_inters])
dp3.show()
```


    
![png](readme_files/7.png)



# Генерация пятиосевой траектории
В данном разделе мы сгенерируем одну локсодрому - это траектория, представляющая собой объемную спираль. После этого создадим вектора поворота в каждой точке для задания положения объекта.

Скачаем файл с ограничесвающей STL моделью.


```python
!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl
```


```python
import trimesh
import ThreeDTool as tdt
import matplotlib as mpl
import numpy as np

# Путь до файла
path = "/content/cube.stl"

# Используем функцию open с параметром "r" (чтение)
with open(path, 'r') as f:
    # Парсим координаты нормалей и вершин треугольников в triangles
    triangles, name = tdt.parse_stl(f)

# Сохраним треугольники в tr. Каждый треугольник будет сохраняться в объект
# класса Triangle
tr = np.array([])
for item in triangles:
    tr = np.hstack([tr, tdt.Triangle(item)])

# Создаем многогранник или полиэдр
polyhedron = tdt.Polyhedron(tr)

# Вычисление радиуса. Вычисляем максимальный радиус локсодромы.
r = np.array([np.linalg.norm(polyhedron.get_min_max()[0]),
              np.linalg.norm(polyhedron.get_min_max()[1])])
rmax = np.max(r)/2
point_n = polyhedron.get_median_point() - [0, 0.5, 0.5]
# Генерация локсодромы
arr = tdt.generate_loxodromes(r=rmax, point_n=point_n, steps=0.001)
# Функция нарезания локосдромы объемом STL модели
cc = tdt.cut_curve(arr[2], path)
# Точка, с которой вычисляются вектора вертикального поворота (красные стрелки)
center_point = point_n
# Оборачиваем точку классом Points для удобства отображения
center_p = tdt.Points([center_point], s=50, color='green', text=True)
# Массив, куда мы сохраним пятизначные траектории
curves5x = np.array([])
for curve in cc:
    # Класс обертка для пятиосевой траектории
    out_curve = tdt.Curve5x()
    for i, item in enumerate(curve.curve_array):
        # Функция для вычисления вектора из двух точек
        vector_z = tdt.vector_from_two_points(center_point, item)
        vector_z[0] = 0
        if i == curve.curve_array.shape[0] - 1:
            point5 = out_curve[i - 1]
        else:
            vector_x = tdt.vector_from_two_points(curve.curve_array[i + 1],
                                                  item)
            vector_x[2] = 0
            point5 = np.hstack([item, vector_z, vector_x])
        out_curve.union(point5)
        tdt.angles_from_vector(point5)
    curves5x = np.hstack([curves5x, out_curve])
# Отобразим все объекты, объеденив их в all_objects
# (траектории - curves5x и точка - center_p)
all_objects = np.hstack([curves5x, center_p])
dp = tdt.Dspl(all_objects)
# Отображение
dp.show()
```

![png](./readme_files/8.png)


# Нарезание моделей
В данном примере мы будем нарезать STL модель с помощью плоскости, которая будет постепенно подниматься с самой нижней точки на определенное расстояние - высоту слоя thick.

Использовать для работы мы будем тот же файл, что и ранее cube.stl


```python
!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl
```

```python
from ThreeDTool import *
import matplotlib as mpl

# Путь до файла
path = "/content/cube.stl"
file = open(path, "r")
parser = Parser_stl()
triangles, name = parser.parse_stl(file)
file.close()

def slicing(triangles, thiсk=0.1):
    # Находим пограничные координаты модели:
    max_xyz, min_xyz = max_min_points(triangles)
    # Находим минимальную координату:
    z_min = min_xyz[2]
    # Находим самую высокую часть модели:
    z_max = max_xyz[2]
    # Найдем высоту модели:
    hight = distance_between_two_points(z_min, z_max)
    # Количество слоев:
    amount_of_layers = hight / thiсk
    plane_array = np.array([])
    # Плоскость нарезания
    slice_plane = Plane(0, 0, 1, -z_min)
    points_array = []
    # Пройдем по всем слоям
    for _ in range(int(amount_of_layers)):
        # Пройдемся по всем треугольникам
        for triangle in triangles:
            try:
                position_index, points = position_analyze_of_triangle(triangle, slice_plane)
            except TypeError:
                logger.error(f"error")
            if position_index == 2:
                # Создаем плоскость треугольника
                plane = Plane()
                # Функция создания плоскости из треугольника
                plane.create_plane_from_triangle(triangle, create_normal=True)
                # Создаем линию пересечения плоскостей треугольника и плоскости слайсинга
                line = Line()
                line.line_from_planes(plane, slice_plane)
                # Линии из вершин треугольников
                line1 = Line()
                line1.line_create_from_points(points[0, 0], points[0, 1])
                line2 = Line()
                line2.line_create_from_points(points[1, 0], points[1, 1])
                # Точки пересечения линий
                point1 = point_from_line_line_intersection(line, line1)
                point2 = point_from_line_line_intersection(line, line2)
                if point1.__class__ == np.ndarray:
                    points_array.append(point1)
                if point2.__class__ == np.ndarray:
                    points_array.append(point2)
        slice_plane.d -= 0.1
    points_array = np.array(points_array)
    u, idx = np.unique(points_array, axis=0, return_index=True)
    points_array = u[idx.argsort()]
    return points_array.T

points = slicing(triangles)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(points[0], points[1], points[2])
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()

```


    
![png](./readme_files/9.png)
    




            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/OnisOris/ThreeDTool",
    "name": "ThreeDTool",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "3D math geometry",
    "author": "OnisOris",
    "author_email": "onisoris@yandex.ru",
    "download_url": "https://files.pythonhosted.org/packages/74/2f/a8eedea3cb7ff86d89903d353818694d3b9579b6894b926833c5089b31a7/threedtool-0.0.4.tar.gz",
    "platform": null,
    "description": "# ThreeDTool\r\n\r\n\r\nThis module is needed to work with mathematical structures such as plane, line, \r\ntriangles and other polygons, polyhedron.\r\n\r\n\u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c, \u043b\u0438\u043d\u0438\u044f, \r\n\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043c\u043d\u043e\u0433\u043e\u0433\u0440\u0430\u043d\u043d\u0438\u043a\u0438.\r\n\r\nAn example of using the library is here:\r\n\r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0437\u0434\u0435\u0441\u044c:\r\n\r\nhttps://github.com/OnisOris/5X3D-slicer\r\n\r\n# \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f\r\n\r\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 ThreeDTool \u0441 github.com\r\n\u0421\u0442\u0430\u0432\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0438\u0436\u0435 \u0441 github.\r\n\r\n\r\n```python\r\n!pip install git+https://github.com/OnisOris/ThreeDTool\r\n```\r\n\r\n  \r\n## \u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432\r\n\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 [[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]  \u0438 [[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]].\r\n\r\n\u041e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. \u041d\u0430\u0439\u0434\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f.\r\n\r\n\r\n```python\r\nimport ThreeDTool as tdt\r\nimport numpy as np\r\n\r\n# \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\r\npol1 = tdt.Polygon(np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0]]))\r\n\r\n# \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u0436\u0435 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\r\n\r\npol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435\r\npol2 = tdt.Polygon(pol2)\r\n\r\n# \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0438\r\npoints = pol1.points_from_polygon_polygon_intersection(pol2)\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a, \u0432 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443\r\n# nx3, \u0433\u0434\u0435 n - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a\r\npoints = tdt.Points(points, s=20, color='red')\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 Dspl, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0443\u0448\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c show(ax)\r\n# \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 show \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 Dspl\r\ndp0 = tdt.Dspl([pol1, pol2, points])\r\n\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043d\u0430\u0448 \u0433\u0440\u0430\u0444\u0438\u043a\r\ndp0.show()\r\n```\r\n\r\n\r\n![alt text](readme_files/1.png \"Title\")\r\n\r\n\u0414\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0432\u0435\u0440\u043d\u0435\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.\r\n\r\n\r\n```python\r\n# \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e \u043e\u0441\u0438 [1, 1, 1] \u043d\u0430 \u0443\u0433\u043e\u043b \u0432 30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432\r\naxis = [1, 1, 1]\r\n\r\n# \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\npol2 = np.array([[1.5, 0, 0], [1.5, 1, 0], [0.5, 1, 0], [0.5, 0, 0]])\r\n\r\n# \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\npol2 = tdt.rot_v(pol2, np.pi/6,  axis)\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435\r\npol2 = tdt.Polygon(pol2)\r\n\r\n# \u041d\u0430\u0439\u0434\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432\r\npoints = pol1.points_from_polygon_polygon_intersection(pol2)\r\nline_s = tdt.Line_segment(point1=points[0], point2=points[1])\r\n\r\n# \u041e\u0441\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 Fvec, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 \u0432\u0438\u0434\u0430:\r\n# [x, y, z, px, py, pz]\r\naxis = tdt.Fvec([0, 0, 0], axis)\r\naxis.length = 0.5\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a, \u0432 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 nx3,\r\n# \u0433\u0434\u0435 n - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a\r\npoints = tdt.Points(points, s=20, color='red')\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 Dspl, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0443\u0448\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c show(ax)\r\n# \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 show \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 Dspl\r\ndp = tdt.Dspl([pol1, pol2, points, line_s, axis])\r\n# \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u043a\u0443\u0440\u0441\u044b \u0433\u0440\u0430\u0444\u0438\u043a\u0430, eval - \u0443\u0433\u043e\u043b \u043d\u0430\u043a\u043b\u043e\u043d\u0430, axim -\r\n# \u0430\u0437\u0438\u043c\u0443\u0442 (\u0423\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e \u043c\u0435\u0440\u0438\u0434\u0438\u0430\u043d\u0430 \u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439\r\n# \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430)\r\ndp.ax.view_init(elev=40, azim=90)\r\n\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043d\u0430\u0448 \u0433\u0440\u0430\u0444\u0438\u043a\r\ndp.show()\r\n\r\n```\r\n\r\n\r\n    \r\n![alt text](readme_files/2.png \"Title\")\r\n    \r\n\r\n\r\n\u041a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c, \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0438\u0441\u044c \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u043d\u0435\u0439 \u043b\u0438\u043d\u0438\u0435\u0439. \u041a\u0440\u0430\u0441\u043d\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0441\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438.\r\n\r\n\r\n```python\r\n# \u0414\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c\r\n# create_subplot3D()\r\ndp.create_subplot3D()\r\ndp.ax.view_init(elev=80, azim=90)\r\ndp.show()\r\n```\r\n\r\n\r\n    \r\n![alt text](readme_files/3.png \"Title\")\r\n    \r\n\r\n\r\n\r\n```python\r\ndp.create_subplot3D()\r\ndp.ax.view_init(elev=00, azim=90)\r\ndp.show()\r\n```\r\n\r\n\r\n    \r\n![alt text](readme_files/4.png \"Title\")\r\n    \r\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432\r\n\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a.\r\n\r\n\r\n\r\n\r\n```python\r\nimport ThreeDTool as tdt\r\nseg = tdt.Line_segment(point1=[-1, 9, -1], point2=[2, 12, 2])\r\ndp = tdt.Dspl([seg])\r\ndp.show()\r\n```\r\n\r\n\r\n    \r\n![png](readme_files/5.png)\r\n    \r\n\r\n\r\n\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a.\r\n\r\n\r\n```python\r\nseg2 = tdt.Line_segment(point1=[-200, -190, 0], point2=[200, 210, 0])\r\n# \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0446\u0432\u0435\u0442 \u043b\u0438\u043d\u0438\u0438\r\nseg2.color = 'red'\r\ndp2 = tdt.Dspl([seg2])\r\ndp2.show()\r\n```\r\n\r\n\r\n    \r\n![png](readme_files/6.png)\r\n    \r\n\r\n\r\n\u041d\u0430\u0439\u0434\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u0432.\r\n\r\n\r\n```python\r\npoint_inters = tdt.Points(tdt.point_from_segment_segment_intersection(seg, seg2), s=30, color='green')\r\npoint_inters.xyz\r\n```\r\n\r\n\r\n\r\n\r\n    array([ 0., 10.,  0.])\r\n\r\n\r\n\r\n\u0418\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043e\u0442\u0440\u0435\u0437\u043a\u0438 \u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435.\r\n\r\n\r\n```python\r\ndp3 = tdt.Dspl([seg, seg2, point_inters])\r\ndp3.show()\r\n```\r\n\r\n\r\n    \r\n![png](readme_files/7.png)\r\n\r\n\r\n\r\n# \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u044f\u0442\u0438\u043e\u0441\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438\r\n\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0434\u043d\u0443 \u043b\u043e\u043a\u0441\u043e\u0434\u0440\u043e\u043c\u0443 - \u044d\u0442\u043e \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043c\u043d\u0443\u044e \u0441\u043f\u0438\u0440\u0430\u043b\u044c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\r\n\r\n\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u0441\u0432\u0430\u044e\u0449\u0435\u0439 STL \u043c\u043e\u0434\u0435\u043b\u044c\u044e.\r\n\r\n\r\n```python\r\n!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl\r\n```\r\n\r\n\r\n```python\r\nimport trimesh\r\nimport ThreeDTool as tdt\r\nimport matplotlib as mpl\r\nimport numpy as np\r\n\r\n# \u041f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430\r\npath = \"/content/cube.stl\"\r\n\r\n# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e open \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \"r\" (\u0447\u0442\u0435\u043d\u0438\u0435)\r\nwith open(path, 'r') as f:\r\n    # \u041f\u0430\u0440\u0441\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u0435\u0439 \u0438 \u0432\u0435\u0440\u0448\u0438\u043d \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432 \u0432 triangles\r\n    triangles, name = tdt.parse_stl(f)\r\n\r\n# \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432 tr. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\r\n# \u043a\u043b\u0430\u0441\u0441\u0430 Triangle\r\ntr = np.array([])\r\nfor item in triangles:\r\n    tr = np.hstack([tr, tdt.Triangle(item)])\r\n\r\n# \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u0433\u0440\u0430\u043d\u043d\u0438\u043a \u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u044d\u0434\u0440\r\npolyhedron = tdt.Polyhedron(tr)\r\n\r\n# \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0434\u0438\u0443\u0441\u0430. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 \u043b\u043e\u043a\u0441\u043e\u0434\u0440\u043e\u043c\u044b.\r\nr = np.array([np.linalg.norm(polyhedron.get_min_max()[0]),\r\n              np.linalg.norm(polyhedron.get_min_max()[1])])\r\nrmax = np.max(r)/2\r\npoint_n = polyhedron.get_median_point() - [0, 0.5, 0.5]\r\n# \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u043e\u043a\u0441\u043e\u0434\u0440\u043e\u043c\u044b\r\narr = tdt.generate_loxodromes(r=rmax, point_n=point_n, steps=0.001)\r\n# \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u0438\u044f \u043b\u043e\u043a\u043e\u0441\u0434\u0440\u043e\u043c\u044b \u043e\u0431\u044a\u0435\u043c\u043e\u043c STL \u043c\u043e\u0434\u0435\u043b\u0438\r\ncc = tdt.cut_curve(arr[2], path)\r\n# \u0422\u043e\u0447\u043a\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 (\u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043a\u0438)\r\ncenter_point = point_n\r\n# \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u043e\u043c Points \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\r\ncenter_p = tdt.Points([center_point], s=50, color='green', text=True)\r\n# \u041c\u0430\u0441\u0441\u0438\u0432, \u043a\u0443\u0434\u0430 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u044f\u0442\u0438\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438\r\ncurves5x = np.array([])\r\nfor curve in cc:\r\n    # \u041a\u043b\u0430\u0441\u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u043f\u044f\u0442\u0438\u043e\u0441\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438\r\n    out_curve = tdt.Curve5x()\r\n    for i, item in enumerate(curve.curve_array):\r\n        # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a\r\n        vector_z = tdt.vector_from_two_points(center_point, item)\r\n        vector_z[0] = 0\r\n        if i == curve.curve_array.shape[0] - 1:\r\n            point5 = out_curve[i - 1]\r\n        else:\r\n            vector_x = tdt.vector_from_two_points(curve.curve_array[i + 1],\r\n                                                  item)\r\n            vector_x[2] = 0\r\n            point5 = np.hstack([item, vector_z, vector_x])\r\n        out_curve.union(point5)\r\n        tdt.angles_from_vector(point5)\r\n    curves5x = np.hstack([curves5x, out_curve])\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043e\u0431\u044a\u0435\u0434\u0435\u043d\u0438\u0432 \u0438\u0445 \u0432 all_objects\r\n# (\u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438 - curves5x \u0438 \u0442\u043e\u0447\u043a\u0430 - center_p)\r\nall_objects = np.hstack([curves5x, center_p])\r\ndp = tdt.Dspl(all_objects)\r\n# \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\r\ndp.show()\r\n```\r\n\r\n![png](./readme_files/8.png)\r\n\r\n\r\n# \u041d\u0430\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0435\u0439\r\n\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0440\u0435\u0437\u0430\u0442\u044c STL \u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0439 \u043d\u0438\u0436\u043d\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - \u0432\u044b\u0441\u043e\u0442\u0443 \u0441\u043b\u043e\u044f thick.\r\n\r\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b, \u0447\u0442\u043e \u0438 \u0440\u0430\u043d\u0435\u0435 cube.stl\r\n\r\n\r\n```python\r\n!curl -O https://raw.githubusercontent.com/OnisOris/5X3D-slicer/main/tests/test_functions/test_models/cube.stl\r\n```\r\n\r\n```python\r\nfrom ThreeDTool import *\r\nimport matplotlib as mpl\r\n\r\n# \u041f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430\r\npath = \"/content/cube.stl\"\r\nfile = open(path, \"r\")\r\nparser = Parser_stl()\r\ntriangles, name = parser.parse_stl(file)\r\nfile.close()\r\n\r\ndef slicing(triangles, thi\u0441k=0.1):\r\n    # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0438:\r\n    max_xyz, min_xyz = max_min_points(triangles)\r\n    # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443:\r\n    z_min = min_xyz[2]\r\n    # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0430\u043c\u0443\u044e \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438:\r\n    z_max = max_xyz[2]\r\n    # \u041d\u0430\u0439\u0434\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u0438:\r\n    hight = distance_between_two_points(z_min, z_max)\r\n    # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0435\u0432:\r\n    amount_of_layers = hight / thi\u0441k\r\n    plane_array = np.array([])\r\n    # \u041f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u0438\u044f\r\n    slice_plane = Plane(0, 0, 1, -z_min)\r\n    points_array = []\r\n    # \u041f\u0440\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u043b\u043e\u044f\u043c\r\n    for _ in range(int(amount_of_layers)):\r\n        # \u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u043c\r\n        for triangle in triangles:\r\n            try:\r\n                position_index, points = position_analyze_of_triangle(triangle, slice_plane)\r\n            except TypeError:\r\n                logger.error(f\"error\")\r\n            if position_index == 2:\r\n                # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\n                plane = Plane()\r\n                # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u0437 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\r\n                plane.create_plane_from_triangle(triangle, create_normal=True)\r\n                # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u0438\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0441\u043b\u0430\u0439\u0441\u0438\u043d\u0433\u0430\r\n                line = Line()\r\n                line.line_from_planes(plane, slice_plane)\r\n                # \u041b\u0438\u043d\u0438\u0438 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432\r\n                line1 = Line()\r\n                line1.line_create_from_points(points[0, 0], points[0, 1])\r\n                line2 = Line()\r\n                line2.line_create_from_points(points[1, 0], points[1, 1])\r\n                # \u0422\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043b\u0438\u043d\u0438\u0439\r\n                point1 = point_from_line_line_intersection(line, line1)\r\n                point2 = point_from_line_line_intersection(line, line2)\r\n                if point1.__class__ == np.ndarray:\r\n                    points_array.append(point1)\r\n                if point2.__class__ == np.ndarray:\r\n                    points_array.append(point2)\r\n        slice_plane.d -= 0.1\r\n    points_array = np.array(points_array)\r\n    u, idx = np.unique(points_array, axis=0, return_index=True)\r\n    points_array = u[idx.argsort()]\r\n    return points_array.T\r\n\r\npoints = slicing(triangles)\r\n\r\nfig = plt.figure()\r\nax = fig.add_subplot(111, projection='3d')\r\nax.scatter(points[0], points[1], points[2])\r\nax.set_xlabel('X Label')\r\nax.set_ylabel('Y Label')\r\nax.set_zlabel('Z Label')\r\nplt.show()\r\n\r\n```\r\n\r\n\r\n    \r\n![png](./readme_files/9.png)\r\n    \r\n\r\n\r\n\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "This module is needed to work in geometric primitives.",
    "version": "0.0.4",
    "project_urls": {
        "GitHub": "https://github.com/OnisOris/ThreeDTool",
        "Homepage": "https://github.com/OnisOris/ThreeDTool"
    },
    "split_keywords": [
        "3d",
        "math",
        "geometry"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "98f5db3d304a56afa94de0e44d7ebe5821c21968b1b69725b1927531509f9424",
                "md5": "f1b0c211eaae722e435f0f6fcdefc56c",
                "sha256": "536d377cac6b1729fd61f94955fffeab89d222c076d0f15a8f736163bcbc716d"
            },
            "downloads": -1,
            "filename": "ThreeDTool-0.0.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f1b0c211eaae722e435f0f6fcdefc56c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 51186,
            "upload_time": "2024-08-26T12:43:01",
            "upload_time_iso_8601": "2024-08-26T12:43:01.594678Z",
            "url": "https://files.pythonhosted.org/packages/98/f5/db3d304a56afa94de0e44d7ebe5821c21968b1b69725b1927531509f9424/ThreeDTool-0.0.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "742fa8eedea3cb7ff86d89903d353818694d3b9579b6894b926833c5089b31a7",
                "md5": "b5ab3218d7ecd5ac891b68fc34d68aa4",
                "sha256": "0d141757839a65b7583831126b9b138e2dccdbb7a0c46244e30fe1ae63ad10d2"
            },
            "downloads": -1,
            "filename": "threedtool-0.0.4.tar.gz",
            "has_sig": false,
            "md5_digest": "b5ab3218d7ecd5ac891b68fc34d68aa4",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 46462,
            "upload_time": "2024-08-26T12:43:03",
            "upload_time_iso_8601": "2024-08-26T12:43:03.151808Z",
            "url": "https://files.pythonhosted.org/packages/74/2f/a8eedea3cb7ff86d89903d353818694d3b9579b6894b926833c5089b31a7/threedtool-0.0.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-08-26 12:43:03",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "OnisOris",
    "github_project": "ThreeDTool",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "threedtool"
}
        
Elapsed time: 4.74547s