def draw_on(self, canvas, offset=(0, 0)): Pin_Drawable.draw_on(self, canvas, offset) ox, oy = offset w, h = self.width, self.height cx, cy = ox + w / 2, oy + h / 2 pwr_x, pwr_y, gnd_x, gnd_y = self._pwr_gnd_positions(offset) self.parts.add(canvas.create_text(pwr_x + LABEL_PADDING * sign(cx - pwr_x), pwr_y + LABEL_PADDING * sign(cy - pwr_y), text='+', fill='white', justify=CENTER, font=FONT)) self.parts.add(canvas.create_text(gnd_x + LABEL_PADDING * sign(cx - gnd_x), gnd_y + LABEL_PADDING * sign(cy - gnd_y), text='-', fill='white', justify=CENTER, font=FONT))
def condensed_points(points): """ Returns a collapsed version of |points| so that there are no three consecutive collinear points. """ assert len(points) >= 1 condensed = points[:1] for i in xrange(1, len(points) - 1): _x, _y = condensed[-1] x, y = points[i] x_, y_ = points[i + 1] if sign(x - _x) != sign(x_ - x) or sign(y - _y) != sign(y_ - y): condensed.append(points[i]) condensed.append(points[-1]) return condensed
def locs(self): """ Returns an (approximate) list of the locations on the proto board covered by this wire. """ dr = self.r_1 - self.r_2 _dr = sign(dr) dc = self.c_1 - self.c_2 _dc = sign(dc) if dr == 0: return [(self.r_1, c) for c in xrange(self.c_1, self.c_2 - _dc, -_dc)] elif dc == 0: return [(r, self.c_1) for r in xrange(self.r_1, self.r_2 - _dr, -_dr)] elif abs(dc) > abs(dr): return [(self.r_1 + (c - self.c_1) * dr / dc , c) for c in xrange( self.c_1, self.c_2 - _dc, -_dc)] else: # abs(dr) >= abs(dc) return [(r, self.c_1 + (r - self.r_1) * dc / dr) for r in xrange( self.r_1, self.r_2 - _dr, -_dr)]
def locs(self): """ Returns an (approximate) list of the locations on the proto board covered by this wire. """ dr = self.r_1 - self.r_2 _dr = sign(dr) dc = self.c_1 - self.c_2 _dc = sign(dc) if dr == 0: return [(self.r_1, c) for c in xrange(self.c_1, self.c_2 - _dc, -_dc)] elif dc == 0: return [(r, self.c_1) for r in xrange(self.r_1, self.r_2 - _dr, -_dr)] elif abs(dc) > abs(dr): return [(self.r_1 + (c - self.c_1) * dr / dc, c) for c in xrange(self.c_1, self.c_2 - _dc, -_dc)] else: # abs(dr) >= abs(dc) return [(r, self.c_1 + (r - self.r_1) * dc / dr) for r in xrange(self.r_1, self.r_2 - _dr, -_dr)]
def draw_on(self, canvas, offset=(0, 0)): Pin_Drawable.draw_on(self, canvas, offset) ox, oy = offset w, h = self.width, self.height cx, cy = ox + w / 2, oy + h / 2 top_x, top_y, middle_x, middle_y, bottom_x, bottom_y = self._pin_positions( offset) self.parts.add(canvas.create_text(top_x + LABEL_PADDING * sign(cx - top_x), top_y + LABEL_PADDING * sign(cy - top_y), text='+', fill='white', justify=CENTER, font=FONT)) self.parts.add(canvas.create_text(middle_x + LABEL_PADDING * sign(cx - middle_x), middle_y + LABEL_PADDING * sign(cy - middle_y), text='m', fill='white', justify=CENTER, font=FONT)) self.parts.add(canvas.create_text(bottom_x + LABEL_PADDING * sign(cx - bottom_x), bottom_y + LABEL_PADDING * sign(cy - bottom_y), text='-', fill='white', justify=CENTER, font=FONT))
def draw_on(self, canvas, offset=(0, 0)): Pin_Drawable.draw_on(self, canvas, offset) ox, oy = offset w, h = self.width, self.height cx, cy = ox + w / 2, oy + h / 2 left_x, left_y, common_x, common_y, right_x, right_y = self._pin_positions( offset) self.parts.add(canvas.create_text(left_x + LABEL_PADDING * sign(cx - left_x), left_y + LABEL_PADDING * sign(cy - left_y), text='l', fill='white', justify=CENTER, font=FONT)) self.parts.add(canvas.create_text(common_x + LABEL_PADDING * sign(cx - common_x), common_y + LABEL_PADDING * sign(cy - common_y), text='c', fill='white', justify=CENTER, font=FONT)) self.parts.add(canvas.create_text(right_x + LABEL_PADDING * sign(cx - right_x), right_y + LABEL_PADDING * sign(cy - right_y), text='r', fill='white', justify=CENTER, font=FONT)) # draw the button that shows whether a signal file has been selected lamp_cx = ox + LAMP_BOX_PADDING + LAMP_BOX_SIZE / 2 lamp_cy = oy + LAMP_BOX_PADDING + LAMP_BOX_SIZE / 2 lamp_box = canvas.create_rectangle(lamp_cx - LAMP_BOX_SIZE / 2, lamp_cy - LAMP_BOX_SIZE / 2, lamp_cx + LAMP_BOX_SIZE / 2, lamp_cy + LAMP_BOX_SIZE / 2, fill=LAMP_BOX_COLOR) lamp = create_circle(canvas, lamp_cx, lamp_cy, LAMP_RADIUS, fill=LAMP_COLOR if self.signal_file else LAMP_EMPTY_COLOR) def set_signal_file(): """ Opens a window to let the user choose a lamp signal file. """ new_signal_file = askopenfilename(title=OPEN_LAMP_SIGNAL_FILE_TITLE, filetypes=[('%s files' % LAMP_SIGNAL_FILE_TYPE, LAMP_SIGNAL_FILE_EXTENSION)], initialfile=self.signal_file) if new_signal_file and new_signal_file != self.signal_file: self.signal_file = relpath(new_signal_file) canvas.itemconfig(lamp, fill=LAMP_COLOR) self.on_signal_file_changed() self.set_signal_file = set_signal_file self.parts.add(lamp_box) self.parts.add(lamp)