Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsElectronicsBasicsRepairDesignCADComponentsEquipmentElectrical Engineering
ElectronicsKB.com
Contact UsLink To UsSearch & Site Map

Electronics Forum / CAD / October 2006



Tip: Looking for answers? Try searching our database.

Gerber to G-Code, Help needed.

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
chapmjw - 21 Oct 2006 05:30 GMT
Hello folks,

I've written software that converts Eagle PCB output to G-Code so you
can use any 3 axis mill create a quick circuit board. Every thing works

perfectly from eagle but i'll like to be able to import a gerber file,
then convert to G-Code.

I have no problem converting Gerber code and displaying it. The
difficulty starts when you have rearange all intersecting element types

and then gernerate offset toolpath geometry.

Is there any one out there that has done this?
Is there any one that would like to help with this project?

thanks
jim
gminette@gmail.com - 21 Oct 2006 11:49 GMT
> Every thing works
> perfectly from eagle but i'll like to be able to import a gerber file,
> then convert to G-Code.

A couple months ago I wrote a similar script in the TCL language.  It
can take an excellon file from Eagle, and convert it to a bunch of
G-code circle cuts, offset for a known mill bit size, optionally with
multiple plunges depths for thicker boards.  As I recall, I used the
excellon format, as it contained the drill sizes in the same file, but
otherwise it's very similar to gerber.

My script kind of relies on a larger suite of TCL scripts I've made for
vertical milling, though.  They create a kind of mid-level language for
milling things.  I can tell it I want circles and polygons cut out to a
given depth, with a given material, using a given mill bit, and it
works out the G-code for it, including feeds, speeds, multiple plunge
depth cuts, and inset pocket clearing.  It's not intelligent about
merging pockets, though.

The main trick in eagle, was telling it to not make vias smaller than
1/32nd inch in size, which is the size of the mill bit I used.

My script follows.  You'll need to make a new mlcnc_g_circle proc to
output the G-code for the individual circles, with moves in between.
My scripts to do that are quite involved, and take into account all
sorts of stuff like mill bit type and coating, stock material, cut
depth, and such, which you don't really need for this, and which would
take up a lot more space here.  If I had more time, I would whip up a
simplified mlcnc_g_circle proc.

       - Garth

# filename is the name of the excellon file to convert.
# z is the Z depth to cut to.
proc mlcnc_g_excellon {filename z} {
       set f [open $filename "r"]
       set holesInfo {}
       set section "start"
       set conv 1.0
       set currdiam 0.0
       while {![eof $f]} {
               if {[catch {
                       set line [gets $f]
               }]} {
                       break
               }
               if {$line == "M71"} {
                       set conv [expr {1.0/25.4}]
               } elseif {$line == "M72"} {
                       set conv 1.0
               }
               if {[regexp {^ *T *([0-9][0-9]*) *C
*([0-9][0-9]*\.[0-9][0-9]*).*$} $line dummy toolnum diam]} {
                       set toolnum [string trimleft $toolnum "0"]
                       set diam [expr {$diam+0.0}]
                       set toolsInfo($toolnum) $diam
               } elseif {[regexp {^ *T *([0-9][0-9]*).*$} $line dummy
toolnum]} {
                       set toolnum [string trimleft $toolnum "0"]
                       if {![info exists toolsInfo($toolnum)]} {
                               error "Malformed excellon file.  May
require extra drill tool file.  We don't handle that yet."
                       }
                       set currdiam $toolsInfo($toolnum)
               } elseif {[regexp {^ *X *([0-9][.0-9]*) *Y
*([0-9][.0-9]*).*$} $line dummy x y]} {
                       if {[string first "." $x] != -1} {
                               set x [expr {$x*$conv}]
                               set y [expr {$y*$conv}]
                       } else {
                               set x [expr {$x*$conv/10000.0}]
                               set y [expr {$y*$conv/10000.0}]
                       }
                       lappend holesInfo $x $y $currdiam
               }
       }
       set out {}
       foreach {x y diam} $holesInfo {
               set rad [expr {$diam/2.0}]
               append out [mlcnc_g_circle $x $y $z $rad $rad]
       }
       return $out
}
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2010 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.