Python как подключиться к кубами
Перейти к содержимому

Python как подключиться к кубами

  • автор:

Библиотека python для работы с ssas

Есть библиотека olap.xmla на PyPI, вот достаточно подробный пример её применения.

Помимо этого есть вариант использования IronPython и соответствующих DLL, небольшой пример можно посмотреть здесь.

Отслеживать
ответ дан 25 мая 2019 в 7:24
9,848 5 5 золотых знаков 29 29 серебряных знаков 58 58 бронзовых знаков

  • python
  • python-3.x
  • olap
  • ssas
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951

Работа с 3-х мерными объектами в Python с использованием OpenGL: Отрисовка и заливка граней многоугольника

В данной программе будет представлен пример, как работать с объёмными фигурами в
OpenGL на языке Python. В итоге будет представлен куб в 3-ёх мерном виде с разноцветными гранями.

Среда разработки: PyCharm Community Edition 2020.1.2

Перед тем, как приступить к данному уроку, следует ознакомиться с предыдущим уроком: Работа с 3-х мерными объектами в Python с использованием OpenGL

В этом уроке мы продолжим совершенствовать код с прошлого занятия, мы обсудим, как можно раскрашивать предметы, в частности поверхности. Для этого мы сначала должны уведомить OpenGL о том, что мы собираемся сделать. После этого мы должны сообщить OpenGL, где находится поверхность, которую мы собираемся закрасить. Ничего сложного, зато еще одна функция OpenGL будет освоена!

Итак, сначала нам нужно выбрать несколько цветов. OpenGL хочет, чтобы вы указывали цвета в формате RGB, но также он ожидает, что значения цветов будут между 0 и 1, где 1 означает самый сильный оттенок цвета.

Например, красивый сплошной зеленый цвет будет выглядеть так: (0,1,0). 0 — это красный, 1 — это зеленый, а 0 — синий. То есть, красный и синий отсутствуют, а зеленый представлен в полной мере.

Теперь давайте продолжим и определим кортеж, состоящий из кортежей цветов в функции main():

colors = ( (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 0, 0), (1, 1, 1), (0, 1, 1), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 0, 0), (1, 1, 1), (0, 1, 1), )

Далее нам нужно определить поверхности. Они определяются в виде групп вершин:

surfaces = ( (0,1,2,3), (3,2,7,6), (6,7,5,4), (4,5,1,0), (1,5,7,2), (4,0,3,6) )

Затем нам нужно добавить новый код раскраски в нашу функцию Cube().

На данный момент функция Cube() имеет следующий вид:

def Cube(vertices, edges): glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd()

Теперь мы добавим к нашей функции Cube() следующий код:

glBegin(GL_QUADS) for surface in surfaces: x = 0 for vertex in surface: x+=1 glColor3fv(colors[x]) glVertex3fv(verticies[vertex]) glEnd()

Итак, здесь вы видите обычный glBegin, только на этот раз у нас GL_QUADS в качестве константы. Затем для каждой поверхности (набора вершин) в кортеже поверхностей и для каждой вершины в этом списке из четырех вершин мы будем использовать функцию glColor3fv, которая будет окрашивать создаваемый нами объект. А потом мы, как и ранее, используем функцию glVertex3fv!

Единственно, что здесь еще есть, — это обычный счетчик, добавляющий 1 к значению переменной x, что позволяет нам немного менять цвета куба.

Теперь наша функция Cube() выглядит следующим образом:

def Cube(vertices, edges, surfaces, colors): glBegin(GL_QUADS) for surface in surfaces: x = 0 for vertex in surface: x += 1 glColor3fv(colors[x]) glVertex3fv(vertices[vertex]) glEnd() glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd()

Отлично, теперь мы имеем:

import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * def Cube(vertices, edges, surfaces, colors): glBegin(GL_QUADS) for surface in surfaces: x = 0 for vertex in surface: x += 1 glColor3fv(colors[x]) glVertex3fv(vertices[vertex]) glEnd() glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd() def main(): vertices = ( (1.0, -1.0, -1.0), (1.0, 1.0, -1.0), (-1.0, 1.0, -1.0), (-1.0, -1.0, -1.0), (1.0, - 1.0, 1.0), (1.0, 1.0, 1.0), (-1.0, -1.0, 1.0), (-1.0, 1.0, 1.0) ) edges = ( (0, 1), (0, 3), (0, 4), (2, 1), (2, 3), (2, 7), (6, 3), (6, 4), (6, 7), (5, 1), (5, 4), (5, 7) ) surfaces = ( (0, 1, 2, 3), (3, 2, 7, 6), (6, 7, 5, 4), (4, 5, 1, 0), (1, 5, 7, 2), (4, 0, 3, 6) ) colors = ( (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 0, 0), (1, 1, 1), (0, 1, 1), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 0, 0), (1, 1, 1), (0, 1, 1), ) pygame.init() display = (800, 600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) glClearColor(0.1, 0.5, 1.0, 0) gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) glTranslatef(0.0, -1.0, -10) glRotatef(20, 10, 0, 0) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() glRotatef(1, 0, 1, 0) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) Cube(vertices, edges, surfaces, colors) pygame.display.flip() pygame.time.wait(10) main()

