Точечное выжигание - gcode-burner

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Zolen
Новичок
Сообщения: 11
Зарегистрирован: 23 ноя 2010, 16:32
Репутация: 2
Откуда: СПб
Контактная информация:

Точечное выжигание - gcode-burner

Сообщение Zolen »

Снимок-gcode-burner.py.png (63251 просмотр) <a class='original' href='./download/file.php?id=4820&sid=6e754718e4860dc75eb1b61a24a378b2&mode=view' target=_blank>Загрузить оригинал (288.63 КБ)</a>
ТипСкрипт
РазработчикКоманда разработчиков cnc-club.ru
Написана наPython
ОСКроссплатформенное программное
обеспечение (Windows, Linux,
MacOS)
Версия1.0
ЛицензияGNU GPL
Gcode-burner - программа для создания Gкода для выжигания на станке с ЧПУ из изображения.

Возможности

  • интерполяция цвета, глубиной прожига
  • масштабирование и перемещение рисунка
  • задание ширины "точки"
  • дополнительные заголовки или окончания файла
  • возможность подключения к EMC2, как препроцессор
  • задание общей длинны или ширины рисунка

Подключение к EMC2

Скрипт разрабатывался таким образом, чтобы его можно было подключить к EMC2 как препроцессор. Т.е. при открытии в EMC2 картинки автоматически запустится gcode-burner, а его вывод откроется в EMC2.
Для того, чтобы подключить gcode-burner к EMC2 нужно в ini файле в разделе фильтр написать что-то вроде:

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

PROGRAM_EXTENSION = .png,.gif,.jpg,.jpeg images for gcode-burner
       png = gcode-burner
       gif = gcode-burner
       jpg = gcode-burner
       jpeg = gcode-burner
Подробнее см. инструкцию к EMC2, раздел: 4.2.3 Раздел [FILTER]

Последняя версия

Последняя версия доступна в репозитории git: https://github.com/cnc-club/gcode-burner
Прямая ссылка на архив: https://github.com/cnc-club/gcode-burne ... master.zip
Нам нужны фотографии готовых работ! А также приветствуются любые замечания и пожелания :)!

С этого сообщения началась разработка gcode-burner. Все что сверху добавлено потом.
--Nick

Доброго времени суток.
Подскажите, какие есть способы из фотографии получить g код, который будет на каждый темный пиксель погружать иглу выжигателя в зготовку(как на картинке)?
Насколько я понял, для начала нужно сделать картинку Ч/Б с минимумом уровней серого. А вот дальше я ничего не придумал =(
Буду рад, если кто расскажет свой рецепт или название софта для этого.
ptp00000.jpg (65126 просмотров) <a class='original' href='./download/file.php?id=910&sid=6e754718e4860dc75eb1b61a24a378b2&mode=view' target=_blank>Загрузить оригинал (34.53 КБ)</a>
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение nkp »

raddd писал(а):Can not write to specified file!
посмотреть - файл не определяет или определяет,но писать в него не может:

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

	def generate_gcode(self, arg):
	
		output_file =  self.output_file.get_text() 
		print output_file ,"output_file"
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

ох и далек я от дел софтовых!!
у меня такой строки
nkp писал(а): print output_file ,"output_file"
дописал, вообще незапускается.

вобщем надо в линуксе попробовать.

он тупо немог создать папку)))

я ее создал. прогресс закончился вылетом проги.

файл уп создался с нулевым размером.

ps. ЗАПУСТИЛ!!!

установил"правильно" numpy и пошло!

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

Re: Точечное выжигание - gcode-burner

Сообщение Nick »

