From 995aa4ca041f054186017e88c307842fa6e75f98 Mon Sep 17 00:00:00 2001 From: werner Date: Thu, 6 Aug 2009 06:54:41 +0000 Subject: [PATCH] - added menu item "Save" to dump the footprint to stdout - added temporary solution for having a part name - added part name to FPD example files - reduced area in which the frame delete button responds git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5393 99fdad57-331a-0410-800a-d7fa5415bdb3 --- README | 22 ++++++++++++++ TODO | 3 +- fpd.l | 2 ++ fpd.y | 22 ++++++++++++-- gui.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++------ gui_style.h | 3 ++ obj.c | 1 + obj.h | 1 + qfn.fpd | 3 ++ quad.fpd | 2 ++ tab.fpd | 2 ++ 11 files changed, 134 insertions(+), 14 deletions(-) diff --git a/README b/README index 45697a9..1edc104 100644 --- a/README +++ b/README @@ -75,6 +75,14 @@ and - to a limited extent - also macros. Long lines can be split by ending them with a backslash. If multiple items need to be placed in a single line, e.g., in a macro, they can be separated with semicolons. +The file has the following structure: + +frame definitions +... +part name +objects +... + Geometry model -------------- @@ -214,6 +222,20 @@ b: vec @(1mm, 1mm) meas a b 0.2 mm +Part name +- - - - - + +The part name is a string of alphanumerical characters. Underscores are +allowed in the part name as well. + +part "" + +Examples: + +part "SSOP_48" +part "0603" + + Frames - - - diff --git a/TODO b/TODO index 4c87ebc..031ee67 100644 --- a/TODO +++ b/TODO @@ -8,7 +8,6 @@ Missing features: - add KiCad output - add postscript output - add option to include/omit helper vecs and frames (display and postscript) -- define part name Error detection: - eliminate duplicate instances @@ -16,7 +15,6 @@ Error detection: Style: - make column of entry field greedily consume all unallocated space - status area looks awful -- status area bounces when something becomes editable - add button with GTK_STOCK_UNDELETE for "undelete" to menu bar Bugs: @@ -54,3 +52,4 @@ Future directions: - future: when encountering an error after a change, we could try to find the same element in the old instance, and select it - future: consider editing off-canvas items in place +- near future: treat part name as pattern diff --git a/fpd.l b/fpd.l index bb29165..cdff32d 100644 --- a/fpd.l +++ b/fpd.l @@ -72,6 +72,8 @@ SP [\t ]* return TOK_SET; } "loop" { BEGIN(NOKEYWORD); return TOK_LOOP; } +"part" { BEGIN(NOKEYWORD); + return TOK_PART; } "frame" { BEGIN(NOKEYWORD); is_table = 0; return TOK_FRAME; } diff --git a/fpd.y b/fpd.y index 9654955..4a7db2e 100644 --- a/fpd.y +++ b/fpd.y @@ -142,7 +142,7 @@ static struct obj *new_obj(enum obj_type type) %token START_FPD START_EXPR -%token TOK_SET TOK_LOOP TOK_FRAME TOK_TABLE TOK_VEC +%token TOK_SET TOK_LOOP TOK_PART TOK_FRAME TOK_TABLE TOK_VEC %token TOK_PAD TOK_RECT TOK_LINE TOK_CIRC TOK_ARC TOK_MEAS %token NUMBER @@ -172,7 +172,7 @@ fpd: root_frame = zalloc_type(struct frame); set_frame(root_frame); } - frame_defs frame_items + frame_defs part_name frame_items { root_frame->prev = last_frame; if (last_frame) @@ -182,6 +182,24 @@ fpd: } ; +part_name: + TOK_PART STRING + { + const char *p; + + if (!*p) { + yyerrorf("invalid part name"); + YYABORT; + } + for (p = $2; *p; *p++) + if (!is_id_char(*p, 0)) { + yyerrorf("invalid part name"); + YYABORT; + } + part_name = $2; + } + ; + frame_defs: | frame_defs frame_def ; diff --git a/gui.c b/gui.c index d8a4340..3725faf 100644 --- a/gui.c +++ b/gui.c @@ -23,6 +23,7 @@ #include "obj.h" #include "delete.h" #include "unparse.h" +#include "dump.h" #include "gui_util.h" #include "gui_style.h" #include "gui_status.h" @@ -39,10 +40,16 @@ static GtkWidget *frames_box; /* ----- menu bar ---------------------------------------------------------- */ +static void menu_save(GtkWidget *widget, gpointer user) +{ + dump(stdout); +} + + static void make_menu_bar(GtkWidget *vbox) { GtkWidget *bar; - GtkWidget *file_menu, *file, *quit; + GtkWidget *file_menu, *file, *quit, *save; bar = gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(vbox), bar, FALSE, FALSE, 0); @@ -53,9 +60,13 @@ static void make_menu_bar(GtkWidget *vbox) gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), file_menu); gtk_menu_shell_append(GTK_MENU_SHELL(bar), file); + save = gtk_menu_item_new_with_label("Save"); + gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), save); + g_signal_connect(G_OBJECT(save), "activate", + G_CALLBACK(menu_save), NULL); + quit = gtk_menu_item_new_with_label("Quit"); gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), quit); - g_signal_connect(G_OBJECT(quit), "activate", G_CALLBACK(gtk_main_quit), NULL); } @@ -460,6 +471,56 @@ static GtkWidget *build_vars(struct frame *frame) } +/* ----- part name --------------------------------------------------------- */ + + +static int validate_part_name(const char *s, void *ctx) +{ + if (!*s) + return 0; + while (*s) + if (!is_id_char(*s++, 0)) + return 0; + return 1; +} + +static void unselect_part_name(void *data) +{ + GtkWidget *widget = data; + + label_in_box_bg(widget, COLOR_PART_NAME); +} + + +static gboolean part_name_edit_event(GtkWidget *widget, GdkEventButton *event, + gpointer data) +{ + inst_select_outside(widget, unselect_part_name); + label_in_box_bg(widget, COLOR_PART_NAME_EDITING); + status_set_type_entry("part ="); + status_set_name("%s", part_name); + edit_name(&part_name, validate_part_name, NULL); + return TRUE; +} + + +static GtkWidget *build_part_name(void) +{ + GtkWidget *label; + + label = label_in_box_new(part_name); + gtk_misc_set_padding(GTK_MISC(label), 2, 2); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0); + + label_in_box_bg(label, COLOR_PART_NAME); + + g_signal_connect(G_OBJECT(box_of_label(label)), + "button_press_event", G_CALLBACK(part_name_edit_event), NULL); + + return box_of_label(label); +} + + /* ----- frame labels ------------------------------------------------------ */ @@ -570,6 +631,7 @@ static gboolean frame_delete_event(GtkWidget *widget, GdkEventButton *event, static GtkWidget *build_frame_delete(struct frame *frame) { GtkWidget *evbox, *image; + GtkWidget *align; evbox = gtk_event_box_new(); image = @@ -577,12 +639,14 @@ static GtkWidget *build_frame_delete(struct frame *frame) GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_container_add(GTK_CONTAINER(evbox), image); - gtk_misc_set_padding(GTK_MISC(image), 2, 2); - gtk_misc_set_alignment(GTK_MISC(image), 0.3, 0); + align = gtk_alignment_new(0.3, 0, 0, 0); + gtk_container_add(GTK_CONTAINER(align), evbox); + gtk_alignment_set_padding(GTK_ALIGNMENT(align), 2, 0, 0, 0); g_signal_connect(G_OBJECT(evbox), "button_press_event", G_CALLBACK(frame_delete_event), frame); - return evbox; + + return align; } @@ -629,28 +693,31 @@ static void build_frames(GtkWidget *vbox) for (frame = frames; frame; frame = frame->next) n++; - tab = gtk_table_new(n*2, 2, FALSE); + tab = gtk_table_new(n*2+1, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(tab), 1); gtk_table_set_col_spacings(GTK_TABLE(tab), 1); gtk_box_pack_start(GTK_BOX(vbox), tab, FALSE, FALSE, 0); + label = build_part_name(); + gtk_table_attach_defaults(GTK_TABLE(tab), label, 0, 1, 0, 1); + n = 0; for (frame = root_frame; frame; frame = frame->prev) { label = build_frame_label(frame); gtk_table_attach_defaults(GTK_TABLE(tab), label, - 0, 1, n*2, n*2+1); + 0, 1, n*2+1, n*2+2); delete = build_frame_delete(frame); gtk_table_attach_defaults(GTK_TABLE(tab), delete, - 0, 1, n*2+1, n*2+2); + 0, 1, n*2+2, n*2+3); refs = build_frame_refs(frame); gtk_table_attach_defaults(GTK_TABLE(tab), refs, - 1, 2, n*2, n*2+1); + 1, 2, n*2+1, n*2+2); vars = build_vars(frame); gtk_table_attach_defaults(GTK_TABLE(tab), vars, - 1, 2, n*2+1, n*2+2); + 1, 2, n*2+2, n*2+3); n++; } gtk_widget_show_all(tab); diff --git a/gui_style.h b/gui_style.h index 54f4f0f..f5ee427 100644 --- a/gui_style.h +++ b/gui_style.h @@ -60,6 +60,9 @@ #define COLOR_EDITING "#ff00ff" +#define COLOR_PART_NAME "#ffa050" +#define COLOR_PART_NAME_EDITING COLOR_EDITING + #define COLOR_FRAME_UNSELECTED "#c0c0c0" #define COLOR_FRAME_SELECTED "#fff0a0" #define COLOR_FRAME_EDITING COLOR_EDITING diff --git a/obj.c b/obj.c index 069cfde..6b2aa5e 100644 --- a/obj.c +++ b/obj.c @@ -27,6 +27,7 @@ #define MAX_ITERATIONS 1000 /* abort "loop"s at this limit */ +char *part_name = NULL; struct frame *frames = NULL; struct frame *root_frame = NULL; struct frame *active_frame = NULL; diff --git a/obj.h b/obj.h index fbf143e..2f4a997 100644 --- a/obj.h +++ b/obj.h @@ -171,6 +171,7 @@ struct obj { }; +extern char *part_name; extern struct frame *frames; extern struct frame *root_frame; extern struct frame *active_frame; diff --git a/qfn.fpd b/qfn.fpd index 45fb783..4b777cb 100644 --- a/qfn.fpd +++ b/qfn.fpd @@ -25,6 +25,9 @@ frame pads { } +part "qfn" + + set N = 24 /* diff --git a/quad.fpd b/quad.fpd index ba3acf6..958d224 100644 --- a/quad.fpd +++ b/quad.fpd @@ -3,6 +3,8 @@ frame c { circ . @ } +part "quad" + vec @(-1mm, 1mm) frame c . vec @(1mm, -1mm) diff --git a/tab.fpd b/tab.fpd index d4580c1..aefcbd5 100644 --- a/tab.fpd +++ b/tab.fpd @@ -2,6 +2,8 @@ * row selection example */ +part "tab" + table { x, x2 } { 1mm, 1 }