Больше функций и описание их работы на сайте: docs.gl

Прикрепленный файл Размер
main.rar 713 байтов

Работа с 3-х мерными объектами в Python с использованием OpenGL

В данной программе будет представлен пример, как работать с объёмными фигурами в
OpenGL на языке Python. В итоге будет представлен куб в 3-ёх мерном виде.

Среда разработки: PyCharm Community Edition 2020.1.2

Для начала работы потребуется наличие следующих инструментов или пакетов: Python, PyOpenGL, PyGame.

Как установить Python можно посмотреть на официальном сайте, ссылка на него: https://www.python.org/

Далее рассмотрим установку пакетов на Python.

Для того, чтобы загрузить PyOpenGL и PyGame, воспользуемся PyPi. В терминале IDE вводим команды:

pip install pygame pip install PyOpenGL

Загрузив все это, пишем следующий код:

import pygame import OpenGL

Если эти выражения не вызовут ошибок, значит вы готовы к дальнейшей работе. Если возникнут ошибки, значит при установке пакетов произошла ошибка, либо текущие версии пакетов несовместимы с Вашей версией Python. Более детальную информацию можно узнать в документации к используемым пакетам Python’a: PyGame и PyOpenGL.

Отлично, теперь перейдем непосредственно к коду! Если у вас еще сохранился код импорта, который мы только что запускали, сотрите его: мы начнем полностью с чистого листа.

Для начала произведем импорт необходимых библиотек:

import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import *

Мы импортируем все из PyGame, а затем все из PyGame.locals. Это вполне стандартный код для PyGame.Затем мы импортируем OpenGL.GL и OpenGL.GLU. OpenGL.GL содержит в себе самые обычные функции библиотеки OpenGL, а вот OpenGL.GLU — более сложных объектов.

Изначально создадим функцию main() для удобства:

def main():

Теперь начнем описывать нашу функцию main().
Давайте же создадим описание наших точек (вершин):

vertices= ( (1.0, -1.0, -1.0), (1.0, 1.0, -1.0), (-1.0, 1.0, -1.0), (-1.0, -1.0, -1.0), (1.0, - 1.0, 1.0), (1.0, 1.0, 1.0), (-1.0, -1.0, 1.0), (-1.0, 1.0, 1.0) )

Здесь мы определили координаты (x, y, z) каждой нашей вершины. Думаю, лучше всего представить это в относительных единицах.

Далее нам надо задать ребра:

edges = ( (0,1), (0,3), (0,4), (2,1), (2,3), (2,7), (6,3), (6,4), (6,7), (5,1), (5,4), (5,7) )

Каждое ребро представлено кортежем, состоящим из двух чисел. Эти числа соответствуют номерам вершин, а ребро их соединяет. Как принято в Python, да и во многих других языках программирования, нумерация начинается с 0. Соответственно, 0 обозначает вершину (1, -1, -1), и так далее.

Теперь, когда у нас все это есть, давайте поработаем над необходимым кодом для работы с OpenGL, чтобы фактически создать сам куб (описывать функцию Cube() мы будем вне функции main()):

def Cube(vertices, edges): glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd()

Как обычно, мы начинаем с задания функции. Поскольку это просто функция, которая будет содержать код OpenGL, мы начинаем этот код со следующего выражения: glBegin (GL_LINES). Это уведомляет OpenGL сначала о том, что мы собираемся бросить в нее какой-то код, а затем — о том, как надо обрабатывать этот код (это указывает аргумент GL_LINES). В данном случае этот код будет рассматриваться как код для рисования линий.

Далее, мы итерируем по всем нашим ребрам (список edges), а затем каждой вершине в ребре (их там две) мы ставим в соответствие вершину из нашего списка вершин vertices (при помощи функции glVertex3fv).

glVertex3fv((1, -1, -1)) glVertex3fv((1, 1, -1))

И так далее. OpenGL, зная, что мы хотим рисовать здесь линии, проведет их между этими точками.

После прохождения всех ребер работа функции заканчивается и мы вызываем glEnd(), чтобы сообщить об этом OpenGL. Подобные открывающие и закрывающие команды используются в OpenGL постоянно.

