Python в LinuxCnC

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Nick писал(а):А "1" откуда взялась?
да это же внутреннее имя виджета
можно любое(допустимое) написать
Выделение(003).jpg (3930 просмотров) <a class='original' href='./download/file.php?id=10327&sid=cfa8b5acf7a356a4a44633db60c73c8c&mode=view' target=_blank>Загрузить оригинал (53.2 КБ)</a>
Nick писал(а):А что от гремлина хочешь?
ну цвета там поменять , DRO подтесать, и т.д.
Nick писал(а):Си как раз лучше всего за праздничным столом изучать
О!наверно название "си" производное от "сивуха" ???!!! :hehehe:
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Python в LinuxCnC

Сообщение Serg »

Nick писал(а): UAVpilot писал(а):но его достоинство в том, что он на любой платформе под любой ОС выглядит и работает одинаково
учитывая, что LinuxCNC идет только под Linux :)
Тот красивый диалог - это стандартный диалог GNOME, однако бывают линуксы и без GNOME.
Например мне, когда на какой-то маленькой железке с линуксом требуется максимально лёгкий GUI, то я достаю старый добрый Motif - в Tk диалоги как раз родом из него. ;)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

есть в модуле .../lib/python/rs274/glcanon.py функция select
она подсвечивает выделеный пользователем участок траектории (а фактически - строку кода):
Выделение_012.png (3739 просмотров) <a class='original' href='./download/file.php?id=21571&sid=cfa8b5acf7a356a4a44633db60c73c8c&mode=view' target=_blank>Загрузить оригинал (108 КБ)</a>
print конечно это я добавил добавил :
(для просмотра содержимого нажмите на ссылку)

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

    def select(self, x, y):
        if self.canon is None: return
        pmatrix = glGetDoublev(GL_PROJECTION_MATRIX)
        glMatrixMode(GL_PROJECTION)
        glPushMatrix()
        glLoadIdentity()
        vport = glGetIntegerv(GL_VIEWPORT)
        gluPickMatrix(x, vport[3]-y, 5, 5, vport)
        glMultMatrixd(pmatrix)
        glMatrixMode(GL_MODELVIEW)

        while 1:
            glSelectBuffer(self.select_buffer_size)
            glRenderMode(GL_SELECT)
            glInitNames()
            glPushName(0)

            if self.get_show_rapids():
                glCallList(self.dlist('select_rapids', gen=self.make_selection_list))
            glCallList(self.dlist('select_norapids', gen=self.make_selection_list))

            try:
                buffer = list(glRenderMode(GL_RENDER))
            except OverflowError:
                self.select_buffer_size *= 2
                continue
            break

        if buffer:
            min_depth, max_depth, names = min(buffer)
            self.set_highlight_line(names[0])
        else:
            self.set_highlight_line(None)

        glMatrixMode(GL_PROJECTION)
        glPopMatrix()
        glMatrixMode(GL_MODELVIEW)
        if buffer:
            print 'line' , names[0]
как получить эту names[0] в другом окошке??
ну примерно таком:
(для просмотра содержимого нажмите на ссылку)

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pygtk
import gtk

class Widgets:
	def __init__(self, xml):
		self._xml = xml
	def __getattr__(self, attr):
		r = self._xml.get_object(attr)
		if r is None: raise AttributeError, "No widget %r" % attr
		return r
	def __getitem__(self, attr):
		r = self._xml.get_object(attr)
		if r is None: raise IndexError, "No widget %r" % attr

class Test:
	def finish (self, data=None):
		gtk.main_quit()
		
	def num_line (self, txt):
		self.widgets.num.set_text(txt)
				
	def __init__(self):
		self.builder = gtk.Builder()
		self.builder.add_from_file("number.ui")
		self.builder.connect_signals(self)

		self.builder.get_object("window1").show()
		self.widgets = Widgets(self.builder)

if __name__ == "__main__":
	main = Test()
	gtk.main()
Выделение_013.png
Выделение_013.png (4.49 КБ) 3739 просмотров
то есть - выделяем в Axis участок траектории - получаем в нашей програмке номер строки кода
Последний раз редактировалось nkp 25 ноя 2013, 23:13, всего редактировалось 1 раз.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Пихай его в пин! :)
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

