Send commitlog mailing list submissions to
        commitlog@lists.openmoko.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        commitlog-requ...@lists.openmoko.org

You can reach the person managing the list at
        commitlog-ow...@lists.openmoko.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r5414 - trunk/eda/fped (wer...@docs.openmoko.org)
   2. r5415 - trunk/eda/fped (wer...@docs.openmoko.org)
--- Begin Message ---
Author: werner
Date: 2009-08-10 15:51:51 +0200 (Mon, 10 Aug 2009)
New Revision: 5414

Modified:
   trunk/eda/fped/TODO
   trunk/eda/fped/fped.c
   trunk/eda/fped/gui.c
   trunk/eda/fped/gui_canvas.c
   trunk/eda/fped/gui_meas.c
   trunk/eda/fped/gui_meas.h
   trunk/eda/fped/gui_tool.c
   trunk/eda/fped/gui_tool.h
   trunk/eda/fped/inst.c
   trunk/eda/fped/inst.h
   trunk/eda/fped/meas.c
   trunk/eda/fped/meas.h
Log:
- File>Save now saves to a file if a second name is given on the command line,
  to stdout if not
- there's no reason anymore to disallow editing the offset in new-style
  measurements
- struct inst_ops is no longer opaque, so we can avoid adding even more silly
  little access functions and open-code straightforward callbacks
- (re)stuctured hover/click/drag logic in gui_tool.c
- added optional debugging output to gui_canvas.c
- don't let a vector's base be dragged onto the vector's own end or onto one
  of its children
- measurements can now be properly changed by dragging



Modified: trunk/eda/fped/TODO
===================================================================
--- trunk/eda/fped/TODO 2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/TODO 2009-08-10 13:51:51 UTC (rev 5414)
@@ -2,8 +2,6 @@
 - populate input area (still needed: mm/mil, rezoom)
 - add default unit (combine with grid unit selection ?)
 - consider adding auto/mm/mil selection for each dimension
