Index: trunk/src_plugins/export_openscad/export_openscad.c =================================================================== --- trunk/src_plugins/export_openscad/export_openscad.c (revision 37246) +++ trunk/src_plugins/export_openscad/export_openscad.c (revision 37247) @@ -40,6 +40,7 @@ #include #include "board.h" #include "data.h" +#include "data_it.h" #include "draw.h" #include #include "layer.h" @@ -302,12 +303,25 @@ scad_group_level = level; } +/* Find the pick and place 0;0 mark, if there is any */ +static void find_origin(rnd_coord_t *ox, rnd_coord_t *oy) +{ + const char *name = "openscad-origin"; + pcb_data_it_t it; + pcb_any_obj_t *obj; + for(obj = pcb_data_first(&it, PCB->Data, PCB_OBJ_CLASS_REAL); obj != NULL; obj = pcb_data_next(&it)) + if (pcb_attribute_get(&obj->Attributes, name) != NULL) + pcb_obj_center(obj, ox, oy); +} + + static void openscad_do_export(rnd_hid_t *hid, rnd_design_t *design, rnd_hid_attr_val_t *options, void *appspec) { const char *filename; int save_ons[PCB_MAX_LAYER]; pcb_cam_t cam; + rnd_coord_t ox = 0, oy = 0; if (!options) { openscad_get_export_options(hid, 0, design, appspec); @@ -363,8 +377,10 @@ if (options[HA_drill].lng) scad_draw_drills(); - scad_draw_finish(options); + find_origin(&ox, &oy); + scad_draw_finish(options, ox, oy); + pcb_hid_restore_layer_ons(save_ons); gds_uninit(&layer_group_calls); Index: trunk/src_plugins/export_openscad/scad_draw.c =================================================================== --- trunk/src_plugins/export_openscad/scad_draw.c (revision 37246) +++ trunk/src_plugins/export_openscad/scad_draw.c (revision 37247) @@ -161,8 +161,10 @@ fprintf(f, "}\n"); } -static void scad_draw_finish(rnd_hid_attr_val_t *options) +static void scad_draw_finish(rnd_hid_attr_val_t *options, rnd_coord_t ox, rnd_coord_t oy) { + int has_origin = (ox != 0) || (oy != 0); + fprintf(f, "module %s_board_main() {\n", scad_prefix); fprintf(f, " translate ([0, 0, -%f])\n", board_thickness/2); fprintf(f, " linear_extrude(height=%f)\n", board_thickness); @@ -172,19 +174,27 @@ fprintf(f, "\n"); fprintf(f, "module %s_board() {\n", scad_prefix); - fprintf(f, " intersection() {\n"); - fprintf(f, " translate ([0, 0, -%d])\n", (int)(board_thickness+1)*2); - fprintf(f, " linear_extrude(height=%d)\n", (int)(board_thickness+1)*4); - fprintf(f, " %s_outline();\n", scad_prefix); - fprintf(f, " union() {\n"); - fprintf(f, " difference() {\n"); - fprintf(f, " %s_board_main();\n", scad_prefix); + + if (has_origin) + rnd_fprintf(f, " translate([%mm, %mm, 0]) {\n", -ox, -oy); + + fprintf(f, " intersection() {\n"); + fprintf(f, " translate ([0, 0, -%d])\n", (int)(board_thickness+1)*2); + fprintf(f, " linear_extrude(height=%d)\n", (int)(board_thickness+1)*4); + fprintf(f, " %s_outline();\n", scad_prefix); + fprintf(f, " union() {\n"); + fprintf(f, " difference() {\n"); + fprintf(f, " %s_board_main();\n", scad_prefix); if (options[HA_drill].lng) - fprintf(f, " %s_drill();\n", scad_prefix); + fprintf(f, " %s_drill();\n", scad_prefix); + fprintf(f, " }\n"); fprintf(f, " }\n"); fprintf(f, " }\n"); + fprintf(f, " %s", model_calls.array); + + if (has_origin) fprintf(f, " }\n"); - fprintf(f, "%s", model_calls.array); + fprintf(f, "}\n"); fprintf(f, "\n");