пока пишу в файл - потом читаю :

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

        if buffer:
            fl = open('/home/nkp/line.txt' , 'w')
            fl.write(str(names[0]))
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

Не, лучше в пин!
там у тебя hal импортируется? Если да, то смело создавай пин и пихай эту информацию туда! Так универсальнее.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

Nick писал(а):Не, лучше в пин! там у тебя hal импортируется? Если да, то смело создавай пин и пихай эту информацию туда! Так универсальнее.
так и сделал...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

вот это работает из командной строки:

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

DIR='/home/nkp/linuxcnc/nc_files/ofs/oper/*'
sed -i 's/X-/K/'  $DIR
sed -i 's/X/X-/'  $DIR
sed -i 's/K/X/'   $DIR
sed -i 's/G2/P/'  $DIR
sed -i 's/G3/G2/' $DIR
sed -i 's/P/G3/'  $DIR
как бы это правильно в питоне использовать ?
чарез import subprocess
subprocess.call(['sed', 's/X-/K/' ,fl], stdout = f_tmp )
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Python в LinuxCnC

Сообщение Serg »

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

Re: Python в LinuxCnC

Сообщение Nick »

import re
import os

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

Re: Python в LinuxCnC

Сообщение nkp »

вопрос по центровке отрисовки в gremlin ...
в Axis функция o.set_centerpoint(x, y, z ) центровки вызывается в двух местах(при загрузке и после загрузки ж-кода):

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

    def open_file_name(f):
        open_file_guts(f)
        if str(widgets.view_x['relief']) == "sunken":
            commands.set_view_x()
        elif str(widgets.view_y['relief']) == "sunken":
            commands.set_view_y()
        elif str(widgets.view_z['relief']) == "sunken":
            commands.set_view_z()
        elif  str(widgets.view_z2['relief']) == "sunken":
            commands.set_view_z2()
        else:
            commands.set_view_p()
        if o.canon is not None:
            x = (o.canon.min_extents[0] + o.canon.max_extents[0])/2
            y = (o.canon.min_extents[1] + o.canon.max_extents[1])/2
            z = (o.canon.min_extents[2] + o.canon.max_extents[2])/2
            o.set_centerpoint(x, y, z)
из glnav.py:

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

    def set_centerpoint(self, x, y, z):
        """Set the new center point for the model.
        This is where we are looking."""

        self.xcenter = x
        self.ycenter = y
        self.zcenter = z
        print "glnav", x,y,z

        self._redraw()
далее это "уходит" наверно(?) в minigl.c с корнями в самой библиотеке GL
если пытаться задать свои координаты центровки(ну вот хоть из кода Axis):

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

        if o.canon is not None:
            x = -20.0
            y = (o.canon.min_extents[1] + o.canon.max_extents[1])/2
            z = (o.canon.min_extents[2] + o.canon.max_extents[2])/2
            o.set_centerpoint(x, y, z)
то заданное значение функция принимает - но отрисовка остается прежней(
такое впечатление ,что моментально перерисовывается из другого места...
но set_centerpoint вызывается только в этих двух файлах:

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

$nkp@nkp-desktop:~$ grep -rl 'set_centerpoint' /home/nkp/emc2-dev-80db2a2/
/home/nkp/emc2-dev-80db2a2/bin/axis
/home/nkp/emc2-dev-80db2a2/src/emc/usr_intf/axis/scripts/axis.py
/home/nkp/emc2-dev-80db2a2/lib/python/glnav.py
/home/nkp/emc2-dev-80db2a2/lib/python/glnav.pyc
/home/nkp/emc2-dev-80db2a2/lib/python/rs274/glcanon.py
glcanon.py
========
вроде бы мелочь , но "нарисовав" в Axis линии заготовки , хотелось чтоб центровалось именно по ней ...
сейчас сделано "по центру" загруженной программы (Gcode)
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Python в LinuxCnC

Сообщение Serg »

Это питон тебя дурит. :)
Мог-бы попробовать внутри set_centerpoint написать какую-нибудь синтаксически неверную галиматью и обнаружить, что всё по прежнему работает без ошибок... ;)

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

