cyclone-pcb-factory/Software/Send/pyGcodeViewer/pygcodeviewer.py

846 lines
25 KiB
Python

#!/usr/bin/python
# coding: UTF-8
import wx
from string import *
from math import *
#from struct import *
import os
import sys
#import datetime
import locale
import re
#import time
#Global Constant
HUGE = 1e10
TINY = 1e-6
#MERGINE = 1e-6
INCH = 25.4 #mm
MIL = INCH/1000
WINDOW_X = 800
WINDOW_Y = 600
CENTER_X=200.0
CENTER_Y=200.0
#For file
IN_INCH_FLAG = 0
GCODE_EXT = '*.gcode'
#View
DEF_COLOR = 'BLACK' #black
#Global variable
gXMIN = HUGE
gXMAX = -HUGE
gYMIN = HUGE
gYMAX = -HUGE
gZMIN = HUGE
gZMAX = -HUGE
gXSHIFT = 0
gYSHIFT = 0
gGCODE_DATA = ""
gGCODES = []
gUNIT = 1
#For Drawing
gTHETA = pi/4.0
gPHI = pi/4.0
gPSI = 0.0
gVIEW_POINT = 0
gPATTERNS = []
gDRAWCONTOUR = []
gMAG = 1.0
gPRE_X = CENTER_X
gPRE_Y = CENTER_X
gMAG_MIN = 0.1
gMAG_MAX = 500.0
gDRAW_XSHIFT = 0.0
gDRAW_YSHIFT = 0.0
gDRAW_ZSHIFT = 0.0
gCENTER_X = 0.0
gCENTER_Y = 0.0
gCENTER_Z = 0.0
gDISP_GERBER = 1
gDISP_DRILL = 0
gDISP_EDGE = 0
gDISP_CONTOUR = 0
gMOVE_COLOR = 'BLUE'
gCOLORS = [
'AQUAMARINE','BLACK','BLUE','BLUE VIOLET','BROWN',
'CADET BLUE','CORAL','CORNFLOWER BLUE','CYAN','DARK GREY',
'DARK GREEN', 'DARK OLIVE GREEN', 'DARK ORCHID', 'DARK SLATE BLUE', 'DARK SLATE GREY',
'DARK TURQUOISE', 'DIM GREY', 'FIREBRICK', 'FOREST GREEN', 'GOLD',
'GOLDENROD', 'GREY', 'GREEN', 'GREEN YELLOW', 'INDIAN RED',
'KHAKI', 'LIGHT BLUE', 'LIGHT GREY', 'LIGHT STEEL BLUE', 'LIME GREEN',
'MAGENTA', 'MAROON', 'MEDIUM AQUAMARINE', 'MEDIUM BLUE', 'MEDIUM FOREST GREEN',
'MEDIUM GOLDENROD', 'MEDIUM ORCHID', 'MEDIUM SEA GREEN', 'MEDIUM SLATE BLUE', 'MEDIUM SPRING GREEN',
'MEDIUM TURQUOISE', 'MEDIUM VIOLET RED', 'MIDNIGHT BLUE', 'NAVY', 'ORANGE',
'ORANGE RED', 'ORCHID', 'PALE GREEN', 'PINK', 'PLUM',
'PURPLE', 'RED', 'SALMON', 'SEA GREEN', 'SIENNA',
'SKY BLUE', 'SLATE BLUE', 'SPRING GREEN', 'STEEL BLUE', 'TAN',
'THISTLE ', 'TURQUOISE', 'VIOLET', 'VIOLET RED', 'WHEAT',
'WHITE', 'YELLOW', 'YELLOW GREEN'
]
gMouseLeftDown = [0]*3
gMouseRightDown = [0]*3
#Window
class MainFrame(wx.Frame):
def __init__(self, parent, id, title):
global WINDOW_X, WINDOW_Y, gVIEW_POINT
wx.Frame.__init__(self, parent, id, title, size=(WINDOW_X, WINDOW_Y))
# Setting up the menu.
filemenu= wx.Menu()
menuOpen = filemenu.Append(wx.ID_OPEN,"&Open"," Open files")
menuReload = filemenu.Append(wx.ID_REVERT,"&Reload"," Reload files")
menuExit = filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program")
#setupmenu = wx.Menu()
#menuMachine = setupmenu.Append(wx.ID_SETUP,"&Machine setup"," Setup Machine")
#menuConv = setupmenu.Append(wx.ID_VIEW_LIST,"&Convert setup"," Convert setup")
# Creating the menubar.
menuBar = wx.MenuBar()
menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
#menuBar.Append(setupmenu,"&Setup") # Adding the "filemenu" to the MenuBar
self.SetMenuBar(menuBar) # Adding the MenuBar to the Frame content.
#Event for Menu bar
self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)
self.Bind(wx.EVT_MENU, self.OnReload, menuReload)
self.Bind(wx.EVT_MENU, self.OnExit, menuExit)
#self.Bind(wx.EVT_MENU, self.OnConvSet, menuConv)
#self.Bind(wx.EVT_MENU, self.OnSetup, menuMachine)
panel = wx.Panel(self, -1)
#panel.SetBackgroundColour('WHITE')
vbox = wx.BoxSizer(wx.VERTICAL)
#Display set
panel1 = wx.Panel(panel, -1)
#box1 = wx.StaticBox(panel1, -1, 'Display data')
#sizer1 = wx.StaticBoxSizer(box1, orient=wx.VERTICAL)
#grid1 = wx.GridSizer(2, 5, 0, 5)
#self.cb1 = wx.CheckBox(panel1, -1, 'Pattern data')
#self.cb1.SetValue(gDISP_GERBER)
#grid1.Add(self.cb1)
#self.cb2 = wx.CheckBox(panel1, -1, 'Drill data')
#self.cb2.SetValue(gDISP_DRILL)
#grid1.Add(self.cb2)
#self.cb3 = wx.CheckBox(panel1, -1, 'Edge data')
#self.cb3.SetValue(gDISP_EDGE)
#grid1.Add(self.cb3)
#self.cb4 = wx.CheckBox(panel1, -1, 'Contour data')
#self.cb4.SetValue(gDISP_CONTOUR)
#grid1.Add(self.cb4)
vbox_view = wx.BoxSizer(wx.VERTICAL)
radioList = ['XY', 'XZ', 'YZ', 'XYZ']
rb1 = wx.RadioBox(panel1, label="View plain", choices=radioList, majorDimension=5, style=wx.RA_SPECIFY_COLS)
rb1.SetSelection(int(gVIEW_POINT))
vbox_view.Add(rb1, 0, wx.BOTTOM | wx.TOP, 9)
#sizer1.Add(grid1)
#panel1.SetSizer(sizer1)
panel1.SetSizer(vbox_view)
vbox.Add(panel1, 0, wx.BOTTOM | wx.TOP, 9)
#Draw data
panel2 = wx.Panel(panel, -1)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
#vbox1 = wx.BoxSizer(wx.VERTICAL)
paint = Paint(panel2)
#paint = Paint(hbox1)
#sw = wx.ScrolledWindow(panel2)
#paint = Paint(sw)
#sw.SetScrollbars(20,20,55,40)
#hbox1.Add(sw, 1, wx.LEFT | wx.RIGHT | wx.EXPAND, 2)
hbox1.Add(paint, 1, wx.EXPAND | wx.ALL, 2)
#vbox1.Add(paint, 0, wx.EXPAND | wx.ALL, 15)
panel2.SetSizer(hbox1)
#panel2.SetSizer(vbox1)
vbox.Add(panel2, 1, wx.LEFT | wx.RIGHT | wx.EXPAND, 2)
#vbox.Add((-1, 25))
hbox5 = wx.BoxSizer(wx.HORIZONTAL)
#btn0 = wx.Button(panel, -1, 'Generate contour', size=(150, 30))
#hbox5.Add(btn0, 0)
#btn1 = wx.Button(panel, -1, 'Convert and Save', size=(150, 30))
#hbox5.Add(btn1, 0)
btn2 = wx.Button(panel, -1, 'Close', size=(70, 30))
hbox5.Add(btn2, 0, wx.LEFT | wx.BOTTOM , 5)
vbox.Add(hbox5, 0, wx.ALIGN_RIGHT | wx.RIGHT, 10)
#vbox1 = wx.BoxSizer(wx.VERTICAL)
#self.progress1 = wx.StaticText(panel, -1, 'Progress')
#vbox1.Add(self.progress1, 0, wx.LEFT)
#self.gauge = wx.Gauge(panel, -1, 100, size=(500, 15))
#vbox1.Add(self.gauge, 0, wx.LEFT)
#vbox.Add(vbox1, 0, wx.ALIGN_LEFT | wx.LEFT, 10)
panel.SetSizer(vbox)
#status = self.CreateStatusBar()
#rect = status.GetFieldRect(1)
#self.gauge = wx.Gauge(status, -1, 100, wx.Point(rect.x + 2, rect.y + 2),wx.Size(rect.width - 4, rect.height - 4))
self.Centre()
self.Show(True)
#Event
#self.Bind(wx.EVT_CHECKBOX, self.OnGeber,self.cb1)
#self.Bind(wx.EVT_CHECKBOX, self.OnDrill,self.cb2)
#self.Bind(wx.EVT_CHECKBOX, self.OnEdge,self.cb3)
#self.Bind(wx.EVT_CHECKBOX, self.OnContour,self.cb4)
self.Bind(wx.EVT_BUTTON, self.OnExit, btn2)
#self.Bind(wx.EVT_BUTTON, self.OnGenerate, btn0)
#self.Bind(wx.EVT_BUTTON, self.OnConvert, btn1)
self.Bind(wx.EVT_RADIOBOX, self.EvtRadioBox1, rb1)
#functions
def EvtRadioBox1(self,e):
global gVIEW_POINT
gVIEW_POINT = e.GetInt()
self.Refresh(1)
def OnGeber(self,e):
global gDISP_GERBER
gDISP_GERBER = int(self.cb1.IsChecked())
self.Refresh(1)
def OnDrill(self,e):
global gDISP_DRILL, gDISP_EDGE
gDISP_DRILL = int(self.cb2.IsChecked())
self.Refresh(1)
def OnEdge(self,e):
global gDISP_EDGE
gDISP_EDGE = int(self.cb3.IsChecked())
self.Refresh(1)
def OnContour(self,e):
global gDISP_CONTOUR, gDRAWCONTOUR
if(len(gDRAWCONTOUR) > 0):
gDISP_CONTOUR = int(self.cb4.IsChecked())
else:
gDISP_CONTOUR = 0
self.cb4.SetValue(0)
self.Refresh(1)
def OnExit(self,e):
self.Close(True) # Close the frame.
def OnOpen(self,e):
setup = OpenFiles(None, -1, 'Open Files')
setup.ShowModal()
setup.Destroy()
self.Refresh(1)
def OnReload(self,e):
readGcodeFile()
#class Paint(wx.Panel):
class Paint(wx.ScrolledWindow):
def __init__(self, parent):
#wx.Panel.__init__(self, parent)
wx.ScrolledWindow.__init__(self, parent,-1,style=wx.HSCROLL|wx.VSCROLL)
global gDRAW_XSHIFT, gDRAW_YSHIFT, gDRAW_ZSHIFT
self.SetBackgroundColour('WHITE')
#print self.GetScaleX()
#print self.GetSize()
#print self.GetScrollPageSize(wx.VERTICAL)
#print self.GetScrollPageSize(wx.HORIZONTAL)
#print self.GetViewStart()
#print self.GetVirtualSize()
self.Bind(wx.EVT_PAINT, self.OnPaint)
#panel.Bind(wx.EVT_SCROLLWIN, self.OnScroll)
self.SetScrollbars(10, 10, 100,100);
#self.Bind(wx.EVT_SCROLLWIN, self.OnScroll)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel)
self.Bind(wx.EVT_LIST_BEGIN_DRAG, self.OnDrag)
self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
self.Bind(wx.EVT_RIGHT_DOWN, self.OnMouseRightDown)
#self.Bind(wx.EVT_LEFT_DCLICK , self.OnMouseLeftDClick)
#self.Bind(wx.EVT_RIGHT_DCLICK , self.OnMouseRightDClick)
self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
self.Bind(wx.EVT_RIGHT_UP, self.OnMouseRightUp)
self.Bind(wx.EVT_MOTION , self.OnMouseMove)
paint_size = self.GetSize()
gDRAW_XSHIFT =int(paint_size.x/2)
gDRAW_YSHIFT =int(paint_size.y/2)
self.Centre()
self.Show(True)
def OnKeyDown(self, event):
keycode = event.GetKeyCode()
print keycode
#if keycode == wx.WXK_UP:
#gerber
def OnPaint(self, e):
global gMAG, gDRAW_XSHIFT, gDRAW_YSHIFT, gDRAW_ZSHIFT, gCENTER_X, gCENTER_Y, gCENTER_Z, gPATTERNS, gMOVE_COLOR,gVIEW_POINT, CENTER_X, CENTER_Y
dc = wx.PaintDC(self)
#print self.GetViewStart()
#print self.GetVirtualSize()
#print self.GetSize()
paint_size = self.GetSize()
CENTER_X =int(paint_size.x/2)
CENTER_Y =int(paint_size.y/2)
#veiw_start = self.GetViewStart()
veiw_start = self.CalcUnscrolledPosition(0,0)
#print "Center x=" + str(CENTER_X) + ", Center x="+ str(CENTER_Y)
#print "pos=" + str(veiw_start)
#print 'Mag' + str(gMAG) + ", x shift=" + str(gDRAW_XSHIFT-veiw_start[0]) + ", y shift=" + str(gDRAW_YSHIFT-veiw_start[1])
#c=POINT(gCENTER_X, gCENTER_Y, gCENTER_Z)
c=POINT(0.0, 0.0, 0.0) #center of view point
#
coorc = POINT(gDRAW_XSHIFT-veiw_start[0],gDRAW_YSHIFT-veiw_start[1],gDRAW_ZSHIFT)
coorx = POINT(gDRAW_XSHIFT-veiw_start[0]+20,gDRAW_YSHIFT-veiw_start[1],gDRAW_ZSHIFT)
coory = POINT(gDRAW_XSHIFT-veiw_start[0],gDRAW_YSHIFT-veiw_start[1]-20,gDRAW_ZSHIFT)
coorz = POINT(gDRAW_XSHIFT-veiw_start[0],gDRAW_YSHIFT-veiw_start[1],gDRAW_ZSHIFT+20)
if(len(gPATTERNS) > 0):
for patterns in gPATTERNS:
#color = patterns.color
for pattern in patterns.patterns:
#print len(pattern.points)
#print pattern.points
if(gVIEW_POINT==0): #XY
p1x = pattern.points[0].x
p1y = pattern.points[0].y
p2x = pattern.points[1].x
p2y = pattern.points[1].y
#Draw coor
dc.SetPen(wx.Pen('BLACK', 1, wx.SOLID))
dc.DrawLines(([coorc.x,coorc.y],[coorx.x,coorx.y])) #X axis
dc.DrawLines(([coorc.x,coorc.y],[coory.x,coory.y])) #Y axis
elif(gVIEW_POINT==1): #XZ
p1x = pattern.points[0].x
p1y = pattern.points[0].z
p2x = pattern.points[1].x
p2y = pattern.points[1].z
dc.SetPen(wx.Pen('BLACK', 1, wx.SOLID))
dc.DrawLines(([coorc.x,coorc.y],[coorx.x,coorx.y])) #X axis
dc.DrawLines(([coorc.x,coorc.y],[coory.x,coory.y])) #Y axis
elif(gVIEW_POINT==2): #YZ
p1x = pattern.points[0].y
p1y = pattern.points[0].z
p2x = pattern.points[1].y
p2y = pattern.points[1].z
dc.SetPen(wx.Pen('BLACK', 1, wx.SOLID))
dc.DrawLines(([coorc.x,coorc.y],[coorx.x,coorx.y])) #X axis
dc.DrawLines(([coorc.x,coorc.y],[coory.x,coory.y])) #Y axis
else:
p1,p2 = change_view(pattern.points[0],pattern.points[1],c)
p1x = p1.x
p1y = p1.y
p2x = p2.x
p2y = p2.y
co1,co2 = change_view(POINT(0.0,0.0,0.0),POINT(20.0,0.0,0.0),c)
dc.SetPen(wx.Pen('BLACK', 1, wx.SOLID))
point1 = [co1.x+gDRAW_XSHIFT-veiw_start[0],co1.y+gDRAW_YSHIFT-veiw_start[1]]
point2 = [co2.x+gDRAW_XSHIFT-veiw_start[0],-co2.y+gDRAW_YSHIFT-veiw_start[1]]
dc.DrawLines((point1,point2)) #X axis
co1,co2 = change_view(POINT(0.0,0.0,0.0),POINT(0.0,20.0,0.0),c)
point1 = [co1.x+gDRAW_XSHIFT-veiw_start[0],co1.y+gDRAW_YSHIFT-veiw_start[1]]
point2 = [co2.x+gDRAW_XSHIFT-veiw_start[0],-co2.y+gDRAW_YSHIFT-veiw_start[1]]
dc.DrawLines((point1,point2)) #Y axis
dc.DrawLines(([coorc.x,coorc.y],[coorc.x,coorc.y-20])) #Z axis
x1 = p1x * gMAG + gDRAW_XSHIFT-veiw_start[0]
y1 = -p1y * gMAG + gDRAW_YSHIFT-veiw_start[1]
x2 = p2x * gMAG + gDRAW_XSHIFT-veiw_start[0]
y2 = -p2y * gMAG + gDRAW_YSHIFT-veiw_start[1]
if(pattern.style == 0): #move
dc.SetPen(wx.Pen(gMOVE_COLOR, 1, wx.DOT_DASH))
dc.DrawLines(([x1,y1],[x2,y2]))
if(pattern.style == 1):
dc.SetPen(wx.Pen(patterns.color, 1, wx.SOLID))
dc.DrawLines([[x1,y1],[x2,y2]])
if(pattern.style == 2 or pattern.style == 3):
dc.SetPen(wx.Pen(color, 1, wx.SOLID))
dc.DrawArcPoint(pattern.p1,pattern.p2,pattern.center)
def OnMouseWheel(self, event):
global gMAG, gMAG_MIN, gMAG_MAX, gDRAW_XSHIFT, gDRAW_YSHIFT, WINDOW_X, WINDOW_Y, CENTER_X, CENTER_Y, gPRE_X, gPRE_Y
pos = event.GetPosition()
w = event.GetWheelRotation()
#mag_cont += copysign(1.0, w)
pre_mag = gMAG
gMAG += copysign(1.0, w)
#gMAG += w/100.0
#gMAG = 1
gDRAW_XSHIFT = float(CENTER_X) - (gMAG*(float(pos.x)-gDRAW_XSHIFT))/pre_mag
gDRAW_YSHIFT = float(CENTER_Y) - (gMAG*(float(pos.y)-gDRAW_YSHIFT))/pre_mag
gPRE_X = float(pos.x)
gPRE_Y = float(pos.y)
if(gMAG < gMAG_MIN):
gMAG = gMAG_MIN
gDRAW_XSHIFT = CENTER_X
gDRAW_YSHIFT = CENTER_Y
if(gMAG > gMAG_MAX):
gMAG = gMAG_MAX
gDRAW_XSHIFT = float(CENTER_X) - (gMAG*(float(pos.x)-gDRAW_XSHIFT))/pre_mag
gDRAW_YSHIFT = float(CENTER_Y) - (gMAG*(float(pos.y)-gDRAW_YSHIFT))/pre_mag
#print 'Mag' + str(gMAG) + ", x shift=" + str(gDRAW_XSHIFT) + ", y shift=" + str(gDRAW_YSHIFT)
#print 'OnMouseWheel' + str(pos) + ", w=" + str(gMAG)
#self.OnPaint(event)
self.Refresh(1)
def OnDrag(self, event):
pos = event.GetPosition()
print "Drag: pos=" + str(pos)
#self.Refresh(1)
def OnScroll(self, event):
global gDRAW_XSHIFT, gDRAW_YSHIFT
pos = self.GetViewStart()
print "pos=" + str(pos)
gDRAW_XSHIFT -= pos[0]
gDRAW_YSHIFT -= pos[1]
print "X shif=" + str(gDRAW_XSHIFT) + ", Y shift=" + str(gDRAW_YSHIFT)
#self.Refresh(1)
def OnMouseLeftDown(self, event):
global gMouseLeftDown
pos = event.GetPosition()
gMouseLeftDown[0] = 1
gMouseLeftDown[1] = pos.x
gMouseLeftDown[2] = pos.y
#print "Left Down: pos=" + str(pos)
def OnMouseRightDown(self, event):
global gMouseRightDown
pos = event.GetPosition()
gMouseRightDown[0] = 1
gMouseRightDown[1] = pos.x
gMouseRightDown[2] = pos.y
#print "Right Down: pos=" + str(pos)
def OnMouseLeftUp(self, event):
global gMouseLeftDown, gMAG, gDRAW_XSHIFT, gDRAW_YSHIFT, CENTER_X, CENTER_Y
pos = event.GetPosition()
size = self.GetSize()
if gMouseLeftDown[0]:
gMouseLeftDown[0] = 0
pre_mag = gMAG
dx = pos.x - gMouseLeftDown[1]
dy = pos.y - gMouseLeftDown[2]
cx = pos.x - dx/2
cy = pos.y - dy/2
if(dx > 0):
gMAG = float(size.x)/float(dx/pre_mag)
elif(dx < 0):
gMAG = -float(pre_mag)/float(dx)
#print "gmag=" + str(gMAG)
if(dy > 0):
if(gMAG > float(size.y)/float(dy/pre_mag)):
gMAG = float(size.y)/float(dy/pre_mag)
gDRAW_XSHIFT = float(CENTER_X) - (gMAG*(float(cx)-gDRAW_XSHIFT))/pre_mag
gDRAW_YSHIFT = float(CENTER_Y) - (gMAG*(float(cy)-gDRAW_YSHIFT))/pre_mag
if(gMAG < gMAG_MIN):
gMAG = gMAG_MIN
gDRAW_XSHIFT = CENTER_X
gDRAW_YSHIFT = CENTER_Y
if(gMAG > gMAG_MAX):
gMAG = gMAG_MAX
gDRAW_XSHIFT = float(CENTER_X) - (gMAG*(float(cx)-gDRAW_XSHIFT))/pre_mag
gDRAW_YSHIFT = float(CENTER_Y) - (gMAG*(float(cy)-gDRAW_YSHIFT))/pre_mag
self.Refresh(1)
#print "X shif=" + str(gDRAW_XSHIFT) + ", Y shift=" + str(gDRAW_YSHIFT)
#print "Left UP: pos=" + str(pos) + ", dx=" + str(dx) + ", dy=" + str(dy) + ", cx=" + str(cx) + ", cy=" + str(cy) + ", mag=" + str(gMAG)
def OnMouseRightUp(self, event):
global gMouseRightDown, gMAG
pos = event.GetPosition()
if gMouseRightDown[0]:
gMouseRightDown[0] = 0
dx = pos.x - gMouseRightDown[1]
dy = pos.y - gMouseRightDown[2]
dist = sqrt(dx*dx + dy*dy)/gMAG
print dist
def OnMouseLeftDClick(self, event):
pos = event.GetPosition()
def OnMouseRightDClick(self, event):
pos = event.GetPosition()
def OnMouseMove(self, event):
pos = event.GetPosition()
class OpenFiles(wx.Dialog):
def __init__(self, parent, id, title):
global IN_INCH_FLAG, gGCODES, gCOLORS, GCODE_EXT, DEF_COLOR
wx.Dialog.__init__(self, parent, id, title, size=(250, 210))
self.dirname=''
panel = wx.Panel(self, -1)
sizer = wx.GridBagSizer(0, 0)
text1 = wx.StaticText(panel, -1, 'G code file')
sizer.Add(text1, (0, 0), flag= wx.LEFT | wx.TOP, border=10)
self.gcode = wx.TextCtrl(panel, -1)
#self.gcode.SetValue(gGERBER_FILE)
sizer.Add(self.gcode, (0, 1), (1, 3), wx.TOP | wx.EXPAND, 5)
button1 = wx.Button(panel, -1, 'Browse...', size=(-1, 30))
sizer.Add(button1, (0, 4), (1, 1), wx.TOP | wx.LEFT | wx.RIGHT , 5)
text2 = wx.StaticText(panel, -1, 'G code color')
sizer.Add(text2, (1, 0), flag= wx.LEFT | wx.TOP, border=10)
self.gcode_color = wx.ComboBox(panel, -1, choices=gCOLORS, style=wx.CB_READONLY)
self.gcode_color.SetValue(str(DEF_COLOR))
sizer.Add(self.gcode_color, (1, 1), (1, 3), wx.TOP | wx.EXPAND, 5)
radioList = ['mm', 'inch']
rb1 = wx.RadioBox(panel, label="unit of Input file", choices=radioList, majorDimension=3, style=wx.RA_SPECIFY_COLS)
rb1.SetSelection(int(IN_INCH_FLAG))
sizer.Add(rb1, (2, 0), (1, 5), wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT , 10)
#sbox1 = wx.StaticBox(panel, -1, 'Read files')
#vbox1 = wx.StaticBoxSizer(box1, orient=wx.VERTICAL)
#sizer1.Add(grid1)
button4 = wx.Button(panel, -1, 'Append Open', size=(-1, 30))
sizer.Add(button4, (4, 2), (1, 1), wx.LEFT, 10)
button5 = wx.Button(panel, -1, 'New Open', size=(-1, 30))
sizer.Add(button5, (4, 3), (1, 1), wx.LEFT, 10)
button6 = wx.Button(panel, -1, 'Close', size=(-1, 30))
sizer.Add(button6, (4, 4), (1, 1), wx.LEFT | wx.BOTTOM | wx.RIGHT, 10)
sizer.AddGrowableCol(2)
panel.SetSizer(sizer)
sizer.Fit(self)
# Events.
self.Bind(wx.EVT_BUTTON, self.OnGcodeOpen, button1)
self.Bind(wx.EVT_BUTTON, self.OnAppend, button4)
self.Bind(wx.EVT_BUTTON, self.OnNEW, button5)
self.Bind(wx.EVT_BUTTON, self.OnClose, button6)
self.Bind(wx.EVT_RADIOBOX, self.EvtRadioBox1, rb1)
#self.Bind(wx.EVT_MENU, self.OnExit, menuExit)
#self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout)
self.Centre()
self.Show(True)
#Events
def EvtRadioBox1(self, e):
global IN_INCH_FLAG
if(e.GetInt()==0): #milli
IN_INCH_FLAG = 0
elif(e.GetInt()==1): #Inch
IN_INCH_FLAG = 1
def OnGcodeOpen(self,e):
global GCODE_EXT
""" Open a file"""
dlg = wx.FileDialog(self, "Choose a output G-code file", self.dirname, "", GCODE_EXT, wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
self.filename = dlg.GetFilename()
self.dirname = dlg.GetDirectory()
self.gcode.SetValue(os.path.join(self.dirname, self.filename))
dlg.Destroy()
def OnAppend(self,e):
global IN_INCH_FLAG, gGCODES, gXMIN, gXMAX, gYMIN, gYMAX, gZMIN, gZMAX, gCENTER_X, gCENTER_Y, gCENTER_Z
if(self.gcode.GetValue()):
gGCODES.append(GCODE(self.gcode.GetValue(),self.gcode_color.GetValue()))
set_unit()
readGcodeFile()
gCENTER_X = (gXMIN + gXMAX)/2
gCENTER_Y = (gYMIN + gYMAX)/2
gCENTER_Z = (gZMIN + gZMAX)/2
#gerber2draw()
self.Close(True) # Close the frame.
def OnNEW(self,e):
global IN_INCH_FLAG, gGCODES, gPATTERNS, gXMIN, gXMAX, gYMIN, gYMAX, gZMIN, gZMAX, gCENTER_X, gCENTER_Y, gCENTER_Z
gGCODES = []
gPATTERNS = []
if(self.gcode.GetValue()):
gGCODES.append(GCODE(self.gcode.GetValue(),self.gcode_color.GetValue()))
set_unit()
readGcodeFile()
gCENTER_X = (gXMIN + gXMAX)/2
gCENTER_Y = (gYMIN + gYMAX)/2
gCENTER_Z = (gZMIN + gZMAX)/2
#gerber2draw()
self.Close(True) # Close the frame.
def OnClose(self,e):
self.Close(True) # Close the frame.
#Set Class
class POINT:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
class LINE:
def __init__(self, style, line, speed, points):
self.style = style
self.line = line
self.speed = speed
self.points = points
class ARC:
def __init__(self,style, line, speed, plain, p1, p2, center):
self.style = style
self.line = line
self.speed = speed
self.plain = plain
self.p1 = p1
self.p2 = p2
self.center = center
class GCODE:
def __init__(self, name, color):
self.name = name
self.color = color
class PATTERN:
def __init__(self, color,patterns):
self.color = color
self.patterns = patterns
#functions
def main():
app = wx.App()
MainFrame(None, -1, 'pyGerber2Gcode')
app.MainLoop()
def set_unit():
global IN_INCH_FLAG, gUNIT, INCH
if (IN_INCH_FLAG):
gUNIT = INCH
else:
gUNIT = 1.0
def readGcodeFile():
global gGCODES, gXMIN, gXMAX, gYMIN, gYMAX, gZMIN, gZMAX
for gcodes in gGCODES:
try:
f = open(gcodes.name,'r')
except IOError, (errno, strerror):
error_dialog("Unable to open the file" + gcodes.name + "\n",1)
else:
pre_x = 0.0
pre_y = 0.0
pre_z = 0.0
x = pre_x
y = pre_y
z = pre_z
s = 0
l = 1
style = 0
patterns = []
while 1:
gcode = f.readline()
if not gcode:
break
flag = 0
#parse g code
gg = re.search("[gG]([\d]+)\D",gcode)
xx = re.search("[xX]([\d\.\-]+)\D",gcode)
yy = re.search("[yY]([\d\.\-]+)\D",gcode)
zz = re.search("[zZ]([\d\.\-]+)\D",gcode)
ss = re.search("[fF]([\d\.\-]+)\D",gcode)
if (gg):
style = int(gg.group(1))
if (xx):
x = float(xx.group(1))
flag = 1
if (yy):
y = float(yy.group(1))
flag = 1
if (zz):
z = float(zz.group(1))
flag = 1
if (ss):
s = float(ss.group(1))
if(style == 1 or style == 0):
if(flag):
point1 = POINT(pre_x,pre_y,pre_z)
point2 = POINT(x,y,z)
patterns.append(LINE(style,l,s,[point1,point2]))
elif(style == 2 or style == 3):
i=0
j=0
k=0
ii = re.search("[iI]([\d\.\-]+)\D",gcode)
jj = re.search("[jJ]([\d\.\-]+)\D",gcode)
kk = re.search("[kK]([\d\.\-]+)\D",gcode)
rr = re.search("[rR]([\d\.\-]+)\D",gcode)
if(ii):
i = float(rr.group(1))
if(jj):
j = float(rr.group(1))
if(kk):
k = float(rr.group(1))
center = POINT(i,j,k)
point1 = POINT(pre_x,pre_y,pre_z)
point2 = POINT(x,y,z)
if(style == 3):
tmp_point = point2
point2 = point1
point1 = point2
if(rr):
r = float(rr.group(1))
c1,c2 = calc_center(point1,point2,r,plain)
center = c1
if(r < 0):
center = c2
patterns.append(ARC(style,l,s,plain,point1,point2,center))
elif(style == 17):
plain = 0
elif(style == 18):
plain = 1
elif(style == 19):
plain = 2
if(x > gXMAX):
gXMAX = x
if(x < gXMIN):
gXMIN = x
if(y > gYMAX):
gYMAX = y
if(y < gYMIN):
gYMIN = y
if(z > gZMAX):
gZMAX = z
if(z < gZMIN):
gZMIN = z
pre_x = x
pre_y = y
pre_z = z
l += 1
gPATTERNS.append(PATTERN(gcodes.color,patterns))
f.close()
def calc_center(p1,p2,r,plain):
r = copysign(1.0, r) * r
if(plain == 0): #XY
if(p1.x == p2.x):
dx = (p2.x - p1.x)/2
dy = sqrt(r*r-dx*dx)
c1 = POINT(p1.x+dx,p1.y+dy,p1.z)
c2 = POINT(p1.x+dx,p1.y-dy,p1.z)
elif(p1.y == p2.y):
dy = (p2.y - p1.y)/2
dx = sqrt(r*r-dy*dy)
c1 = POINT(p1.x+dx,p1.y+dy,p1.z)
c2 = POINT(p1.x-dx,p1.y+dy,p1.z)
else:
a = (p2.y - p1.y)/(p2.x - p1.x)
av = -1/a
bv = (p2.y -+ p1.y)/2 - av * (p2.x + p1.x)/2
dx = sqrt(r*r/(av*av+1))
dy = av * dx
cx = (p2.x + p1.x)/2
cy = (p2.y + p1.y)/2
c1 = POINT(p1.x+dx,p1.y-dy,p1.z)
c2 = POINT(p1.x-dx,p1.y+dy,p1.z)
# if(plain == 1): #ZX
# if(plain == 2): #YZ
return [c1,c2]
def rot_coor(p):
global gTHETA, gPHI, gPSI
dx = c.x-p.x
dy = c.y-p.y
ang = atan2(dy,dx) + gTHETA
r = sqrt(dx*dx+dy*dy)
def change_view(p1,p2,c):
global gTHETA, gPHI, gPSI
pp1 = POINT(0.0,0.0,0.0)
pp2 = POINT(0.0,0.0,0.0)
# rot around z
dx1 = p1.x-c.x
dy1 = p1.y-c.y
ang1 = atan2(dy1,dx1) + gTHETA
dx2 = p2.x-c.x
dy2 = p2.y-c.y
ang2 = atan2(dy2,dx2) + gTHETA
r1 = sqrt(dx1*dx1+dy1*dy1)
r2 = sqrt(dx2*dx2+dy2*dy2)
pp1.x = c.x+r1*cos(ang1)
pp1.y = c.y+r1*sin(ang1)
pp2.x = c.x+r2*cos(ang2)
pp2.y = c.y+r2*sin(ang2)
# rot around x
dy1 = pp1.y-c.y
dz1 = pp1.z-c.z
ang1 = atan2(dy1,dz1) + gPHI
dz2 = pp2.z-c.z
dy2 = pp2.y-c.y
ang2 = atan2(dy2,dz2) + gPHI
r1 = sqrt(dz1*dz1+dy1*dy1)
r2 = sqrt(dz2*dz2+dy2*dy2)
pp1.z = c.z+r1*cos(ang1)
pp1.y = c.y+r1*sin(ang1)+p1.z
pp2.z = c.z+r2*cos(ang2)
pp2.y = c.y+r2*sin(ang2)+p2.z
# rot around y
dx1 = pp1.x-c.x
dz1 = pp1.z-c.z
ang1 = atan2(dx1,dz1) + gPSI
dz2 = pp2.z-c.z
dx2 = pp2.x-c.x
ang2 = atan2(dx2,dz2) + gPSI
r1 = sqrt(dz1*dz1+dx1*dx1)
r2 = sqrt(dz2*dz2+dx2*dx2)
pp1.z = c.z+r1*cos(ang1)
pp1.x = c.y+r1*sin(ang1)
pp2.z = c.z+r2*cos(ang2)
pp2.x = c.y+r2*sin(ang2)
return pp1,pp2
def circle_points(cx,cy,r,points_num):
points=[]
if(points_num <= 2):
print "Too small angle at Circle"
return
i = points_num
while i > 0:
cir_x=cx+r*cos(2.0*pi*float(i)/float(points_num))
cir_x=cx+r*cos(2.0*pi*float(i)/float(points_num))
cir_y=cy+r*sin(2.0*pi*float(i)/float(points_num))
points.extend([cir_x,cir_y])
i -= 1
cir_x=cx+r*cos(0.0)
cir_y=cy+r*sin(0.0)
points.extend([cir_x,cir_y])
return points
def arc_points(cx,cy,r,s_angle,e_angle,kaku):
points=[]
if(s_angle == e_angle):
print "Start and End angle are same"
int(kaku)
if(kaku <= 2):
print "Too small angle"
ang_step=(e_angle-s_angle)/(kaku-1)
i = 0
while i < kaku:
arc_x=cx+r*cos(s_angle+ang_step*float(i))
arc_y=cy+r*sin(s_angle+ang_step*float(i))
points.extend([arc_x,arc_y])
i += 1
return points
def error_dialog(error_mgs,sw):
print error_mgs
if(sw):
#raw_input("\n\nPress the enter key to exit.")
sys.exit()
if __name__ == "__main__":
main()