Это все, что касается нашей функции. Она создает куб, но теперь мы хотим его отобразить и указать его перспективу в нашем окружении, для этого возвращаемся в функцию main() и пишем следующее:

pygame.init() display = (800,600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

Это тоже очень типичный для Pygame код. Единственное существенное отличие здесь в том, что после параметра display в функции pygame.display.set_mode мы добавляем еще один параметр. На самом деле это константы, уведомляющие PyGame о том, что мы будем использовать код OpenGL. Константа DOUBLEBUF расшифровывается как двойной буфер. Она обозначает тип буфферизации, в котором есть два буфера для соответствия кадровой частоте монитора. Обратите внимание, что для разделения констант используется символ «|». Мы еще столкнемся с ним в дальнейшем.

Идем дальше. В теле главной функции находится следующий код:

gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)

Функция gluPerspective определяет перспективу, о чем, впрочем, несложно догадаться из ее названия. Ее первый параметр определяет угол поля зрения и выражается в градусах. Второй параметр — это соотношение сторон дисплея, ширина, деленная на высоту. Следующие два параметра — znear и zfar, которые представляют собой ближнюю и дальнюю плоскости отсечения.

Идем дальше. У нас есть следующая функция:

glTranslatef(0.0, -1.0, -10) glRotatef(20, 10, 0, 0)

Функция glTranslatef, цитируя дословно, «умножает текущую матрицу на матрицу перехода»

Теперь напишем наш типичный цикл для отслеживания событий в PyGame:

while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit()

Это простой цикл отслеживания событий в PyGame, который определяет возможность выхода. Иными словами, он отслеживает нажатие клавиши «x». Далее, под оператором while продолжаем наш код:

glRotatef(1, 0, 1, 0) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) Cube() pygame.display.flip() pygame.time.wait(10)

Функция glRotatef умножает текущую матрицу на матрицу вращения. Ее параметрами являются угол вращения и координаты x, y, и z.

Затем у нас есть функция glClear, работающая, как любая другая функция очистки. Мы указываем в ее параметрах пару констант, которые сообщают OpenGL, что именно мы очищаем.

Как только мы очистим «экран», мы опять вызовем нашу функцию Cube ().
После этого мы вызываем функцию pygame.display.flip (), которая обновляет наш экран.
И наконец, мы вставляем небольшую задержку при помощи функции pygame.time.wait (10).

И в завершении в самой программе просто вызываем функцию main().

import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * def Cube(vertices, edges): glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(vertices[vertex]) glEnd()  def main(): vertices = ( (1.0, -1.0, -1.0), (1.0, 1.0, -1.0), (-1.0, 1.0, -1.0), (-1.0, -1.0, -1.0), (1.0, - 1.0, 1.0), (1.0, 1.0, 1.0), (-1.0, -1.0, 1.0), (-1.0, 1.0, 1.0) ) edges = ( (0, 1), (0, 3), (0, 4), (2, 1), (2, 3), (2, 7), (6, 3), (6, 4), (6, 7), (5, 1), (5, 4), (5, 7) ) pygame.init() display = (800, 600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) glTranslatef(0.0, -1.0, -10) glRotatef(20, 10, 0, 0) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() glRotatef(1, 0, 1, 0) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) Cube(vertices, edges) pygame.display.flip() pygame.time.wait(10) main()
Прикрепленный файл Размер
main.rar 573 байта

Организация OLAP куба средствами Python

Добрый день, уважаемые читатели. Сегодня я расскажу вам о том, как можно построить простенькую систему анализа данных на Python. В этом мне помогут framework cubes и пакет cubesviewer .

Сubes представляет собой framework’ом для работы с многомерными данными с помощью Python. Кроме того он включает в себя OLAP HTTP-сервер для упрощенной разработки приложений отчетности и общего просмотра данных.

Сubesviewer представляет собой web-интерфейс для работы с вышеуказанным сервером.

Установка и настройка cubes

Для начала надо установить библиотеки, необходимые для работы пакета:

pip install pytz python-dateutil jsonschema pip install sqlalchemy flask 

Далее устанавливаем сам пакет cubes :

pip install cubes 

Как показала практика, лучше использовать версию (1.0alpha2) из текущего репозитория .

Доп настройки под windows

Если вы планируете работать под Windows необходимо в файле PYTHON_DIR\Lib\site-packages\dateutil\tz.py заменить 40 строку:

return myfunc(*args, **kwargs).encode() 
return myfunc(*args, **kwargs) 

