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. r5400 - trunk/eda/fped (wer...@docs.openmoko.org)
   2. r5401 - trunk/eda/fped (wer...@docs.openmoko.org)
--- Begin Message ---
Author: werner
Date: 2009-08-07 15:37:51 +0200 (Fri, 07 Aug 2009)
New Revision: 5400

Added:
   trunk/eda/fped/meas.c
   trunk/eda/fped/meas.fpd
   trunk/eda/fped/meas.h
Modified:
   trunk/eda/fped/Makefile
   trunk/eda/fped/README
   trunk/eda/fped/fpd.l
   trunk/eda/fped/fpd.y
   trunk/eda/fped/gui_inst.c
   trunk/eda/fped/inst.c
   trunk/eda/fped/inst.h
   trunk/eda/fped/obj.c
   trunk/eda/fped/obj.h
   trunk/eda/fped/sc89.fpd
Log:
- fpd.y: fixed check for empty part name
- added new-style measurements (experimental)



Modified: trunk/eda/fped/Makefile
===================================================================
--- trunk/eda/fped/Makefile     2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/Makefile     2009-08-07 13:37:51 UTC (rev 5400)
@@ -11,7 +11,7 @@
 #
 
 OBJS = fped.o expr.o coord.o obj.o delete.o inst.o util.o error.o \
-       unparse.o dump.o \
+       unparse.o dump.o meas.o \
        cpp.o lex.yy.o y.tab.o \
        gui.o gui_util.o gui_style.o gui_inst.o gui_status.o gui_canvas.o \
        gui_tools.o

Modified: trunk/eda/fped/README
===================================================================
--- trunk/eda/fped/README       2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/README       2009-08-07 13:37:51 UTC (rev 5400)
@@ -427,3 +427,45 @@
 be undeleted by pressing "u". If any other changes have been made
 since deletion, fped may misbehave. If deleting a vector, all items
 that reference it are deleted.
+
+
+Experimental: new-style measurements
+------------------------------------
+
+New-style measurements can measure the distance between various pairs
+of points, not only between points in the same instance and the same
+frame. They operate on the set of points produced during instantiation.
+
+New-style measurements are placed in the root frame after all other
+items.
+
+Known issues:
+- they are currently not dumped and they can't be entered or edited
+  through the GUI
+- 
+
+Syntax:
+
+<type> <from> <op> <to> <offset>
+
+Types:
+- measxy: measure diagonally
+- measx: measure along the X axis
+- measy: measure along the y axis
+
+Note that the type also affects the selection of the points. E.g.,
+measx will select maximum x values.
+
+Operators:
+- A -> B: smallest value of A and smallest B greater than A
+- A <- B: like A -> B, but normal (for offset and text) is inverted
+- A >> B: smallest value of A and greatest value of B
+- A << B: like A -> B, but normal (for offset and text) is inverted
+
+Operands are qualified vector names. Vectors in the root frame are
+referenced by their name. Vectors in other frames are prefixed with
+the name of the frame followed by a dot.
+
+Example:
+
+measx pad.sw -> pad.se 1mm

Modified: trunk/eda/fped/fpd.l
===================================================================
--- trunk/eda/fped/fpd.l        2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/fpd.l        2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 #include "coord.h"
 #include "expr.h"
 #include "error.h"
+#include "meas.h"
 
 #include "y.tab.h"
 
@@ -94,6 +95,12 @@
                                  return TOK_ARC; }
 <INITIAL>"meas"                        { BEGIN(NOKEYWORD);
                                  return TOK_MEAS; }
+<INITIAL>"measxy"              { BEGIN(NOKEYWORD);
+                                 return TOK_MEASXY; }
+<INITIAL>"measx"               { BEGIN(NOKEYWORD);
+                                 return TOK_MEASX; }
+<INITIAL>"measy"               { BEGIN(NOKEYWORD);
+                                 return TOK_MEASY; }
 
 <INITIAL>[a-zA-Z_][a-zA-Z_0-9]*: { *strchr(yytext, ':') = 0;
                                  yylval.id = unique(yytext);
@@ -118,6 +125,11 @@
                                  yylval.str = stralloc(yytext+1);
                                  return STRING; }
 