C:\mast\gcode-burner.py
Запускать лучше прямо из того же директория.
Хотя... наверное надо бы это пофиксить...
Ты откуда брал версию, с github?
raddd писал(а):Can not write to specified file!
((((
ЗЫ. с админ консоли запускал. тоже самое.
А как ты файл выбирал?


ЗЫ фотос и видео давай :). Надо программу доработать, чтобы такого не случалось, но т.к. все пользователи молчат, ничего дальше не двигается :).
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

запускал прямо из директории.
путь прописал полный и файл лежит в той же папке.
вышло что в винде 8.1 он несмог создать папку для output.ngc
когда я ее создал вручную стало выкидывать (программа завершилась с ошибкой бла-бла-бла)
потом я увидел в косоли питона про numpy и нашел в нете экзешник. c ним и заработало.
до этого я ставил или неставил а просто запустил скачаный numpy где много папок и скрипт install.py

вобщем если сегодня жена отпустит после моих гулянок в мастерскую, чегонибудь граверну и скину фото.

мой иник

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

[Field_names]
feed = Feed
z_traverse = Z traverse
save_to_file = Save Gcode to file
save_options = Save options
dot_width = Dot width
dot_height = Dot height
z_max = Z max
paramtererization = Add parameterization
height = Total height
width = Total width
z_min = Z min
clean-each = Clean head each
aspect = Fix aspect ratio
x_offset = X offet
echo_filter_progress = Echo filter progress
z_func = Z function
y_offset = Y offset

[Global]
clean-gcode = (Add here Gcode to clean the head)
	(Something like G00 X... Y...)
	(Machine will go cleaning each "row", or after reaching some "sum")
layout = vertical
footer = (Default footer)
	M02
checkbuttons_order = aspect save_options save_to_file echo_filter_progress paramtererization
output_file = f:/mast/output.ngc
spinners_order = z_min z_max z_traverse | width height | dot_width dot_height | x_offset y_offset | feed
image-scale = 200
header = (This is simple header)
clean-each = 100
input_file = C:\mast\wolf-sketch.jpg.gif.jpg
z_func = zmin*(1-v)+zmax*v if v<0.9 else None

[CheckButtons]
save_to_file = 1
save_options = 1
paramtererization = 0
aspect = 1
echo_filter_progress = 1

[Spinners]
feed = 400.0
z_traverse = 10.0
dot_width = 0.6
dot_height = 0.6
z_max = 1.0
height = 225.0
width = 300.0
z_min = 0.0
y_offset = 2.6
x_offset = 2.3

и питон

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

#!/usr/bin/env python 
"""
Copyright (C) 2009 Nick Drobchenko, nick@cnc-club.ru
any help can be obtained at cnc-club.ru 
Russian forum: http://cnc-club.ru/forum/viewforum.php?f=15  
English forum: http://cnc-club.ru/forum/viewforum.php?f=33

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
"""



import getopt, sys, os, pygtk, gtk

class Burner: 
	def destroy(self, widget, data=None):
		gtk.main_quit()

	def usage():
		print "Usage is not ready yet. See help button inside gcode-burner." # TODO

	def help(self, widget):
		self.help_dialog = gtk.MessageDialog(self.window,
                                flags = gtk.DIALOG_DESTROY_WITH_PARENT,
                                 type=gtk.MESSAGE_INFO,
	                             buttons=gtk.BUTTONS_OK,
	                             message_format=None);
		f = open("gcode-burner.info", "r")
		self.help_dialog.set_markup(f.read())
		f.close()
		self.help_dialog.run()
		self.help_dialog.destroy()

#		g_signal_connect_swapped (dialog, "response",
 #                         G_CALLBACK (gtk_widget_destroy),
  #                        dialog);



	def set_image(self, widget=None):
		input_file =  self.input_file.get_filename() 
		if  input_file == None : 
			input_file = self.args_input_file
		
		if not os.path.isfile(input_file):
			message = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_OK, message_format=None)
			message.set_markup('Wrong file!')
			message.run()
			message.destroy()
			return
		try :
			self.pixbuf = gtk.gdk.pixbuf_new_from_file(input_file)			
		except :
			message = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_NONE, message_format=None)
			message.set_markup('Wrong image!')
			message.run()
			message.destroy()
			return
		self.w, self.h = self.pixbuf.get_width(), self.pixbuf.get_height()  
		if self.w==0 or self.h==0 : 
			print '(Wrong img)'
			return
		scale = float(self.config.get('Global','image-scale'))
		if self.w>self.h : scaled_buf = self.pixbuf.scale_simple(int(scale),int(scale*self.h/self.w),gtk.gdk.INTERP_BILINEAR)
		else :   scaled_buf = self.pixbuf.scale_simple(int(scale*self.w/self.h),int(scale),gtk.gdk.INTERP_BILINEAR)
		self.image.set_from_pixbuf(scaled_buf)


	def generate_gcode(self, arg):
	
		output_file =  self.output_file.get_text() 

		if self.checkbuttons['save_to_file'].get_active():
			try :
				f = open(output_file,'w')	
			except:
				message = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_NONE, message_format=None)
				message.set_markup('Can not write to specified file!')
				message.run()
				message.destroy()
				return
#		self.pixbuf = self.pixbuf.add_alpha(False,0,0,0)
		pixels = self.pixbuf.get_pixels_array()
