[WIKI] Интерфейс Gmoccapy с нуля.

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

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение nkp »

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

import linuxcnc
s = linuxcnc.stat()

s.poll()
line=s.current_line
http://www.linuxcnc.org/docs/devel/html ... rface.html
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

current_line
(returns integer) - currently executing line, int.
работает не так как хотелось бы, показывает не текущую строку, а ту строку по которую динамически загружена в память программа.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение nkp »

verser писал(а):а ту строку по которую динамически загружена в память программа.
поясни пожалуйста подробней
verser писал(а):currently executing line, int.
то есть - здесь несоответствие в документации???
будем бить в набат))))
зы
я так понял - ты пробовал использовать s.current_line ...
вместе с s.poll() ??(функция "обновления " данных)
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

nkp писал(а): то есть - здесь несоответствие в документации???
именно!
nkp писал(а):я так понял - ты пробовал использовать s.current_line ...
вместе с s.poll() ??(функция "обновления " данных)
обижаешь :) .
nkp писал(а):
verser писал(а):а ту строку по которую динамически загружена в память программа.
поясни пожалуйста подробней
Берем программу 100 строк, стартуем, на третьей строчке g-code имеем s.current_line = 98.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение Serg »

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

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение nkp »

verser писал(а):именно!
тогда нужно поставить в известность разработчиков...
напишешь?(у тебя вроде бы с английским просто))
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

nkp писал(а): напишешь?(у тебя вроде бы с английским просто))
ты настоящий дружище :twisted:
напишу, но ещё хотя бы одно подтверждение нужно от нашего участника.
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

Подключил к gmoccapy тулкит "мастеров" Features от Nicka.
Исходники и инструкции в шапке.
Не забываем благодарить Nicka , а также тех, кого он благодарит :), в теме http://cnc-club.ru/forum/viewtopic.php?f=15&t=3124
От себя скажу - это потрясающая работа, надеюсь оказаться полезным и с позволения Nicka внести посильный вклад в развитие.
Последний раз редактировалось verser 19 июн 2014, 16:09, всего редактировалось 1 раз.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение Nick »

Как выполняется обновление отрисовки?
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

Nick писал(а):Как выполняется обновление отрисовки?
Я таймер пока убрал, отрисовка обновляется после каждого ввода числа или параметра.
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

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

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение Nick »

verser писал(а):Я таймер пока убрал, отрисовка обновляется после каждого ввода числа или параметра.
А зачем таймер убрал? У него основной смысл - обновлять не сразу, т.е. может улучшить быстродействие.
Основной вопрос был в том, как обновляется? Через какую функцию? axis-remote?


Да - в "активной" разработке... :freak:
Основной смысл - хочется сделать стороннюю утилиту для создания обрабокти контура или площади контура с заглублением по спирале и с перемычками.
Есть уже интерфейс, который может выдать сторонней утилите кучу параметров и принять от нее Gкод. Собственно нужна сторонняя утилита :).
Раньше я пытался написать все на чистом Gкоде, но заглубление по спирале меня доканало.
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

Nick писал(а): А зачем таймер убрал? У него основной смысл - обновлять не сразу, т.е. может улучшить быстродействие.
Основной вопрос был в том, как обновляется? Через какую функцию? axis-remote?
Виноват :) , но таймер не заработал сразу , как разберусь - подключу.
В gmoccapy axis-remote отсутствует. Но вот так - работает обновление

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

	def refresh(self, *arg ) :
		f = open(PROGRAM_PREFIX + "/features.ngc","w")
		f.write(self.to_gcode())
		f.close()
		self.stat.poll()
		self.linuxcnc.reset_interpreter()
		self.linuxcnc.wait_complete()
		self.linuxcnc.program_open(PROGRAM_PREFIX + "/features.ngc")
		self.linuxcnc.wait_complete()
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение Nick »

т.е. тоже самое только без axis-remote?
Просто axis сам по себе не перерисовывает картинку.
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

