from stl import mesh  # pip install numpy-stl
import matplotlib.pyplot as plt

# читаем файл, получаем массив координат вершин каждой грани
m = mesh.Mesh.from_file('easy.stl').vectors

# выводим размерность массива
print(m.shape)

fig = plt.figure()  # создаем окошко рисования
ax = fig.add_subplot(projection='3d')  # создаем пространство в окошке
# ax.plot(m[:, :, 0], m[:, :, 1], m[:, :, 2])  # рисуем кристаллик одним цветом
# plt.show()  # выводим все на экран


def plot_face(ax, face, c):
    """
    функция для отрисовки одной грани
    :param ax: пространство для рисования
    :param face: грань (массив 3x3)
    :param c: цвет
    """
    for k in range(3):  # цикл по вершинам
        ax.plot([face[k, 0], face[(k + 1) % 3, 0]],
                [face[k, 1], face[(k + 1) % 3, 1]],
                [face[k, 2], face[(k + 1) % 3, 2]], c=c)


for i in range(m.shape[0]):  # цикл по граням
    plot_face(ax, m[i], f"C{i}")

# подписываем оси
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.savefig("crystal.png")  # сохраняем файл
plt.show()  # выводим на экран
