added some scripts
This commit is contained in:
parent
69c500f894
commit
8ccf408a68
2 changed files with 744 additions and 0 deletions
345
scripts/import_dxf_polygons_v4.ulp
Normal file
345
scripts/import_dxf_polygons_v4.ulp
Normal file
|
@ -0,0 +1,345 @@
|
|||
/**********************************************************************
|
||||
** **
|
||||
** 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";
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
}
|
399
scripts/svg2poly.ulp
Normal file
399
scripts/svg2poly.ulp
Normal file
|
@ -0,0 +1,399 @@
|
|||
/*
|
||||
* svg2poly.ulp
|
||||
* Feb 2012, By Cruz Monrreal II (Cruz.Monrreal@gmail.com)
|
||||
*
|
||||
* Imports select .svg file and will draw it as a set of polygons
|
||||
* For best results, follow Inkscape instructions as closely as
|
||||
* possible.
|
||||
*
|
||||
*
|
||||
* NOTE: This is not a universal .svg converter. The spec is
|
||||
* simply too large, and the .ulp language is not robust
|
||||
* enough to create an entire .svg parser.
|
||||
*
|
||||
*/
|
||||
|
||||
#usage "<b>Convert a modified SVG file to a Polygon</b><p>\n"
|
||||
" run svg2poly -ratio num\n"
|
||||
" run svg2poly -ratiox numx -ratioy numy -layer layername -outline thickness\n<p>"
|
||||
" The polygons will automatically be centered about the current 'mark'</p>\n"
|
||||
" For instructions on how to prepare the SVG file, go to www.thinkmaketest.com\\nn"
|
||||
"<author>Author: Cruz Monrreal II\n(cruz.monrreal@gmail.com)\n1-Feb-2011</author>"
|
||||
|
||||
/* Inputs, Defaults */
|
||||
string layer = "tDocu";
|
||||
int outline = 0;
|
||||
real ratioX = 1.0, ratioY = 1.0;
|
||||
|
||||
|
||||
/* Globals */
|
||||
string tmp[], master_xml;
|
||||
int poly_start[], num_pts=0, num_polys=0;
|
||||
real pts_x[], pts_y[];
|
||||
real tmp_coords[];
|
||||
|
||||
/* Output */
|
||||
string cmd;
|
||||
|
||||
/*
|
||||
* Stack imlemented to get around lack of recursion
|
||||
*/
|
||||
string stack = "";
|
||||
|
||||
/*** Stack Helper Functions ***/
|
||||
void push(string s){ stack = (stack == "") ? s : stack + "|" + s; }
|
||||
string pull()
|
||||
{
|
||||
string tmp;
|
||||
|
||||
if (stack == "")
|
||||
// Nothing in stack
|
||||
return "";
|
||||
else if (strrstr(stack, "|") == -1){
|
||||
// Stack only has one element
|
||||
tmp = stack;
|
||||
stack = "";
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// Search for the last `|` in string
|
||||
// Return string past last `|`
|
||||
tmp = strsub(stack, strrstr(stack, "|") + 1);
|
||||
stack = strsub(stack, 0, strrstr(stack, "|"));
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encodes all necessary information into a single string
|
||||
* for stack-based recursion
|
||||
*/
|
||||
string pack(string xml, int repush, int num_pts)
|
||||
{
|
||||
string tmp;
|
||||
sprintf(tmp, "%s^%d^%d", xml, repush, num_pts);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/*** Functions ***/
|
||||
void print(string s) {printf("%s\n", s);}
|
||||
|
||||
/*
|
||||
* Sets up the eagle commands for the script.
|
||||
*/
|
||||
void setup_cmd()
|
||||
{
|
||||
int i;
|
||||
|
||||
// Search for parameters
|
||||
for(i=0; i<argc; i++){
|
||||
if (argv[i] == "-ratio"){ // Scale SVG in the X and Y Axis
|
||||
if (i+1 < argc){ // Make sure that there's another argument
|
||||
if (strstr(argv[i+1], "-") == -1){ // And that it's not a command
|
||||
ratioX = ratioY = strtod(argv[i+1]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}else if (argv[i] == "-ratiox"){ //Scale SVG in X Axis
|
||||
if (i+1 < argc){
|
||||
if (strstr(argv[i+1], "-") == -1) {
|
||||
ratioX = strtod(argv[i+1]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}else if (argv[i] == "-ratioy"){ // Scale SVG in Y Axis
|
||||
if (i+1 < argc){
|
||||
if (strstr(argv[i+1], "-") == -1){
|
||||
ratioY = strtod(argv[i+1]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}else if (argv[i] == "-layer"){ // Change layer that SVG is drawn on
|
||||
if (i+1 < argc){
|
||||
if (strstr(argv[i+1], "-") == -1){
|
||||
layer = argv[i+1];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}else if (argv[i] == "-outline"){ // Draw an outline of a given size
|
||||
if (i+1 < argc){
|
||||
if (strstr(argv[i+1], "-") == -1){
|
||||
outline = strtol(argv[i+1]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Arguments passed to replace defaults
|
||||
/*switch (argc){
|
||||
case 5:
|
||||
outline = strtol(argv[4]);
|
||||
case 4:
|
||||
layer = argv[3];
|
||||
case 3:
|
||||
ratioX = strtod(argv[2]);
|
||||
ratioY = strtod(argv[1]);
|
||||
break;
|
||||
case 2:
|
||||
ratioX = ratioY = strtod(argv[1]);
|
||||
}*/
|
||||
|
||||
// Write it all to the eagle command
|
||||
sprintf(cmd, "set wire_bend 2;\nchange layer %s;\nset width %d;\npoly", layer, outline);
|
||||
}
|
||||
|
||||
|
||||
|
||||
string matrix_to_translate(string translate){
|
||||
// Might need to implement sin & cos...
|
||||
|
||||
|
||||
|
||||
|
||||
return translate;
|
||||
}
|
||||
|
||||
/*
|
||||
* Converts svg formatted coordinates to usable peices
|
||||
* WARNING: Function assumes string is formatted correctly
|
||||
*/
|
||||
int svgcoords_to_coords(string s)
|
||||
{
|
||||
string coords[];
|
||||
strsplit(coords, s, ',');
|
||||
tmp_coords[0] = strtod(coords[0]);
|
||||
tmp_coords[1] = strtod(coords[1]);
|
||||
|
||||
// Lower the point resolution
|
||||
sprintf(s, "%2.2f,%2.2f", tmp_coords[0], tmp_coords[1]);
|
||||
strsplit(coords, s, ',');
|
||||
tmp_coords[0] = strtod(coords[0]);
|
||||
tmp_coords[1] = strtod(coords[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract points from a given svg path.
|
||||
* ASSUMES: User followed instructions on site
|
||||
* File was saved as Plain SVG & NO Relative Moves allowed
|
||||
*/
|
||||
void extract_pts(string pts, string transform)
|
||||
{
|
||||
string svg_cmds[];
|
||||
int num = strsplit(svg_cmds, pts, ' '),
|
||||
new_pts = 0;
|
||||
int i = 3;
|
||||
|
||||
// Path format:
|
||||
// M x,y L x,y L x,y L x,y ....
|
||||
poly_start[num_pts] = 1;
|
||||
svgcoords_to_coords(svg_cmds[1]);
|
||||
pts_x[num_pts] = tmp_coords[0];
|
||||
pts_y[num_pts++] = tmp_coords[1];
|
||||
new_pts++;
|
||||
|
||||
printf("%2d) %2.2f,%2.2f\n", num_polys, tmp_coords[0], tmp_coords[1]);
|
||||
|
||||
// Assume that the only commands left are 'L'
|
||||
for(; i<num; i+=2){
|
||||
svgcoords_to_coords(svg_cmds[i]);
|
||||
|
||||
if (tmp_coords[0] != pts_x[num_pts-1] || tmp_coords[1] != pts_y[num_pts-1]){
|
||||
poly_start[num_pts] = 0;
|
||||
pts_x[num_pts] = tmp_coords[0];
|
||||
pts_y[num_pts] = tmp_coords[1];
|
||||
|
||||
//if (transform == "")
|
||||
printf(" %2.2f,%2.2f\n", pts_x[num_pts], pts_y[num_pts]);
|
||||
poly_start[num_pts++] = 0;
|
||||
new_pts++;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply transform if needed
|
||||
if (transform != ""){
|
||||
//print(" Local transform: " + transform);
|
||||
if (strstr(transform, "translate") != -1){
|
||||
int a = strchr(transform, '('),
|
||||
b = strchr(transform, ')', a+1);
|
||||
int offset = num_pts - new_pts;
|
||||
|
||||
// Extract translation offsets
|
||||
svgcoords_to_coords(strsub(transform, a+1, b-a-1));
|
||||
|
||||
// Translate points
|
||||
for(int i=0; i < num/2; i++){
|
||||
pts_x[i + offset] += tmp_coords[0];
|
||||
pts_y[i + offset] += tmp_coords[1];
|
||||
//printf("%f, %f\n", pts_x[i + offset], pts_y[i + offset]);
|
||||
}
|
||||
}else if (strstr(transform, "matrix") != -1){
|
||||
// Do Matrix math (yay...)
|
||||
/* REMEMBER: Inkscape y axis is inverted...*/
|
||||
print(" TODO: Implement Matrix Transform");
|
||||
}else
|
||||
print("Unknown path transformation:\n " + transform);
|
||||
}
|
||||
|
||||
//print("");
|
||||
num_polys++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Traverse through the tree of groups, adding points to paths,
|
||||
* while applying group transforms in the process
|
||||
*/
|
||||
void extract_nested_data(string xml)
|
||||
{
|
||||
string ops[];
|
||||
string children[];
|
||||
int size;
|
||||
|
||||
push(pack(xml, 0, num_pts));
|
||||
|
||||
while(stack != ""){
|
||||
strsplit(ops, pull(), '^');
|
||||
|
||||
// Find # of children
|
||||
size = xmlelements(children, ops[0], "g/g");
|
||||
|
||||
if (size != 0 && ops[1] == "0"){
|
||||
// Repush
|
||||
push(ops[0] + "^1^" + ops[2]);
|
||||
|
||||
// Reverse push children
|
||||
for(int i=size-1; i>=0; i--)
|
||||
push(pack(children[i], 0, num_pts));
|
||||
}else{
|
||||
// Search for and add points
|
||||
print("Searching group " + xmlattribute(ops[0], "g", "id"));
|
||||
|
||||
string paths[];
|
||||
int num_paths = xmlelements(paths, ops[0], "g/path");
|
||||
|
||||
for(int i=0; i<num_paths; i++){
|
||||
print(" Found Path " + xmlattribute(paths[i], "path", "id"));
|
||||
|
||||
// Extract points from each line/path
|
||||
extract_pts(xmlattribute(paths[i], "path", "d"), xmlattribute(paths[i], "path", "transform"));
|
||||
}
|
||||
|
||||
// Find and apply group transform
|
||||
string transform = xmlattribute(ops[0], "g", "transform");
|
||||
if (transform != ""){
|
||||
// Figure out where to start the transform
|
||||
int offset = 0;
|
||||
|
||||
if (ops[1] != "0")
|
||||
offset = strtol(ops[2]);
|
||||
|
||||
print(" Found transform " + transform);
|
||||
|
||||
if (strstr(transform, "translate") != -1){
|
||||
int a = strchr(transform, '('),
|
||||
b = strchr(transform, ')', a+1);
|
||||
|
||||
// Extract translation offsets
|
||||
svgcoords_to_coords(strsub(transform, a+1, b-a-1));
|
||||
|
||||
// Translate points
|
||||
for(int i=offset; i < num_pts; i++){
|
||||
pts_x[i] += tmp_coords[0];
|
||||
pts_y[i] += tmp_coords[1];
|
||||
//printf("%f, %f\n", pts_x[i + offset], pts_y[i + offset]);
|
||||
}
|
||||
}else if (strstr(transform, "matrix") != -1){
|
||||
// Do Matrix math (yay...)
|
||||
/* REMEMBER: Inkscape y axis is inverted...*/
|
||||
print(" TODO: Implement Matrix Transform");
|
||||
}else
|
||||
print("Unknown path transformation:\n " + transform);
|
||||
|
||||
}else{
|
||||
print(" No transform found");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Writes all activity to a log file, while doing its thing
|
||||
*/
|
||||
output("svg2poly.log", "wt")
|
||||
{
|
||||
setup_cmd();
|
||||
|
||||
// Select file
|
||||
string file = dlgFileOpen("Select a file", "", "*.svg");
|
||||
|
||||
if (file != ""){
|
||||
int i=0, j=0;
|
||||
string svg[];
|
||||
master_xml= "";
|
||||
|
||||
int len = fileread(svg, file);
|
||||
|
||||
// Read file into one massive xml line
|
||||
for(; i<len; i++){
|
||||
//print(svg[i]);
|
||||
master_xml += svg[i];
|
||||
}
|
||||
|
||||
// Extract Points and apply transformations
|
||||
extract_nested_data(xmlelement(master_xml, "svg/g"));
|
||||
|
||||
// Correct Inkscape's Formatting issue
|
||||
for(i=0; i<num_pts; i++)
|
||||
pts_y[i] *= -1;
|
||||
|
||||
// Center object
|
||||
real min_x, min_y,
|
||||
max_x, max_y;
|
||||
min_x = max_x = pts_x[0];
|
||||
min_y = max_y = pts_y[0];
|
||||
|
||||
for(i=1; i<num_pts; i++){
|
||||
// Find Min & Max
|
||||
if (pts_x[i] < min_x)
|
||||
min_x = pts_x[i];
|
||||
if (pts_x[i] > max_x)
|
||||
max_x = pts_x[i];
|
||||
|
||||
if (pts_y[i] < min_y)
|
||||
min_y = pts_y[i];
|
||||
if (pts_y[i] > max_y)
|
||||
max_y = pts_y[i];
|
||||
}
|
||||
|
||||
real x_center = (max_x - min_x)/2,
|
||||
y_center = (max_y - min_y)/2;
|
||||
|
||||
// Apply offsets to all points
|
||||
for(i=0; i < num_pts; i++){
|
||||
pts_x[i] -= min_x + x_center;
|
||||
pts_y[i] -= min_y + y_center;
|
||||
}
|
||||
printf("%f %f\n", x_center, y_center);
|
||||
|
||||
// Generate eagle command
|
||||
for(i=0; i<num_pts; i++){
|
||||
if (poly_start[i] == 1){
|
||||
//printf("%2d) %3.4f %3.4f\n", j++, pts_x[i] * ratioX, pts_y[i] * ratioY);
|
||||
if (i != 0)
|
||||
sprintf(cmd, "%s;\npoly (R %f %f)", cmd, pts_x[i] * ratioX, pts_y[i] * ratioY);
|
||||
else
|
||||
sprintf(cmd, "%s (R %f %f)", cmd, pts_x[i] * ratioX, pts_y[i] * ratioY);
|
||||
}else{
|
||||
//printf(" %3.4f %3.4f\n", pts_x[i] * ratioX, pts_y[i] * ratioY);
|
||||
sprintf(cmd, "%s (R %f %f)", cmd, pts_x[i] * ratioX, pts_y[i] * ratioY);
|
||||
}
|
||||
}
|
||||
|
||||
cmd += ";\n";
|
||||
print("\nEagle Command:\n" + cmd);
|
||||
exit(cmd);
|
||||
}
|
||||
|
||||
exit("");
|
||||
}
|
Loading…
Add table
Reference in a new issue