попробуй, может с self.linuxcnc.wait_complete() заработает и без axis-remote.
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

Nick писал(а): Основной смысл - хочется сделать стороннюю утилиту для создания обрабокти контура или площади контура с заглублением по спирале и с перемычками.
Есть уже интерфейс, который может выдать сторонней утилите кучу параметров и принять от нее Gкод. Собственно нужна сторонняя утилита :).
Раньше я пытался написать все на чистом Gкоде, но заглубление по спирале меня доканало.
Перейду обсуждать Features в "родную" веткуhttp://cnc-club.ru/forum/viewtopic.php? ... 63#p124663
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

Обновил в шапке дополнение Features, подробности здесь http://cnc-club.ru/forum/viewtopic.php? ... 54#p124954
Lines.png (3176 просмотров) <a class='original' href='./download/file.php?id=29848&sid=3df31ce95436abcbefc69e08872b3923&mode=view' target=_blank>Загрузить оригинал (117.34 КБ)</a>
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение nkp »

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

   def refresh(self, *arg ) :
      f = open(PROGRAM_PREFIX + "/features.ngc","w")
      f.write(self.to_gcode())
      f.close()
      self.stat.poll()
      self.linuxcnc.reset_interpreter()
      self.linuxcnc.wait_complete()
      self.linuxcnc.program_open(PROGRAM_PREFIX + "/features.ngc")
      self.linuxcnc.wait_complete()
здесь я так понял self.stat.poll() ничего не делает без IF( проверка состояния интерпретатора)
??
Аватара пользователя
verser
Мастер
Сообщения: 1884
Зарегистрирован: 21 июл 2013, 22:28
Репутация: 1278
Настоящее имя: Сергей
Откуда: Тбилиси
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение verser »

nkp писал(а): здесь я так понял self.stat.poll() ничего не делает без IF( проверка состояния интерпретатора)
??
да, лишний.. убрал.
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Интерфейс Gmoccapy , делаем свои дополнения. WIKI.

Сообщение nkp »

я просто пробовал загрузку в MyGUI (скажем так - простейший gtk интерфейс с gremlin)
задумка старая - и ngcgui (pyngcgui в том числе) и Features очень "универсальны...
а я хочу вставить в токарку самые необходимые мастера (их совсем немного) примерно такого плана:
Выделение_064.png (3157 просмотров) <a class='original' href='./download/file.php?id=29851&sid=3df31ce95436abcbefc69e08872b3923&mode=view' target=_blank>Загрузить оригинал (201.62 КБ)</a>
это вызвано отсутствием мышки на стойке
давно пробовал делать какие то наброски:
(для просмотра содержимого нажмите на ссылку)

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys ,os
import re
import pygtk
import gtk
from gladevcp.gladebuilder import GladeBuilder
import gladevcp
import time
import linuxcnc
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 color (self, data=None):
		self.widgets.button14.modify_bg(gtk.STATE_NORMAL , gtk.gdk.Color('#FF0095'))
		time.sleep(0.5)
		self.widgets.button14.modify_bg(gtk.STATE_NORMAL , gtk.gdk.Color('#F000FF'))		
	def open(self, widget, text_filter=None, all_filter=None):
		
		filename=None
		dialog=gtk.FileChooserDialog(title="Open ngcgui_file", action=gtk.FILE_CHOOSER_ACTION_OPEN,
			buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))		
		if (text_filter != None) and (all_filter != None):
			dialog.add_filter(text_filter)
			dialog.add_filter(all_filter)
		dialog.set_current_folder('~/emc2/nc_files')
		response = dialog.run()
		if response == gtk.RESPONSE_OK:
			self.filename = dialog.get_filename()
		elif response == gtk.RESPONSE_CANCEL:
			print 'Cancel open'
		dialog.destroy()
		self.restart1 (self)
		(dirname, fname) = os.path.split(self.filename)
		(self.shortname, extension) = os.path.splitext(fname)
		n=[self.shortname,'.png']
		self.imj=''.join(n)
		if os.path.exists(str(self.imj)):
			self.widgets.image2.set_from_file(str(self.imj))
		else:
			self.widgets.image2.set_from_file('start.jpg')		
		self.update(self)
	def update(self, data=None):		
		f = open(self.filename, "r")
		lines = f.readlines()		
		x=0
		q=0
		while x < len(lines):
			if  re.search("#\d+ *[(*]", lines[x]):
				vel=re.findall('[(][=][-]?.?0?\d*[.]?\d*', lines[x])
