Vismach

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: Vismach

Сообщение Impartial »

Понял.
Меня тоже интересует визуализация процесса обработки с использованием OpenGL.
Хочется найти оптимальный вариант средства для реализации, чтобы любой мог настроить под свои представления о дизайне.
Но пока дальше С++ не двинулся. Использую движки от игр. Но это далеко от простого пользователя.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Vismach

Сообщение Nick »

А как делают визуализацию различные пакеты? Я имею в виду не только токарку, но и фрезеровку.
Есть какая-то информация как рассчитывается геометрия обработки? Большим булем?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

Impartial писал(а):и, чтобы любой мог настроить под свои представления о дизайне.
широкого инструментария все равно пользователю не дашь - ну там цвета изменять и маштаб - больше ничего не получиться...
цвета "родные" в Axis (в gremlin) и так можно изменять (где то мы обсуждали это)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

Nick писал(а):А как делают визуализацию различные пакеты?
некоторые говорят - Opengl не поддерживает напрямую булевы операции
3dmax наверно на чем то другом работает...
все это проштудировать нужно...
ps вот этопосмотреть нужно
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: Vismach

Сообщение Impartial »

Nick писал(а):Есть какая-то информация как рассчитывается геометрия обработки? Большим булем?
Лучший способ - отдать расчет векторному процессору видеосистемы. Для этого задается каркас из треугольников, правила перемещения и рендеринга.
В OpenGL это стандартизировано.
nkp писал(а):широкого инструментария все равно пользователю не дашь - ну там цвета изменять и маштаб - больше ничего не получиться...
А если дать возможность пользователю самому рисовать объекты, как это делается при создании игровых сценариев. Там ведь не программисты это делают а дизайнеры. А системой, аналогичной игровому движку, это все проигрывать. Станок из чертежей перевести в каркас не большая проблема.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

из соседней темы :
Starik писал(а):В гремлине рисовать довольно легко , поищи как они конус инструмента рисуют.
попытался тоже поискать :
начал с вкл-выкл в меню этого конуса
.menu.view add checkbutton \
-variable show_tool \
-command toggle_show_tool
setup_menu_accel .menu.view end [_ "Show too_l"]
идем в axis.py:
def toggle_show_tool(*event):
ap.putpref("show_tool", vars.show_tool.get())
o.tkRedraw()
и сразу тупик:
команда вызывает две функции:
ap.putpref("show_tool", vars.show_tool.get()) - запоминает настройки для повторного запуска
o.tkRedraw() - присутствует в каждой команде меню касательно графики: можно еще подсказку??
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Vismach

Сообщение Nick »

Impartial писал(а):А если дать возможность пользователю самому рисовать объекты, как это делается при создании игровых сценариев. Там ведь не программисты это делают а дизайнеры. А системой, аналогичной игровому движку, это все проигрывать. Станок из чертежей перевести в каркас не большая проблема.
У blender есть свой движок, чтобы игры делать, можно его использовать :)

nkp писал(а):некоторые говорят - Opengl не поддерживает напрямую булевы операции
3dmax наверно на чем то другом работает...
Так OpenGL вроде как и не должен это делать. Буль - не такая простая операция - частенько после него возникают глюки в геометрии. А нам тут еще и анимировать надо, чтобы можно было отследить процесс обработки... в общем хитрая штуковина получается... даже не знаю, с какого места ее решать...
ap.putpref("show_tool", vars.show_tool.get()) - запоминает настройки для повторного запуска
а кто такой это ap?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

Nick писал(а):а кто такой это ap?
ap = AxisPreferences()
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

ага - вроде бы нашел...
/lib/python/rs274/glcanon.py

