# HG changeset patch # User Mychaela Falconia # Date 1454205458 0 # Node ID a930e05cf908d3ec79c86d6c317dfa1d9593391e # Parent 0e18818206e57375f3c7007b37ad6d25d4974fa1 pads2gpcb/decals.c: silk circle extraction implemented diff -r 0e18818206e5 -r a930e05cf908 pads2gpcb/decals.c --- a/pads2gpcb/decals.c Sun Jan 31 01:39:31 2016 +0000 +++ b/pads2gpcb/decals.c Sun Jan 31 01:57:38 2016 +0000 @@ -118,7 +118,82 @@ static try_silk_circle() { - return(0); + int i, bad; + long x[2], y[2]; + long centre_x, centre_y, diameter, thickness; + + if (strcmp(input_line_fields[0], "CIRCLE")) + return(0); + if (input_line_nfields != 5) + return(0); + if (strcmp(input_line_fields[4], "0")) + return(0); + if (strcmp(input_line_fields[1], "2")) { + printf("line %d: silk CIRCLE piece ncoord != 2\n", + input_lineno); + return(0); + } + thickness = convert_input_dim(input_line_fields[2]); + + bad = 0; + for (i = 0; i < 2; i++) { + get_line_internal(); + parse_input_line_fields(); + if (input_line_nfields != 2) { + printf("line %d: silk CIRCLE coord not 2 numbers\n", + input_lineno); + bad = 1; + continue; + } + x[i] = convert_input_dim(input_line_fields[0]); + y[i] = -convert_input_dim(input_line_fields[1]); + } + if (bad) + return(1); + + /* find the centre and diameter */ + if (x[0] == x[1]) { + centre_x = x[0]; + if (y[0] < y[1]) { + diameter = y[1] - y[0]; + centre_y = y[0] + diameter / 2; + } else if (y[1] < y[0]) { + diameter = y[0] - y[1]; + centre_y = y[1] + diameter / 2; + } else + goto centre_diam_fail; + } else if (y[0] == y[1]) { + centre_y = y[0]; + if (x[0] < x[1]) { + diameter = x[1] - x[0]; + centre_x = x[0] + diameter / 2; + } else if (x[1] < x[0]) { + diameter = x[0] - x[1]; + centre_x = x[1] + diameter / 2; + } else + goto centre_diam_fail; + } else { +centre_diam_fail: + printf("line %d: unable to find circle centre and diameter\n", + input_lineno); + return(1); + } + if (diameter % 2) + printf("warning: line %d: circle diameter in nm is odd!\n", + input_lineno); + + if (num_silk_arcs >= MAX_SILK_LINES) { + printf("Too many silk arcs!\n"); + return(1); + } + silk_arcs[num_silk_arcs].centre_x = centre_x; + silk_arcs[num_silk_arcs].centre_y = centre_y; + silk_arcs[num_silk_arcs].width = diameter; + silk_arcs[num_silk_arcs].height = diameter; + silk_arcs[num_silk_arcs].start_angle = 0; + silk_arcs[num_silk_arcs].delta_angle = 360; + silk_arcs[num_silk_arcs].thickness = thickness; + return(1); } static void