+"->"                           return TOK_NEXT;
+"<-"                           return TOK_NEXT_INVERTED;
+">>"                           return TOK_MAX;
+"<<"                           return TOK_MAX_INVERTED;
+
 {SP}                           ;
 \n                             { if (!disable_keywords)
                                        BEGIN(INITIAL);

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y        2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/fpd.y        2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 #include "error.h"
 #include "expr.h"
 #include "obj.h"
+#include "meas.h"
 
 
 extern struct expr *expr_result;
@@ -48,11 +49,11 @@
 }
 
 
-static struct vec *find_vec(const char *name)
+static struct vec *find_vec(const struct frame *frame, const char *name)
 {
        struct vec *v;
 
-       for (v = curr_frame->vecs; v; v = v->next)
+       for (v = frame->vecs; v; v = v->next)
                if (v->name == name)
                        return v;
        return NULL;
@@ -140,12 +141,20 @@
        struct value *value;
        struct vec *vec;
        struct obj *obj;
+       struct meas *meas;
+       enum meas_type mt;
+       struct {
+               int inverted;
+               int max;
+       } mo;
 };
 
 
 %token         START_FPD START_EXPR
 %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         TOK_PAD TOK_RECT TOK_LINE TOK_CIRC TOK_ARC
+%token         TOK_MEAS TOK_MEASXY TOK_MEASX TOK_MEASY
+%token         TOK_NEXT TOK_NEXT_INVERTED TOK_MAX TOK_MAX_INVERTED
 
 %token <num>   NUMBER
 %token <str>   STRING
@@ -155,9 +164,13 @@
 %type  <var>   vars var
 %type  <row>   rows
 %type  <value> row value
-%type  <vec>   vec base
+%type  <vec>   vec base qbase
 %type  <obj>   obj
 %type  <expr>  expr opt_expr add_expr mult_expr unary_expr primary_expr
+%type  <meas>  measurements meas
+%type  <str>   opt_string
+%type  <mt>    meas_type
+%type  <mo>    meas_op
 
 %%
 
