{"id":446,"date":"2016-11-25T13:42:24","date_gmt":"2016-11-25T11:42:24","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=446"},"modified":"2020-09-24T13:43:01","modified_gmt":"2020-09-24T11:43:01","slug":"cnc-del-dxf-al-g-code-optimizacion-de-caminos","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=446&lang=es","title":{"rendered":"CNC: Del dxf al G-Code. Optimizaci\u00f3n de caminos"},"content":{"rendered":"<p><a href=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2016\/11\/toolpath.png\"><img loading=\"lazy\" src=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2016\/11\/toolpath-300x185.png\" alt=\"\" title=\"toolpath\" width=\"300\" height=\"185\" class=\"alignright size-medium wp-image-1365\"><\/a>El workflow del CNC consta de tres pasos:<\/p>\n<ol>\n<li>Dise\u00f1o del modelo o pieza. Se hace con software CAD, como por ejemplo LibreCAD, y el formato de salida estandar es dxf<\/li>\n<li>Generar el G-Code (de lo que va este post). Necesitas un programa que sepa leer el formato dxf (donde est\u00e1n definidas l\u00edneas, arcos, polil\u00ednies, splines, etc.) y genere el c\u00f3digo (G-code) que entienden las fresadoras CNC.<\/li>\n<li>El software que sepa interpretar el G-Code y sepa enviar los comandos a la m\u00e1quina CNC a trav\u00e9s del puerto paralelo. Por ejemplo, LinuxCNC o EMC.<\/li>\n<\/ol>\n<p>De tota esta <em>tool chain<\/em> el proceso m\u00e1s complicado es el segundo. Concretamente la optimizaci\u00f3n de los caminos que har\u00e1 la m\u00e1quina CNC tiene mucha importancia en el resultado final.<\/p>\n<p>Vamos a verlo con un ejemplo simple y clarificador. Estamos utilizando el <a href=\"https:\/\/sourceforge.net\/projects\/dxf2gcode\/\" title=\"dxf2gcode\"><strong>dxf2gcode<\/strong><\/a>, y realmente va muy bien. Est\u00e1 escrito en Python. Tiene una interficie gr\u00e1fica, pero lo mejor es que se puede ejecutar en modo consola. Frente a un problema que he tenido y que ya est\u00e1 solucionado, he tenido que buscar una alternativa. Me he encontrado con el proyecto <a href=\"http:\/\/linux.softpedia.com\/get\/Utilities\/dxf2G-17935.shtml\" title=\"dxf2G\"><strong>dxf2G<\/strong><\/a> (los nombres no son muy originales, ya veis), que est\u00e1 escrito en lenguaje C, son 3000 l\u00edneas de c\u00f3digo, y se ejecuta en l\u00ednea de comandos.<\/p>\n<p>El segundo es un proyecto sencillo que funciona muy bien para peque\u00f1os, y del  que es interesante estudiar el \u00f3digo. Mirando qu\u00e9 hace y c\u00f3mo lo hace, se encuentra a faltar que no separa las capas del dxf (normalmente se trabaja con capas porque asociamos las capas a un cambio de herramienta, para trabajar con diferentes di\u00e1metros de broca), y sobretodo la optimizaci\u00f3n de caminos, que ser\u00eda la part dif\u00edcil de implementar (se hacen tesis doctorales sobre esta materia).<\/p>\n<p>Lo vemos con un ejemplo de dibujar una l\u00ednea a una profundidad de 3mm, haciendo dos pasadas de 1,5mm. La manera correcta, como lo hace <strong>dxf2gcode<\/strong> es hacer una pasada a 1,5mm, agujerear hasta 3mm, y deshacer el camino hasta volver al inicio de la recta.  El trozo de G-Code que genera el dxf2gcode es:<br \/>\n<code><br \/>\n(*** LAYER: 0 ***)<br \/>\nT1 M6<br \/>\nS6000<\/code><\/p>\n<p><code><br \/>\n<\/code><code>(* SHAPE Nr: 0 *)<br \/>\nG0 X   0.000 Y   0.000<br \/>\nM3 M8<br \/>\nG0 Z   3.000<br \/>\nF150<br \/>\nG1 Z  -1.500<br \/>\nF400<br \/>\nG1 X  60.000 Y   0.000<br \/>\nF150<br \/>\nG1 Z  -3.000<br \/>\nF400<br \/>\nG1 X   0.000 Y   0.000<br \/>\nF150<br \/>\nG1 Z   3.000<br \/>\nG0 Z  15.000<br \/>\nM9 M5<br \/>\n<\/code><br \/>\nEn cambio, el <strong>dxf2G<\/strong> hace la implementaci\u00f3n f\u00e1cil y costosa en tiempo: vamos al origen de la recta; agujereamos a -1,5; hacemos la pasada de la recta; subimos hasta 6mm para no tocar la pieza; volvemos al origen de la recta; agujereamos hasta -3mm; volvemos a repasar la recta fresando a -3mm.<br \/>\n<code><br \/>\nG0 X0.000000 Y0.000000<br \/>\nG0 Z3.000000<br \/>\nG1 Z0<br \/>\nG1 Z-1.500000<br \/>\nG1 X60.000000 Y0.000000<br \/>\nG0 Z6.000000<br \/>\nG0 X0.000000 Y0.000000<br \/>\nG0 Z3.000000<br \/>\nG1 Z-3.000000<br \/>\nG1 X60.000000 Y0.000000<br \/>\nG0 Z6.000000<br \/>\n<\/code><br \/>\nTotal, el segundo c\u00f3digo puede tardar el doble de tiempo que el primero. I es que implementar algoritmos de optimizaci\u00f3n de caminos (<em>toolpath optimization<\/em> en ingl\u00e9s) no es cosa f\u00e1cil.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El workflow del CNC consta de tres pasos: Dise\u00f1o del modelo o pieza. Se hace con software CAD, como por ejemplo LibreCAD, y el formato de salida estandar es dxf Generar el G-Code (de lo que va este post). Necesitas un programa que sepa leer el formato dxf (donde est\u00e1n definidas l\u00edneas, arcos, polil\u00ednies, splines, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[302,324],"tags":[],"_links":{"self":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/446"}],"collection":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=446"}],"version-history":[{"count":1,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/446\/revisions"}],"predecessor-version":[{"id":447,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/446\/revisions\/447"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}