Код: Выделить всё

        if self.get_show_tool():
            pos = self.lp.last(self.get_show_live_plot())
            if pos is None: pos = [0] * 6
            rx, ry, rz = pos[3:6]
            pos = self.to_internal_units(pos[:3])
            if self.is_foam():
                glEnable(GL_COLOR_MATERIAL)
                glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
                glPushMatrix()
                glTranslatef(pos[0], pos[1], self.get_foam_z())
                glRotatef(180, 1, 0, 0)
                cone = self.dlist("cone", gen=self.make_cone)
                glColor3f(*self.colors['cone_xy'])
                glCallList(cone)
                glPopMatrix()
                u = self.to_internal_linear_unit(rx)
                v = self.to_internal_linear_unit(ry)
                glPushMatrix()
                glTranslatef(u, v, self.get_foam_w())
                glColor3f(*self.colors['cone_uv'])
                glCallList(cone)
                glPopMatrix()
            else:
                glPushMatrix()
                glTranslatef(*pos)
                sign = 1
                for ch in self.get_geometry():
                    if ch == '-':
                        sign = -1
                    elif ch == 'A':
                        glRotatef(rx*sign, 1, 0, 0)
                        sign = 1
                    elif ch == 'B':
                        glRotatef(ry*sign, 0, 1, 0)
                        sign = 1
                    elif ch == 'C':
                        glRotatef(rz*sign, 0, 0, 1)
                        sign = 1
                glEnable(GL_BLEND)
                glEnable(GL_CULL_FACE)
                glBlendFunc(GL_ONE, GL_CONSTANT_ALPHA)

                current_tool = self.get_current_tool()
                if current_tool is None or current_tool.diameter == 0:
                    if self.canon:
                        g = self.canon
                        x,y,z = 0,1,2
                        cone_scale = max(g.max_extents[x] - g.min_extents[x],
                                       g.max_extents[y] - g.min_extents[y],
                                       g.max_extents[z] - g.min_extents[z],
                                       2 ) * .5
                    else:
                        cone_scale = 1
                    if self.is_lathe():
                        glRotatef(90, 0, 1, 0)
                    cone = self.dlist("cone", gen=self.make_cone)
                    glScalef(cone_scale, cone_scale, cone_scale)
                    glColor3f(*self.colors['cone'])
                    glCallList(cone)
                else:
                    if current_tool != self.cached_tool:
                        self.cache_tool(current_tool)
                    glColor3f(*self.colors['cone'])
                    glCallList(self.dlist('tool'))
                glPopMatrix()

        glMatrixMode(GL_PROJECTION)
        glPushMatrix()
        glLoadIdentity()
        ypos = self.winfo_height()
        glOrtho(0.0, self.winfo_width(), 0.0, ypos, -1.0, 1.0)
        glMatrixMode(GL_MODELVIEW)
        glPushMatrix()
        glLoadIdentity()

        limit, homed, posstrs, droposstrs = self.posstrs()

        charwidth, linespace, base = self.get_font_info()

        maxlen = max([len(p) for p in posstrs])
        pixel_width = charwidth * max(len(p) for p in posstrs)

        glDepthFunc(GL_ALWAYS)
        glDepthMask(GL_FALSE)
        glEnable(GL_BLEND)
        glBlendFunc(GL_ONE, GL_CONSTANT_ALPHA)
        glColor3f(*self.colors['overlay_background'])
        glBlendColor(0,0,0,1-self.colors['overlay_alpha'])
        glBegin(GL_QUADS)
        glVertex3f(0, ypos, 1)
        glVertex3f(0, ypos - 8 - linespace*len(posstrs), 1)
        glVertex3f(pixel_width+42, ypos - 8 - linespace*len(posstrs), 1)
        glVertex3f(pixel_width+42, ypos, 1)
        glEnd()
        glDisable(GL_BLEND)

        maxlen = 0
        ypos -= linespace+5
        i=0
        glColor3f(*self.colors['overlay_foreground'])
        if not self.get_show_offsets():
            for string in posstrs:
                maxlen = max(maxlen, len(string))
                glRasterPos2i(5, ypos)
                for char in string:
                    glCallList(base + ord(char))
                if i < len(homed) and homed[i]:
                    glRasterPos2i(pixel_width + 8, ypos)
                    glBitmap(13, 16, 0, 3, 17, 0, homeicon)
                if i < len(homed) and limit[i]:
                    glBitmap(13, 16, 0, 1, 17, 0, limiticon)
                ypos -= linespace
                i = i + 1
        if self.get_show_offsets():
            if self.is_lathe():
                homed.insert(0,homed[0])
            i=0
            for string in droposstrs:
                maxlen = max(maxlen, len(string))
                glRasterPos2i(5, ypos)
                for char in string:
                    glCallList(base + ord(char))
                if i < len(homed) and homed[i]:
                    glRasterPos2i(charwidth *3, ypos)
                    glBitmap(13, 16, 0, 3, 17, 0, homeicon)
                ypos -= linespace
                i = i + 1

        glDepthFunc(GL_LESS)
        glDepthMask(GL_TRUE)

        glPopMatrix()
        glMatrixMode(GL_PROJECTION)
        glPopMatrix()
        glMatrixMode(GL_MODELVIEW)