#		print  self.pixbuf.get_pixels_array()
#		rowstride = self.pixbuf.get_rowstride()
#		l = len(pixels)
#		ch = self.pixbuf.get_n_channels()

		zmin,zmax,ztr,x,y,x0,y0,feed = [self.spin_buttons[key].get_value() for key in 'z_min z_max z_traverse dot_width dot_height x_offset y_offset feed'.split()]
		header = self.header.get_text(self.header.get_start_iter(),self.header.get_end_iter())
		clean = self.clean_gcode.get_text(self.clean_gcode.get_start_iter(),self.clean_gcode.get_end_iter())
		clean_each = self.clean_each.get_text().lower()
		try :
			clean_v = float(clean_each)
		except :
			clean_v = None
		if 	clean_v <= 0 : clean_v = None
		v_sum = 0.	
		gcode = header
		
		parameterize = self.checkbuttons['paramtererization'].get_active() 
		if parameterize :
			gcode += """
			#<x-offset> = %s
			#<y-offset> = %s
			#<z-offset> = 0
			#<x-scale>  = 1
			#<y-scale>  = 1
			#<z-scale>  = 1
			#<z-traverse>  = %s
			#<feed>		= %s
			"""%(x0,y0,ztr,feed)
			gcode += '\n(Header end)\n' 
			gcode += 'G0 Z#<z-traverse>\n'
			gcode += 'G0 X#<x-offset> Y#<y-offset>\n' 
			gcode += 'G1 X#<x-offset> Y#<x-offset> F#<feed>\n'
		else: 
			gcode += '\n(Header end)\n' 
			gcode += 'G0 Z%f\n' %(ztr)  
			gcode += 'G0 X%f Y%f\n' %(x0, y0)  
			gcode += 'G1 X%f Y%f F%f\n' %(x0, y0, feed)  
			
		gcodel = []
		for j in range(len(pixels[0])):
			if 	"row" in clean_each :
				gcodel.append(clean+"\n")
			if self.checkbuttons['echo_filter_progress'].get_active():
				print "FILTER_PROGRESS=%d" % int(100*j/len(pixels[0]))
			for i in range(len(pixels)):
				#xy = j*rowstride+i*ch
				r = pixels[i][j][0]
				g = pixels[i][j][1]
				b = pixels[i][j][2]
				v = float(r+g+b)/255/3
				v_sum += 1.-v
				if clean_v!=None and v_sum > clean_v : 
					gcodel.append(clean+"\n")
					v_sum = 0
				if v!=0:
					depth = eval(self.z_func.get_text())
					if depth != None:
						if parameterize :
							gcodel.append( 'G0 X[%s*#<x-scale>+#<x-offset>] Y[%s*#<y-scale>+#<y-offset>]\n' %(x*i, y*j) ) 
							gcodel.append( 'G1 Z[%s*#<z-scale>+#<z-offset>]\n' % depth )
							gcodel.append( 'G0 Z#<z-traverse>\n' )
						else :
							gcodel.append( 'G0 X%f Y%f\n' %(x0+x*i, y0+y*j) ) 
							gcodel.append( 'G1 Z%f\n' % depth )
							gcodel.append( 'G0 Z%f\n' %(ztr) )
							
		gcode +="".join(gcodel) 		
		footer = self.footer.get_text(self.footer.get_start_iter(),self.footer.get_end_iter())
		gcode += '(Footer start)\n'+footer
	
		if self.checkbuttons['save_to_file'].get_active(): 
			f.write(gcode)
			f.close()
		else :
			print gcode

		if self.checkbuttons['save_options'].get_active():
			for key in self.spin_buttons :
				self.config.set('Spinners', key, self.spin_buttons[key].get_value())
			for key in self.checkbuttons:
				self.config.set('CheckButtons', key, 1 if self.checkbuttons[key].get_active() else 0)
			self.config.set('Global', 'header', header)
			self.config.set('Global', 'footer', footer)
			self.config.set('Global', 'clean-gcode', clean)
			
		input_file =  self.input_file.get_filename() 
		if  input_file == None : 
			input_file = self.args_input_file

		self.config.set('Global', 'input_file', input_file)	
		self.config.set('Global', 'output_file', output_file)

		self.config.set('Global', 'clean-each', self.clean_each.get_text())
		self.config.set('Global', 'z_func', self.z_func.get_text())
		
			
		f = open('C:\mast\gcode-burner.ini',"w")
		self.config.write(f)			
		f.close()
		self.destroy(None,None)		

	def change_spinners(self, widget, key):
		if self.change_spinners_lock : return
		self.change_spinners_lock = True
		if key == 'dot_width': 
			self.spin_buttons['width'].set_value(self.w * self.spin_buttons[key].get_value()) 
		if key == 'width': 
			self.spin_buttons['dot_width'].set_value(self.spin_buttons[key].get_value()/self.w) 
		if key == 'dot_height': 
			self.spin_buttons['height'].set_value(self.h * self.spin_buttons[key].get_value()) 
		if key == 'height': 
			self.spin_buttons['dot_height'].set_value(self.spin_buttons[key].get_value()/self.h) 
		if self.checkbuttons["aspect"].get_active():
			if key in ['dot_width', 'width'] :
				self.spin_buttons['height'	  ].set_value(self.spin_buttons['width'].get_value() * self.h / self.w)
				self.spin_buttons['dot_height'].set_value(float(self.spin_buttons['height'].get_value()) / self.h)
			else :
				self.spin_buttons['width'].set_value(self.spin_buttons['height'].get_value() * self.w / self.h)
				self.spin_buttons['dot_width'].set_value(float(self.spin_buttons['width'].get_value()) / self.w)
			
		self.change_spinners_lock = False


	def show_filename(self, widget):
		if widget.get_active():
			self.output_file.show()
		else:
			self.output_file.hide()
	

	def __init__(self):
		self.change_spinners_lock = False

		
		import ConfigParser
		self.config = ConfigParser.RawConfigParser()
		self.config.read('C:\mast\gcode-burner.ini')
		spinners = dict(self.config.items('Spinners'))
		field_names = dict(self.config.items('Field_names'))
		spinners_order =  self.config.get('Global','spinners_order').split()
		checkbuttons_order =  self.config.get('Global','checkbuttons_order').split()
		layout = self.config.get('Global','layout')

		try:
			opts, args = getopt.getopt(sys.argv[1:], "hi:", ["help", "input=" ])
		except getopt.GetoptError, err:
			# print help information and exit:
			print str(err) # will print something like "option -a not recognized"
			usage()
			sys.exit(2)
		input_file = None
		for o, a in opts:
			if o in ("-h", "--help"):
				usage()
				sys.exit()
			else:
				assert False, "unhandled option"

		if args == [] : 
			self.args_input_file = self.config.get('Global','input_file')
		else :		
			self.args_input_file = args[0]

		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.window.connect("destroy", self.destroy)
		table = gtk.Table(2+len(spinners_order) + len(checkbuttons_order)+1,4)

		i = 0 
		self.image = gtk.Image()
		if layout == "vertical" :	
			table.attach(self.image, 0, 3, 0, 1)
		else : 
			table.attach(self.image, 3, 4, 1, 2+len(spinners_order) + len(checkbuttons_order)+1)
		i += 1	
		
		self.input_file = gtk.FileChooserButton('Open image', backend=None)
		table.attach(self.input_file, 0, 2, i, i+1, xoptions=gtk.FILL)
		self.args_input_file = os.path.realpath(self.args_input_file)
		self.input_file.select_filename(self.args_input_file)
		self.input_file.connect("file-set", self.set_image)   
		self.set_image()
		i += 1	
		
		self.spin_buttons = {}

		self.z_func = gtk.Entry()
		self.z_func.set_text(self.config.get('Global','z_func'))
		table.attach(gtk.Label('Z function'), 0, 1, i, i+1)
		table.attach(self.z_func, 1, 2, i, i+1)
		i += 1

		for key in spinners_order:
			if key == '|':
				table.attach(gtk.HSeparator(), 0, 2, i, i+1, xoptions=gtk.FILL)
				i += 1
				continue
				
			adj = gtk.Adjustment(float(spinners[key]), -100000.0, 100000.0, 0.1, 100.0, 0.0)
			self.spin_buttons[key] = gtk.SpinButton(adjustment=adj, climb_rate=0.1, digits=5)
			table.attach(self.spin_buttons[key], 1, 2, i, i+1, xoptions=gtk.FILL)
			table.attach(gtk.Label(field_names[key]), 0, 1, i, i+1, xoptions=gtk.FILL)
			adj.connect("value_changed", self.change_spinners, key)
			i += 1

		self.clean_each = gtk.Entry()
		self.clean_each.set_text(self.config.get('Global','clean-each'))
		table.attach(gtk.Label(self.config.get('Field_names','clean-each')), 0, 1, i, i+1)
		table.attach(self.clean_each, 1, 2, i, i+1)
		i += 1


		self.checkbuttons = {}
		j = 0
		for key in checkbuttons_order:
			self.checkbuttons[key] = gtk.CheckButton(field_names[key])
			self.checkbuttons[key].set_active( bool(int(self.config.get('CheckButtons',key))) )
			table.attach(self.checkbuttons[key], j, j+1, i, i+1, xoptions=gtk.FILL)
			j = (j+1)%2 
			if j==0 : 
				i += 1


		if j != 0 :			
			i += 1
		self.output_file = gtk.Entry()
		self.output_file.set_text(self.config.get('Global','output_file'))

		self.checkbuttons['save_to_file'].connect("toggled",self.show_filename)
		table.attach(gtk.Label('File name'), 0, 1, i, i+1)
		table.attach(self.output_file, 1, 2, i, i+1)
		i += 1		
	
		button = gtk.Button("Generate Gcode")
		table.attach(button, 2, 3, i, i+1)
		button.connect("clicked", self.generate_gcode)		

		button = gtk.Button("Help")
		table.attach(button, 0, 1, i, i+1)
		button.connect("clicked", self.help)		
		
		i += 1		

		frame = gtk.Frame('Header')
		textview = gtk.TextView()
		self.header = textview.get_buffer()
		self.header.set_text(self.config.get('Global','header'))
		textview.set_wrap_mode(gtk.WRAP_NONE)
		sw = gtk.ScrolledWindow()


		sw.set_size_request(250,150)
		frame.add(sw)
		sw.add(textview)
		table.attach(frame,2,3,1,7, xoptions=gtk.EXPAND | gtk.FILL, yoptions=gtk.EXPAND | gtk.FILL, xpadding=5, ypadding=5 )


		frame = gtk.Frame('Footer')
		textview = gtk.TextView()
		self.footer = textview.get_buffer()
		self.footer.set_text(self.config.get('Global','footer'))
		textview.set_wrap_mode(gtk.WRAP_NONE)
		sw = gtk.ScrolledWindow()
		frame.add(sw)
		sw.add(textview)
		table.attach(frame,2,3,7,15, xoptions=gtk.EXPAND | gtk.FILL , yoptions=gtk.EXPAND | gtk.FILL, xpadding=5, ypadding=5 )


		frame = gtk.Frame('Clean Gcode')
		textview = gtk.TextView()
		self.clean_gcode = textview.get_buffer()
		self.clean_gcode.set_text(self.config.get('Global','clean-gcode'))
		textview.set_wrap_mode(gtk.WRAP_NONE)
		sw = gtk.ScrolledWindow()
		frame.add(sw)
		sw.add(textview)
		table.attach(frame,2,3,15,21, xoptions=gtk.EXPAND | gtk.FILL , yoptions=gtk.EXPAND | gtk.FILL, xpadding=5, ypadding=5 )

		
		self.window.add(table)
		self.window.show_all()		
		