Затем, вне зависимости от платформы на которой вы работаете, нужно добавить следующий fix для корректной работы json-парсера. Вносить его надо в PYTHON_DIR\Lib\site-packages\cubes-1.0alpha-py2.7.egg\cubes\metadata.py начиная с 90 строки:

 # TODO: same hack as in _json_from_url return read_model_metadata_bundle(source) 

Описание настройки куба и процесс его разворачивания

Для примера возьмем OLAP-куб, который идет в поставке с cubes . Он находится в папке examples/hello_world (ее можно взять с репозитория). Наибольший интерес для нас представляют 2 файла:

  • slicer.ini — файл настроек http сервера нашего куба
  • model.json — файл с описание модели куба

Остановимся на них поподробнее. Начнем с файла slicer.ini , который может включать следующие разделы:

  • [workspace] – конфигурация рабочего места
  • [server] — параметры сервера (адрес, порт и тд.)
  • [models] — список моделей для загрузки
  • [datastore] или [store] – параметры хранилища данных
  • [translations] — настройки локализации для модели.

Итак разберем из нашего тестового файла видно, что сервер будет располагаться на локальной машине и будет работать по 5000 порту. В качестве хранилища будет использоваться локальная база SQLite под названием data.sqlite.

Подробнее о конфигурировании сервера можно прочитать в документации. Также из файла видно, что описание модели нашего куба находиться в файле model.json , описание структуры которого мы сейчас и займемся. Файл описания модели, это json -файл, который включает следующие логические разделы:

  • name – имя модели
  • label – метка
  • description – описание модели
  • locale – локаль для модели (если задана локализация)
  • cubes – список метаданных кубов
  • dimensions – список метаданных измерений
  • public_dimensions – список доступных измерений. По умолчанию все измерения доступны.

Для нас представляют интерес разделы cubes и dimensions , т.к. все остальные опциональны. Элемент списка dimensions , содержит следующие метаданные:

Элемент списка cubes , содержит следующие метаданные:

Исходя из выше описанного, можно понять, что у нас в модели в будет 2 измерения ( item, year ). У измерения “ item ” 3 уровня измерений:

  • category . Отображаемое имя “Category”, поля “category”, “category_label”
  • subcategory . Отображаемое имя “Sub-category”, поля “subcategory”, “subcategory_label”
  • line_item . Отображаемое имя “Line Item”, поле “line_item”

В качестве меры в нашем кубе будет выступать поле “amount” , для которой выполняются функции суммы и подсчета кол-ва строк. Подробнее о разметке модели куба можно почитать в документации После того, как мы разобрались с настройками, надо создать нашу тестовую базу. Для того, чтобы это сделать, необходимо запустить скрипт prepare_data.py :

python prepare_data.py 

Теперь осталось только запустить наш тестовый сервер с кубом, который называется slicer :

slicer serve slicer.ini 

После этого можно проверить работоспособность нашего куба. Для этого в строке браузера можно ввести: http://localhost:5000/cube/irbd_balance/aggregate?drilldown=year В ответ мы получим json-объект с результатом агрегации наших данных. Подробнее о формате ответа сервера можно почитать тут .

Установка cubesviewer

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

git clone https://github.com/nonsleepr/cubesviewer.git 

А потом просто переместить содержимое папки /src в нужный место.

Надо отметить, что сubesviewer является Django-приложением, поэтому для его работы необходим Django (не выше версии 1.4) , а также пакеты requests и django-piston . Т.к. данная версия Django уже устарела, то выше я привел ссылку откуда можно взять сubesviewer для версии Django 1.6.

Установка ее немного отличается от оригинала тем, что в файл конфигурации сервера slicer.ini в раздел [server] нужно добавить строку allow_cors_origin: http://localhost:8000

После этого надо настроить приложение в файле CUBESVIEWER_DIR/web/cvapp/settings.py . Указав ему настройки БД, адрес OLAP сервера (переменная CUBESVIEWER_CUBES_URL ) и адрес просмоторщика ( CUBESVIEWER_BACKEND_URL )

Осталось внести небольшой fix в dajno-piston

Теперь можно синхронизировать наше приложение с БД. Для этого из CUBESVIEWER_DIR/web/cvapp нужно выполнить:

python manage.py syncdb 

Осталось запустить локальный сервер Django

python manage.py runserver 

Теперь осталось зайти на указанный в CUBESVIEWER_BACKEND_URL адрес через браузер. И наслаждаться готовым результатом.

Заключение

Для иллюстрации работы я взял самый простой пример. Надо отметить что для производственных проектов cubes можно развернуть например на apache или uswgi . Ну а подключить к нему сubesviewer с помощью этой статьи не составит труда.

Если тема будет интересна сообществу, то я раскрою ее в одной из будущих статей.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *