Zoom and Excellon plot

This commit is contained in:
Juan Pablo Caram 2014-01-06 22:08:55 -05:00
parent e0d93910a6
commit 3cb9e444c0
4 changed files with 329 additions and 1890 deletions

1758
camlib.py

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -15,69 +15,66 @@ from camlib import *
class App:
def __init__(self):
########################################
## GUI ##
########################################
self.gladefile = "cirkuix.ui"
self.builder = Gtk.Builder()
self.builder.add_from_file(self.gladefile)
self.window = self.builder.get_object("window1")
self.positionLabel = self.builder.get_object("label3")
#self.drawingarea = self.builder.get_object("drawingarea1")
#self.drawingarea.connect("draw", self.cairopaint)
self.positionLabel = self.builder.get_object("label3")
self.grid = self.builder.get_object("grid1")
self.grid = self.builder.get_object("grid1")
## Event handling ##
self.builder.connect_signals(self)
self.figure = None
self.axes = None
self.canvas = None
## Make plot area ##
self.mplpaint()
self.window.show_all()
self.gerbers = []
########################################
## DATA ##
########################################
self.gerbers = []
self.excellons = []
self.mouse = None
Gtk.main()
def mplpaint(self):
f = Figure(dpi=50)
a = f.add_subplot(111)
a.set_aspect(1)
t = arange(0.0,5.0,0.01)
s = sin(2*pi*t)
a.plot(t,s)
a.grid()
self.figure = Figure(dpi=50)
#self.axes = self.figure.add_subplot(111)
self.axes = self.figure.add_axes([0.05,0.05,0.9,0.9])
self.axes.set_aspect(1)
#t = arange(0.0,5.0,0.01)
#s = sin(2*pi*t)
#self.axes.plot(t,s)
self.axes.grid()
#a.patch.set_visible(False) Background of the axes
f.patch.set_visible(False)
f.tight_layout()
self.figure.patch.set_visible(False)
#self.figure.tight_layout()
canvas = FigureCanvas(f) # a Gtk.DrawingArea
canvas.set_size_request(600,400)
canvas.mpl_connect('button_press_event', self.on_click_over_plot)
canvas.mpl_connect('motion_notify_event', self.on_mouse_move_over_plot)
self.grid.attach(canvas,1,1,600,400)
self.canvas = FigureCanvas(self.figure) # a Gtk.DrawingArea
#self.canvas.set_size_request(600,400)
self.canvas.mpl_connect('button_press_event', self.on_click_over_plot)
self.canvas.mpl_connect('motion_notify_event', self.on_mouse_move_over_plot)
##self.canvas.mpl_connect('scroll_event', self.on_scroll_over_plot)
##self.canvas.mpl_connect('key_press_event', self.on_key_over_plot)
self.canvas.set_hexpand(1)
self.canvas.set_vexpand(1)
#self.builder.get_object("viewport2").add(self.canvas)
self.grid.attach(self.canvas,0,0,600,400)
#self.builder.get_object("scrolledwindow1").add(self.canvas)
def cairopaint(self, da, cr):
width = 200
height = 200
#cr = widget.window.cairo_create() # Context
cr.set_source_rgb(0.5, 0.5, 0.5)
cr.rectangle(0, 0, width, height)
cr.fill()
# draw a rectangle
cr.set_source_rgb(1.0, 1.0, 1.0)
cr.rectangle(10, 10, width - 20, height - 20)
cr.fill()
# draw lines
cr.set_source_rgb(0.0, 0.0, 0.8)
cr.move_to(width / 3.0, height / 3.0)
cr.rel_line_to(0, height / 6.0)
cr.move_to(2 * width / 3.0, height / 3.0)
cr.rel_line_to(0, height / 6.0)
cr.stroke()
# and a circle
cr.set_source_rgb(1.0, 0.0, 0.0)
radius = min(width, height)
cr.arc(width / 2.0, height / 2.0, radius / 2.0 - 20, 0, 2 * pi)
cr.stroke()
cr.arc(width / 2.0, height / 2.0, radius / 3.0 - 10, pi / 3, 2 * pi / 3)
cr.stroke()
def on_filequit(self, param):
print "quit from menu"
@ -89,49 +86,190 @@ class App:
self.window.destroy()
Gtk.main_quit()
def on_fileopengeometry(self, param):
print "File->Open Geometry"
def on_fileopengerber(self, param):
print "File->Open Gerber"
dialog = Gtk.FileChooserDialog("Please choose a file", self.window,
Gtk.FileChooserAction.OPEN,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
response = dialog.run()
if response == Gtk.ResponseType.OK:
## Load the file ##
print("Open clicked")
print("File selected: " + dialog.get_filename())
gerber = Gerber()
gerber.parse_file(dialog.get_filename())
gerber.create_geometry()
self.gerbers.append(gerber)
self.plot_gerber(gerber)
## End ##
elif response == Gtk.ResponseType.CANCEL:
print("Cancel clicked")
dialog.destroy()
def on_fileopenexcellon(self, param):
print "File->Open Excellon"
dialog = Gtk.FileChooserDialog("Please choose a file", self.window,
Gtk.FileChooserAction.OPEN,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
response = dialog.run()
if response == Gtk.ResponseType.OK:
## Load the file ##
print("Open clicked")
print("File selected: " + dialog.get_filename())
excellon = Excellon()
excellon.parse_file(dialog.get_filename())
self.excellons.append(excellon)
self.plot_excellon(excellon)
## End ##
elif response == Gtk.ResponseType.CANCEL:
print("Cancel clicked")
dialog.destroy()
def plot_gerber(self, gerber):
gerber.create_geometry()
f = Figure(dpi=75)
a = f.add_subplot(111)
a.set_aspect(1)
for poly in gerber.solid_geometry:
# Options
mergepolys = self.builder.get_object("cb_mergepolys").get_active()
multicolored = self.builder.get_object("cb_multicolored").get_active()
geometry = None
if mergepolys:
geometry = gerber.solid_geometry
else:
geometry = gerber.buffered_paths + \
[poly['polygon'] for poly in gerber.regions] + \
gerber.flash_geometry
linespec = None
if multicolored:
linespec = '-'
else:
linespec = 'k-'
#f = Figure(dpi=75)
#a = f.add_subplot(111)
#a.set_aspect(1)
for poly in geometry:
x, y = poly.exterior.xy
a.plot(x, y)
#a.plot(x, y)
self.axes.plot(x, y, linespec)
for ints in poly.interiors:
x, y = ints.coords.xy
a.plot(x, y)
a.grid()
f.tight_layout()
canvas = FigureCanvas(f) # a Gtk.DrawingArea
canvas.set_size_request(600,400)
self.grid.attach(canvas,1,1,600,400)
self.window.show_all()
self.axes.plot(x, y, linespec)
#f.tight_layout()
#canvas = FigureCanvas(f) # a Gtk.DrawingArea
#canvas.set_size_request(600,400)
#self.grid.attach(canvas,1,1,600,400)
#self.window.show_all()
def plot_excellon(self, excellon):
excellon.create_geometry()
# Plot excellon
for geo in excellon.solid_geometry:
x, y = geo.exterior.coords.xy
self.axes.plot(x, y, 'r-')
for ints in geo.interiors:
x, y = ints.coords.xy
self.axes.plot(x, y, 'g-')
def on_mouse_move_over_plot(self, event):
self.positionLabel.set_label("X: %.4f Y: %.4f"%(event.xdata, event.ydata))
try: # May fail in case mouse not within axes
self.positionLabel.set_label("X: %.4f Y: %.4f"%(
event.xdata, event.ydata))
self.mouse = [event.xdata, event.ydata]
except:
self.positionLabel.set_label("X: --- Y: ---")
self.mouse = None
def on_click_over_plot(self, event):
print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
event.button, event.x, event.y, event.xdata, event.ydata)
def get_bounds(self):
xmin = Inf
ymin = Inf
xmax = -Inf
ymax = -Inf
geometry_sets = [self.gerbers, self.excellons]
for gs in geometry_sets:
for g in gs:
gxmin, gymin, gxmax, gymax = g.solid_geometry.bounds
xmin = min([xmin, gxmin])
ymin = min([ymin, gymin])
xmax = max([xmax, gxmax])
ymax = max([ymax, gymax])
return [xmin, ymin, xmax, ymax]
def on_zoom_in(self, event):
self.zoom(1.5)
return
def on_zoom_out(self, event):
self.zoom(1/1.5)
def on_zoom_fit(self, event):
xmin, ymin, xmax, ymax = self.get_bounds()
width = xmax-xmin
height = ymax-ymin
self.axes.set_xlim((xmin-0.05*width, xmax+0.05*width))
self.axes.set_ylim((ymin-0.05*height, ymax+0.05*height))
self.canvas.queue_draw()
return
def zoom(self, factor, center=None):
xmin, xmax = self.axes.get_xlim()
ymin, ymax = self.axes.get_ylim()
width = xmax-xmin
height = ymax-ymin
if center == None:
center = [(xmin+xmax)/2.0, (ymin+ymax)/2.0]
# For keeping the point at the pointer location
relx = (xmax-center[0])/width
rely = (ymax-center[1])/height
new_width = width/factor
new_height = height/factor
self.axes.set_xlim((center[0]-new_width*(1-relx), center[0]+new_width*relx))
self.axes.set_ylim((center[1]-new_height*(1-rely), center[1]+new_height*rely))
self.canvas.queue_draw()
# def on_scroll_over_plot(self, event):
# print "Scroll"
# center = [event.xdata, event.ydata]
# if sign(event.step):
# self.zoom(1.5, center=center)
# else:
# self.zoom(1/1.5, center=center)
#
# def on_window_scroll(self, event):
# print "Scroll"
#
# def on_key_over_plot(self, event):
# print 'you pressed', event.key, event.xdata, event.ydata
def on_window_key_press(self, widget, event):
print event.get_keycode(), event.get_keyval()
val = int(event.get_keyval()[1])
if val == 49: # 1
self.on_zoom_fit(None)
return
if val == 50: # 2
self.zoom(1/1.5, self.mouse)
return
if val == 51: # 3
self.zoom(1.5, self.mouse)
return
app = App()

View File

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-open</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
@ -11,6 +16,7 @@
<property name="height_request">400</property>
<property name="can_focus">False</property>
<signal name="destroy" handler="on_closewindow" swapped="no"/>
<signal name="key-press-event" handler="on_window_key_press" swapped="no"/>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
@ -41,21 +47,22 @@
</child>
<child>
<object class="GtkImageMenuItem" id="imagemenuitem2">
<property name="label">Open geometry</property>
<property name="label">Open Gerber</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">image2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_fileopengeometry" swapped="no"/>
<signal name="activate" handler="on_fileopengerber" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="imagemenuitem3">
<property name="label">gtk-save</property>
<property name="label">Open Excellon</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<property name="image">image1</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_fileopenexcellon" swapped="no"/>
</object>
</child>
<child>
@ -175,6 +182,63 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkToolbar" id="toolbar_main">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="toolbar_style">icons</property>
<child>
<object class="GtkToolButton" id="zoomfit_toolbutton">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Zoom Fit</property>
<property name="label" translatable="yes">Fit</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-zoom-100</property>
<signal name="clicked" handler="on_zoom_fit" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="zoomin_toolbutton">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Zoom+</property>
<property name="label" translatable="yes">Zoom+</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-zoom-in</property>
<signal name="clicked" handler="on_zoom_in" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="zoomout_toolbutton">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Zoom-</property>
<property name="label" translatable="yes">Zoom-</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-zoom-out</property>
<signal name="clicked" handler="on_zoom_out" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkPaned" id="paned1">
<property name="visible">True</property>
@ -196,12 +260,13 @@
<property name="margin_top">3</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkCheckButton" id="checkbutton1">
<property name="label" translatable="yes">Merge Geometry</property>
<object class="GtkCheckButton" id="cb_mergepolys">
<property name="label" translatable="yes">Merge Polygons</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@ -211,8 +276,8 @@
</packing>
</child>
<child>
<object class="GtkCheckButton" id="checkbutton2">
<property name="label" translatable="yes">Different Colors</property>
<object class="GtkCheckButton" id="cb_multicolored">
<property name="label" translatable="yes">Multi-colored</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@ -226,42 +291,7 @@
</packing>
</child>
<child>
<object class="GtkBox" id="box4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Scale (pix./unit): </property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spinbutton1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="invisible_char">●</property>
<property name="climb_rate">10</property>
<property name="snap_to_ticks">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
<placeholder/>
</child>
</object>
</child>
@ -269,7 +299,7 @@
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Gerber</property>
<property name="label" translatable="yes">Options</property>
</object>
<packing>
<property name="tab_fill">False</property>
@ -294,50 +324,45 @@
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<property name="can_focus">False</property>
<child>
<object class="GtkViewport" id="viewport2">
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<object class="GtkScrollbar" id="scrollbar1">
<property name="height_request">25</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child>
<object class="GtkGrid" id="grid1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<property name="show_fill_level">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkScrollbar" id="scrollbar2">
<property name="width_request">25</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<property name="show_fill_level">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
</object>
<packing>
@ -349,7 +374,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
<child>
@ -404,7 +429,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
</object>