def __init__(self, v): super(mirror, self).__init__() a, b = D(v[0]), -D(v[1]) a = a / dmath.hypot(a, b) b = b / dmath.hypot(a, b) self.m[0,0] = 1 - 2 * a * a self.m[0,1] = - 2 * a * b self.m[1,0] = - 2 * a * b self.m[1,1] = 1 - 2 * b * b
def center_radius_angle(self, m): points = xform(m, self.points) c = points[0] r, a = [], [] for p in points[1:]: dx, dy = p[0] - c[0], p[1] - c[1] r.append(dmath.hypot(dx, dy)) a.append(dmath.atan2(-dy, dx)) return c, r, a
def rect_pad(self, name, points, rounded, state): m = [] ret = [] for i in range(len(points)): p0, p1 = points[i], points[(i + 1) % len(points)] m.append(((p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2)) dim0 = dmath.hypot(m[2][0] - m[0][0], m[2][1] - m[0][1]) dim1 = dmath.hypot(m[3][0] - m[1][0], m[3][1] - m[1][1]) c = ((m[0][0] + m[2][0]) / 2, (m[0][1] + m[2][1]) / 2) if dim0.quantize(D("0.000001")) == dim1.quantize(D("0.000001")): if rounded: ret.append(circ_pad(name, c, dim0 / 2), state) else: ret += self.rect_pad(name, [ points[0], points[1], m[1], m[3] ], False, state) ret += self.rect_pad(name, [ m[3], m[1], points[2], points[3] ], False, state) return ret if dim0 > dim1: angle = dmath.atan2(m[2][1] - m[0][1], m[2][0] - m[0][0]) else: angle = dmath.atan2(m[3][1] - m[1][1], m[3][0] - m[1][0]) flags = [] if not rounded: flags.append("square") if state.get_onsolder(): flags.append("onsolder") if not state.get_paste(): flags.append("nopaste") thickness = min(dim0, dim1) / 2 width = max(dim0, dim1) - thickness * 2 p = [] p.append((c[0] + dmath.cos(angle) * width / 2, c[1] + dmath.sin(angle) * width / 2)) p.append((c[0] - dmath.cos(angle) * width / 2, c[1] - dmath.sin(angle) * width / 2)) ret.append("""Pad [ %s %s %s %s %s %s %s "%s" "%s" "%s" ]""" % ( P(p[0][0]), P(p[0][1]), P(p[1][0]), P(p[1][1]), P(thickness * 2), P(self.clearance * 2), P((self.mask + thickness) * 2), name, name, ",".join(flags))) return ret
def render(self, obj, state): ret = [] points = xform(state.m, obj.points) if type(obj) == circle: dx = points[1][0] - points[0][0] dy = points[1][1] - points[0][1] r = dmath.hypot(dx, dy) ret.append("""Pin [ %s %s %s %s %s %s "" "" "hole" ]""" % ( P(points[0][0]), P(points[0][1]), P(r * 2), P(self.clearance * 2), P((self.mask + r) * 2), P(r * 2))) return ret
def render(self, obj, state): ret = [] points = xform(state.m, obj.points) if type(obj) == circle: name = state.get_name() if self.should_skip(name): return ret dx = points[1][0] - points[0][0] dy = points[1][1] - points[0][1] r = dmath.hypot(dx, dy) ret.append(self.circ_pad(name, points[0], r, state)) elif type(obj) == square: name = state.get_name() if self.should_skip(name): return ret p = [] for i in range(0, len(obj.paths[0]) - 1): p.append(points[obj.paths[0][i]]) ret += self.rect_pad(name, p, obj.rounded, state) elif type(obj) == union: pass return ret