def main():
	gtk.main()
	return 0	

if __name__ == "__main__":
	Burner()
	main()

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

Re: Точечное выжигание - gcode-burner

Сообщение Nick »

О, кстати забыл дописать, вчера чуть переделал скрипт, теперь должно запускаться из любой папки.
Плюс для выбора файла куда писать Gкод добавил кнопку с диалогом.
Все на github
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

гуд! Сегодня потестим!
||||||||||||
||||||||||||
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

настройкі и изображения
11.png (3873 просмотра) <a class='original' href='./download/file.php?id=52524&sid=6e754718e4860dc75eb1b61a24a378b2&mode=view' target=_blank>Загрузить оригинал (84.11 КБ)</a>
закончу скину фото
Вложения
1434614621.jpg (3833 просмотра) <a class='original' href='./download/file.php?id=52569&sid=6e754718e4860dc75eb1b61a24a378b2&mode=view' target=_blank>Загрузить оригинал (125.72 КБ)</a>
Последний раз редактировалось raddd 18 июн 2015, 11:10, всего редактировалось 2 раза.
||||||||||||
||||||||||||
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

и "сразу вопрос" (с) обратный ход холостой, как бы испрвить?
||||||||||||
||||||||||||
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

Nick писал(а):Ну так тупо поменяй их местами.
Или напиши в функции: zmin*(v)+zmax*(1-v) if v<0.9 else None
или
zmin*(v)+zmax*(1-v) if v>0.1 else None
Главная мысль - эта функция должна выдавать заглубление или None если вообще точки не надо.
параметры v - светимость точки от 0 до 1, zmin,zmax из формы.
Nick, опиши пожалуйста подробней значения энтих функций.

