def write_change_over_switch(canvas, t = I, labels = None): if canvas is None: return t.r_move(-0.5, 0.0), t.r_move(0.5, 0.5), t.r_move(0.5, -0.5) #t = t.r_move(0.5, 0.0) OVER = 3.0 / 20.0 # zobacek kontaktu EQA = 1.0 - OVER # Strana rovnostranneho trojuhelnika EQH = 0.866 * EQA # EQH - vyska rovnostranneho trojuhhlnika Line([ (-0.5, 0.0), (-0.5 * EQH, 0.0), (0.5 * EQH, 0.5 - 0.5 * OVER) ], t).write(canvas) # kontakty Line([ (0.5 * EQH - 0.5 * OVER, 0.5 - OVER), (0.5 * EQH - 0.5 * OVER, 0.5), (0.5, 0.5) ], t).write(canvas) Line([ (0.5 * EQH - 0.5 * OVER, -0.5 + OVER), (0.5 * EQH - 0.5 * OVER, -0.5), (0.5, -0.5) ], t).write(canvas) if labels is not None: canvas.text(labels[0], t.transform_point((-0.5 * EQH, 0.0)), 'nw', 'small') canvas.text(labels[1], t.transform_point((0.5 * EQH - 0.5 * OVER, 0.5)), 'ne', 'small') canvas.text(labels[2], t.transform_point((0.5 * EQH - 0.5 * OVER, -0.5)), 'se', 'small') return t.r_move(-0.5, 0.0), t.r_move(0.5, 0.5), t.r_move(0.5, -0.5)
def write_arrow(canvas, t=I): width = GS Line(((0.3, 0.0), (width - 0.3, 0.0)), t).write(canvas) Line(EQ_TRIANGLE, I.scale(-0.3, 0.3).move( (width - 0.3, 0.0)).transform(t)).write(canvas) return t.move(t.transform_vector((width, 0.0)))
def write_comparator(canvas, t=I): width = GS t = I.move((0.5 * width, 0.0)).transform(t) Line(COMPARATOR_POINTS, I.scale(0.3, 0.3).transform(t)).write(canvas) Line(COMPARATOR_POINTS, I.scale(-0.3, -0.3).transform(t)).write(canvas) Line(EQ_TRIANGLE, I.scale(-1.3, 1.3).transform(t)).write(canvas) return t.move(t.transform_vector((0.5 * GS, 0.0)))
def write_mix_valve(canvas, transf=I): symbol = Line(MIX_VALVE, transf) symbol.write(canvas) t1 = transf.move(transf.transform_vector((1.5, 0.0))) t2 = transf.rotate_vect() t2 = t2.move(t2.transform_vector((1.5, 0.0))) return t1, t2
def write_gnd(canvas, t=I): Line([(-0.5, 0.0), (0.5, 0.0), (0.0, -0.5), (-0.5, 0.0)], t.r_scale(0.5).r_move(0.0, -0.5)).write(canvas) Line([(0.0, 0.0), (0.0, -0.25)], t).write(canvas) canvas.text('GND', t.transform_point((0.0, -0.25)), position='ne', size='small')
def write_join(canvas, t1, t2): x1, y1 = t1.get_offset() x2, y2 = t2.get_offset() x = max((x1, x2)) + 0.5 y = 0.5 * (y1 + y2) Line([(x1, y1), (x, y1), (x, y2), (x2, y2)]).write(canvas) Line([(x, y), (x + 0.5, y)]).write(canvas) return I.move_to((x + 0.5, y))
def write_fork(canvas, t, scale = 1.0): Line([ (0.0, 0.0), (0.5, 0.0) ], t).write(canvas) Line([ (1.0, 0.5 * scale), (0.5, 0.5 * scale), (0.5, -0.5 * scale), (1.0, -0.5 * scale) ], t).write(canvas) Circle(t.r_move(0.5, 0.0).r_scale(0.15)).write(canvas) return t.r_move(1.0, 0.5 * scale), t.r_move(1.0, -0.5 * scale)
def write_coil(canvas = None, t = I, labels = None): if canvas is not None: WH_RATIO = 3.0 / 4.0 Square(t.r_scale(WH_RATIO, 1.0)).write(canvas) Line([(-0.5, 0.0), (-0.5 * WH_RATIO, 0.0)], t).write(canvas) Line([(0.5, 0.0), (0.5 * WH_RATIO, 0.0)], t).write(canvas) if labels is not None: canvas.text(labels[0], t.transform_point((-0.5 * WH_RATIO, 0.0)), 'nw', 'small') canvas.text(labels[1], t.transform_point((0.5 * WH_RATIO, 0.0)), 'ne', 'small') return t.r_move(-0.5, 0.0), t.r_move(0.5, 0.0)
def write_ref(canvas, t=I, text=''): Line([(-0.1, 0.0), (0.0, 0.0)], t).write(canvas) Line([(-0.1, 0.20), (-0.1, -0.20), (-1.0, -0.20), (-0.4 * 0.866 - 1.0, 0.0), (-1.0, 0.20), (-0.1, 0.20)], t).write(canvas) canvas.text(text, t.transform_point((-0.1, 0.0)), position='w', size='small') return t
def write_tee2(canvas, t1, t2): p1x, p1y = t1.transform_point((0.0, 0.0)) v1x, v1y = t1.transform_vector((-1.0, 0.0)) p2x, p2y = t2.transform_point((0.0, 0.0)) v2x, v2y = t2.transform_vector((-1.0, 0.0)) ox = p1x * v2x + p2x * v1x oy = p1y * v2y + p2y * v1y t = t1.move_to((ox, oy)) symbol = Line(((-0.5, 0.0), (0.5, 0.0), (0.0, 0.0), (0.0, -0.5)), t) symbol.write(canvas) return t.move(t.transform_vector((1.5, 0.0)))
def write_ref(self, handle, text = ''): Line([ (-0.1, 0.0), (0.0, 0.0) ], handle).write(self.canvas) Line([ (-0.1, 0.20), (-0.1, -0.20), (-1.0, -0.20), (-0.4*0.866-1.0, 0.0), (-1.0, 0.20), (-0.1, 0.20) ], handle).write(self.canvas) #self.canvas.text(text, self.t.transform_point((-0.1, 0.0)), position = 'w', size = 'small') return handle
def write_terminal(canvas, t = I, align = 'left'): SCALE = 0.20 t = t.r_move(0.5 * SCALE * ALIGNMENTS[align], 0.0) t_scaled = t.r_scale(SCALE) Circle(t_scaled).write(canvas) Line([(-0.5, -0.5), (0.5, 0.5)], t_scaled).write(canvas) return t.r_move(0.5 * SCALE * ALIGNMENTS[align], 0.0)
def write_pump(canvas, transf=I): symbol = Circle(transf) symbol.write(canvas) t = I.scale(-0.6, 0.6).transform(transf) symbol = Line(EQ_TRIANGLE, t) symbol.write(canvas) return transf.move(transf.transform_vector((1.5, 0.0)))
def write_converter(labels, canvas, t=I): width = GS t = I.move((0.5 * width, 0.0)).transform(t) Square(I.scale(1.5, 1.5).transform(t)).write(canvas) Line(((-0.75, -0.75), (0.75, 0.75)), t).write(canvas) canvas.text(labels[0], t.transform_point((-0.35, 0.35))) canvas.text(labels[1], t.transform_point((0.35, -0.35))) return t.move(t.transform_vector((0.5 * width, 0.0)))
def draw_face_view(self, scheme): scheme.draw_rect((12.4, 62)) Line( ((6.2, 24.26), (8.5, 24.26), (8.5, -24.26), (6.2, -24.26)), scheme.t ).write(scheme.canvas) Line( ((-6.2, 24.26), (-8.5, 24.26), (-8.5, -24.26), (-6.2, -24.26)), scheme.t ).write(scheme.canvas) Line(((-6.2, 18.38), (6.2, 18.38)), scheme.t).write(scheme.canvas) Line(((-6.2, -18.38), (6.2, -18.38)), scheme.t).write(scheme.canvas) scheme.draw_rect((10.85, 35.28), 'TINY') scheme.draw_circle(2.325, cx=-2.7125, cy=31.0-2.725) scheme.draw_circle(2.325, cx=2.7125, cy=31.0-2.725) scheme.draw_circle(2.325, cx=-2.7125, cy=-31.0+2.725) scheme.draw_circle(2.325, cx=2.7125, cy=-31.0+2.725)
def write_temp_sensor(canvas, t = I): width = GS t = I.move((0.5 * width, 0.0)).transform(t) Square(I.scale(RESISTOR_RATIO, 1.0).move((0.0, 0.0)).transform(t)).write(canvas) Line(((0.4, 0.4), (-0.4, -0.4), (-0.7, -0.4)), t).write(canvas) # Square(I.scale(1.5, 1.5).transform(t)).write(canvas) canvas.text('$\\vartheta$', t.transform_point((-0.55, -0.4)), position='n') return I.move((0.2 * GS, 0.0)).transform(t)
def write_switch(canvas, t=I, labels=None, align='left'): t = t.r_move(0.5 * ALIGNMENTS[align], 0.0) OVER = 3.0 / 20.0 # zobacek kontaktu EQA = 1.0 - OVER # Strana rovnostranneho trojuhelnika EQH = 0.866 * EQA # EQH - vyska rovnostranneho trojuhhlnika Line([(-0.5, 0.0), (-0.5 * EQH, 0.0), (0.5 * EQH * 0.866, 0.5 - 0.5 * OVER)], t).write(canvas) # kontakt Line([(0.5 * EQH - 0.5 * OVER, OVER), (0.5 * EQH - 0.5 * OVER, 0.0), (0.5, 0.0)], t).write(canvas) if labels is not None: canvas.text(labels[0], t.transform_point((-0.5, 0.0)), 'nw', 'small') canvas.text(labels[1], t.transform_point((0.5, 0.0)), 'ne', 'small') return t.r_move(0.5 * ALIGNMENTS[align], 0.0)
def write_pump(canvas, transf=I): if canvas is not None: symbol = Circle(transf) symbol.write(canvas) t = I.scale(-0.6, 0.6).transform(transf) symbol = Line(EQ_TRIANGLE, t) symbol.write(canvas) return transf.r_move(-0.5, 0.0), transf.r_move(0.5, 0.0)
def write_fork(canvas, t=I): width = GS Line(((0.3, 0.0), (width - 0.3, 0.0)), t).write(canvas) Line(((width - 0.3, 1.25 * GS), (0.5 * width, 1.25 * GS), (0.5 * width, -1.25 * GS), (width - 0.3, -1.25 * GS)), t).write(canvas) Line(EQ_TRIANGLE, I.scale(-0.3, 0.3).move( (width - 0.3, 1.25 * GS)).transform(t)).write(canvas) Line(EQ_TRIANGLE, I.scale(-0.3, 0.3).move( (width - 0.3, 0.0)).transform(t)).write(canvas) Line(EQ_TRIANGLE, I.scale(-0.3, 0.3).move( (width - 0.3, -1.25 * GS)).transform(t)).write(canvas) return [ I.move((width, 1.25 * GS)).transform(t), I.move((width, 0.0)).transform(t), I.move((width, -1.25 * GS)).transform(t) ]
def draw_vdimension(self, points, x): # draw auxiliary lines self.canvas.set_line_width(LINE_WIDTHS['TINY']) aux_points = [((x1 - 2.0, y1), (x - 2.0, y1)) for x1, y1 in points] for p in aux_points: Line(p, self.t).write(self.canvas) # draw dimension line Line(((x, points[0][1]), (x, points[-1][1])), self.t).write(self.canvas) # draw dimension mark for p in [(x, y) for _, y in points[1:]]: self.draw_dimension_mark(self.t.r_move(p[0], p[1]).rotate_vect()) for p in [(x, y) for _, y in points[0:-1]]: self.draw_dimension_mark( self.t.r_move(p[0], p[1]).r_scale(-1.0, 1.0).rotate_vect()) # write a dimension for i in range(len(points) - 1): y1 = points[i][1] y2 = points[i + 1][1] dim = y2 - y1 self.canvas.text('{}'.format(dim), self.t.transform_point((x, 0.5 * (y1 + y2))), 'w')
def draw_hdimension(self, points, y): # draw auxiliary lines self.canvas.set_line_width(LINE_WIDTHS['TINY']) aux_points = [((x1, y1 + 2.0), (x1, y + 2.0)) for x1, y1 in points] for p in aux_points: Line(p, self.t).write(self.canvas) # draw dimension line Line(((points[0][0], y), (points[-1][0], y)), self.t).write(self.canvas) # draw dimension mark for p in [(x, y) for x, _ in points[1:]]: self.draw_dimension_mark(self.t.r_move(p[0], p[1])) for p in [(x, y) for x, _ in points[0:-1]]: self.draw_dimension_mark( self.t.r_move(p[0], p[1]).r_scale(-1.0, 1.0)) # write a dimension for i in range(len(points) - 1): x1 = points[i][0] x2 = points[i + 1][0] dim = x2 - x1 self.canvas.text('{}'.format(dim), self.t.transform_point((0.5 * (x1 + x2), y)), 'n')
def write_tee(canvas, t=I): if canvas is not None: symbol = Line(((-0.5, 0.0), (0.5, 0.0), (0.0, 0.0), (0.0, -0.5)), t) symbol.write(canvas) return t.r_move(-0.5, 0.0), t.r_move(0.5, 0.0), t.rotate_vect().r_move(0.5, 0.0)
def write_corner(canvas, transf=I): if canvas is not None: symbol = Line(((-0.5, 0.0), (0.0, 0.0), (0.0, -0.5)), transf) symbol.write(canvas) return transf.r_move(-0.5, 0.0), transf.rotate_vect().r_move(0.5, 0.0)
def write_mix_valve(canvas, transf=I): if canvas is not None: symbol = Line(MIX_VALVE, transf) symbol.write(canvas) return transf.r_move(-0.5, 0.0), transf.r_move( 0.5, 0.0), transf.rotate_vect().r_move(0.5, 0.0)
def write_wire(canvas, t=I, scale=1.0): if canvas is not None: Line([(0.0, 0.0), (1.0 * scale, 0.0)], t).write(canvas) return t, t.r_move(1.0 * scale, 0.0)
(0.0, 0.0)]) # Schematicka znacka smesovaciho ventilu MIX_VALVE = Transform().scale(0.5).transform_points([(0.0, 0.0), (EQ_TRIANGLE_H, 0.5), (EQ_TRIANGLE_H, -0.5), (-EQ_TRIANGLE_H, 0.5), (-EQ_TRIANGLE_H, -0.5), (0.0, 0.0), (0.5, -EQ_TRIANGLE_H), (-0.5, -EQ_TRIANGLE_H), (0.0, 0.0)]) # Schematicka znacka cerpadla circle = Circle() triangle = Line(Transform().scale(0.70).transform_points(EQ_TRIANGLE)) # Krbova kamna def write_heater(canvas, transf=I): if canvas is not None: t = I.scale(2.0, 3.0).transform(transf) symbol = Square(t) symbol.write(canvas) return transf.r_move(-1.0, 0.0), transf.r_move(1.0, 0.0) def write_pump(canvas, transf=I): if canvas is not None: symbol = Circle(transf) symbol.write(canvas)
def draw_frame(self): # Vykres velikosti A3 # Vykresovy list drawing_frame_size = self.paper['DRAWING_FRAME_SIZE'] grid_frame_size = self.paper['GRID_FRAME_SIZE'] outer_frame_size = self.paper['OUTER_FRAME_SIZE'] self.draw_rect(outer_frame_size, 'TINY') # draw outer frame self.draw_rect(grid_frame_size, style='tiny') # self.draw_rect(drawing_frame_size) # draw center marks x, y = grid_frame_size x, y = 0.5 * x, 0.5 * y size = grid_frame_size[0] - drawing_frame_size[0] self.draw_hline(x, 0, -size) self.draw_hline(-x, 0, size) self.draw_vline(0, y, -size) self.draw_vline(0, -y, size) # center triangles Line(EQ_TRIANGLE, self.t.r_move(x - 5.0, 0.0).r_scale(-5.0, 5.0)).write(self.canvas) Line(EQ_TRIANGLE, self.t.r_move(0.0, -y + 5.0).r_scale( -5.0, 5.0).rotate_vect()).write(self.canvas) # draw grid y = 0.5 * grid_frame_size[1] hgrid, vgrid = self.paper['GRID'] size = 0.5 * size dist = 0.5 * grid_frame_size[0] / hgrid for i in range(hgrid - 1): x = (i + 1) * dist self.draw_vline(x, y, -size) self.draw_vline(-x, y, -size) self.draw_vline(x, -y, size) self.draw_vline(-x, -y, size) self.canvas.text(GRID_NUMBERS[hgrid - 1 - i], (-x + 0.5 * dist, y - 0.5 * size), size='large') self.canvas.text(GRID_NUMBERS[hgrid + i], (x - 0.5 * dist, y - 0.5 * size), size='large') self.canvas.text(GRID_NUMBERS[hgrid - 1 - i], (-x + 0.5 * dist, -y + 0.5 * size), size='large') self.canvas.text(GRID_NUMBERS[hgrid + i], (x - 0.5 * dist, -y + 0.5 * size), size='large') self.canvas.text(GRID_NUMBERS[0], (-(hgrid - 0.5) * dist, y - 0.5 * size), size='large') self.canvas.text(GRID_NUMBERS[hgrid * 2 - 1], ((hgrid - 0.5) * dist, y - 0.5 * size), size='large') self.canvas.text(GRID_NUMBERS[0], (-(hgrid - 0.5) * dist, -y + 0.5 * size), size='large') self.canvas.text(GRID_NUMBERS[hgrid * 2 - 1], ((hgrid - 0.5) * dist, -y + 0.5 * size), size='large') dist = 0.5 * grid_frame_size[1] / vgrid x = 0.5 * grid_frame_size[0] for i in range(vgrid - 1): x = 0.5 * grid_frame_size[0] y = (i + 1) * dist self.draw_hline(x, y, -size) self.draw_hline(x, -y, -size) self.draw_hline(-x, y, size) self.draw_hline(-x, -y, size) x = x - 0.5 * size y = (i + 0.5) * dist self.canvas.text(GRID_LETTERS[vgrid - 1 - i], (x, y), size='large') self.canvas.text(GRID_LETTERS[vgrid - 1 - i], (-x, y), size='large') self.canvas.text(GRID_LETTERS[vgrid + i], (x, -y), size='large') self.canvas.text(GRID_LETTERS[vgrid + i], (-x, -y), size='large') x = 0.5 * (grid_frame_size[0] - size) y = (vgrid - 0.5) * dist self.canvas.text(GRID_LETTERS[0], (x, y), size='large') self.canvas.text(GRID_LETTERS[0], (-x, y), size='large') self.canvas.text(GRID_LETTERS[2 * vgrid - 1], (x, -y), size='large') self.canvas.text(GRID_LETTERS[2 * vgrid - 1], (-x, -y), size='large') # draw cut marks cut_points = ((0.0, 0.0), (10.0, 0.0), (10.0, 2.0), (2.0, 2.0), (2.0, 10.0), (0.0, 10.0), (0.0, 0.0)) x = 0.5 * grid_frame_size[0] y = 0.5 * grid_frame_size[1] self.canvas.set_line_width(LINE_WIDTHS['TINY']) self.canvas.set_fill(True) Line(cut_points, self.t.r_move(-x, -y)).write(self.canvas) Line(cut_points, self.t.r_scale(1.0, -1.0).r_move(-x, -y)).write(self.canvas) Line(cut_points, self.t.r_scale(-1.0, 1.0).r_move(-x, -y)).write(self.canvas) Line(cut_points, self.t.r_scale(-1.0, -1.0).r_move(-x, -y)).write(self.canvas) # Description field DESC_FIELD_SIZE = (170.0, 50.0) self.push() self.move(0.5 * (drawing_frame_size[0] - DESC_FIELD_SIZE[0]), 0.5 * (DESC_FIELD_SIZE[1] - drawing_frame_size[1])) self.draw_rect(DESC_FIELD_SIZE, style='bold') if self.description is not None: # Cislo vykresu if 'number' in self.description: self.canvas.text(self.description['number'], self.t.transform_point((0.0, -10.0)), size='huge') # Nazev vykresu if 'name' in self.description: self.canvas.text(self.description['name'], self.t.transform_point((0.0, 0.0)), size='huge') head = list() text = list() # Projekt # Realizator # projektant # schvalil # nakreslil if 'author' in self.description: head.append('\\hfill{{}}Autor:') text.append(self.description['author']) # datum if 'date' in self.description: head.append('\\hfill{{}}Datum:') text.append(self.description['date']) # meritko if 'scale' in self.description: head.append('\\hfill{{}}Měřítko:') text.append(self.description['scale']) # List / listu if 'page' in self.description: head.append('\\hfill{{}}List:') text.append(self.description['page']) # zmenove pole if text: self.canvas.text('\\\\'.join(head), self.t.transform_point( (-0.5 * (DESC_FIELD_SIZE[0] - 15.0), 0.0)), width=15.0) self.canvas.text('\\\\'.join(text), self.t.transform_point( (-0.5 * (DESC_FIELD_SIZE[0] - 30.0) + 17.0, 0.0)), width=30.0) self.pop() # Move drawing coordinates self.move(0.0, 0.5 * DESC_FIELD_SIZE[1])
def draw_dimension_mark(self, t): Line(((-4.0, 1.37), (0.0, 0.0), (-4.0, -1.37)), t).write(self.canvas)
def draw_vline(self, x, y, size, line='NORMAL', style='normal'): self.canvas.set_line_width(LINE_WIDTHS[line]) self.set_style(style) Line(((x, y), (x, y + size)), self.t).write(self.canvas)
def write_corner(canvas, transf=I): symbol = Line(((-0.5, 0.0), (0.0, 0.0), (0.0, -0.5)), transf) symbol.write(canvas) transf = transf.rotate_vect() return transf.move(transf.transform_vector((1.5, 0.0)))