-- add measurements (partly done. still needed: find out how to define
-  non-trivial endpoints, e.g., some vector in last iteration of loop)
 - add KiCad output
 - add postscript output
 - add option to include/omit helper vecs and frames (done for display, still
@@ -35,6 +33,9 @@
 - merge edit_unique with edit_name
 - merge find_var_in_frame with similar mechanisms in expr.c and fpd.y
 - add regression tests
+- the drag logic is too complex. Better: let tool/instance just generate the
+  list of points at each stage, then handle the highlighting and hovering
+  inside a dragging module.
 
 Open decisions:
 - Q: should loop be (start, last) or (start, iterations) ? or start ... last ?

Modified: trunk/eda/fped/fped.c
===================================================================
--- trunk/eda/fped/fped.c       2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/fped.c       2009-08-10 13:51:51 UTC (rev 5414)
@@ -11,6 +11,8 @@
  */
 
 
+#include <stdlib.h>
+#include <stdio.h>
 
 #include "cpp.h"
 #include "util.h"
@@ -23,7 +25,9 @@
 extern void scan_empty(void);
 extern int yyparse(void);
 
+char *save_file = NULL;
 
+
 static void load_file(const char *name)
 {
        reporter = report_parse_error;
@@ -32,20 +36,34 @@
 }
 
 
+static void usage(const char *name)
+{
+       fprintf(stderr, "usage: %s [in_file [out_file]]\n", name);
+       exit(1);
+}
+
+
 int main(int argc, char **argv)
 {
+       const char *name = *argv;
        int error;
 
        error = gui_init(&argc, &argv);
        if (error)
                return error;
-       if (argc == 1) {
+       switch (argc) {
+       case 1:
                scan_empty();
                (void) yyparse();
-       } else {
+               break;
+       case 3:
+               save_file = argv[2];
+               /* fall through */
+       case 2:
                load_file(argv[1]);
-               argc--;
-               argv++;
+               break;
+       default:
+               usage(name);
        }
 
        if (!part_name)

Modified: trunk/eda/fped/gui.c
===================================================================
--- trunk/eda/fped/gui.c        2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/gui.c        2009-08-10 13:51:51 UTC (rev 5414)
@@ -11,6 +11,7 @@
  */
 
 
+#include <stdio.h>
 #include <gtk/gtk.h>
 
 #include "inst.h"
@@ -30,6 +31,8 @@
 #include "icons/meas_off.xpm"
 
 
+extern char *save_file;
+
 GtkWidget *root;
 int show_stuff = 1;
 int show_meas = 1;
@@ -45,7 +48,22 @@
 
 static void menu_save(GtkWidget *widget, gpointer user)
 {
-       dump(stdout);
+       FILE *file;
+
+       if (!save_file) {
+               if (!dump(stdout))
+                       perror("stdout");
+               return;
+       }
+       file = fopen(save_file, "w");
+       if (!file) {
+               perror(save_file);
+               return;
+       }
+       if (!dump(file))
+               perror(save_file);
+       if (fclose(file) == EOF)
+               perror(save_file);
 }
 
 

Modified: trunk/eda/fped/gui_canvas.c
===================================================================
--- trunk/eda/fped/gui_canvas.c 2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/gui_canvas.c 2009-08-10 13:51:51 UTC (rev 5414)
@@ -27,6 +27,13 @@
 #include "gui_canvas.h"
 
 
+#if 0
+#define        DPRINTF(fmt, ...)       fprintf(stderr, fmt "\n", ##__VA_ARGS__)
+#else
+#define        DPRINTF(fmt, ...)
+#endif
+
+
 void (*highlight)(void) = NULL;
 
 static struct coord curr_pos;
@@ -139,6 +146,7 @@
 {
        struct coord pos = canvas_to_coord(event->x, event->y);
 
+       DPRINTF("--- motion ---");
        curr_pos.x = event->x;
        curr_pos.y = event->y;
        tool_hover(pos);
@@ -161,6 +169,7 @@
        const struct inst *prev;
        int res;
 
+       DPRINTF("--- button press ---");
        gtk_widget_grab_focus(widget);
        switch (event->button) {
        case 1:
@@ -206,6 +215,7 @@
 {
        struct coord pos = canvas_to_coord(event->x, event->y);
 
+       DPRINTF("--- button release ---");
        switch (event->button) {
        case 1:
                if (!dragging)
@@ -291,6 +301,7 @@
 {
        struct coord pos = canvas_to_coord(curr_pos.x, curr_pos.y);
 
+       DPRINTF("--- key press ---");
        switch (event->keyval) {
        case ' ':
                user_origin = pos;
@@ -350,10 +361,13 @@
     gpointer data)
 {
        static int first = 1;
+
+       DPRINTF("--- expose ---");
        if (first) {
                init_canvas();
                first = 0;
        }
+       tool_dehover();
        redraw();
        return TRUE;
 }
@@ -373,6 +387,7 @@
 static gboolean leave_notify_event(GtkWidget *widget, GdkEventCrossing *event,
     gpointer data)
 {
+       DPRINTF("--- leave ---");
        if (dragging)
                tool_cancel_drag();
        tool_dehover();

Modified: trunk/eda/fped/gui_meas.c
===================================================================
--- trunk/eda/fped/gui_meas.c   2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/gui_meas.c   2009-08-10 13:51:51 UTC (rev 5414)
@@ -12,7 +12,9 @@
 
 
 #include "util.h"
+#include "coord.h"
 #include "meas.h"
+#include "inst.h"
 #include "gui_canvas.h"
 #include "gui_tool.h"
 #include "gui_meas.h"
@@ -153,7 +155,10 @@
        case max_to_min:
                return is_min(meas_dsc->lt, inst);
        case next_to_min:
-               return is_min_of_next(meas_dsc->lt, inst, a);
+               if (!is_min(meas_dsc->lt, inst))
+                       return 0;
+               return is_next(meas_dsc->lt, a, inst);
+//             return is_min_of_next(meas_dsc->lt, inst, a);
        default:
                abort();
        }
@@ -222,10 +227,10 @@
 }
 
 
-/* ----- find point ------------------------------------------------------- */
+/* ----- find start point (new measurement) -------------------------------- */
 
 
-static struct inst *find_point_meas(struct coord pos)
+static struct inst *find_point_meas_new(struct coord pos)
 {
        if (meas_inst)
                return inst_find_vec(pos, meas_pick_vec_b, meas_inst);
@@ -260,6 +265,7 @@
        struct meas *meas;
 
        meas_inst = NULL;
+       highlight = NULL;
        if (from == to)
                return 0;
        /* it's safe to pass "from" here, but we may change it later */
@@ -290,9 +296,9 @@
                abort();
        }
        meas->inverted =
-         mode == min_to_next_or_max && is_min(meas_dsc->lt, to) ? 0 :
-         meas_dsc->lt(from->u.rect.end, to->u.rect.end) !=
-         (mode == min_to_next_or_max);
+           mode == min_to_next_or_max && is_min(meas_dsc->lt, to) ? 0 :
+           meas_dsc->lt(from->u.rect.end, to->u.rect.end) !=
+           (mode == min_to_next_or_max);
 {
 char *sm[] = { "min_to", "max_to", "next_to" };
 char *st[] = { "nxy", "nx", "ny", "mxy", "mx", "my" };
@@ -305,9 +311,36 @@
 }
 
 
+static void cancel_drag_new_meas(void)
+{
+       meas_inst = NULL;
+       highlight = NULL;
+       redraw();
+}
+
+
 /* ----- begin dragging existing measurement ------------------------------- */
 
 
+/*
+ * We didn't record which instance provided the vector we're using here, so we
+ * have to search for it now.
+ */
+
+static struct inst *vec_at(const struct vec *vec, struct coord pos)
+{
+       struct inst *inst;
+       const struct sample *s;
+
+       for (inst = insts_ip_vec(); inst; inst = inst->next)
+               if (inst->vec == vec)
+                       for (s = vec->samples; s; s = s->next)
+                               if (coord_eq(s->pos, pos))
+                                       return inst;
+       abort();
+}
+
+
 void begin_drag_move_meas(struct inst *inst, int i)
 {
        const struct meas *meas = &inst->obj->u.meas;
@@ -328,49 +361,93 @@
        default:
                abort();
        }
+       highlight = meas_highlight_b;
        switch (i) {
        case 0:
-               highlight = meas_highlight_a;
                mode = meas->type < 3 ? next_to_min : max_to_min;
+               meas_inst = vec_at(inst->obj->u.meas.high, inst->u.meas.end);
                break;
        case 1:
-               highlight = meas_highlight_b;
                mode = min_to_next_or_max;
+               meas_inst = vec_at(inst->obj->base, inst->base);
                break;
        default:
                abort();
        }
+//     redraw();
+}
+
+
+/* ----- find end point (existing measurement) ----------------------------- */
+
+
+struct inst *find_point_meas_move(struct inst *inst, struct coord pos)
+{
+       return inst_find_vec(pos, meas_pick_vec_b, meas_inst);
+}
+
+
+/* ----- end dragging existing measurements -------------------------------- */
+
+
+void end_drag_move_meas(void)
+{
+       highlight = NULL;
        redraw();
 }
 
 
-/* ----- operations ------------------------------------------------------- */
+void do_move_to_meas(struct inst *inst, struct inst *to, int i)
+{
+       struct meas *meas = &inst->obj->u.meas;
 
+       switch (i) {
+       case 0:
+               inst->obj->base = inst_get_vec(to);
+               break;
+       case 1:
+               meas->high = inst_get_vec(to);
+               if (is_max(meas_dsc->lt, to))
+                       meas->type = (meas->type % 3)+3;
+               else
+                       meas->type = (meas->type % 3);
+               break;
+       default:
+               abort();
+       }
+}
 
+
+/* ----- operations -------------------------------------------------------- */
+
+
 struct tool_ops tool_meas_ops = {
        .tool_selected  = tool_selected_meas_xy,
        .tool_deselected= tool_deselected_meas,
-       .find_point     = find_point_meas,
+       .find_point     = find_point_meas_new,
        .begin_drag_new = begin_drag_new_meas,
        .drag_new       = drag_new_line,
        .end_new        = end_new_meas,
+       .cancel_drag_new= cancel_drag_new_meas,
 };
 
 struct tool_ops tool_meas_ops_x = {
        .tool_selected  = tool_selected_meas_x,
        .tool_deselected= tool_deselected_meas,
-       .find_point     = find_point_meas,
+       .find_point     = find_point_meas_new,
        .begin_drag_new = begin_drag_new_meas,
        .drag_new       = drag_new_line,
        .end_new        = end_new_meas,
+       .cancel_drag_new= cancel_drag_new_meas,
 };
 
 
 struct tool_ops tool_meas_ops_y = {
        .tool_selected  = tool_selected_meas_y,
        .tool_deselected= tool_deselected_meas,
-       .find_point     = find_point_meas,
+       .find_point     = find_point_meas_new,
        .begin_drag_new = begin_drag_new_meas,
        .drag_new       = drag_new_line,
        .end_new        = end_new_meas,
+       .cancel_drag_new= cancel_drag_new_meas,
 };

Modified: trunk/eda/fped/gui_meas.h
===================================================================
--- trunk/eda/fped/gui_meas.h   2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/gui_meas.h   2009-08-10 13:51:51 UTC (rev 5414)
@@ -23,5 +23,8 @@
 
 
 void begin_drag_move_meas(struct inst *inst, int i);
+struct inst *find_point_meas_move(struct inst *inst, struct coord pos);
+void end_drag_move_meas(void);
+void do_move_to_meas(struct inst *inst, struct inst *to, int i);
 
 #endif /* !GUI_MEAS_H */

Modified: trunk/eda/fped/gui_tool.c
===================================================================
--- trunk/eda/fped/gui_tool.c   2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/gui_tool.c   2009-08-10 13:51:51 UTC (rev 5414)
@@ -457,8 +457,9 @@
 }
 
 
-void do_move_to_arc(struct inst *inst, struct vec *vec, int i)
+void do_move_to_arc(struct inst *inst, struct inst *to, int i)
 {
+       struct vec *vec = inst_get_vec(to);
        struct obj *obj = inst->obj;
        int is_circle;
 
@@ -591,6 +592,7 @@
 /* ----- moving references ------------------------------------------------- */
 
 
+#if 0
 static int may_move(struct inst *curr)
 {
        if (!selected_inst)
@@ -605,6 +607,7 @@
        drag.anchors_n = 0;
        return 0;
 }
+#endif
 
 
 static int would_be_equal(const struct drag_state *state,
@@ -642,7 +645,7 @@
 
 static void do_move_to(struct drag_state *state, struct inst *curr)
 {
-       assert(may_move_to(state, curr));
+       assert(state->inst->ops->find_point || may_move_to(state, curr));
        *state->anchors[state->anchor_i] = inst_get_vec(curr);
 }
 
@@ -665,14 +668,60 @@
 }
 
 
+/*
+ * When hovering, we have to consider the following states:
+ *
+ * selected (selected_inst != NULL)
+ * |  dragging new (drag.new != NULL)
+ * |  |  dragging existing (drag.anchors_n != 0)
+ * |  |  |  tool selected (active_ops)
+ * |  |  |  |
+ * Y  N  N  N  highlight if inst_find_point_selected else don't
+ * Y  N  N  Y  highlight if inst_find_point_selected else fall over to tool
+ * -  Y  N  -  highlight if inst_find_point / active_ops->find_point else don't
+ * -  N  Y  -  highlight if may_move_to else don't
+ * -  Y  Y  -  invalid state
+ * N  N  N  Y  highlight if inst_find_point / active_ops->find_point else don't
+ * N  N  N  N  don't highlight
+ */
+
+static struct inst *get_hover_inst(struct coord pos)
+{
+       struct inst *inst;
+       int i;
+
+       if (drag.new) {
+               if (active_ops->find_point)
+                       return active_ops->find_point(pos);
+               return inst_find_point(pos);
+       }
+       if (drag.anchors_n) {
+               if (drag.inst->ops->find_point)
+                       return drag.inst->ops->find_point(drag.inst, pos);
+               inst = inst_find_point(pos);
+               if (!inst)
+                       return NULL;
+               return may_move_to(&drag, inst) ? inst : NULL;
+       }
+       if (selected_inst) {
+               i = inst_find_point_selected(pos, &inst);
+               if (i != -1)
+                       return inst;
+       }
+       if (!active_ops)
+               return NULL;
+       if (active_ops->find_point)
+               return active_ops->find_point(pos);
+       return inst_find_point(pos);
+}
+
+
 void tool_hover(struct coord pos)
 {
-       struct inst *curr;
+       struct inst *curr = NULL;
 
-       if (active_ops && active_ops->find_point)
-               curr = active_ops->find_point(pos);
-       else
-               curr = inst_find_point(pos);
+       curr = get_hover_inst(pos);
+#if 0
        if ((drag.new && curr == drag.new) || (drag.inst && curr == drag.inst))
                return;
        if (curr && !active_ops) {
@@ -685,6 +734,9 @@
                        drag.anchors_n = 0;
                }
        }
+got:
+#endif
+
        if (curr == hover_inst)
                return;
        if (hover_inst) {
@@ -712,6 +764,17 @@
 }
 
 
+/*
+ * When considering dragging, we have the following states:
+ *
+ * selected (selected_inst != NULL)
+ * |  tool selected (active_ops)
+ * |  |
+ * N  N  don't
+ * Y  -  if we could drag, drag_new/end_new, else fall over to tool
+ * N  Y  click, else single-click creation, else drag_new/end_new
+ */
+
 int tool_consider_drag(struct coord pos)
 {
        struct inst *curr;
@@ -719,41 +782,51 @@
        assert(!drag.new);
        assert(!drag.anchors_n);
        last_canvas_pos = translate(pos);
-       if (active_ops && active_ops->click) {
+
+       if (!selected_inst && !active_ops)
+               return 0;
+       if (selected_inst) {
+               drag.anchor_i = inst_find_point_selected(pos, NULL);
+               if (drag.anchor_i != -1) {
+                       tool_dehover();
+                       drag.inst = selected_inst;
+                       drag.new = NULL;
+                       drag.anchors_n =
+                           inst_anchors(selected_inst, drag.anchors);
+                       over_begin(drag_save_and_draw, NULL, pos);
+                       inst_begin_drag_move(selected_inst, drag.anchor_i);
+                       return 1;
+               }
+       }
+       if (!active_ops)
+               return 0;
+       if (active_ops->click) {
                active_ops->click(pos);
                return 0;
        }
-       if (active_ops && active_ops->find_point)
-               curr = active_ops->find_point(pos);
-       else
-               curr = inst_find_point(pos);
+
+       curr = get_hover_inst(pos);
        if (!curr)
                return 0;
+
        tool_dehover();
-       if (active_ops) {
-               if (active_ops->drag_new) {
-                       if (active_ops->begin_drag_new)
-                               active_ops->begin_drag_new(curr);
-                       drag.inst = NULL;
-                       drag.new = curr;
-                       over_begin(drag_save_and_draw, NULL, pos);
-                       return 1;
-               } else {
-                       /* object is created without dragging */
-                       if (active_ops->end_new(curr, NULL)) {
-                               tool_cancel_drag();
-                               return -1;
-                       }
-                       return 0;
-               }
+
+       if (active_ops->drag_new) {
+               if (active_ops->begin_drag_new)
+                       active_ops->begin_drag_new(curr);
+               drag.inst = NULL;
+               drag.new = curr;
+               over_begin(drag_save_and_draw, NULL, pos);
+               return 1;
        }
-       if (!may_move(curr))
-               return 0;
-       drag.inst = selected_inst;
-       drag.new = NULL;
-       inst_begin_drag_move(selected_inst, drag.anchor_i);
-       over_begin(drag_save_and_draw, NULL, pos);
-       return 1;
+
+       /* object is created without dragging */
+       if (active_ops->end_new(curr, NULL)) {
+               tool_cancel_drag();
+               return -1;
+       }
+       return 0;
+
 }
 
 
@@ -766,12 +839,15 @@
 
 void tool_cancel_drag(void)
 {
+       if (drag.anchors_n && drag.inst->ops->end_drag_move)
+       if (drag.anchors_n && drag.inst->ops->end_drag_move)
+               drag.inst->ops->end_drag_move();
+       drag.new = NULL;
+       active_ops = NULL;
+       drag.anchors_n = 0;
        over_end();
        tool_dehover();
        tool_reset();
-       drag.new = NULL;
-       active_ops = NULL;
-       drag.anchors_n = 0;
 }
 
 
@@ -784,17 +860,26 @@
        tool_cancel_drag();
        if (state.new && ops->end_new_raw)
                return ops->end_new_raw(state.new, to);
-       if (ops->find_point)
+       if (state.new && ops->find_point)
                end = ops->find_point(to);
-       else
-               end = inst_find_point(to);
-       if (!end)
+       else {
+               if (state.inst && state.inst->ops->find_point)
+                       end = state.inst->ops->find_point(state.inst, to);
+               else
+                       end = inst_find_point(to);
+       }
+       if (!end) {
+               if (state.new && ops->cancel_drag_new)
+                       ops->cancel_drag_new();
                return 0;
+       }
        if (state.new)
                return ops->end_new(state.new, end);
-       if (!may_move_to(&state, end))
+
+       /* if we got the point from find_point, it's authoritative */
+       if (!state.inst->ops->find_point && !may_move_to(&state, end))
                return 0;
-       if (!inst_do_move_to(drag.inst, inst_get_vec(end), state.anchor_i))
+       if (!inst_do_move_to(state.inst, end, state.anchor_i))
                do_move_to(&state, end);
        return 1;
 }
@@ -802,12 +887,15 @@
 
 void tool_redraw(void)
 {
+       struct coord pos;
+
        over_reset();
+       hover_inst = NULL;
        if (!drag.new && !drag.anchors_n)
                return;
-       tool_hover(last_canvas_pos);
-       over_begin(drag_save_and_draw, NULL,
-           canvas_to_coord(last_canvas_pos.x, last_canvas_pos.y));
+       pos = canvas_to_coord(last_canvas_pos.x, last_canvas_pos.y);
+       tool_hover(pos);
+       over_begin(drag_save_and_draw, NULL, pos);
 }
 
 
@@ -837,6 +925,7 @@
 void tool_reset(void)
 {
        over_reset();
+       hover_inst = NULL;
        tool_select(ev_point, NULL);
 }
 

Modified: trunk/eda/fped/gui_tool.h
===================================================================
--- trunk/eda/fped/gui_tool.h   2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/gui_tool.h   2009-08-10 13:51:51 UTC (rev 5414)
@@ -28,6 +28,7 @@
        struct pix_buf *(*drag_new)(struct inst *from, struct coord to);
        int (*end_new_raw)(struct inst *from, struct coord to);
        int (*end_new)(struct inst *from, struct inst *to);
+       void (*cancel_drag_new)(void);
 };
 
 
@@ -42,7 +43,7 @@
 struct pix_buf *gui_hover_vec(struct inst *self);
 struct pix_buf *gui_hover_frame(struct inst *self);
 
-void do_move_to_arc(struct inst *inst, struct vec *vec, int i);
+void do_move_to_arc(struct inst *inst, struct inst *to, int i);
 
 void tool_dehover(void);
 void tool_hover(struct coord pos);

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c       2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/inst.c       2009-08-10 13:51:51 UTC (rev 5414)
@@ -29,22 +29,6 @@
 #include "inst.h"
 
 
-struct inst_ops {
-       void (*debug)(struct inst *self);
-       void (*save)(FILE *file, struct inst *self);
-       void (*draw)(struct inst *self);
-       struct pix_buf *(*hover)(struct inst *self);
-       unit_type (*distance)(struct inst *self, struct coord pos, 
-           unit_type scale);
-       void (*select)(struct inst *self);
-       int (*anchors)(struct inst *self, struct vec ***anchors);
-       void (*begin_drag_move)(struct inst *from, int i);
-       struct pix_buf *(*draw_move)(struct inst *inst,
-           struct coord pos, int i);
-       /* arcs and measurements need this special override */
-       void (*do_move_to)(struct inst *inst, struct vec *vec, int i);
-};
-
 enum inst_prio {
        ip_frame,       /* frames have their own selection */
        ip_pad,         /* pads also accept clicks inside */
@@ -235,6 +219,49 @@
 }
 
 
+int inst_find_point_selected(struct coord pos, struct inst **res)
+{
+       struct vec **anchors[3];
+       int n, best_i, i;
+       struct inst *best = NULL;
+       struct inst *inst;
+       int d_min, d;
+
+       assert(selected_inst);
+       n = inst_anchors(selected_inst, anchors);
+       for (i = 0; i != n; i++) {
+               if (*anchors[i]) {
+                       for (inst = insts[ip_vec]; inst; inst = inst->next) {
+                               if (inst->vec != *anchors[i])
+                                       continue;
+                               d = gui_dist_vec(inst, pos, draw_ctx.scale);
+                               if (d != -1 && (!best || d < d_min)) {
+                                       best = inst;
+                                       best_i = i;
+                                       d_min = d;
+                               }
+                       }
+               } else {
+                       for (inst = insts[ip_frame]; inst; inst = inst->next) {
+                               if (inst != selected_inst->outer)
+                                       continue;
+                               d = gui_dist_frame(inst, pos, draw_ctx.scale);
+                               if (d != -1 && (!best || d < d_min)) {
+                                       best = inst;
+                                       best_i = i;
+                                       d_min = d;
+                               }
+                       }
+               }
+       }
+       if (!best)
+               return -1;
+       if (res)
+               *res = best;
+       return best_i;
+}
+
+
 struct coord inst_get_point(const struct inst *inst)
 {
        if (inst->ops == &vec_ops)
@@ -317,7 +344,6 @@
 
 static void propagate_bbox(const struct inst *inst)
 {
-       /* @@@ for new-style measurements */
        struct inst *frame = curr_frame ? curr_frame : insts[ip_frame];
 
        update_bbox(&frame->bbox, inst->bbox.min);
@@ -388,6 +414,30 @@
 }
 
 
+/*
+ * @@@ The logic of gui_find_point_vec isn't great. Instead of selecting a
+ * point and then filtering, we should filter the candidates, so that a point
+ * that's close end eligible can win against one that's closer but not
+ * eligible.
+ */
+
+static struct inst *find_point_vec(struct inst *self, struct coord pos)
+{
+       struct inst *inst;
+       const struct vec *vec;
+
+       inst = inst_find_point(pos);
+       if (!inst)
+               return NULL;
+       if (inst->ops == &frame_ops)
+               return inst;
+       for (vec = inst->vec; vec; vec = vec->base)
+               if (vec == self->vec)
+               return NULL;
+       return inst;
+}
+
+
 static int vec_op_anchors(struct inst *inst, struct vec ***anchors)
 {
        anchors[0] = &inst->vec->base;
@@ -401,6 +451,7 @@
        .hover          = gui_hover_vec,
        .distance       = gui_dist_vec,
        .select         = vec_op_select,
+       .find_point     = find_point_vec,
        .anchors        = vec_op_anchors,
        .draw_move      = draw_move_vec,
 };
@@ -669,8 +720,6 @@
        rect_status(self->bbox.min, self->bbox.max, -1);
        status_set_type_entry("offset =");
        status_set_name("%5.2f mm", units_to_mm(self->u.meas.offset));
-       if (!self->obj)
-               return; /* @@@ new-style measurements */
        edit_expr(&self->obj->u.meas.offset);
 }
 
@@ -692,7 +741,10 @@
        .select         = meas_op_select,
        .anchors        = meas_op_anchors,
        .begin_drag_move= begin_drag_move_meas,
+       .find_point     = find_point_meas_move,
        .draw_move      = draw_move_meas,
+       .end_drag_move  = end_drag_move_meas,
+       .do_move_to     = do_move_to_meas,
 };
 
 
@@ -911,11 +963,11 @@
 }
 
 
-int inst_do_move_to(struct inst *inst, struct vec *vec, int i)
+int inst_do_move_to(struct inst *inst, struct inst *to, int i)
 {
        if (!inst->ops->do_move_to)
                return 0;
-       inst->ops->do_move_to(inst, vec, i);
+       inst->ops->do_move_to(inst, to, i);
        return 1;
 }
 

Modified: trunk/eda/fped/inst.h
===================================================================
--- trunk/eda/fped/inst.h       2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/inst.h       2009-08-10 13:51:51 UTC (rev 5414)
@@ -36,8 +36,26 @@
        struct coord max;
 };
 
-struct inst_ops;
+struct inst;
 
+struct inst_ops {
+       void (*debug)(struct inst *self);
+       void (*save)(FILE *file, struct inst *self);
+       void (*draw)(struct inst *self);
+       struct pix_buf *(*hover)(struct inst *self);
+       unit_type (*distance)(struct inst *self, struct coord pos, 
+           unit_type scale);
+       void (*select)(struct inst *self);
+       int (*anchors)(struct inst *self, struct vec ***anchors);
+       void (*begin_drag_move)(struct inst *from, int i);
+       struct inst *(*find_point)(struct inst *self, struct coord pos);
+       struct pix_buf *(*draw_move)(struct inst *inst,
+           struct coord pos, int i);
+       void (*end_drag_move)(void);
+       /* arcs and measurements need this special override */
+       void (*do_move_to)(struct inst *inst, struct inst *to, int i);
+};
+
 struct inst {
        const struct inst_ops *ops;
        struct coord base;
@@ -85,6 +103,7 @@
 void inst_deselect(void);
 
 struct inst *inst_find_point(struct coord pos);
+int inst_find_point_selected(struct coord pos, struct inst **res);
 struct coord inst_get_point(const struct inst *inst);
 int inst_anchors(struct inst *inst, struct vec ***anchors);
 struct vec *inst_get_vec(const struct inst *inst);
@@ -119,7 +138,7 @@
 struct inst *insts_ip_vec(void);
 
 struct pix_buf *inst_draw_move(struct inst *inst, struct coord pos, int i);
-int inst_do_move_to(struct inst *inst, struct vec *vec, int i);
+int inst_do_move_to(struct inst *inst, struct inst *to, int i);
 struct pix_buf *inst_hover(struct inst *inst);
 void inst_begin_drag_move(struct inst *inst, int i);
 void inst_delete(struct inst *inst);

Modified: trunk/eda/fped/meas.c
===================================================================
--- trunk/eda/fped/meas.c       2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/meas.c       2009-08-10 13:51:51 UTC (rev 5414)
@@ -23,12 +23,7 @@
 
 struct num eval_unit(const struct expr *expr, const struct frame *frame);
 
-struct sample {
-       struct coord pos;
-       struct sample *next;
-};
 
-
 static void reset_samples(struct sample **samples)
 {
        struct sample *next;

Modified: trunk/eda/fped/meas.h
===================================================================
--- trunk/eda/fped/meas.h       2009-08-09 01:51:20 UTC (rev 5413)
+++ trunk/eda/fped/meas.h       2009-08-10 13:51:51 UTC (rev 5414)
@@ -41,7 +41,10 @@
        struct expr *offset;
 };
 
-struct sample;
+struct sample {
+       struct coord pos;
+       struct sample *next;
+};
 
 
 int lt_x(struct coord a, struct coord b);




--- End Message ---
--- Begin Message ---
Author: werner
Date: 2009-08-10 17:13:07 +0200 (Mon, 10 Aug 2009)
New Revision: 5415

Modified:
   trunk/eda/fped/dump.c
   trunk/eda/fped/gui_tool.c
   trunk/eda/fped/sc89.fpd
Log:
- trying to place a frame reference upset the overlay state and caused an abort
- dump any undumped non-measurements before the measurements
- finished sc89.fpd, with the full set of measurements



Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c       2009-08-10 13:51:51 UTC (rev 5414)
+++ trunk/eda/fped/dump.c       2009-08-10 15:13:07 UTC (rev 5415)
@@ -364,8 +364,11 @@
                obj->dumped = 0;
        dump_vecs(file, frame->vecs, indent);
 
-       /* do we need this for anything but measurements ? */
+       /* frames based on @ (anything else ?) */
        for (obj = frame->objs; obj; obj = obj->next)
+               if (obj->type != ot_meas)
+                       dump_obj(file, obj, indent, NULL);
+       for (obj = frame->objs; obj; obj = obj->next)
                dump_obj(file, obj, indent, NULL);
 }
 

Modified: trunk/eda/fped/gui_tool.c
===================================================================
--- trunk/eda/fped/gui_tool.c   2009-08-10 13:51:51 UTC (rev 5414)
+++ trunk/eda/fped/gui_tool.c   2009-08-10 15:13:07 UTC (rev 5415)
@@ -821,10 +821,8 @@
        }
 
        /* object is created without dragging */
-       if (active_ops->end_new(curr, NULL)) {
-               tool_cancel_drag();
+       if (active_ops->end_new(curr, NULL))
                return -1;
-       }
        return 0;
 
 }

Modified: trunk/eda/fped/sc89.fpd
===================================================================
--- trunk/eda/fped/sc89.fpd     2009-08-10 13:51:51 UTC (rev 5414)
+++ trunk/eda/fped/sc89.fpd     2009-08-10 15:13:07 UTC (rev 5415)
@@ -1,10 +1,10 @@
 /* MACHINE-GENERATED ! */
 
 frame pad {
-       sw: vec @(-Px/2, -Py/2)
-       se: vec sw(Px, 0mm)
-       nw: vec sw(0mm, Py)
-       pad "$pad" se nw
+       _pad_0: vec @(-Px/2, -Py/2)
+       _pad_1: vec .(Px, 0mm)
+       _pad_2: vec _pad_0(0mm, Py)
+       pad "$pad" _pad_2 _pad_1
 }
 
 frame pad_ne {
@@ -28,16 +28,53 @@
        frame pad _pad_sc_0
 }
 
-part "SC_89"
+frame outline {
+       __4: vec @(0mm, Oy/2)
+       __5: vec @(0mm, -Oy/2)
+       __6: vec .(Ox/2, 0mm)
+       __7: vec __5(-Ox/2, 0mm)
+       __8: vec __4(Ow/2, 0mm)
+       __9: vec __4(-Ow/2, 0mm)
+       _outline_6: vec @(0mm, Oh)
+       _outline_7: vec .(Ox/2, 0mm)
+       _outline_8: vec _outline_6(-Ox/2, 0mm)
+       _outline_9: vec _outline_6(Ow/2, 0mm)
+       _outline_10: vec _outline_6(-Ow/2, 0mm)
+       line __7 __6 5mil
+       line _outline_7 __6 5mil
+       line _outline_8 __7 5mil
+       line _outline_8 _outline_10 5mil
+       line __9 _outline_10 5mil
+       line __9 __8 5mil
+       line __8 _outline_9 5mil
+       line _outline_9 _outline_7 5mil
+}
+
+part "SC89"
 table
-    { Gx, Gy, Px, Py }
-    { 1.5mm, 0.7mm, 0.5mm, 0.6mm }
+    { Px, Py, Gy, Wx }
+    { 0.5mm, 0.6mm, 0.7mm, 1.5mm }
 
+table
+    { Ox, Oy, Oh, Ow }
+    { 2mm, 2.2mm, 0.6mm, 0.85mm }
+
 __0: vec @(0mm, Gy/2)
-__1: vec @(-Gx/2, -Gy/2)
-__2: vec @(Gx/2, -Gy/2)
+__1: vec @(0mm, -Gy/2)
+__2: vec .(Wx/2, 0mm)
+__3: vec __1(-Wx/2, 0mm)
+dummy: vec @(0.2mm, 0mm)
 frame pad_sc __0
-frame pad_nw __1
+frame pad_nw __3
 frame pad_ne __2
-
-measx pad.sw -> pad.se 1mm
+frame outline @
+measx pad._pad_0 >> pad._pad_1 -0.6mm
+measy pad._pad_0 >> pad._pad_2 0.8mm
+measy __3 >> pad._pad_0 0.5mm
+measx pad._pad_0 -> pad._pad_1 -0.3mm
+measy pad._pad_0 >> __3 0.5mm
+measy dummy >> outline.__6 1.1mm
+measy outline._outline_7 >> dummy 0.3mm
+measy outline.__8 >> outline.__6 1.2mm
+measx outline.__9 >> outline.__8 0.3mm
+measx outline.__7 >> outline.__6 -0.8mm




--- End Message ---
_______________________________________________
commitlog mailing list
commitlog@lists.openmoko.org
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to