как скажем настроить белое=z0 черное=z-2

а то выходит так, что и белое гравирует и черное с разницей в 1мм т.е. белое=z-1 черное=z-2
Вложения
вот мои настройки (3852 просмотра) <a class='original' href='./download/file.php?id=52564&sid=6e754718e4860dc75eb1b61a24a378b2&mode=view' target=_blank>Загрузить оригинал (73.38 КБ)</a>
вот мои настройки
||||||||||||
||||||||||||
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

фотик еще спит, как проснется скину этого "волка" на дсп
||||||||||||
||||||||||||
Аватара пользователя
tooshka
Почётный участник
Почётный участник
Сообщения: 1803
Зарегистрирован: 24 окт 2012, 14:26
Репутация: 209
Настоящее имя: Андрей
Откуда: Нижний Новгород
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение tooshka »

raddd писал(а):и "сразу вопрос" (с) обратный ход холостой, как бы испрвить?
Что всегда радует в программерах))) так это "прекрасные" интерфейсы. Видимо логика совсем другая.
Милая, ты услышь меня
под окном стою со своим я ЧПУ! (Протяжно; с надрывом; форте)
Внимание!!! Чрезмерное увлечение ЧПУ приводит к проблемам в семейных отношениях!
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

Вот здесь как я и хотел http://www.cnc-club.ru/forum/viewtopic. ... 42#p201142
Но! Чтобы сделать шаг 2мм и размер 200х200мм пришлось резать картинку до 100х100 пикселей.
Можно ли это решать прямо в скрипте?(когда ввожу шаг автоматом меняется размер. И наоборот)
Ну и настройки мне пока непонятны.
||||||||||||
||||||||||||
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение Nick »