Re: Python в LinuxCnC

Сообщение nkp »

UAVpilot писал(а):Собственно после изменений .py надо перекомпилить соотв. .pyc/.pyo
наверно просто удалить их...
==========
но дело не в .pyc
я же в файле axis (который в bin) задаю аргументы для функции
вот тупо ставлю -20:

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

 if o.canon is not None:
            x = -20.0
            y = (o.canon.min_extents[1] + o.canon.max_extents[1])/2
            z = (o.canon.min_extents[2] + o.canon.max_extents[2])/2
            o.set_centerpoint(x, y, z)
кстати ,неважно какие еденицы на данный момент в емс - по моему эти параметры всегда в дюймах(?)
Аватара пользователя
NightV
Почётный участник
Почётный участник
Сообщения: 6599
Зарегистрирован: 30 дек 2011, 09:14
Репутация: 2279
Настоящее имя: Владимир Айрапетян
Откуда: Israel
Контактная информация:

Re: Python в LinuxCnC

Сообщение NightV »

UAVpilot писал(а):Это питон тебя дурит.
дожили... раньше юзверь юзвера дурили... теперь еще и ПО пытается его надурить... :hehehe:
Всё просто! если знаешь КАК!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Python в LinuxCnC

Сообщение Serg »

nkp писал(а):я же в файле axis (который в bin) задаю аргументы для функции
Ну напиши там перед "o.set_centerpoint(x, y, z)" чего-нибудь матерное и убедись, что эта часть кода не исполняется... :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Python в LinuxCnC

Сообщение Сергей Саныч »

UAVpilot писал(а):Ну напиши там перед "o.set_centerpoint(x, y, z)" чего-нибудь матерное
в этом вашем питоне лишний пробел - уже матерное :idiot:
Чудес не бывает. Бывают фокусы.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

UAVpilot писал(а):Ну напиши там перед "o.set_centerpoint(x, y, z)" чего-нибудь матерное и убедись, что эта часть кода не исполняется...
написал - хоть и знал что конечно будет ошибка - синтаксическая прежде всего...
Выделение_014.png (3236 просмотров) <a class='original' href='./download/file.php?id=34736&sid=cfa8b5acf7a356a4a44633db60c73c8c&mode=view' target=_blank>Загрузить оригинал (202.11 КБ)</a>
=============
эта функция срабатывает при загрузке gcode в емс
(именно загрузке - перезагрузка не срабатывает)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Python в LinuxCnC

Сообщение Nick »

UAVpilot писал(а):Ну напиши там перед "o.set_centerpoint(x, y, z)" чего-нибудь матерное и убедись, что эта часть кода не исполняется...
у меня такое ощущение, что он может в этом pyc прописывать или исходник, или его последнюю дату модификации и если она больше, то компилим заново...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Python в LinuxCnC

Сообщение Serg »

Не сразу заметил, что при открытии файла это зовётся.

похоже serf._redraw() вообще не имеет к этому отношения. Везде сделал вот так:

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

self.xcenter = -10
self._redraw()
но безрезультатно.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Python в LinuxCnC

Сообщение nkp »

UAVpilot писал(а):self._redraw()
если я правильно понял - self._redraw - это в OpenGLTk.py:

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

    def _redraw(self):
        print "self._redraw()Ok"
        self.tkRedraw()

    def tkRedraw(self, *dummy):
        """Cause the opengl widget to redraw itself."""
        print "self.tkRedraw()Ok"
        if not self.initialised: return
        self.activate()

        glPushMatrix()          # Protect our matrix
        self.update_idletasks()
        self.activate()
        w = self.winfo_width()
        h = self.winfo_height()
        glViewport(0, 0, w, h)

        # Clear the background and depth buffer.
        glClearColor(self.r_back, self.g_back, self.b_back, 0.)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glMatrixMode(GL_PROJECTION)
она отрабатывает , а def tkRedraw(self, *dummy) - кажись нет...
Ответить

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