#парсим комментарии				
				dat=re.findall('[(].+', lines[x])
				dat1=re.findall('\s+.+', dat[0])
				l=dat1[0]
				dat2=l[:-2]
				if len(dat2) != 0:  
					self.ent1[q].set_text(dat2)
				else:
					self.ent1[q].set_text('')				
				vel1=re.findall('[-]?\d+[.]?\d*', vel[0])
				if len(vel) != 0:  
					self.ent[q].set_text(vel1[0])
				else:
					 self.ent[q].set_text('')
				q+=1
			x+=1
#скрываем незанятые поля			
		t=0
		while t+q < 14 :	
			for r in self.ent :	
				w=self.ent[q+t]	
				w.hide()
			t+=1
#		print q,'q'
		tt=0	
		while tt+q < 14 :	
			for k in self.ent1 :	
				wd=self.ent1[q+tt]	
				wd.hide()
			tt+=1		
		self.q=q
		f.close()				
	def make (self,widget, data=None):
		self.d = {
		1:self.widgets.entry1.get_text(),2:self.widgets.entry2.get_text(),
		3:self.widgets.entry3.get_text(),4:self.widgets.entry4.get_text(),
		5:self.widgets.entry5.get_text(),6:self.widgets.entry6.get_text(),
		7:self.widgets.entry7.get_text(),8:self.widgets.entry8.get_text(),
		9:self.widgets.entry9.get_text(),10:self.widgets.entry10.get_text(),
		11:self.widgets.entry11.get_text(),12:self.widgets.entry12.get_text(),
		13:self.widgets.entry13.get_text(),14:self.widgets.entry14.get_text()
		}
		'''for i  in  range(self.q):
			v=re.findall('[^0-9\-\.]', self.d.get(i+1))    
			if len(v) != 0  or  self.d.get(i+1)=='' or self.d.get(i+1)=='.':
				self.on_info(self)
				self.ent[i].set_text('')
				self.ebox[i].modify_bg(gtk.STATE_NORMAL , gtk.gdk.Color('#8E898D'))
				self.ent[i].grab_focus ()
			else :
				self.ebox[i].modify_bg(gtk.STATE_NORMAL , gtk.gdk.Color('#EDECEB'))'''

		self.cwd = os.getcwd()
		t=[self.cwd,'/ngcgui.ngc']
		self.imj=''.join(t)
		
		fname0=re.findall('\w+\.', self.filename)
		fname1=re.findall('\w+', fname0[0])
		ser=' '
		n=['o','<', fname1[0], '>','call', '\n','M2']		
		h=1
		m=5
		while h <= self.q:
			n.insert(m, '[')
			m+=1
			n.insert(m, self.d.get(h))
			m+=1
			n.insert(m, ']') 
			h+=1
			m+=1		
		j=ser.join(n)
		ff = open(str(self.imj), "w")
		ff.write(j)

#		sys.stdout.write(j)
		ff.close()
#		self.stat.poll()
	def finish (self, data=None):
		self.c.reset_interpreter()
		self.c.wait_complete()

		self.c.program_open(self.imj)
		print self.imj,'self.imj'
		self.c.wait_complete()