кстати - вот они изменения в axis для foam
все это действительно находится в def redraw(self):[/i]
и она проверяя состояние пользовательских настроек отрисовывает gremlin
Последний раз редактировалось nkp 04 июл 2013, 13:38, всего редактировалось 3 раза.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Vismach

Сообщение Serg »

Impartial писал(а):А этот интерпритатор имеет какой то стандарт?
На что стандарт?

Интерпретатор Tcl просто очень удобно построен - он весь выполнен в виде одной библиотеки размером 1.2MB, а сам бинарник - 7kB, в нём только разбор командной строки. Причём сюда входит довольно обширный набор средств, в том числе и работа с сетью и т.д. Tk - это ещё одна библиотека размером 1.3MB и там внутри довольно приличный набор виджетов и прочего для построения интерфейса.
Вот поэтому всякие питоны, перлы и т.п. пользуют его, а не изобретают своё. Ну и для встроенных применений Tcl/Tk самое оно.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: Vismach

Сообщение Impartial »

UAVpilot писал(а):На что стандарт?
Если я возьму этот скрипт и попытаюсь его запустить в квартусе, запустится? Или под анроидом?
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Vismach

Сообщение Serg »

Запустится. Я на Tcl/Tk пишу много прог, которые без изменений работают и в Linux и в винде и на маках.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

думаю разобрать для начала отрисовку осей:

Код: Выделить всё

    def draw_axes(self, n, letters="XYZ"):
        glNewList(n, GL_COMPILE)
        x,y,z,p = 0,1,2,3
        s = self.stat
        view = self.get_view()


        glColor3f(*self.colors['axis_x'])
        glBegin(GL_LINES)
        glVertex3f(1.0,0.0,0.0)
        glVertex3f(0.0,0.0,0.0)
        glEnd()

        if view != x:
            glPushMatrix()
            if self.is_lathe():
                glTranslatef(1.3, -0.1, 0)
                glTranslatef(0, 0, -0.1)
                glRotatef(-90, 0, 1, 0)
                glRotatef(90, 1, 0, 0)
                glTranslatef(0.1, 0, 0)
            else:
                glTranslatef(1.2, -0.1, 0)
                if view == y:
                    glTranslatef(0, 0, -0.1)
                    glRotatef(90, 1, 0, 0)
            glScalef(0.2, 0.2, 0.2)
            self.hershey.plot_string(letters[0], 0.5)
            glPopMatrix()

        glColor3f(*self.colors['axis_y'])
        glBegin(GL_LINES)
        glVertex3f(0.0,0.0,0.0)
        glVertex3f(0.0,1.0,0.0)
        glEnd()
здесь рисуется линия по двум точкам:
glVertex3f(1.0,0.0,0.0)
glVertex3f(0.0,0.0,0.0)

причем это обернуто в :
glBegin(GL_LINES)
glVertex3f(1.0,0.0,0.0)
glVertex3f(0.0,0.0,0.0)
glEnd()

