Hi,
I have read articles in this forum. Conclusion is that Eagle almost does not support any imports of vectors. My intention is milling shapes in PCB and place the components with precisely appointed places (eg the LEDs must fit to holes in enclosure). I tried to use a couple of methods:
1. Direct import of DXFs.
There was necessary to scale by strange coefficient 3.779527 and only lines and rectangles can be imported. No polylines, arcs, ellipses are allowed. The PCB in project is not a rectangle.
2. Import a bitmap (*.bmp)
Works but converting vectors to bitmap in order to convert it again into vectors is not wise.
3. Import SVG
I found svg2poly.ulp but functionality is poor. Almost nothing is imported from project.
Does anyone have tested solution which allows to import vector graphics?
Hi Jorge,
Importing DXF generated by Inkscape was first thing I did. The result was worst. If native format SVG for Inscape was converted to DXF then imported to Eagle, result seemed useless. Probably it works with specialized CAD software where I can decide how each of the path will be represented in DXF file. The same when Adobe Illustrator was used. 😞
Hi Jorge,
I also really need to import vector drawings into eagle.
I am designing a capacitive touch pad, here the precise geometry is important and with all the symmetry it is easy to draw in other programs but really difficult in Eagle.
1. importing .dxf is working but I can not fill out the shape :
I found these sparkfun tutorials great . importing a .dxf file works but it is bare lines and I need the shapes to be filled out. all i can find on this is that polygons too are empty, then filled by running ratsnest. but this does not work on the imported .dxf, is there more precise documentation / tolls / commands on filling polygons? In properties I can see fields to fill but there is none...
2. autoCAD
I see another route would be to design a pattern in autoCAD, then export as dxf and import into eagle, is there more reference on that? It is another SW but I am happy to use that if it works well. (obviously there are still many issues with import vectors drawings...)
3. geometric drawings
It seems to me like many precise, geometric drawings like antennas, touch pads, etc. are pretty difficult in Eagle, how do designers handle these? I can't see them importing the way we are trying here...
Hello guys,
My very first question is about how does it look like with working with vector graphic in eagle. Are there any progress in this from the last comment?
And I have few tips for you. import-dxf ulp script doesn't cover every line although if it is a line or polyline or sth else. I found on some forum very good tutorial how to do it. The following script gives me the best results. If you really need a high precision of dimensions you have to break lines and curves in many small ones to get a perfect result. I use adobe illustrator but export is in R13 dxf format. You can specify it during export in the menu.
And for a graphic, I use a bitmap. Eagle can't work with the huge amount of small polygons and edit takes a little more worth time. But the results are very good with a resolution higher than 400. We make at work enclosures from PCBs and any problems yet.
Please try this script and let me know if you're satisfied with results.
/********************************************************************** ** ** ** Filename: import_dxf_polygons.ulp ** ** ** ** Author: Tim Ruetz ** ** tim at caiaq.de ** ** ** ** This ULP imports polylines and splines from DXF files ** ** Use it for importing vectorized logos, fonts etc. ** ** Arcs, circles, splines, curves are not supported yet. ** ** Since this is a very simple, rudimentary script it just uses ** ** straight lines as approximation. ** ** Please use a vector graphics editor to edit/refine you DXF file: ** ** - add as many as needed vertexes to the shape ** ** - convert all curves to straight lines ** ** - no negative shapes are supported by eagle, so create openings ** ** to connect negative shapes to outside (see example DXF) ** ** ** *********************************************************************** ** ** ** Legal issues: This program is provided as it is. Without any ** ** warranties of any kind of data lose or damages. ** ** ** ** Feel free to modify and improve this program and let me know. ** ** ** ** Version: 0.4 ** ** Date: 04.07.2011 ** ** ** *********************************************************************** ** ** ** Version history ** ** ** ** 0.1 initial version ** ** ** ** 0.2 added default pen with = 0.0 ** ** added insert offset settings to dialog ** ** ** ** 0.3 increased coordinate precision ** ** to import very tiny shapes ** ** ** ** 0.4 added WIRE vs POLYGON option ** ** by Tod E. Kurt, http://todbot.com/blog/ ** ** ** *********************************************************************** */ #usage "<b>Simple DXF Polyline Import V0.3</b>\n" "<p>" "Imports and scales (only!) POLYLINE and SPLINE entries in DXF files." "Splines are not drawn as splines but as stright lines!" "<author>Author: Tim Ruetz (tim@caiaq.de)</author>" string dxf_filename; int dxf_len; int i, j; string dxf_filedata[]; int dxf_code; string dxf_value; int state = 0; real vertex_x; real vertex_y; real vertex_x_buf; real vertex_y_buf; real scale = 1.0; real pen_width = 0.2; // mm real angle = 0.0; // degrees real rot_s; // rotation sinus real rot_c; // rotation cosinus int mirror_flag = 0; // 1=mirror real xmin, xmax; real ymin, ymax; real width_orig; real height_orig; real w, h; string parse_msg = ""; string l; string cmd; string script_out; int layer_cnt; int layer_sel=0; string layer_list[]; int pen_sel = 0; string pen_list[] = { "0.0", "0.1", "0.2", "0.3", "0.4", "0.5", "1.0", "1.5", "2.0" }; int line_sel = 0; string line_list[] = { "WIRE", "POLYGON" }; real offset_x = 0.0; real offset_y = 0.0; void find_layers() { if (library) { layer_cnt=0; library(L) { L.layers(LA) { if (LA.visible) { if ((LA.number < 17 || LA.number > 19) && (LA.number < 23 || LA.number > 25) && LA.number != 28) { if (LA.number == 94) layer_sel = layer_cnt; sprintf(layer_list[layer_cnt++], "%3d - %s", LA.number, LA.name); } } } } } if (board) { layer_cnt=0; board(B) { B.layers(LA) { if (LA.visible) { if ((LA.number < 17 || LA.number > 19) && (LA.number < 23 || LA.number > 25) && LA.number != 28) sprintf(layer_list[layer_cnt++], "%3d - %s", LA.number, LA.name); } } } } if (schematic) { layer_cnt=0; schematic(S) { S.layers(LA) { if (LA.visible) { if (LA.number < 95 || LA.number > 96) { if (LA.number == 94) layer_sel = layer_cnt; sprintf(layer_list[layer_cnt++], "%3d - %s", LA.number, LA.name); } } } } } } void update_script() { script_out = ""; // script_out += "SET UNDO_LOG OFF;\n"; script_out += "GRID MM;\n"; script_out += "SET WIDTH "+pen_list[pen_sel]+";\n"; script_out += "CHANGE POUR SOLID;\n"; script_out += "LAYER "+strsub(layer_list[layer_sel],0, 3)+";\n"; script_out += "SET WIRE_BEND 2;\n"; script_out += cmd; // script_out += "SET UNDO_LOG ON;\n"; script_out += "WINDOW FIT;\n"; // zoom in on window, thx to carlyn } void parse_dxf() { string cmd_temp = ""; int vertexes = 0; cmd = ""; xmin = ymin = 100000.0; xmax = ymax = -100000.0; rot_s = sin(angle / 180.0 * PI); rot_c = cos(angle / 180.0 * PI); for (i=0; i<dxf_len; i+=2) { dxf_code = strtol(dxf_filedata[i]); dxf_value = dxf_filedata[i+1]; if (dxf_code == 0) { if (state > 2 && dxf_value != "VERTEX") { if (vertexes > 2) // only draw polygons with at least 3 vertexes { cmd += cmd_temp+";\n"; } state = 0; cmd_temp=""; vertexes = 0; } if (dxf_value == "POLYLINE") state = 1; if (dxf_value == "VERTEX" && state==1) { cmd_temp += line_list[line_sel]; // cmd_temp += "POLYGON"; state=2; } if (dxf_value == "SPLINE") { cmd_temp += line_list[line_sel]; // cmd_temp += "POLYGON"; state = 2; } } if (state >= 2) { if (dxf_code == 10) vertex_x = strtod(dxf_value) * scale; if (dxf_code == 20) { state = 3; vertex_y = strtod(dxf_value) * scale; if (vertex_x > xmax) xmax = vertex_x; if (vertex_x < xmin) xmin = vertex_x; if (vertex_y > ymax) ymax = vertex_y; if (vertex_y < ymin) ymin = vertex_y; if (vertex_x != vertex_x_buf || vertex_y != vertex_y_buf) { vertex_x_buf = vertex_x; vertex_y_buf = vertex_y; if (mirror_flag) vertex_x = -vertex_x; sprintf(l, " (%5.6f %5.6f)", (vertex_x * rot_c - vertex_y * rot_s) + offset_x, (vertex_y * rot_c + vertex_x * rot_s) + offset_y); cmd_temp += l; vertexes++; } } } } sprintf(parse_msg, "%s\n\nWidth: %5.3f mm\nHeight: %5.3f mm\n\nLeft: %5.3f mm\nRight: %5.3f mm\n\nTop: %5.3f mm\nBottom: %5.3f mm\n\n", dxf_filename, xmax-xmin, ymax-ymin, xmin + offset_x, xmax + offset_x, ymin + offset_y, ymax + offset_y); if (scale==1.0) // at least the first time { w = width_orig = xmax-xmin; h = height_orig = ymax-ymin; } update_script(); } // // main() // find_layers(); dxf_filename = dlgFileOpen("DXF file to import", ".", "DXF files (*.dxf);;All files (*)"); if (dxf_filename == "") exit (0); dxf_len = fileread(dxf_filedata, dxf_filename); if (dxf_len<1) exit(0); parse_dxf(); // dialog int result = dlgDialog("Simple DXF Polyline Import") { dlgTabWidget { dlgTabPage("Settings") { dlgGridLayout { dlgCell(0, 0) dlgLabel("Scale"); dlgCell(0, 1) dlgRealEdit(scale, 0.0, 999.0); dlgCell(0, 2) dlgPushButton("+Rescale") parse_dxf(); dlgCell(1, 0) dlgLabel("Scale to width [mm]"); dlgCell(1, 1) dlgRealEdit(w, 0.1, 9999.0); dlgCell(1, 2) dlgPushButton("+Scale to width") { scale = w/width_orig; h=scale*height_orig; parse_dxf(); } dlgCell(2, 0) dlgLabel("Scale to height [mm]"); dlgCell(2, 1) dlgRealEdit(h, 0.1, 9999.0); dlgCell(2, 2) dlgPushButton("+Scale to height") { scale = h/height_orig; w=scale*width_orig; parse_dxf(); } dlgCell(3, 0) dlgLabel("Info"); dlgCell(3, 1, 3, 2) dlgTextView(parse_msg);; dlgCell(4, 0) dlgLabel("Import to layer"); dlgCell(4, 1, 4, 2) dlgComboBox(layer_list, layer_sel) update_script(); dlgCell(5, 0) dlgLabel("Wire or Polygon"); dlgCell(5, 1, 5,2) dlgComboBox( line_list, line_sel) parse_dxf(); dlgCell(6, 0) dlgLabel("Pen width [mm]"); dlgCell(6, 1, 6, 2) dlgComboBox(pen_list, pen_sel) update_script(); dlgCell(7, 0) dlgLabel("Angle (ccw)"); dlgCell(7, 1) dlgRealEdit(angle, 0.0, 360.0) parse_dxf(); dlgCell(7, 2) dlgCheckBox("Mirror", mirror_flag) parse_dxf(); dlgCell(8, 0) dlgLabel("Insert offset [mm] x="); dlgCell(8, 1, 8,2) { dlgGridLayout { dlgCell (1, 1) dlgRealEdit(offset_x, -999.0, 999.0) parse_dxf(); dlgCell (1, 2) dlgLabel("y="); dlgCell (1, 3) dlgRealEdit(offset_y, -999.0, 999.0) parse_dxf(); } } } } dlgTabPage("Generated Script") { dlgTextView(script_out); } } dlgGridLayout { dlgCell(0, 0) dlgPushButton("-Cancel") dlgReject(); dlgCell(0, 3) { dlgPushButton("+Execute") { parse_dxf(); dlgAccept(); } } } }; if (result == 0) exit(0); else { exit(script_out); }
Hi @_Marek,
I was needing to import some custom silkscreen Logos into Eagle.
After long research over the internet, I finally found a solution who works fine and not so difficult to use.
And bonus for you, It uses Inkscape as design logo.
Here the link to the script creator: https://gfwilliams.github.io/svgtoeagle/
Follow the instruction and all is working!
See you and have fun
Jltharin