#!/usr/local/bin/python """ Arc Buddy G-Code Generator Version 1.2 Copyright (C) <2008> 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 3 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, see . e-mail me any suggestions to "jet1024 at semo dot net" If you make money using this software you must donate $20 USD to a local food bank or the food police will get you! Think of others from time to time... To make it a menu item in Ubuntu use the Alacarte Menu Editor and add the command python YourPathToThisFile/face.py make sure you have made the file execuatble by right clicking and selecting properties then Permissions and Execute To use with EMC2 see the instructions at: http://wiki.linuxcnc.org/cgi-bin/emcinfo.pl?Simple_EMC_G-Code_Generators Modified by Sebastian Jardi Estadella to work with gEdit. What I (Sebastian) have changed or Add: Default values in the Entry Widgets to don't have 'ValueError: empty string for float()ValueError: empty string for float()' when push Showme if you have empty fields. Check for empty fields in Entrys before DoIt() Returns two lines of gcode: StartPoint and Arc GCode by StandardOut that insert gcode when run from gEdit. I have changed 'Write to Axis and Quit" / "Quit" button by "Write to Axis and Quit" / "Ok" Button. And add an allwais "Quit" button. To use in gEdit to insert the generated GCode, in gEdit (Spanish) do: Herramientas - Herramientas Externas - Nuevo Change 'Herramiento Nueva' by 'GCode - ArcBuddy' Descripcion: 'Create Arcs in GCode.' Comando(s): python /home/'usr'/emc2/arcbuddy-sje.py Entrada: Ninguno Salida: Insertar en la posicion del cursor. Aplicabilidad: Todos los documentos. In gEdit English do: Tools - External Tools - New Change 'New Tool' by 'GCode - ArcBuddy' Description: 'Create Arcs in GCode' Command(s): python /home/'usr'/emc2/arcbuddy-sje.py Input: Nothing Output: Insert in cursor position. Apliability: All Documents. Now when you create you gcode in gEdit go to: Tools - GCode - ArcBuddy Insert the required data. Click in OK button. The generated GCode will be inserted in cursor position. I have marked my changes from original code with a comment "Add or modified by Sebastian" email: sje at tinet dot org http://www.tinet.org/~sje/cnc/laser_eng.htm """ from Tkinter import * from math import * import os IN_AXIS = os.environ.has_key("AXIS_PROGRESS_BAR") class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.grid() self.createWidgets() def createWidgets(self): self.PreviewFrame = Frame(self,bd=5) self.PreviewFrame.grid(row=0, column=0) self.PreviewCanvas = Canvas(self.PreviewFrame,width=300, height=300, bg='white') self.PreviewCanvas.grid(sticky=N+S+E+W) self.XLine = self.PreviewCanvas.create_line(75,150,225,150) self.YLine = self.PreviewCanvas.create_line(150,75,150,225) self.Deg0 = self.PreviewCanvas.create_text(245, 150, text='0 X+') self.Deg90 = self.PreviewCanvas.create_text(150, 60, text='Y+\n90') self.Deg180 = self.PreviewCanvas.create_text(50, 150, text='X- 180') self.Deg270 = self.PreviewCanvas.create_text(150, 240, text='270\nY-') self.EntryFrame = Frame(self,bd=5) self.EntryFrame.grid(row=0, column=1) self.st00 = Label(self.EntryFrame, text='Figure out the G2/3 Code') self.st00.grid(row=0, column=0, columnspan=2) self.st01 = Label(self.EntryFrame, text='X Center of Arc') self.st01.grid(row=1, column=0) self.XArcCenterVar = StringVar() self.XArcCenterVar.set("0") # Default value, add by Sebastian self.XArcCenter = Entry(self.EntryFrame, textvariable=self.XArcCenterVar ,width=15) self.XArcCenter.grid(row=1, column=1) self.st02 = Label(self.EntryFrame, text='Y Center of Arc') self.st02.grid(row=2, column=0) self.YArcCenterVar = StringVar() self.YArcCenterVar.set("0") # Default value, add by Sebastian self.YArcCenter = Entry(self.EntryFrame, textvariable=self.YArcCenterVar ,width=15) self.YArcCenter.grid(row=2, column=1) self.st03 = Label(self.EntryFrame, text='Diameter of Arc') self.st03.grid(row=3, column=0) self.ArcDiameterVar = StringVar() self.ArcDiameterVar.set("1") # Default value, add by Sebastian self.ArcDiameter = Entry(self.EntryFrame, textvariable=self.ArcDiameterVar ,width=15) self.ArcDiameter.grid(row=3, column=1) self.st04 = Label(self.EntryFrame, text='Start Angle') self.st04.grid(row=4, column=0) self.StartAngleVar = StringVar() self.StartAngleVar.set("0") #Default value, add by Sebastian self.StartAngle = Entry(self.EntryFrame, textvariable=self.StartAngleVar ,width=15) self.StartAngle.grid(row=4, column=1) self.st05 = Label(self.EntryFrame, text='End Angle') self.st05.grid(row=5, column=0) self.EndAngleVar = StringVar() self.EndAngleVar.set("45") # Default value, add by Sebastian self.EndAngle = Entry(self.EntryFrame, textvariable=self.EndAngleVar ,width=15) self.EndAngle.grid(row=5, column=1) self.st05 = Label(self.EntryFrame, text='Direction') self.st05.grid(row=6, column=0) self.DirectionVar = IntVar() Radiobutton(self.EntryFrame, text='CCW', value=0, variable=self.DirectionVar)\ .grid(row=6, column=1, sticky = W) Radiobutton(self.EntryFrame, text='CW', value=1, variable=self.DirectionVar)\ .grid(row=6, column=1, sticky = E) self.sp00 = Label(self.EntryFrame, text=' ') self.sp00.grid(row=7) self.st06 = Label(self.EntryFrame, text='Starting Point for the Arc') self.st06.grid(row=8, column=0, columnspan=2) self.StartPointVar = StringVar() self.StartPoint = Entry(self.EntryFrame, width=30, textvariable = self.StartPointVar) self.StartPoint.grid(row=9, column=0, columnspan=2) self.st06 = Label(self.EntryFrame, text='G Code for the Arc') self.st06.grid(row=10, column=0, columnspan=2) self.ArcCodeVar = StringVar() self.ArcCode = Entry(self.EntryFrame, width=35, textvariable = self.ArcCodeVar) self.ArcCode.grid(row=11, column=0, columnspan=2) self.sp01 = Label(self.EntryFrame, text=' ') self.sp01.grid(row=12) self.DoItButton = Button(self.EntryFrame, text='Show Me', command=self.DoIt) self.DoItButton.grid(row=13, column=0) self.ToClipboard = Button(self.EntryFrame, text='To Clipboard', command=self.CopyClipboard) self.ToClipboard.grid(row=13, column=1) # Modified by Sebastian if IN_AXIS: self.OkButton = Button(self, text='Write to AXIS and Quit', command=self.WriteToAxis) else: self.OkButton = Button(self, text='Ok', command=self.WriteStdOut) self.OkButton.grid(row=14, column=0) self.quitButton = Button(self, text='Quit', command=self.quit) self.quitButton.grid(row=14, column=1) def DoIt(self): # draw the arc try: self.PreviewCanvas.delete(self.ArcId) except AttributeError: pass # if sentences add by Sebastian if len(self.XArcCenterVar.get())==0: # If field is empty self.XArcCenterVar.set('0') # set it to Default value. self.XArcCenterN = float(self.XArcCenterVar.get()) if len(self.YArcCenterVar.get())==0: self.YArcCenterVar.set('0') self.YArcCenterN = float(self.YArcCenterVar.get()) if len(self.StartAngleVar.get())==0: self.StartAngleVar.set('0') self.ArcStart = float(self.StartAngleVar.get()) if len(self.EndAngleVar.get())==0: self.EndAngleVar.set('45') self.ArcEnd = float(self.EndAngleVar.get()) self.ArcDirection = float(self.DirectionVar.get()) if self.ArcDirection == 0: #CCW if self.ArcStart < self.ArcEnd: self.ArcDegrees = self.ArcEnd - self.ArcStart elif self.ArcStart > self.ArcEnd: self.ArcDegrees = (360 - self.ArcStart) + self.ArcEnd elif self.ArcStart == self.ArcEnd: self.ArcDegrees = 360 self.ArcId = self.PreviewCanvas.create_arc(75,75,225,225,extent=self.ArcDegrees,\ start=self.ArcStart, style='arc') elif self.ArcDirection == 1: # CW if self.ArcStart > self.ArcEnd: self.ArcDegrees = self.ArcStart - self.ArcEnd elif self.ArcStart < self.ArcEnd: self.ArcDegrees = (360 - self.ArcEnd) + self.ArcStart elif self.ArcStart == self.ArcEnd: self.ArcDegrees = 360 self.ArcId = self.PreviewCanvas.create_arc(75,75,225,225,extent=self.ArcDegrees,\ start=self.ArcEnd, style='arc') #print self.ArcDegrees # Commented by Sebastian # generate the G code if len(self.ArcDiameterVar.get())==0: # Add by Sebastian self.ArcDiameterVar.set('1') # Default value self.ArcRadius = float(self.ArcDiameterVar.get())/2 # find the X and Y start point and offset if self.ArcStart <= 90: # Quadrant 1 self.XStart = self.XArcCenterN + (self.ArcRadius * cos(radians(self.ArcStart))) self.YStart = self.YArcCenterN + (self.ArcRadius * sin(radians(self.ArcStart))) self.StartPointVar.set('X%3.4f Y%3.4f' %(self.XStart, self.YStart)) self.IOffset = -(self.XStart - self.XArcCenterN) self.JOffset = -(self.YStart - self.YArcCenterN) elif self.ArcStart > 90 and self.ArcStart <= 180: # Quadrant 2 self.XStart = self.XArcCenterN - (self.ArcRadius*sin(radians(self.ArcStart-90))) self.YStart = self.YArcCenterN + (self.ArcRadius*cos(radians(self.ArcStart-90))) self.StartPointVar.set('X%3.4f Y%3.4f' %(self.XStart, self.YStart)) self.IOffset = abs(self.XStart - self.XArcCenterN) self.JOffset = -(self.YStart - self.YArcCenterN) elif self.ArcStart > 180 and self.ArcStart <= 270: # Quadrant 3 self.XStart = self.XArcCenterN - (self.ArcRadius*cos(radians(self.ArcStart-180))) self.YStart = self.YArcCenterN - (self.ArcRadius*sin(radians(self.ArcStart-180))) self.StartPointVar.set('X%3.4f Y%3.4f' %(self.XStart, self.YStart)) self.IOffset = abs(self.XStart - self.XArcCenterN) self.JOffset = abs(self.YStart - self.YArcCenterN) elif self.ArcStart > 270 and self.ArcStart <= 360: # Quadrant 4 self.XStart = self.XArcCenterN + (self.ArcRadius*sin(radians(self.ArcStart-270))) self.YStart = self.YArcCenterN - (self.ArcRadius*cos(radians(self.ArcStart-270))) self.StartPointVar.set('X%3.4f Y%3.4f' %(self.XStart, self.YStart)) self.IOffset = -(self.XStart - self.XArcCenterN) self.JOffset = self.YStart + self.YArcCenterN # find the X and Y end point if self.ArcEnd <= 90: # Quadrant 1 self.XEnd = self.XArcCenterN + (self.ArcRadius * cos(radians(self.ArcEnd))) self.YEnd = self.YArcCenterN + (self.ArcRadius * sin(radians(self.ArcEnd))) self.ArcEndPoint = 'X%3.4f Y%3.4f' %(self.XStart, self.YStart) elif self.ArcEnd > 90 and self.ArcEnd <= 180: # Quadrant 2 self.XEnd = self.XArcCenterN - (self.ArcRadius*sin(radians(self.ArcEnd-90))) self.YEnd = self.YArcCenterN + (self.ArcRadius*cos(radians(self.ArcEnd-90))) self.ArcEndPoint = 'X%3.4f Y%3.4f' %(self.XStart, self.YStart) elif self.ArcEnd > 180 and self.ArcEnd <= 270: # Quadrant 3 self.XEnd = self.XArcCenterN - (self.ArcRadius*cos(radians(self.ArcEnd-180))) self.YEnd = self.YArcCenterN - (self.ArcRadius*sin(radians(self.ArcEnd-180))) self.ArcEndPoint = 'X%3.4f Y%3.4f' %(self.XStart, self.YStart) elif self.ArcEnd > 270 and self.ArcEnd <= 360: # Quadrant 4 self.XEnd = self.XArcCenterN + (self.ArcRadius*sin(radians(self.ArcEnd-270))) self.YEnd = self.YArcCenterN - (self.ArcRadius*cos(radians(self.ArcEnd-270))) self.ArcEndPoint = 'X%3.4f Y%3.4f' %(self.XStart, self.YStart) if self.ArcDirection == 0: # CCW self.ArcCodeVar.set('G3 X%.4f Y%.4f I%.4f J%.4f' \ %(self.XEnd, self.YEnd, self.IOffset, self.JOffset)) elif self.ArcDirection == 1: # CW self.ArcCodeVar.set('G2 X%.4f Y%.4f I%.4f J%.4f' \ %(self.XEnd, self.YEnd, self.IOffset, self.JOffset)) def CopyClipboard(self): self.DoIt() # Add by Sebastian self.ArcCode.clipboard_clear() self.StartPoint.clipboard_append(self.StartPoint.get() + "\r\n") # Add by Sebastian self.ArcCode.clipboard_append(self.ArcCode.get() + "\r\n") def WriteToAxis(self): sys.stdout.write(self.g_code.get(0.0, END)) self.quit() def WriteStdOut(self): # Add by Sebastian self.DoIt() sys.stdout.write(self.StartPoint.get() + "\r\n") sys.stdout.write(self.ArcCode.get() + "\r\n") self.quit() app = Application() app.master.title("Arc Buddy 1.2") app.mainloop()