Index: trunk/src_plugins/export_openscad/export_openscad.c =================================================================== --- trunk/src_plugins/export_openscad/export_openscad.c (revision 11205) +++ trunk/src_plugins/export_openscad/export_openscad.c (revision 11206) @@ -30,6 +30,7 @@ #include #include #include +#include #include "compat_misc.h" #include "board.h" @@ -39,6 +40,7 @@ #include "math_helper.h" #include "misc_util.h" #include "plugins.h" +#include "safe_fs.h" #include "hid.h" #include "hid_nogui.h" @@ -68,7 +70,7 @@ static FILE *f = NULL; unsigned layer_open; double layer_thickness = 0.01; -gds_t layer_calls; +gds_t layer_calls, model_calls; pcb_hid_attribute_t openscad_attribute_list[] = { /* other HIDs expect this to be first. */ @@ -88,6 +90,7 @@ #define NUM_OPTIONS (sizeof(openscad_attribute_list)/sizeof(openscad_attribute_list[0])) #include "scad_draw.c" +#include "scad_models.c" PCB_REGISTER_ATTRIBUTES(openscad_attribute_list, openscad_cookie) @@ -155,7 +158,7 @@ fprintf(f, " translate([0,0,%f]) {\n", h); layer_open = 1; - pcb_append_printf(&layer_calls, " layer_%s();\n", layer_name); + pcb_append_printf(&layer_calls, " layer_%s();\n", layer_name); } static void openscad_do_export(pcb_hid_attr_val_t * options) @@ -189,7 +192,10 @@ return -1; gds_init(&layer_calls); + gds_init(&model_calls); + scad_insert_models(); + openscad_hid_export_to_file(f, options); scad_close_layer(); @@ -199,6 +205,7 @@ pcb_hid_restore_layer_ons(save_ons); gds_uninit(&layer_calls); + gds_uninit(&model_calls); fclose(f); f = NULL; Index: trunk/src_plugins/export_openscad/scad_draw.c =================================================================== --- trunk/src_plugins/export_openscad/scad_draw.c (revision 11205) +++ trunk/src_plugins/export_openscad/scad_draw.c (revision 11206) @@ -90,6 +90,7 @@ fprintf(f, " pcb_board_main();\n"); fprintf(f, " pcb_drill();\n"); fprintf(f, " }\n"); + fprintf(f, "%s", model_calls.array); fprintf(f, "}\n"); fprintf(f, "\n"); Index: trunk/src_plugins/export_openscad/scad_models.c =================================================================== --- trunk/src_plugins/export_openscad/scad_models.c (nonexistent) +++ trunk/src_plugins/export_openscad/scad_models.c (revision 11206) @@ -0,0 +1,59 @@ +static void scad_insert_model(htsp_t *models, const char *name, pcb_coord_t x0, pcb_coord_t y0) +{ + FILE *fin; + char *ref; + + if (!htsp_has(models, name)) { + char buff[1024]; + fin = pcb_fopen(name, "r"); + if (fin != NULL) { + char *s, *safe_name = pcb_strdup(name); + for(s = safe_name; *s != '\0'; s++) + if (!isalnum(*s)) + *s = '_'; + /* replace the module line */ + while(fgets(buff, sizeof(buff), fin) != NULL) { + if (strstr(buff, "module") != NULL) { + fprintf(f, "module pcb_part_%s()", safe_name); + if (strchr(buff, '{') != NULL) + fprintf(f, "{\n"); + else + fprintf(f, "\n"); + break; + } + fprintf(f, "%s", buff); + } + + /* copy the rest */ + while(fgets(buff, sizeof(buff), fin) != NULL) { + fprintf(f, "%s", buff); + } + fclose(fin); + pcb_snprintf(buff, sizeof(buff), "pcb_part_%s", safe_name); + htsp_set(models, (char *)name, pcb_strdup(buff)); + free(safe_name); + } + else + htsp_set(models, (char *)name, NULL); + } + ref = htsp_get(models, (char *)name); + if (ref != NULL) + pcb_append_printf(&model_calls, " translate([%mm,%mm,0.8])\n %s();\n", x0, y0, ref); +} + +static void scad_insert_models(void) +{ + htsp_t models; + char *mod; + + htsp_init(&models, strhash, strkeyeq); + + PCB_ELEMENT_LOOP(PCB->Data); { + mod = pcb_attribute_get(&element->Attributes, "openscad"); + if (mod != NULL) + scad_insert_model(&models, mod, element->MarkX, element->MarkY); + } PCB_END_LOOP; + +#warning TODO: free strings + htsp_uninit(&models); +}