@@ -191,7 +204,7 @@
                {
                        const char *p;
 
-                       if (!*p) {
+                       if (!*$2) {
                                yyerrorf("invalid part name");
                                YYABORT;
                        }
@@ -232,6 +245,10 @@
        ;
 
 frame_items:
+       measurements
+               {
+                       measurements = $1;
+               }
        | frame_item frame_items
        ;
 
@@ -248,7 +265,7 @@
        | vec
        | LABEL vec
                {
-                       if (find_vec($1)) {
+                       if (find_vec(curr_frame, $1)) {
                                yyerrorf("duplicate vector \"%s\"", $1);
                                YYABORT;
                        }
@@ -370,6 +387,7 @@
                        $$->y = $6;
                        $$->frame = curr_frame;
                        $$->next = NULL;
+                       $$->samples = NULL;
                        last_vec = $$;
                        *next_vec = $$;
                        next_vec = &$$->next;
@@ -391,7 +409,7 @@
                }
        | ID
                {
-                       $$ = find_vec($1);
+                       $$ = find_vec(curr_frame, $1);
                        if (!$$) {
                                yyerrorf("unknown vector \"%s\"", $1);
                                YYABORT;
@@ -463,6 +481,101 @@
                }
        ;
 
+measurements:
+               {
+                       $$ = NULL;
+               }
+       | meas measurements
+               {
+                       $$ = $1;
+                       $$->next = $2;
+               }
+       ;
+
+meas:
+       meas_type opt_string qbase meas_op qbase expr
+               {
+                       $$ = alloc_type(struct meas);
+                       $$->type = $4.max ? $1+3 : $1;
+                       $$->label = $2;
+                       $$->low = $3;
+                       $$->inverted = $4.inverted;
+                       $$->high = $5;
+                       $$->offset = $6;
+                       $$->next = NULL;
+               }
+       ;
+
+qbase:
+       ID
+               {
+                       $$ = find_vec(root_frame, $1);
+                       if (!$$) {
+                               yyerrorf("unknown vector \"%s\"", $1);
+                               YYABORT;
+                       }
+               }
+       | ID '.' ID
+               {
+                       const struct frame *frame;
+
+                       frame = find_frame($1);
+                       $$ = frame ? find_vec(frame, $3) : NULL;
+                       if (!$$) {
+                               yyerrorf("unknown vector \"%s.%s\"", $1, $3);
+                               YYABORT;
+                       }
+               }
+       ;
+
+meas_type:
+       TOK_MEASXY
+               {
+                       $$ = mt_xy_next;
+               }
+       | TOK_MEASX
+               {
+                       $$ = mt_x_next;
+               }
+       | TOK_MEASY
+               {
+                       $$ = mt_y_next;
+               }
+       ;
+
+meas_op:
+       TOK_NEXT
+               {
+                       $$.max = 0;
+                       $$.inverted = 0;
+               }
+       | TOK_NEXT_INVERTED
+               {
+                       $$.max = 0;
+                       $$.inverted = 1;
+               }
+       | TOK_MAX
+               {
+                       $$.max = 1;
+                       $$.inverted = 0;
+               }
+       | TOK_MAX_INVERTED
+               {
+                       $$.max = 1;
+                       $$.inverted = 1;
+               }
+       ;
+
+opt_string:
+               {
+                       $$ = NULL;
+               }
+       | STRING
+               {
+                       $$ = $1;
+               }
+       ;
+
 opt_expr:
                {
                        $$ = NULL;

Modified: trunk/eda/fped/gui_inst.c
===================================================================
--- trunk/eda/fped/gui_inst.c   2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/gui_inst.c   2009-08-07 13:37:51 UTC (rev 5400)
@@ -16,6 +16,7 @@
 #include <gtk/gtk.h>
 
 #include "util.h"
+#include "coord.h"
 #include "inst.h"
 #include "gui.h"
 #include "gui_util.h"
@@ -329,13 +330,12 @@
 /* ----- meas -------------------------------------------------------------- */
 
 
-static struct coord offset_vec(const struct inst *self)
+static struct coord offset_vec(struct coord a, struct coord b,
+    const struct inst *self)
 {
-       struct coord a, b, res;
+       struct coord res;
        double f;
 
-       a = self->base;
-       b = self->u.meas.end;
        res.x = a.y-b.y;
        res.y = b.x-a.x;
        if (res.x == 0 && res.y == 0)
@@ -352,7 +352,7 @@
        struct coord a, b, off;
        unit_type d;
 
-       off = offset_vec(self);
+       off = offset_vec(self->base, self->u.meas.end, self);
        a = add_vec(self->base, off);
        b = add_vec(self->u.meas.end, off);
        d = dist_line(pos, a, b)/scale;
@@ -364,13 +364,34 @@
 {
        struct coord a0, b0, a1, b1, off, c, d;
        GdkGC *gc;
+       double len;
+       const char *label = self->u.meas.meas ?
+           self->u.meas.meas->label ? self->u.meas.meas->label : "" : "";
        char *s;
 
-       off = offset_vec(self);
        a0 = translate(ctx, self->base);
        b0 = translate(ctx, self->u.meas.end);
-       a1 = translate(ctx, add_vec(self->base, off));
-       b1 = translate(ctx, add_vec(self->u.meas.end, off));
+       a1 = self->base;
+       b1 = self->u.meas.end;
+       switch (self->u.meas.meas ? self->u.meas.meas->type : mt_xy_next) {
+       case mt_xy_next:
+       case mt_xy_max:
+               break;
+       case mt_x_next:
+       case mt_x_max:
+               b1.y = a1.y;
+               break;
+       case mt_y_next:
+       case mt_y_max:
+               b1.x = a1.x;
+               break;
+       default:
+               abort();
+       }
+       off = offset_vec(a1, b1, self);
+       len = units_to_mm(dist_point(a1, b1));
+       a1 = translate(ctx, add_vec(a1, off));
+       b1 = translate(ctx, add_vec(b1, off));
        gc = gc_meas[get_mode(self)];
        gdk_draw_line(DA, gc, a0.x, a0.y, a1.x, a1.y);
        gdk_draw_line(DA, gc, b0.x, b0.y, b1.x, b1.y);
@@ -379,9 +400,8 @@
        draw_arrow(ctx, gc, FALSE, b1, a1, MEAS_ARROW_LEN, MEAS_ARROW_ANGLE);
 
        c = add_vec(a1, b1);
-       d = sub_vec(b0, a0);
-       s = stralloc_printf("%lgmm",
-           units_to_mm(dist_point(self->base, self->u.meas.end)));
+       d = sub_vec(b1, a1);
+       s = stralloc_printf("%s%lgmm", label, len);
        render_text(DA, gc, c.x/2, c.y/2, -atan2(d.y, d.x)/M_PI*180, s,
            MEAS_FONT, 0.5, -MEAS_BASELINE_OFFSET,
            dist_point(a1, b1)-1.5*MEAS_ARROW_LEN, 0);

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c       2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/inst.c       2009-08-07 13:37:51 UTC (rev 5400)
@@ -291,8 +291,11 @@
 
 static void propagate_bbox(const struct inst *inst)
 {
-       update_bbox(&curr_frame->bbox, inst->bbox.min);
-       update_bbox(&curr_frame->bbox, inst->bbox.max);
+       /* @@@ for new-style measurements */
+       struct inst *frame = curr_frame ? curr_frame : insts[ip_frame];
+
+       update_bbox(&frame->bbox, inst->bbox.min);
+       update_bbox(&frame->bbox, inst->bbox.max);
 }
 
 
@@ -640,6 +643,8 @@
        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, 0);
 }
 
@@ -648,6 +653,8 @@
 {
        struct obj *obj = inst->obj;
 
+       if (!inst->obj)
+               return 0; /* @@@ new-style measurements */
        anchors[0] = &obj->base;
        anchors[1] = &obj->u.meas.other;
        return 2;
@@ -664,8 +671,8 @@
 };
 
 
-int inst_meas(struct obj *obj, struct coord from, struct coord to,
-    unit_type offset)
+int inst_meas(struct obj *obj, struct meas *meas,
+    struct coord from, struct coord to, unit_type offset)
 {
        struct inst *inst;
 
@@ -673,6 +680,9 @@
        inst->obj = obj;
        inst->u.meas.end = to;
        inst->u.meas.offset = offset;
+       inst->u.meas.meas = meas;
+       if (!obj)
+               inst->active = 1; /* @@@ new-style measurements */
        /* @@@ our bbox is actually a bit more complex than this */
        update_bbox(&inst->bbox, to);
        propagate_bbox(inst);

Modified: trunk/eda/fped/inst.h
===================================================================
--- trunk/eda/fped/inst.h       2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/inst.h       2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 
 #include "coord.h"
 #include "obj.h"
+#include "meas.h"
 
 
 enum mode {
@@ -70,6 +71,7 @@
                struct {
                        struct coord end;
                        double offset;
+                       struct meas *meas; /* new-style measurement */
                } meas;
        } u;
        struct inst *next;
@@ -95,8 +97,8 @@
 int inst_pad(struct obj *obj, const char *name, struct coord a, struct coord 
b);
 int inst_arc(struct obj *obj, struct coord center, struct coord start,
     struct coord stop, unit_type width);
-int inst_meas(struct obj *obj, struct coord from, struct coord to,
-    unit_type offset);
+int inst_meas(struct obj *obj, struct meas *meas,
+    struct coord from, struct coord to, unit_type offset);
 
 void inst_begin_active(int active);
 void inst_end_active(void);

Added: trunk/eda/fped/meas.c
===================================================================
--- trunk/eda/fped/meas.c                               (rev 0)
+++ trunk/eda/fped/meas.c       2009-08-07 13:37:51 UTC (rev 5400)
@@ -0,0 +1,193 @@
+/*
+ * meas.c - Measurements
+ *
+ * Written 2009 by Werner Almesberger
+ * Copyright 2009 by Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#include <stdlib.h>
+
+#include "util.h"
+#include "coord.h"
+#include "expr.h"
+#include "obj.h"
+#include "inst.h"
+#include "meas.h"
+
+
+struct num eval_unit(const struct expr *expr, const struct frame *frame);
+
+struct sample {
+       struct coord pos;
+       struct sample *next;
+};
+
+struct meas *measurements = NULL;
+
+
+static void reset_samples(struct sample **samples)
+{
+       struct sample *next;
+
+       while (*samples) {
+               next = (*samples)->next;
+               free(*samples);
+               *samples = next;
+       }
+}
+
+
+void meas_start(void)
+{
+       struct frame *frame;
+       struct vec *vec;
+
+       for (frame = frames; frame; frame = frame->next)
+               for (vec = frame->vecs; vec; vec = vec->next)
+                       reset_samples(&vec->samples);
+}
+
+
+void meas_post(struct vec *vec, struct coord pos)
+{
+       struct sample **walk, *new;
+
+       for (walk = &vec->samples; *walk; walk = &(*walk)->next) {
+               if (pos.y < (*walk)->pos.y)
+                       break;
+               if (pos.y > (*walk)->pos.y)
+                       continue;
+               if (pos.x < (*walk)->pos.x)
+                       break;
+               if (pos.x == (*walk)->pos.x)
+                       return;
+       }
+       new = alloc_type(struct sample);
+       new->pos = pos;
+       new->next = *walk;
+       *walk = new;
+}
+
+
+static int lt_x(struct coord a, struct coord b)
+{
+       return a.x < b.x;
+}
+
+
+static int lt_y(struct coord a, struct coord b)
+{
+       return a.y < b.y;
+}
+
+
+static int lt_xy(struct coord a, struct coord b)
+{
+       return a.y < b.y || (a.y == b.y && a.x < b.x);
+}
+
+
+static int (*lt_op[mt_n])(struct coord a, struct coord b) = {
+       lt_xy,
+       lt_x,
+       lt_y,
+       lt_xy,
+       lt_x,
+       lt_y
+};
+
+
+static int is_next[mt_n] = {
+       1, 1, 1,
+       0, 0, 0
+};
+
+
+static int better_next(int (*lt)(struct coord a, struct coord b),
+    struct coord a0, struct coord b0, struct coord b)
+{
+       /* if we don't have any suitable point A0 < B0 yet, use this one */
+       if (!lt(a0, b0))
+               return 1;
+
+       /* B must be strictly greater than A0 */
+       if (!lt(a0, b))
+               return 0;
+
+       /* if we can get closer to A0, do so */
+       if (lt(b, b0))
+               return 1;
+
+       /* reject B > B0 */
+       if (lt(b0, b))
+               return 0;
+
+       /*
+        * B == B0 along the coordinate we measure. Now give the other
+        * coordinate a chance. This gives us a stable sort order and it
+        * makes meas/measx/measy usually select the same point.
+        */
+       if (lt == lt_xy)
+               return 0;
+       if (lt == lt_x)
+               return better_next(lt_y, a0, b0, b);
+       if (lt == lt_y)
+               return better_next(lt_x, a0, b0, b);
+       abort();
+}
+
+
+int instantiate_meas(void)
+{
+       struct meas *meas;
+       struct coord a0, b0;
+       const struct sample *a, *b;
+       int (*lt)(struct coord a, struct coord b);
+       struct num offset;
+
+       for (meas = measurements; meas; meas = meas->next) {
+               if (!meas->low->samples || !meas->high->samples)
+                       continue;
+
+               lt = lt_op[meas->type];
+
+               /*
+                * In order to obtain a stable order, we sort points equal on
+                * the measured coordinate also by xy:
+                *
+                * if (*a < a0) use *a
+                * else if (*a == a0 && *a <xy a0) use *a
+                */
+               a0 = meas->low->samples->pos;
+               for (a = meas->low->samples; a; a = a->next)
+                       if (lt(a->pos, a0) ||
+                           (!lt(a0, a->pos) && lt_xy(a->pos, a0)))
+                               a0 = a->pos;
+
+               b0 = meas->high->samples->pos;
+               for (b = meas->high->samples; b; b = b->next) {
+                       if (is_next[meas->type]) {
+                               if (better_next(lt, a0, b0, b->pos))
+                                       b0 = b->pos;
+                       } else {
+                               if (lt(b0, b->pos) ||
+                                   (!lt(b->pos, b0) && lt_xy(b0, b->pos)))
+                                       b0 = b->pos;
+                       }
+               }
+
+               offset = eval_unit(meas->offset, root_frame);
+               if (is_undef(offset))
+                       return 0;
+               inst_meas(NULL, meas,
+                   meas->inverted ? b0 : a0, meas->inverted ? a0 : b0,
+                   offset.n);
+       }
+       return 1;
+}

Added: trunk/eda/fped/meas.fpd
===================================================================
--- trunk/eda/fped/meas.fpd                             (rev 0)
+++ trunk/eda/fped/meas.fpd     2009-08-07 13:37:51 UTC (rev 5400)
@@ -0,0 +1,24 @@
+/*
+ * new-style measurements demo
+ */
+
+part "measurements"
+loop x = -2, 2
+A: vec @(0mm, 0mm)
+B: vec @(x*2mm, 2mm)
+C: vec @(0mm, 4mm)
+
+/*
+ * If we measure (x, y), y trumps x
+ */
+measxy "A -> B = " A -> B 0.2mm
+measxy "A <- B = " A <- B 0.5mm
+
+measxy "A >> B = " A >> B 1.5mm
+
+measx "x(A -> B) = " A -> B -0.5mm
+measx "x(A >> B) = " A >> B -1mm
+measy "y(A -> B) = " A -> B -2mm
+measy "y(A >> B) = " A >> B -4.5mm
+
+measxy "B -> C = " B -> C 0.5mm

Added: trunk/eda/fped/meas.h
===================================================================
--- trunk/eda/fped/meas.h                               (rev 0)
+++ trunk/eda/fped/meas.h       2009-08-07 13:37:51 UTC (rev 5400)
@@ -0,0 +1,46 @@
+/*
+ * meas.h - Measurements
+ *
+ * Written 2009 by Werner Almesberger
+ * Copyright 2009 by Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#ifndef MEAS_H
+#define MEAS_H
+
+#include "obj.h"
+
+
+struct meas {
+       enum meas_type {
+               mt_xy_next,
+               mt_x_next,
+               mt_y_next,
+               mt_xy_max,
+               mt_x_max,
+               mt_y_max,
+               mt_n
+       } type;
+       char *label; /* or NULL */
+       int inverted;
+       struct vec *low;
+       struct vec *high;
+       struct expr *offset;
+       struct meas *next;
+};
+
+
+extern struct meas *measurements;
+
+
+void meas_start(void);
+void meas_post(struct vec *vec, struct coord pos);
+int instantiate_meas(void);
+
+#endif /* !MEAS_H */

Modified: trunk/eda/fped/obj.c
===================================================================
--- trunk/eda/fped/obj.c        2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/obj.c        2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 #include "util.h"
 #include "error.h"
 #include "expr.h"
+#include "meas.h"
 #include "inst.h"
 #include "obj.h"
 
@@ -37,7 +38,8 @@
     const struct frame *parent, struct obj *frame_ref, int active);
 
 
-static struct num eval_unit(const struct expr *expr, const struct frame *frame)
+struct num eval_unit(const struct expr *expr, const struct frame *frame);
+/*static*/ struct num eval_unit(const struct expr *expr, const struct frame 
*frame)
 {
        struct num d;
 
@@ -78,6 +80,7 @@
                vec->pos.y += y.n;
                if (!inst_vec(vec, vec_base))
                        return 0;
+               meas_post(vec, vec->pos);
        }
        return 1;
 }
@@ -144,7 +147,8 @@
                        offset = eval_unit(obj->u.meas.offset, frame);
                        if (is_undef(offset))
                                return 0;
-                       if (!inst_meas(obj, obj->base ? obj->base->pos : base,
+                       if (!inst_meas(obj, NULL,
+                           obj->base ? obj->base->pos : base,
                            obj->u.meas.other ? obj->u.meas.other->pos : base,
                            offset.n))
                                return 0;
@@ -261,8 +265,11 @@
        int ok;
 
        inst_start();
+       meas_start();
        ok = generate_frame(root_frame, zero, NULL, NULL, 1);
        if (ok)
+               ok = instantiate_meas();
+       if (ok)
                inst_commit();
        else
                inst_revert();

Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h        2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/obj.h        2009-08-07 13:37:51 UTC (rev 5400)
@@ -84,6 +84,8 @@
        int initialized;
 };
 
+struct sample;
+
 struct vec {
        const char *name; /* NULL if anonymous */
        struct expr *x;
@@ -96,6 +98,9 @@
 
        /* used when editing */
        struct frame *frame;
+
+       /* samples for measurements */
+       struct sample *samples;
 };
 
 struct frame {
@@ -147,7 +152,7 @@
        struct expr *width;
 };
 
-struct meas {
+struct old_meas {
        struct vec *other; /* NULL if frame origin */
        struct expr *offset;
 };
@@ -160,7 +165,7 @@
                struct rect line;
                struct pad pad;
                struct arc arc;
-               struct meas meas;
+               struct old_meas meas;
        } u;
        struct frame *frame;
        struct vec *base;

Modified: trunk/eda/fped/sc89.fpd
===================================================================
--- trunk/eda/fped/sc89.fpd     2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/sc89.fpd     2009-08-07 13:37:51 UTC (rev 5400)
@@ -1,12 +1,12 @@
 /* MACHINE-GENERATED ! */
 
 frame pad {
-       _pad_0: vec @(-Px/2, -Py/2)
-       _pad_1: vec .(Px, 0mm)
-       _pad_2: vec _pad_0(0mm, Py)
-       pad "$pad" _pad_1 _pad_2
-       meas _pad_0 _pad_1 -0.1mm
-       meas _pad_0 _pad_2 0.1mm
+       sw: vec @(-Px/2, -Py/2)
+       se: vec sw(Px, 0mm)
+       nw: vec sw(0mm, Py)
+       pad "$pad" se nw
+//     meas sw se -0.1mm
+//     meas sw nw 0.1mm
 }
 
 frame pad_ne {
@@ -41,3 +41,5 @@
 frame pad_sc __0
 frame pad_nw __1
 frame pad_ne __2
+
+measx pad.sw -> pad.se 1mm




--- End Message ---
--- Begin Message ---
Author: werner
Date: 2009-08-07 18:19:23 +0200 (Fri, 07 Aug 2009)
New Revision: 5401

Modified:
   trunk/eda/fped/TODO
   trunk/eda/fped/gui_canvas.c
   trunk/eda/fped/gui_style.h
   trunk/eda/fped/gui_tools.c
   trunk/eda/fped/gui_tools.h
   trunk/eda/fped/gui_util.c
   trunk/eda/fped/gui_util.h
   trunk/eda/fped/inst.c
Log:
- zoom out now doesn't stop before there is a significant border around the 
  drawing
- zoom to frame was broken because it didn't track the recent change in
  location of active flag
- we can now pan and zoom while dragging 
- gui_canvas.c:button_release_event didn't consider the button, making 
  centering also end dragging



Modified: trunk/eda/fped/TODO
===================================================================
--- trunk/eda/fped/TODO 2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/TODO 2009-08-07 16:19:23 UTC (rev 5401)
@@ -24,7 +24,6 @@
 Bugs:
 - default silk width has no business being hard-coded in obj.c
 - undelete only works if not much has changed since the deletion
-- re-center while dragging confuses the save-under mechanism
 
 Code cleanup:
 - merge edit_unique with edit_name

Modified: trunk/eda/fped/gui_canvas.c
===================================================================
--- trunk/eda/fped/gui_canvas.c 2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/gui_canvas.c 2009-08-07 16:19:23 UTC (rev 5401)
@@ -104,6 +104,7 @@
        gdk_draw_rectangle(ctx.widget->window, gc_bg, TRUE, 0, 0, aw, ah);
 
        inst_draw(&ctx);
+       tool_redraw(&ctx);
 }
 
 
@@ -198,7 +199,10 @@
 {
        struct coord pos = canvas_to_coord(&ctx, event->x, event->y);
 
-       if (dragging) {
+       switch (event->button) {
+       case 1:
+               if (!dragging)
+                       break;
                dragging = 0;
                if (hypot(pos.x-drag_start.x, pos.y-drag_start.y)/ctx.scale < 
                    DRAG_MIN_R)
@@ -207,6 +211,7 @@
                        if (tool_end_drag(&ctx, pos))
                                change_world();
                }
+               break;
        }
        return TRUE;
 }
@@ -234,9 +239,10 @@
        bbox = inst_get_bbox();
        bbox.min = translate(&ctx, bbox.min);
        bbox.max = translate(&ctx, bbox.max);
-       if (bbox.min.x >= 0 && bbox.max.y >= 0 &&
-           bbox.max.x < ctx.widget->allocation.width &&
-           bbox.min.y < ctx.widget->allocation.height)
+       if (bbox.min.x >= ZOOM_STOP_BORDER &&
+           bbox.max.y >= ZOOM_STOP_BORDER &&
+           bbox.max.x < ctx.widget->allocation.width-ZOOM_STOP_BORDER &&
+           bbox.min.y < ctx.widget->allocation.height-ZOOM_STOP_BORDER)
                return;
        ctx.scale *= 2;
        ctx.center.x = 2*ctx.center.x-pos.x;

Modified: trunk/eda/fped/gui_style.h
===================================================================
--- trunk/eda/fped/gui_style.h  2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/gui_style.h  2009-08-07 16:19:23 UTC (rev 5401)
@@ -24,6 +24,9 @@
 
 #define        CANVAS_CLEARANCE        10
 
+#define        ZOOM_STOP_BORDER        50      /* stop zoom if we have at 
least a 50
+                                          pixel border */
+
 #define        VEC_ARROW_LEN           10
 #define        VEC_ARROW_ANGLE         20
 #define        VEC_EYE_R               5

Modified: trunk/eda/fped/gui_tools.c
===================================================================
--- trunk/eda/fped/gui_tools.c  2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/gui_tools.c  2009-08-07 16:19:23 UTC (rev 5401)
@@ -59,7 +59,6 @@
 static struct inst *hover_inst = NULL;
 static GtkWidget *frame_image, *frame_image_locked, *frame_image_ready;
 
-
 static struct drag_state {
        struct inst *inst; /* non-NULL if dragging an existing object */
        struct inst *new; /* non-NULL if dragging a new object */
@@ -72,6 +71,7 @@
 };
 
 static struct pix_buf *pix_buf;
+static struct coord last_canvas_pos;
 
 
 static struct vec *new_vec(struct inst *base)
@@ -706,6 +706,7 @@
 
        assert(!drag.new);
        assert(!drag.anchors_n);
+       last_canvas_pos = translate(ctx, pos);
        curr = inst_find_point(ctx, pos);
        if (!curr)
                return 0;
@@ -736,6 +737,7 @@
 {
        if (pix_buf)
                restore_pix_buf(pix_buf);
+       last_canvas_pos = translate(ctx, to);
        tool_hover(ctx, to);
        pix_buf = drag.new ? active_ops->drag_new(ctx, drag.new, to) :
            inst_draw_move(drag.inst, ctx, to, drag.anchor_i);
@@ -746,8 +748,10 @@
 {
        tool_dehover(ctx);
        tool_reset();
-       if (pix_buf)
+       if (pix_buf) {
                restore_pix_buf(pix_buf);
+               pix_buf = NULL;
+       }
        drag.new = NULL;
        active_ops = NULL;
        drag.anchors_n = 0;
@@ -776,6 +780,18 @@
 }
 
 
+void tool_redraw(struct draw_ctx *ctx)
+{
+       if (!drag.new && !drag.anchors_n)
+               return;
+       if (pix_buf)
+               free_pix_buf(pix_buf);
+       pix_buf = NULL;
+       tool_drag(ctx, canvas_to_coord(ctx,
+           last_canvas_pos.x, last_canvas_pos.y));
+}
+
+
 /* ----- tool bar creation ------------------------------------------------- */
 
 

Modified: trunk/eda/fped/gui_tools.h
===================================================================
--- trunk/eda/fped/gui_tools.h  2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/gui_tools.h  2009-08-07 16:19:23 UTC (rev 5401)
@@ -42,6 +42,7 @@
 void tool_drag(struct draw_ctx *ctx, struct coord to);
 void tool_cancel_drag(struct draw_ctx *ctx);
 int tool_end_drag(struct draw_ctx *ctx, struct coord to);
+void tool_redraw(struct draw_ctx *ctx);
 
 /*
  * Cache the frame and track it.

Modified: trunk/eda/fped/gui_util.c
===================================================================
--- trunk/eda/fped/gui_util.c   2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/gui_util.c   2009-08-07 16:19:23 UTC (rev 5401)
@@ -51,6 +51,13 @@
 /* ----- backing store ----------------------------------------------------- */
 
 
+void free_pix_buf(struct pix_buf *buf)
+{
+       g_object_unref(G_OBJECT(buf->buf));
+       free(buf);
+}
+
+
 struct pix_buf *save_pix_buf(GdkDrawable *da, int xa, int ya, int xb, int yb,
     int border)
 {
@@ -92,8 +99,7 @@
 {
        gdk_draw_pixbuf(buf->da, NULL, buf->buf, 0, 0, buf->x, buf->y, -1, -1,
            GDK_RGB_DITHER_NORMAL, 0, 0);
-       g_object_unref(G_OBJECT(buf->buf));
-       free(buf);
+       free_pix_buf(buf);
 }
 
 

Modified: trunk/eda/fped/gui_util.h
===================================================================
--- trunk/eda/fped/gui_util.h   2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/gui_util.h   2009-08-07 16:19:23 UTC (rev 5401)
@@ -28,6 +28,7 @@
 
 void set_width(GdkGC *gc, int width);
 
+void free_pix_buf(struct pix_buf *buf);
 struct pix_buf *save_pix_buf(GdkDrawable *da, int xa, int ya, int xb, int yb,
     int border);
 void restore_pix_buf(struct pix_buf *buf);

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c       2009-08-07 13:37:51 UTC (rev 5400)
+++ trunk/eda/fped/inst.c       2009-08-07 16:19:23 UTC (rev 5401)
@@ -763,7 +763,7 @@
        curr_frame = curr_frame->outer;
        if (curr_frame)
                propagate_bbox(inst);
-       if (inst->active && frame == active_frame)
+       if (inst->u.frame.active && frame == active_frame)
                active_frame_bbox = inst->bbox;
 }
 




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

Reply via email to