Index: trunk/src/view.c =================================================================== --- trunk/src/view.c (revision 21308) +++ trunk/src/view.c (revision 21309) @@ -41,6 +41,7 @@ #include "actions.h" #include "compat_misc.h" #include "error.h" +#include "pcb-printf.h" static unsigned long int pcb_view_next_uid = 0; @@ -197,3 +198,66 @@ pcb_box_enlarge(&v->bbox, 0.25, 0.25); } } + +static void view_append_str(gds_t *dst, const char *prefix, const char *key, const char *value) +{ + const char *s; + pcb_append_printf(dst, "%s %s = {", prefix, key); + for(s = value; *s != '\0'; s++) { + switch(*s) { + case '\\': + case '}': + gds_append(dst, '\\'); + break; + } + gds_append(dst, *s); + } + gds_append_str(dst, "}\n"); +} + +void pcb_view_save(pcb_view_t *v, gds_t *dst, const char *prefix) +{ + int g, n; + + if (prefix == NULL) + prefix = ""; + + pcb_append_printf(dst, "%sha:view.%lu {\n", prefix, v->uid); + view_append_str(dst, prefix, "type", v->type); + view_append_str(dst, prefix, "title", v->title); + view_append_str(dst, prefix, "explanation", v->explanation); + if (v->have_bbox) + pcb_append_printf(dst, "%s bbox = {%.08$$mm; %.08$$mm; %.08$$mm; %.08$$mm;}\n", prefix, v->bbox.X1, v->bbox.Y1, v->bbox.X2, v->bbox.Y2); + if (v->have_xy) + pcb_append_printf(dst, "%s xy = {%.08$$mm; %.08$$mm;}\n", prefix, v->x, v->y); + + for(g = 0; g < 2; g++) { + if (pcb_idpath_list_length(&v->objs[g]) > 0) { + pcb_idpath_t *i; + pcb_append_printf(dst, "%s li:objs.%d {\n", prefix, g); + for(i = pcb_idpath_list_first(&v->objs[g]); i != NULL; i = pcb_idpath_list_next(i)) { + pcb_append_printf(dst, "%s {", prefix); + for(n = 0; n < i->len; n++) + pcb_append_printf(dst, "%ld;", i->id[n]); + pcb_append_printf(dst, "}\n", prefix); + } + pcb_append_printf(dst, "%s }\n", prefix); + } + } + + switch(v->data_type) { + case PCB_VIEW_PLAIN: + pcb_append_printf(dst, "%s data_type = plain\n", prefix); + break; + case PCB_VIEW_DRC: + pcb_append_printf(dst, "%s data_type = drc\n", prefix); + pcb_append_printf(dst, "%s data {\n", prefix); + pcb_append_printf(dst, "%s required_value = %.08$$mm\n", prefix, v->data.drc.required_value); + if (v->data.drc.have_measured) + pcb_append_printf(dst, "%s measured_value = %.08$$mm\n", prefix, v->data.drc.measured_value); + pcb_append_printf(dst, "%s }\n", prefix); + break; + } + + pcb_append_printf(dst, "%s}\n", prefix); +} Index: trunk/src/view.h =================================================================== --- trunk/src/view.h (revision 21308) +++ trunk/src/view.h (revision 21309) @@ -29,6 +29,7 @@ #define PCB_VIEW_H #include +#include #include "unit.h" #include "idpath.h" #include "box.h" @@ -110,4 +111,8 @@ /* Calculate and set v->bbox from v->objs[] bboxes */ void pcb_view_set_bbox_by_objs(pcb_data_t *data, pcb_view_t *v); +/* Serialize/save a view into dst as a lihata string, each line optionally + prefixed (prefix can be NULL) */ +void pcb_view_save(pcb_view_t *v, gds_t *dst, const char *prefix); + #endif