+
+ public void arc (real center_x, real center_y,
+ real radius_x, real radius_y,
+ real start_angle, real delta_angle)
+ {
+ fprintf(out, " ElementArc[ %6d %6d %6d %6d %3d %3d %d]\n",
+ mm2mils100(center_x), mm2mils100(center_y),
+ mm2mils100(radius_x), mm2mils100(radius_y),
+ start_angle, delta_angle, mm2mils100(line_thickness));
+ }
+
+ public typedef struct {
+ real x, y; /* center */
+ real width, height; /* size */
+
+ real via_space_x;
+ real via_space_y;
+ int via_cols, via_rows;
+ string name;
+
+ real via_drill;
+ real via_copper;
+
+ } center_t;
+
+ public void center_pad(center_t center) {
+
+ if (is_uninit(¢er.via_drill))
+ center.via_drill = process_drill;
+
+ if (is_uninit(¢er.via_copper))
+ center.via_copper = process_ring;
+
+ if (is_uninit(¢er.via_space_x)) {
+ real side_x = center.via_drill / 2 + center.via_copper;
+ real space_x = center.width - 2 * side_x;
+
+ center.via_space_x = space_x / (center.via_cols - 1);
+ }
+
+ if (is_uninit(¢er.via_space_y)) {
+ real side_y = center.via_drill / 2 + center.via_copper;
+ real space_y = center.width - 2 * side_y;
+
+ center.via_space_y = space_y / (center.via_rows - 1);
+ }
+
+ /* whole pad */
+ pad((pad_t) {
+ .center_x = center.x,
+ .center_y = center.y,
+ .width = center.width,
+ .height = center.height,
+ .name = center.name,
+ .options = "square,nopaste",
+ .spacing = process_space,
+ .mask = 0});
+
+ /* vias */
+ for (int r = 0; r < center.via_rows; r++)
+ for (int c = 0; c < center.via_cols; c++) {
+ real x = (c - (center.via_cols - 1) / 2) * center.via_space_x;
+ real y = (r - (center.via_rows - 1) / 2) * center.via_space_y;
+
+ via_mm(x, y, process_drill, process_ring, center.name);
+
+ pad((pad_t) {
+ .center_x = center.x + x,
+ .center_y = center.y + y,
+ .width = center.via_space_x / 2,
+ .height = center.via_space_y / 2,
+ .name = center.name,
+ .options = "square,nopaste",
+ .clearance = 0,
+ .mask = 0,
+ });
+ }
+
+ for (real r = 0; r < center.via_rows - 0.5; r += 0.5) {
+ for (real c = 0; c < center.via_cols - 0.5; c += 0.5) {
+
+ if (is_int(r) && is_int(c))
+ continue;
+
+ real x = (c - (center.via_cols - 1) / 2) * center.via_space_x;
+ real y = (r - (center.via_rows - 1) / 2) * center.via_space_y;
+
+ /* exposed copper */
+ pad((pad_t) {
+ .center_x = center.x + x,
+ .center_y = center.y + y,
+ .width = center.via_space_x / 2,
+ .height = center.via_space_x / 2,
+ .soldermask = 0,
+ .name = center.name,
+ .options = "square,nopaste",
+ });
+
+ /* paste spot */
+ pad((pad_t) {
+ .center_x = center.x + x,
+ .center_y = center.y + y,
+ .width = center.via_space_x / 3.5,
+ .height = center.via_space_y / 3.5,
+ .name = center.name,
+ .options = "square",
+ });
+ }
+ }
+ }