ну с цветом ясно:
glColor3f(*self.colors['axis_x'])(можно его прямо задавать)
вот этот код рисует букву (X,Y,или Z):

Код: Выделить всё

        if view != y:
            glPushMatrix()
            glTranslatef(0, 1.2, 0)
            if view == x:
                glTranslatef(0, 0, -0.1)
                glRotatef(90, 0, 1, 0)
                glRotatef(90, 0, 0, 1)
            glScalef(0.2, 0.2, 0.2)
            self.hershey.plot_string(letters[1], 0.5)
            glPopMatrix()
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

вот в таком виде функция рисует толькотри линии:

Код: Выделить всё

    def draw_axes(self, n, letters="XYZ"):
        glNewList(n, GL_COMPILE)
        x,y,z,p = 0,1,2,3
        s = self.stat
        view = self.get_view()

        glColor3f(*self.colors['axis_x'])
        glBegin(GL_LINES)
        glVertex3f(0.0,0.0,0.0)
        glVertex3f(0.0,1.0,0.0)
        glEnd()

        glColor3f(*self.colors['axis_y'])
        glBegin(GL_LINES)
        glVertex3f(1.0,0.0,0.0)
        glVertex3f(0.0,0.0,0.0)
        glEnd()

        glColor3f(*self.colors['axis_z'])
        glBegin(GL_LINES)
        glVertex3f(0.0,0.0,0.0)
        glVertex3f(0.0,0.0,1.0)
        glEnd()

        glEndList()
(для просмотра содержимого нажмите на ссылку)
Выделение(023).jpg
Выделение(023).jpg (8.88 КБ) 5236 просмотров
вот такой код рисует квадрат:

Код: Выделить всё

    def draw_axes(self, n, letters="XYZ"):
        glNewList(n, GL_COMPILE)
        x,y,z,p = 0,1,2,3
        s = self.stat
        view = self.get_view()

        glColor3f(*self.colors['axis_x'])
        glBegin(GL_LINES)       
        glVertex3f(0.0,0.0,0.0)
        glVertex3f(0.0,2.0,0.0)
        glEnd()
        
        glColor3f(*self.colors['axis_x'])
        glBegin(GL_LINES)       
        glVertex3f(0.0,2.0,0.0)
        glVertex3f(0.0,2.0,2.0)
        glEnd()
        
        glColor3f(*self.colors['axis_x'])
        glBegin(GL_LINES)       
        glVertex3f(0.0,2.0,2.0)
        glVertex3f(0.0,0.0,2.0)
        glEnd()
        
        glColor3f(*self.colors['axis_x'])
        glBegin(GL_LINES)       
        glVertex3f(0.0,0.0,2.0)
        glVertex3f(0.0,0.0,0.0)
        glEnd()

        glEndList()
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Vismach

Сообщение Nick »

А прозрачность можно настроить?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

Nick писал(а):А прозрачность можно настроить?
прозрачность задается рядом с цветом:
Выделение(025).jpg (5220 просмотров) <a class='original' href='./download/file.php?id=16063&sid=66dac18d20e99a43f545e44824024cf1&mode=view' target=_blank>Загрузить оригинал (268.26 КБ)</a>
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

"привязка" vismach к выполнению жкода
https://www.youtube.com/watch?v=h5qvN5K2az0
Аватара пользователя
PKM
Почётный участник
Почётный участник
Сообщения: 4263
Зарегистрирован: 31 мар 2011, 18:11
Репутация: 705
Настоящее имя: Андрей
Откуда: Украина
Контактная информация:

Re: Vismach

Сообщение PKM »

Круто! А в 3D можно это показывать?
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

так это же и есть 3d)
просто подключить непрерывный поворот сцены (медленно) и эффект будет виден...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Vismach

Сообщение nkp »

но только сразу хочу написать про "обман" :hehehe: :
это не чисто в Axis,это просто поверх растянул окошко Vismach ))
но буду "вставлять" это в "родной" gremlin...
Ответить

Вернуться в «LinuxCNC»