#		gtk.main_quit()
	def restart1 (self, data=None):
		for i in range(14) :
			w=self.ent[i]
			wd=self.ent1[i]
			wd.show()	
			w.show()	
	def restart (self, data=None):
		for i in range(14) :
			w=self.ent[i]
			wd=self.ent1[i]
			wd.show()	
			w.show()
	def on_info(self, widget):
        	md = gtk.MessageDialog(parent=None, flags=0,
        	  type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_CLOSE,
        	  message_format="Ошибка ввода")
        	md.run()
        	md.destroy()
	def image1(self, widget):
		if os.path.exists(str(self.imj)):
			n=[self.shortname,'.png']
			self.imj=''.join(n)
			self.widgets.image2.set_from_file(str(self.imj))
		else:
			self.widgets.image2.set_from_file('start.jpg')
	def image2(self, widget):
		if os.path.exists(str(self.imj)):
			n=[self.shortname,'1.png']
			self.imj=''.join(n)
			self.widgets.image2.set_from_file(str(self.imj))
		else:
			self.widgets.image2.set_from_file('start.jpg')
	def image3(self, widget):
		if os.path.exists(str(self.imj)):
			n=[self.shortname,'2.png']
			self.imj=''.join(n)
			self.widgets.image2.set_from_file(str(self.imj))
		else:
			self.widgets.image2.set_from_file('start.jpg')
	def __init__(self ):
		self.c = linuxcnc.command()
		self.s = linuxcnc.stat()		
		text_filter=gtk.FileFilter()
		text_filter.set_name(".ngc")
		text_filter.add_mime_type("*.ngc")
		all_filter=gtk.FileFilter()
		all_filter.set_name("All files")
		all_filter.add_pattern("*")
		self.builder = gtk.Builder()
		self.builder.add_from_file("1.glade")
		self.builder.connect_signals(self)
		self.builder.get_object("window1").maximize()
		self.builder.get_object("window1").show()
		self.widgets = Widgets(self.builder)
#		self.widgets.entry3.set_text ('asdfgh')
#		self.widgets.ventbox1.modify_bg(gtk.STATE_NORMAL , gtk.gdk.Color('#FF0095'))
		self.col='#8E898D'
		self.widgets.button14.modify_bg(gtk.STATE_NORMAL , gtk.gdk.Color(self.col))
		self.ebox=[
			self.widgets .eventbox1,self.widgets .eventbox2,
			self.widgets .eventbox3,self.widgets .eventbox4,
			self.widgets .eventbox5,self.widgets .eventbox6,
			self.widgets .eventbox7,self.widgets .eventbox8,
			self.widgets .eventbox9,self.widgets .eventbox10,
			self.widgets .eventbox11,self.widgets .eventbox12,
			self.widgets .eventbox13,self.widgets .eventbox14]
		self.ent = [
		self.widgets.entry1,self.widgets.entry2,
		self.widgets.entry3,self.widgets.entry4,
		self.widgets.entry5,self.widgets.entry6,
		self.widgets.entry7,self.widgets.entry8,
		self.widgets.entry9,self.widgets.entry10,
		self.widgets.entry11,self.widgets.entry12,
		self.widgets.entry13,self.widgets.entry14
		]
		self.ent1 = [
		self.widgets.entry15,self.widgets.entry16,
		self.widgets.entry17,self.widgets.entry18,
		self.widgets.entry19,self.widgets.entry20,
		self.widgets.entry21,self.widgets.entry22,
		self.widgets.entry23,self.widgets.entry24,
		self.widgets.entry25,self.widgets.entry26,
		self.widgets.entry27,self.widgets.entry28
		]
		self.widgets.image2.set_from_file('start.jpg')
		self.widgets.image1.set_from_file('1.png')
		self.widgets.image3.set_from_file('1.png')		
if __name__ == "__main__":
	main = Test()
	gtk.main()
	
то есть простая картинка ,поля для ввода , парсим,формируем о-код , и загружаем в lcnc...
так вот с этим какие топроблемы первый раз загружает всегда без исключения...
следующие вызовы def finish (self, data=None): работают через раз...
как в Gmoccapy в обновлением? потестировал достаточно?
Ответить

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