А я всегда говорил, что в Программировании самое сложное, это написать красивый интерфейс. :tongue:
raddd писал(а):Nick, опиши пожалуйста подробней значения энтих функций.
Скинь свою картинку.
Там просто двухцветное, или grayscale?

Функция работает так. Все, что в поле Function передается в питоновский eval. При этом можно использовать параметры V - интенсивность точки от 0 до 1, zmin и zmax.

Если тебе просто черное и белое, то пишем
zmin if v>0.5 else zmax
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение Nick »

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

Re: Точечное выжигание - gcode-burner

Сообщение Nick »

Я б по больше заглубление в точках делал - так контрастность маленькая, или расстояние между ними по меньше...
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

Nick писал(а):Холостой ход, в смысле сделать по G0 обратно?
Не.. чтобы каждую строку не слево на право. А туда и обратно резало. (Первая слево направо.вторая справо на лево.третья слевонаправо и т.д. извиняюсь за такой стиль описания ну уж как умею)))

Вот мне и интересно как сделать точки глубже.
А шаг основная причина почему я неиспользую "виндовый" софт там 1мм максимум! Вот захотел я своей жены портрет на фасад кухни 400х500 по 1мм это доооолго и излишне а 2 мм какраз)))

"Виндовы" софт это дровопал вроде называется
||||||||||||
||||||||||||
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

Вот как вышло под виндой.
Таже картинка 100х100 пикселей
Глубина черного 2мм
Белого 0мм
И естественно выло размеро м 100х100мм а хотел 200х200 от туда и вопрос с масштабированием Gкода и освоением других приложений.
Вложения
IMG_20150618_113648.jpg (3820 просмотров) <a class='original' href='./download/file.php?id=52571&sid=6e754718e4860dc75eb1b61a24a378b2&mode=view' target=_blank>Загрузить оригинал (494.94 КБ)</a>
Clipboarder.2015.06.18-002.png (3818 просмотров) <a class='original' href='./download/file.php?id=52572&sid=6e754718e4860dc75eb1b61a24a378b2&mode=view' target=_blank>Загрузить оригинал (411.5 КБ)</a>
||||||||||||
||||||||||||
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение Nick »

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

Re: Точечное выжигание - gcode-burner

Сообщение Nick »

вроде сделал зиг-заг... проверяй
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 540
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Точечное выжигание - gcode-burner

Сообщение raddd »

ооооо!!!! уже в Жкоде віжу то что надо!!!

ставлю под фрезу!!!
||||||||||||
||||||||||||
Ответить

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